diff --git a/base/OWNERS b/base/OWNERS
deleted file mode 100644
index 21d1970..0000000
--- a/base/OWNERS
+++ /dev/null
@@ -1,52 +0,0 @@
-# About src/base:
-#
-# Chromium is a very mature project, most things that are generally useful are
-# already here, and that things not here aren't generally useful.
-#
-# Base is pulled into many projects. For example, various ChromeOS daemons. So
-# the bar for adding stuff is that it must have demonstrated wide
-# applicability. Prefer to add things closer to where they're used (i.e. "not
-# base"), and pull into base only when needed.  In a project our size,
-# sometimes even duplication is OK and inevitable.
-#
-# Adding a new logging macro DPVELOG_NE is not more clear than just
-# writing the stuff you want to log in a regular logging statement, even
-# if it makes your calling code longer. Just add it to your own code.
-#
-# If the code in question does not need to be used inside base, but will have
-# multiple consumers across the codebase, consider placing it in a new directory
-# under components/ instead.
-
-danakj@chromium.org
-dcheng@chromium.org
-gab@chromium.org
-mark@chromium.org
-thakis@chromium.org
-thestig@chromium.org
-
-# For Bind/Callback:
-per-file bind*=tzik@chromium.org
-per-file callback*=tzik@chromium.org
-
-# For Android-specific changes:
-per-file *android*=file://base/android/OWNERS
-per-file BUILD.gn=file://base/android/OWNERS
-
-# For Fuchsia-specific changes:
-per-file *_fuchsia*=file://build/fuchsia/OWNERS
-
-# For FeatureList API:
-per-file feature_list*=asvitkine@chromium.org
-per-file feature_list*=isherman@chromium.org
-
-# Restricted since rand_util.h also backs the cryptographically secure RNG.
-per-file rand_util*=set noparent
-per-file rand_util*=file://ipc/SECURITY_OWNERS
-
-# For TCMalloc tests:
-per-file security_unittest.cc=jln@chromium.org
-
-# For Value:
-per-file values*=jdoerrie@chromium.org
-
-# COMPONENT: Internals>Core
diff --git a/base/auto_reset.h b/base/auto_reset.h
deleted file mode 100644
index 8515fe9..0000000
--- a/base/auto_reset.h
+++ /dev/null
@@ -1,43 +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 BASE_AUTO_RESET_H_
-#define BASE_AUTO_RESET_H_
-
-#include <utility>
-
-#include "base/macros.h"
-
-// base::AutoReset<> is useful for setting a variable to a new value only within
-// a particular scope. An base::AutoReset<> object resets a variable to its
-// original value upon destruction, making it an alternative to writing
-// "var = false;" or "var = old_val;" at all of a block's exit points.
-//
-// This should be obvious, but note that an base::AutoReset<> instance should
-// have a shorter lifetime than its scoped_variable, to prevent invalid memory
-// writes when the base::AutoReset<> object is destroyed.
-
-namespace base {
-
-template<typename T>
-class AutoReset {
- public:
-  AutoReset(T* scoped_variable, T new_value)
-      : scoped_variable_(scoped_variable),
-        original_value_(std::move(*scoped_variable)) {
-    *scoped_variable_ = std::move(new_value);
-  }
-
-  ~AutoReset() { *scoped_variable_ = std::move(original_value_); }
-
- private:
-  T* scoped_variable_;
-  T original_value_;
-
-  DISALLOW_COPY_AND_ASSIGN(AutoReset);
-};
-
-}  // namespace base
-
-#endif  // BASE_AUTO_RESET_H_
diff --git a/base/containers/OWNERS b/base/containers/OWNERS
deleted file mode 100644
index cc39b28..0000000
--- a/base/containers/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-danakj@chromium.org
-dcheng@chromium.org
-vmpstr@chromium.org
diff --git a/base/containers/README.md b/base/containers/README.md
deleted file mode 100644
index 092a264..0000000
--- a/base/containers/README.md
+++ /dev/null
@@ -1,295 +0,0 @@
-# base/containers library
-
-## What goes here
-
-This directory contains some STL-like containers.
-
-Things should be moved here that are generally applicable across the code base.
-Don't add things here just because you need them in one place and think others
-may someday want something similar. You can put specialized containers in
-your component's directory and we can promote them here later if we feel there
-is broad applicability.
-
-### Design and naming
-
-Containers should adhere as closely to STL as possible. Functions and behaviors
-not present in STL should only be added when they are related to the specific
-data structure implemented by the container.
-
-For STL-like containers our policy is that they should use STL-like naming even
-when it may conflict with the style guide. So functions and class names should
-be lower case with underscores. Non-STL-like classes and functions should use
-Google naming. Be sure to use the base namespace.
-
-## Map and set selection
-
-### Usage advice
-
-  * Generally avoid **std::unordered\_set** and **std::unordered\_map**. In the
-    common case, query performance is unlikely to be sufficiently higher than
-    std::map to make a difference, insert performance is slightly worse, and
-    the memory overhead is high. This makes sense mostly for large tables where
-    you expect a lot of lookups.
-
-  * Most maps and sets in Chrome are small and contain objects that can be
-    moved efficiently. In this case, consider **base::flat\_map** and
-    **base::flat\_set**. You need to be aware of the maximum expected size of
-    the container since individual inserts and deletes are O(n), giving O(n^2)
-    construction time for the entire map. But because it avoids mallocs in most
-    cases, inserts are better or comparable to other containers even for
-    several dozen items, and efficiently-moved types are unlikely to have
-    performance problems for most cases until you have hundreds of items. If
-    your container can be constructed in one shot, the constructor from vector
-    gives O(n log n) construction times and it should be strictly better than
-    a std::map.
-
-  * **base::small\_map** has better runtime memory usage without the poor
-    mutation performance of large containers that base::flat\_map has. But this
-    advantage is partially offset by additional code size. Prefer in cases
-    where you make many objects so that the code/heap tradeoff is good.
-
-  * Use **std::map** and **std::set** if you can't decide. Even if they're not
-    great, they're unlikely to be bad or surprising.
-
-### Map and set details
-
-Sizes are on 64-bit platforms. Stable iterators aren't invalidated when the
-container is mutated.
-
-| Container                                | Empty size            | Per-item overhead | Stable iterators? |
-|:---------------------------------------- |:--------------------- |:----------------- |:----------------- |
-| std::map, std::set                       | 16 bytes              | 32 bytes          | Yes               |
-| std::unordered\_map, std::unordered\_set | 128 bytes             | 16-24 bytes       | No                |
-| base::flat\_map and base::flat\_set      | 24 bytes              | 0 (see notes)     | No                |
-| base::small\_map                         | 24 bytes (see notes)  | 32 bytes          | No                |
-
-**Takeaways:** std::unordered\_map and std::unordered\_map have high
-overhead for small container sizes, prefer these only for larger workloads.
-
-Code size comparisons for a block of code (see appendix) on Windows using
-strings as keys.
-
-| Container           | Code size  |
-|:------------------- |:---------- |
-| std::unordered\_map | 1646 bytes |
-| std::map            | 1759 bytes |
-| base::flat\_map     | 1872 bytes |
-| base::small\_map    | 2410 bytes |
-
-**Takeaways:** base::small\_map generates more code because of the inlining of
-both brute-force and red-black tree searching. This makes it less attractive
-for random one-off uses. But if your code is called frequently, the runtime
-memory benefits will be more important. The code sizes of the other maps are
-close enough it's not worth worrying about.
-
-### std::map and std::set
-
-A red-black tree. Each inserted item requires the memory allocation of a node
-on the heap. Each node contains a left pointer, a right pointer, a parent
-pointer, and a "color" for the red-black tree (32-bytes per item on 64-bits).
-
-### std::unordered\_map and std::unordered\_set
-
-A hash table. Implemented on Windows as a std::vector + std::list and in libc++
-as the equivalent of a std::vector + a std::forward\_list. Both implementations
-allocate an 8-entry hash table (containing iterators into the list) on
-initialization, and grow to 64 entries once 8 items are inserted. Above 64
-items, the size doubles every time the load factor exceeds 1.
-
-The empty size is sizeof(std::unordered\_map) = 64 +
-the initial hash table size which is 8 pointers. The per-item overhead in the
-table above counts the list node (2 pointers on Windows, 1 pointer in libc++),
-plus amortizes the hash table assuming a 0.5 load factor on average.
-
-In a microbenchmark on Windows, inserts of 1M integers into a
-std::unordered\_set took 1.07x the time of std::set, and queries took 0.67x the
-time of std::set. For a typical 4-entry set (the statistical mode of map sizes
-in the browser), query performance is identical to std::set and base::flat\_set.
-On ARM, unordered\_set performance can be worse because integer division to
-compute the bucket is slow, and a few "less than" operations can be faster than
-computing a hash depending on the key type. The takeaway is that you should not
-default to using unordered maps because "they're faster."
-
-### base::flat\_map and base::flat\_set
-
-A sorted std::vector. Seached via binary search, inserts in the middle require
-moving elements to make room. Good cache locality. For large objects and large
-set sizes, std::vector's doubling-when-full strategy can waste memory.
-
-Supports efficient construction from a vector of items which avoids the O(n^2)
-insertion time of each element separately.
-
-The per-item overhead will depend on the underlying std::vector's reallocation
-strategy and the memory access pattern. Assuming items are being linearly added,
-one would expect it to be 3/4 full, so per-item overhead will be 0.25 *
-sizeof(T).
-
-
-flat\_set/flat\_map support a notion of transparent comparisons. Therefore you
-can, for example, lookup base::StringPiece in a set of std::strings without
-constructing a temporary std::string. This functionality is based on C++14
-extensions to std::set/std::map interface.
-
-You can find more information about transparent comparisons here:
-http://en.cppreference.com/w/cpp/utility/functional/less_void
-
-Example, smart pointer set:
-
-```cpp
-// Declare a type alias using base::UniquePtrComparator.
-template <typename T>
-using UniquePtrSet = base::flat_set<std::unique_ptr<T>,
-                                    base::UniquePtrComparator>;
-
-// ...
-// Collect data.
-std::vector<std::unique_ptr<int>> ptr_vec;
-ptr_vec.reserve(5);
-std::generate_n(std::back_inserter(ptr_vec), 5, []{
-  return std::make_unique<int>(0);
-});
-
-// Construct a set.
-UniquePtrSet<int> ptr_set(std::move(ptr_vec), base::KEEP_FIRST_OF_DUPES);
-
-// Use raw pointers to lookup keys.
-int* ptr = ptr_set.begin()->get();
-EXPECT_TRUE(ptr_set.find(ptr) == ptr_set.begin());
-```
-
-Example flat_map<std\::string, int>:
-
-```cpp
-base::flat_map<std::string, int> str_to_int({{"a", 1}, {"c", 2},{"b", 2}},
-                                            base::KEEP_FIRST_OF_DUPES);
-
-// Does not construct temporary strings.
-str_to_int.find("c")->second = 3;
-str_to_int.erase("c");
-EXPECT_EQ(str_to_int.end(), str_to_int.find("c")->second);
-
-// NOTE: This does construct a temporary string. This happens since if the
-// item is not in the container, then it needs to be constructed, which is
-// something that transparent comparators don't have to guarantee.
-str_to_int["c"] = 3;
-```
-
-### base::small\_map
-
-A small inline buffer that is brute-force searched that overflows into a full
-std::map or std::unordered\_map. This gives the memory benefit of
-base::flat\_map for small data sizes without the degenerate insertion
-performance for large container sizes.
-
-Since instantiations require both code for a std::map and a brute-force search
-of the inline container, plus a fancy iterator to cover both cases, code size
-is larger.
-
-The initial size in the above table is assuming a very small inline table. The
-actual size will be sizeof(int) + min(sizeof(std::map), sizeof(T) *
-inline\_size).
-
-# Deque
-
-### Usage advice
-
-Chromium code should always use `base::circular_deque` or `base::queue` in
-preference to `std::deque` or `std::queue` due to memory usage and platform
-variation.
-
-The `base::circular_deque` implementation (and the `base::queue` which uses it)
-provide performance consistent across platforms that better matches most
-programmer's expectations on performance (it doesn't waste as much space as
-libc++ and doesn't do as many heap allocations as MSVC). It also generates less
-code tham `std::queue`: using it across the code base saves several hundred
-kilobytes.
-
-Since `base::deque` does not have stable iterators and it will move the objects
-it contains, it may not be appropriate for all uses. If you need these,
-consider using a `std::list` which will provide constant time insert and erase.
-
-### std::deque and std::queue
-
-The implementation of `std::deque` varies considerably which makes it hard to
-reason about. All implementations use a sequence of data blocks referenced by
-an array of pointers. The standard guarantees random access, amortized
-constant operations at the ends, and linear mutations in the middle.
-
-In Microsoft's implementation, each block is the smaller of 16 bytes or the
-size of the contained element. This means in practice that every expansion of
-the deque of non-trivial classes requires a heap allocation. libc++ (on Android
-and Mac) uses 4K blocks which elimiates the problem of many heap allocations,
-but generally wastes a large amount of space (an Android analysis revealed more
-than 2.5MB wasted space from deque alone, resulting in some optimizations).
-libstdc++ uses an intermediate-size 512 byte buffer.
-
-Microsoft's implementation never shrinks the deque capacity, so the capacity
-will always be the maximum number of elements ever contained. libstdc++
-deallocates blocks as they are freed. libc++ keeps up to two empty blocks.
-
-### base::circular_deque and base::queue
-
-A deque implemented as a circular buffer in an array. The underlying array will
-grow like a `std::vector` while the beginning and end of the deque will move
-around. The items will wrap around the underlying buffer so the storage will
-not be contiguous, but fast random access iterators are still possible.
-
-When the underlying buffer is filled, it will be reallocated and the constents
-moved (like a `std::vector`). The underlying buffer will be shrunk if there is
-too much wasted space (_unlike_ a `std::vector`). As a result, iterators are
-not stable across mutations.
-
-# Stack
-
-`std::stack` is like `std::queue` in that it is a wrapper around an underlying
-container. The default container is `std::deque` so everything from the deque
-section applies.
-
-Chromium provides `base/containers/stack.h` which defines `base::stack` that
-should be used in preference to std::stack. This changes the underlying
-container to `base::circular_deque`. The result will be very similar to
-manually specifying a `std::vector` for the underlying implementation except
-that the storage will shrink when it gets too empty (vector will never
-reallocate to a smaller size).
-
-Watch out: with some stack usage patterns it's easy to depend on unstable
-behavior:
-
-```cpp
-base::stack<Foo> stack;
-for (...) {
-  Foo& current = stack.top();
-  DoStuff();  // May call stack.push(), say if writing a parser.
-  current.done = true;  // Current may reference deleted item!
-}
-```
-
-## Appendix
-
-### Code for map code size comparison
-
-This just calls insert and query a number of times, with printfs that prevent
-things from being dead-code eliminated.
-
-```cpp
-TEST(Foo, Bar) {
-  base::small_map<std::map<std::string, Flubber>> foo;
-  foo.insert(std::make_pair("foo", Flubber(8, "bar")));
-  foo.insert(std::make_pair("bar", Flubber(8, "bar")));
-  foo.insert(std::make_pair("foo1", Flubber(8, "bar")));
-  foo.insert(std::make_pair("bar1", Flubber(8, "bar")));
-  foo.insert(std::make_pair("foo", Flubber(8, "bar")));
-  foo.insert(std::make_pair("bar", Flubber(8, "bar")));
-  auto found = foo.find("asdf");
-  printf("Found is %d\n", (int)(found == foo.end()));
-  found = foo.find("foo");
-  printf("Found is %d\n", (int)(found == foo.end()));
-  found = foo.find("bar");
-  printf("Found is %d\n", (int)(found == foo.end()));
-  found = foo.find("asdfhf");
-  printf("Found is %d\n", (int)(found == foo.end()));
-  found = foo.find("bar1");
-  printf("Found is %d\n", (int)(found == foo.end()));
-}
-```
-
diff --git a/base/containers/adapters.h b/base/containers/adapters.h
deleted file mode 100644
index fa671b4..0000000
--- a/base/containers/adapters.h
+++ /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.
-
-#ifndef BASE_CONTAINERS_ADAPTERS_H_
-#define BASE_CONTAINERS_ADAPTERS_H_
-
-#include <stddef.h>
-
-#include <iterator>
-
-#include "base/macros.h"
-
-namespace base {
-
-namespace internal {
-
-// Internal adapter class for implementing base::Reversed.
-template <typename T>
-class ReversedAdapter {
- public:
-  using Iterator = decltype(static_cast<T*>(nullptr)->rbegin());
-
-  explicit ReversedAdapter(T& t) : t_(t) {}
-  ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
-
-  // TODO(mdempsky): Once we can use C++14 library features, use std::rbegin
-  // and std::rend instead, so we can remove the specialization below.
-  Iterator begin() const { return t_.rbegin(); }
-  Iterator end() const { return t_.rend(); }
-
- private:
-  T& t_;
-
-  DISALLOW_ASSIGN(ReversedAdapter);
-};
-
-template <typename T, size_t N>
-class ReversedAdapter<T[N]> {
- public:
-  using Iterator = std::reverse_iterator<T*>;
-
-  explicit ReversedAdapter(T (&t)[N]) : t_(t) {}
-  ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
-
-  Iterator begin() const { return Iterator(&t_[N]); }
-  Iterator end() const { return Iterator(&t_[0]); }
-
- private:
-  T (&t_)[N];
-
-  DISALLOW_ASSIGN(ReversedAdapter);
-};
-
-}  // namespace internal
-
-// Reversed returns a container adapter usable in a range-based "for" statement
-// for iterating a reversible container in reverse order.
-//
-// Example:
-//
-//   std::vector<int> v = ...;
-//   for (int i : base::Reversed(v)) {
-//     // iterates through v from back to front
-//   }
-template <typename T>
-internal::ReversedAdapter<T> Reversed(T& t) {
-  return internal::ReversedAdapter<T>(t);
-}
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_ADAPTERS_H_
diff --git a/base/containers/flat_set.h b/base/containers/flat_set.h
deleted file mode 100644
index bf14c36..0000000
--- a/base/containers/flat_set.h
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_CONTAINERS_FLAT_SET_H_
-#define BASE_CONTAINERS_FLAT_SET_H_
-
-#include <functional>
-
-#include "base/containers/flat_tree.h"
-#include "base/template_util.h"
-
-namespace base {
-
-// flat_set is a container with a std::set-like interface that stores its
-// contents in a sorted vector.
-//
-// Please see //base/containers/README.md for an overview of which container
-// to select.
-//
-// PROS
-//
-//  - Good memory locality.
-//  - Low overhead, especially for smaller sets.
-//  - Performance is good for more workloads than you might expect (see
-//    overview link above).
-//  - Supports C++14 set interface.
-//
-// CONS
-//
-//  - Inserts and removals are O(n).
-//
-// IMPORTANT NOTES
-//
-//  - Iterators are invalidated across mutations.
-//  - If possible, construct a flat_set in one operation by inserting into
-//    a std::vector and moving that vector into the flat_set constructor.
-//  - For multiple removals use base::EraseIf() which is O(n) rather than
-//    O(n * removed_items).
-//
-// QUICK REFERENCE
-//
-// Most of the core functionality is inherited from flat_tree. Please see
-// flat_tree.h for more details for most of these functions. As a quick
-// reference, the functions available are:
-//
-// Constructors (inputs need not be sorted):
-//   flat_set(InputIterator first, InputIterator last,
-//            FlatContainerDupes = KEEP_FIRST_OF_DUPES,
-//            const Compare& compare = Compare());
-//   flat_set(const flat_set&);
-//   flat_set(flat_set&&);
-//   flat_set(std::vector<Key>,
-//            FlatContainerDupes = KEEP_FIRST_OF_DUPES,
-//            const Compare& compare = Compare());  // Re-use storage.
-//   flat_set(std::initializer_list<value_type> ilist,
-//            FlatContainerDupes = KEEP_FIRST_OF_DUPES,
-//            const Compare& comp = Compare());
-//
-// Assignment functions:
-//   flat_set& operator=(const flat_set&);
-//   flat_set& operator=(flat_set&&);
-//   flat_set& operator=(initializer_list<Key>);
-//
-// Memory management functions:
-//   void   reserve(size_t);
-//   size_t capacity() const;
-//   void   shrink_to_fit();
-//
-// Size management functions:
-//   void   clear();
-//   size_t size() const;
-//   size_t max_size() const;
-//   bool   empty() const;
-//
-// Iterator functions:
-//   iterator               begin();
-//   const_iterator         begin() const;
-//   const_iterator         cbegin() const;
-//   iterator               end();
-//   const_iterator         end() const;
-//   const_iterator         cend() const;
-//   reverse_iterator       rbegin();
-//   const reverse_iterator rbegin() const;
-//   const_reverse_iterator crbegin() const;
-//   reverse_iterator       rend();
-//   const_reverse_iterator rend() const;
-//   const_reverse_iterator crend() const;
-//
-// Insert and accessor functions:
-//   pair<iterator, bool> insert(const key_type&);
-//   pair<iterator, bool> insert(key_type&&);
-//   void                 insert(InputIterator first, InputIterator last,
-//                               FlatContainerDupes = KEEP_FIRST_OF_DUPES);
-//   iterator             insert(const_iterator hint, const key_type&);
-//   iterator             insert(const_iterator hint, key_type&&);
-//   pair<iterator, bool> emplace(Args&&...);
-//   iterator             emplace_hint(const_iterator, Args&&...);
-//
-// Erase functions:
-//   iterator erase(iterator);
-//   iterator erase(const_iterator);
-//   iterator erase(const_iterator first, const_iterator& last);
-//   template <typename K> size_t erase(const K& key);
-//
-// Comparators (see std::set documentation).
-//   key_compare   key_comp() const;
-//   value_compare value_comp() const;
-//
-// Search functions:
-//   template <typename K> size_t                   count(const K&) const;
-//   template <typename K> iterator                 find(const K&);
-//   template <typename K> const_iterator           find(const K&) const;
-//   template <typename K> pair<iterator, iterator> equal_range(K&);
-//   template <typename K> iterator                 lower_bound(const K&);
-//   template <typename K> const_iterator           lower_bound(const K&) const;
-//   template <typename K> iterator                 upper_bound(const K&);
-//   template <typename K> const_iterator           upper_bound(const K&) const;
-//
-// General functions:
-//   void swap(flat_set&&);
-//
-// Non-member operators:
-//   bool operator==(const flat_set&, const flat_set);
-//   bool operator!=(const flat_set&, const flat_set);
-//   bool operator<(const flat_set&, const flat_set);
-//   bool operator>(const flat_set&, const flat_set);
-//   bool operator>=(const flat_set&, const flat_set);
-//   bool operator<=(const flat_set&, const flat_set);
-//
-template <class Key, class Compare = std::less<>>
-using flat_set = typename ::base::internal::flat_tree<
-    Key,
-    Key,
-    ::base::internal::GetKeyFromValueIdentity<Key>,
-    Compare>;
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_FLAT_SET_H_
diff --git a/base/containers/id_map.h b/base/containers/id_map.h
deleted file mode 100644
index 4c816da..0000000
--- a/base/containers/id_map.h
+++ /dev/null
@@ -1,290 +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 BASE_CONTAINERS_ID_MAP_H_
-#define BASE_CONTAINERS_ID_MAP_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <set>
-#include <type_traits>
-#include <unordered_map>
-#include <utility>
-
-#include "base/containers/flat_set.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/sequence_checker.h"
-
-namespace base {
-
-// This object maintains a list of IDs that can be quickly converted to
-// pointers to objects. It is implemented as a hash table, optimized for
-// relatively small data sets (in the common case, there will be exactly one
-// item in the list).
-//
-// Items can be inserted into the container with arbitrary ID, but the caller
-// must ensure they are unique. Inserting IDs and relying on automatically
-// generated ones is not allowed because they can collide.
-
-// The map's value type (the V param) can be any dereferenceable type, such as a
-// raw pointer or smart pointer
-template <typename V, typename K = int32_t>
-class IDMap final {
- public:
-  using KeyType = K;
-
- private:
-  using T = typename std::remove_reference<decltype(*V())>::type;
-
-  using HashTable = std::unordered_map<KeyType, V>;
-
- public:
-  IDMap() : iteration_depth_(0), next_id_(1), check_on_null_data_(false) {
-    // A number of consumers of IDMap create it on one thread but always
-    // access it from a different, but consistent, thread (or sequence)
-    // post-construction. The first call to CalledOnValidSequence() will re-bind
-    // it.
-    DETACH_FROM_SEQUENCE(sequence_checker_);
-  }
-
-  ~IDMap() {
-    // Many IDMap's are static, and hence will be destroyed on the main
-    // thread. However, all the accesses may take place on another thread (or
-    // sequence), such as the IO thread. Detaching again to clean this up.
-    DETACH_FROM_SEQUENCE(sequence_checker_);
-  }
-
-  // Sets whether Add and Replace should DCHECK if passed in NULL data.
-  // Default is false.
-  void set_check_on_null_data(bool value) { check_on_null_data_ = value; }
-
-  // Adds a view with an automatically generated unique ID. See AddWithID.
-  KeyType Add(V data) { return AddInternal(std::move(data)); }
-
-  // Adds a new data member with the specified ID. The ID must not be in
-  // the list. The caller either must generate all unique IDs itself and use
-  // this function, or allow this object to generate IDs and call Add. These
-  // two methods may not be mixed, or duplicate IDs may be generated.
-  void AddWithID(V data, KeyType id) { AddWithIDInternal(std::move(data), id); }
-
-  void Remove(KeyType id) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    typename HashTable::iterator i = data_.find(id);
-    if (i == data_.end() || IsRemoved(id)) {
-      NOTREACHED() << "Attempting to remove an item not in the list";
-      return;
-    }
-
-    if (iteration_depth_ == 0) {
-      data_.erase(i);
-    } else {
-      removed_ids_.insert(id);
-    }
-  }
-
-  // Replaces the value for |id| with |new_data| and returns the existing value.
-  // Should only be called with an already added id.
-  V Replace(KeyType id, V new_data) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(!check_on_null_data_ || new_data);
-    typename HashTable::iterator i = data_.find(id);
-    DCHECK(i != data_.end());
-    DCHECK(!IsRemoved(id));
-
-    using std::swap;
-    swap(i->second, new_data);
-    return new_data;
-  }
-
-  void Clear() {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    if (iteration_depth_ == 0) {
-      data_.clear();
-    } else {
-      removed_ids_.reserve(data_.size());
-      removed_ids_.insert(KeyIterator(data_.begin()), KeyIterator(data_.end()));
-    }
-  }
-
-  bool IsEmpty() const {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    return size() == 0u;
-  }
-
-  T* Lookup(KeyType id) const {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    typename HashTable::const_iterator i = data_.find(id);
-    if (i == data_.end() || !i->second || IsRemoved(id))
-      return nullptr;
-    return &*i->second;
-  }
-
-  size_t size() const {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    return data_.size() - removed_ids_.size();
-  }
-
-#if defined(UNIT_TEST)
-  int iteration_depth() const {
-    return iteration_depth_;
-  }
-#endif  // defined(UNIT_TEST)
-
-  // It is safe to remove elements from the map during iteration. All iterators
-  // will remain valid.
-  template<class ReturnType>
-  class Iterator {
-   public:
-    Iterator(IDMap<V, K>* map) : map_(map), iter_(map_->data_.begin()) {
-      Init();
-    }
-
-    Iterator(const Iterator& iter)
-        : map_(iter.map_),
-          iter_(iter.iter_) {
-      Init();
-    }
-
-    const Iterator& operator=(const Iterator& iter) {
-      map_ = iter.map;
-      iter_ = iter.iter;
-      Init();
-      return *this;
-    }
-
-    ~Iterator() {
-      DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
-
-      // We're going to decrement iteration depth. Make sure it's greater than
-      // zero so that it doesn't become negative.
-      DCHECK_LT(0, map_->iteration_depth_);
-
-      if (--map_->iteration_depth_ == 0)
-        map_->Compact();
-    }
-
-    bool IsAtEnd() const {
-      DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
-      return iter_ == map_->data_.end();
-    }
-
-    KeyType GetCurrentKey() const {
-      DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
-      return iter_->first;
-    }
-
-    ReturnType* GetCurrentValue() const {
-      DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
-      if (!iter_->second || map_->IsRemoved(iter_->first))
-        return nullptr;
-      return &*iter_->second;
-    }
-
-    void Advance() {
-      DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
-      ++iter_;
-      SkipRemovedEntries();
-    }
-
-   private:
-    void Init() {
-      DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
-      ++map_->iteration_depth_;
-      SkipRemovedEntries();
-    }
-
-    void SkipRemovedEntries() {
-      while (iter_ != map_->data_.end() && map_->IsRemoved(iter_->first))
-        ++iter_;
-    }
-
-    IDMap<V, K>* map_;
-    typename HashTable::const_iterator iter_;
-  };
-
-  typedef Iterator<T> iterator;
-  typedef Iterator<const T> const_iterator;
-
- private:
-  // Transforms a map iterator to an iterator on the keys of the map.
-  // Used by Clear() to populate |removed_ids_| in bulk.
-  struct KeyIterator : std::iterator<std::forward_iterator_tag, KeyType> {
-    using inner_iterator = typename HashTable::iterator;
-    inner_iterator iter_;
-
-    KeyIterator(inner_iterator iter) : iter_(iter) {}
-    KeyType operator*() const { return iter_->first; }
-    KeyIterator& operator++() {
-      ++iter_;
-      return *this;
-    }
-    KeyIterator operator++(int) { return KeyIterator(iter_++); }
-    bool operator==(const KeyIterator& other) const {
-      return iter_ == other.iter_;
-    }
-    bool operator!=(const KeyIterator& other) const {
-      return iter_ != other.iter_;
-    }
-  };
-
-  KeyType AddInternal(V data) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(!check_on_null_data_ || data);
-    KeyType this_id = next_id_;
-    DCHECK(data_.find(this_id) == data_.end()) << "Inserting duplicate item";
-    data_[this_id] = std::move(data);
-    next_id_++;
-    return this_id;
-  }
-
-  void AddWithIDInternal(V data, KeyType id) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(!check_on_null_data_ || data);
-    if (IsRemoved(id)) {
-      removed_ids_.erase(id);
-    } else {
-      DCHECK(data_.find(id) == data_.end()) << "Inserting duplicate item";
-    }
-    data_[id] = std::move(data);
-  }
-
-  bool IsRemoved(KeyType key) const {
-    return removed_ids_.find(key) != removed_ids_.end();
-  }
-
-  void Compact() {
-    DCHECK_EQ(0, iteration_depth_);
-    for (const auto& i : removed_ids_)
-      data_.erase(i);
-    removed_ids_.clear();
-  }
-
-  // Keep track of how many iterators are currently iterating on us to safely
-  // handle removing items during iteration.
-  int iteration_depth_;
-
-  // Keep set of IDs that should be removed after the outermost iteration has
-  // finished. This way we manage to not invalidate the iterator when an element
-  // is removed.
-  base::flat_set<KeyType> removed_ids_;
-
-  // The next ID that we will return from Add()
-  KeyType next_id_;
-
-  HashTable data_;
-
-  // See description above setter.
-  bool check_on_null_data_;
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  DISALLOW_COPY_AND_ASSIGN(IDMap);
-};
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_ID_MAP_H_
diff --git a/base/containers/linked_list.h b/base/containers/linked_list.h
deleted file mode 100644
index a913bad..0000000
--- a/base/containers/linked_list.h
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. 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_CONTAINERS_LINKED_LIST_H_
-#define BASE_CONTAINERS_LINKED_LIST_H_
-
-#include "base/macros.h"
-
-// Simple LinkedList type. (See the Q&A section to understand how this
-// differs from std::list).
-//
-// To use, start by declaring the class which will be contained in the linked
-// list, as extending LinkNode (this gives it next/previous pointers).
-//
-//   class MyNodeType : public LinkNode<MyNodeType> {
-//     ...
-//   };
-//
-// Next, to keep track of the list's head/tail, use a LinkedList instance:
-//
-//   LinkedList<MyNodeType> list;
-//
-// To add elements to the list, use any of LinkedList::Append,
-// LinkNode::InsertBefore, or LinkNode::InsertAfter:
-//
-//   LinkNode<MyNodeType>* n1 = ...;
-//   LinkNode<MyNodeType>* n2 = ...;
-//   LinkNode<MyNodeType>* n3 = ...;
-//
-//   list.Append(n1);
-//   list.Append(n3);
-//   n3->InsertBefore(n3);
-//
-// Lastly, to iterate through the linked list forwards:
-//
-//   for (LinkNode<MyNodeType>* node = list.head();
-//        node != list.end();
-//        node = node->next()) {
-//     MyNodeType* value = node->value();
-//     ...
-//   }
-//
-// Or to iterate the linked list backwards:
-//
-//   for (LinkNode<MyNodeType>* node = list.tail();
-//        node != list.end();
-//        node = node->previous()) {
-//     MyNodeType* value = node->value();
-//     ...
-//   }
-//
-// Questions and Answers:
-//
-// Q. Should I use std::list or base::LinkedList?
-//
-// A. The main reason to use base::LinkedList over std::list is
-//    performance. If you don't care about the performance differences
-//    then use an STL container, as it makes for better code readability.
-//
-//    Comparing the performance of base::LinkedList<T> to std::list<T*>:
-//
-//    * Erasing an element of type T* from base::LinkedList<T> is
-//      an O(1) operation. Whereas for std::list<T*> it is O(n).
-//      That is because with std::list<T*> you must obtain an
-//      iterator to the T* element before you can call erase(iterator).
-//
-//    * Insertion operations with base::LinkedList<T> never require
-//      heap allocations.
-//
-// Q. How does base::LinkedList implementation differ from std::list?
-//
-// A. Doubly-linked lists are made up of nodes that contain "next" and
-//    "previous" pointers that reference other nodes in the list.
-//
-//    With base::LinkedList<T>, the type being inserted already reserves
-//    space for the "next" and "previous" pointers (base::LinkNode<T>*).
-//    Whereas with std::list<T> the type can be anything, so the implementation
-//    needs to glue on the "next" and "previous" pointers using
-//    some internal node type.
-
-namespace base {
-
-template <typename T>
-class LinkNode {
- public:
-  LinkNode() : previous_(nullptr), next_(nullptr) {}
-  LinkNode(LinkNode<T>* previous, LinkNode<T>* next)
-      : previous_(previous), next_(next) {}
-
-  LinkNode(LinkNode<T>&& rhs) {
-    next_ = rhs.next_;
-    rhs.next_ = nullptr;
-    previous_ = rhs.previous_;
-    rhs.previous_ = nullptr;
-
-    // If the node belongs to a list, next_ and previous_ are both non-null.
-    // Otherwise, they are both null.
-    if (next_) {
-      next_->previous_ = this;
-      previous_->next_ = this;
-    }
-  }
-
-  // Insert |this| into the linked list, before |e|.
-  void InsertBefore(LinkNode<T>* e) {
-    this->next_ = e;
-    this->previous_ = e->previous_;
-    e->previous_->next_ = this;
-    e->previous_ = this;
-  }
-
-  // Insert |this| into the linked list, after |e|.
-  void InsertAfter(LinkNode<T>* e) {
-    this->next_ = e->next_;
-    this->previous_ = e;
-    e->next_->previous_ = this;
-    e->next_ = this;
-  }
-
-  // Remove |this| from the linked list.
-  void RemoveFromList() {
-    this->previous_->next_ = this->next_;
-    this->next_->previous_ = this->previous_;
-    // next() and previous() return non-null if and only this node is not in any
-    // list.
-    this->next_ = nullptr;
-    this->previous_ = nullptr;
-  }
-
-  LinkNode<T>* previous() const {
-    return previous_;
-  }
-
-  LinkNode<T>* next() const {
-    return next_;
-  }
-
-  // Cast from the node-type to the value type.
-  const T* value() const {
-    return static_cast<const T*>(this);
-  }
-
-  T* value() {
-    return static_cast<T*>(this);
-  }
-
- private:
-  LinkNode<T>* previous_;
-  LinkNode<T>* next_;
-
-  DISALLOW_COPY_AND_ASSIGN(LinkNode);
-};
-
-template <typename T>
-class LinkedList {
- public:
-  // The "root" node is self-referential, and forms the basis of a circular
-  // list (root_.next() will point back to the start of the list,
-  // and root_->previous() wraps around to the end of the list).
-  LinkedList() : root_(&root_, &root_) {}
-
-  // Appends |e| to the end of the linked list.
-  void Append(LinkNode<T>* e) {
-    e->InsertBefore(&root_);
-  }
-
-  LinkNode<T>* head() const {
-    return root_.next();
-  }
-
-  LinkNode<T>* tail() const {
-    return root_.previous();
-  }
-
-  const LinkNode<T>* end() const {
-    return &root_;
-  }
-
-  bool empty() const { return head() == end(); }
-
- private:
-  LinkNode<T> root_;
-
-  DISALLOW_COPY_AND_ASSIGN(LinkedList);
-};
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_LINKED_LIST_H_
diff --git a/base/containers/mru_cache.h b/base/containers/mru_cache.h
deleted file mode 100644
index 4a9f44e..0000000
--- a/base/containers/mru_cache.h
+++ /dev/null
@@ -1,268 +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.
-
-// This file contains a template for a Most Recently Used cache that allows
-// constant-time access to items using a key, but easy identification of the
-// least-recently-used items for removal.  Each key can only be associated with
-// one payload item at a time.
-//
-// The key object will be stored twice, so it should support efficient copying.
-//
-// NOTE: While all operations are O(1), this code is written for
-// legibility rather than optimality. If future profiling identifies this as
-// a bottleneck, there is room for smaller values of 1 in the O(1). :]
-
-#ifndef BASE_CONTAINERS_MRU_CACHE_H_
-#define BASE_CONTAINERS_MRU_CACHE_H_
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <functional>
-#include <list>
-#include <map>
-#include <unordered_map>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/macros.h"
-
-namespace base {
-namespace trace_event {
-namespace internal {
-
-template <class MruCacheType>
-size_t DoEstimateMemoryUsageForMruCache(const MruCacheType&);
-
-}  // namespace internal
-}  // namespace trace_event
-
-// MRUCacheBase ----------------------------------------------------------------
-
-// This template is used to standardize map type containers that can be used
-// by MRUCacheBase. This level of indirection is necessary because of the way
-// that template template params and default template params interact.
-template <class KeyType, class ValueType, class CompareType>
-struct MRUCacheStandardMap {
-  typedef std::map<KeyType, ValueType, CompareType> Type;
-};
-
-// Base class for the MRU cache specializations defined below.
-template <class KeyType,
-          class PayloadType,
-          class HashOrCompareType,
-          template <typename, typename, typename> class MapType =
-              MRUCacheStandardMap>
-class MRUCacheBase {
- public:
-  // The payload of the list. This maintains a copy of the key so we can
-  // efficiently delete things given an element of the list.
-  typedef std::pair<KeyType, PayloadType> value_type;
-
- private:
-  typedef std::list<value_type> PayloadList;
-  typedef typename MapType<KeyType,
-                           typename PayloadList::iterator,
-                           HashOrCompareType>::Type KeyIndex;
-
- public:
-  typedef typename PayloadList::size_type size_type;
-
-  typedef typename PayloadList::iterator iterator;
-  typedef typename PayloadList::const_iterator const_iterator;
-  typedef typename PayloadList::reverse_iterator reverse_iterator;
-  typedef typename PayloadList::const_reverse_iterator const_reverse_iterator;
-
-  enum { NO_AUTO_EVICT = 0 };
-
-  // The max_size is the size at which the cache will prune its members to when
-  // a new item is inserted. If the caller wants to manager this itself (for
-  // example, maybe it has special work to do when something is evicted), it
-  // can pass NO_AUTO_EVICT to not restrict the cache size.
-  explicit MRUCacheBase(size_type max_size) : max_size_(max_size) {}
-
-  virtual ~MRUCacheBase() = default;
-
-  size_type max_size() const { return max_size_; }
-
-  // Inserts a payload item with the given key. If an existing item has
-  // the same key, it is removed prior to insertion. An iterator indicating the
-  // inserted item will be returned (this will always be the front of the list).
-  //
-  // The payload will be forwarded.
-  template <typename Payload>
-  iterator Put(const KeyType& key, Payload&& payload) {
-    // Remove any existing payload with that key.
-    typename KeyIndex::iterator index_iter = index_.find(key);
-    if (index_iter != index_.end()) {
-      // Erase the reference to it. The index reference will be replaced in the
-      // code below.
-      Erase(index_iter->second);
-    } else if (max_size_ != NO_AUTO_EVICT) {
-      // New item is being inserted which might make it larger than the maximum
-      // size: kick the oldest thing out if necessary.
-      ShrinkToSize(max_size_ - 1);
-    }
-
-    ordering_.emplace_front(key, std::forward<Payload>(payload));
-    index_.emplace(key, ordering_.begin());
-    return ordering_.begin();
-  }
-
-  // Retrieves the contents of the given key, or end() if not found. This method
-  // has the side effect of moving the requested item to the front of the
-  // recency list.
-  iterator Get(const KeyType& key) {
-    typename KeyIndex::iterator index_iter = index_.find(key);
-    if (index_iter == index_.end())
-      return end();
-    typename PayloadList::iterator iter = index_iter->second;
-
-    // Move the touched item to the front of the recency ordering.
-    ordering_.splice(ordering_.begin(), ordering_, iter);
-    return ordering_.begin();
-  }
-
-  // Retrieves the payload associated with a given key and returns it via
-  // result without affecting the ordering (unlike Get).
-  iterator Peek(const KeyType& key) {
-    typename KeyIndex::const_iterator index_iter = index_.find(key);
-    if (index_iter == index_.end())
-      return end();
-    return index_iter->second;
-  }
-
-  const_iterator Peek(const KeyType& key) const {
-    typename KeyIndex::const_iterator index_iter = index_.find(key);
-    if (index_iter == index_.end())
-      return end();
-    return index_iter->second;
-  }
-
-  // Exchanges the contents of |this| by the contents of the |other|.
-  void Swap(MRUCacheBase& other) {
-    ordering_.swap(other.ordering_);
-    index_.swap(other.index_);
-    std::swap(max_size_, other.max_size_);
-  }
-
-  // Erases the item referenced by the given iterator. An iterator to the item
-  // following it will be returned. The iterator must be valid.
-  iterator Erase(iterator pos) {
-    index_.erase(pos->first);
-    return ordering_.erase(pos);
-  }
-
-  // MRUCache entries are often processed in reverse order, so we add this
-  // convenience function (not typically defined by STL containers).
-  reverse_iterator Erase(reverse_iterator pos) {
-    // We have to actually give it the incremented iterator to delete, since
-    // the forward iterator that base() returns is actually one past the item
-    // being iterated over.
-    return reverse_iterator(Erase((++pos).base()));
-  }
-
-  // Shrinks the cache so it only holds |new_size| items. If |new_size| is
-  // bigger or equal to the current number of items, this will do nothing.
-  void ShrinkToSize(size_type new_size) {
-    for (size_type i = size(); i > new_size; i--)
-      Erase(rbegin());
-  }
-
-  // Deletes everything from the cache.
-  void Clear() {
-    index_.clear();
-    ordering_.clear();
-  }
-
-  // Returns the number of elements in the cache.
-  size_type size() const {
-    // We don't use ordering_.size() for the return value because
-    // (as a linked list) it can be O(n).
-    DCHECK(index_.size() == ordering_.size());
-    return index_.size();
-  }
-
-  // Allows iteration over the list. Forward iteration starts with the most
-  // recent item and works backwards.
-  //
-  // Note that since these iterators are actually iterators over a list, you
-  // can keep them as you insert or delete things (as long as you don't delete
-  // the one you are pointing to) and they will still be valid.
-  iterator begin() { return ordering_.begin(); }
-  const_iterator begin() const { return ordering_.begin(); }
-  iterator end() { return ordering_.end(); }
-  const_iterator end() const { return ordering_.end(); }
-
-  reverse_iterator rbegin() { return ordering_.rbegin(); }
-  const_reverse_iterator rbegin() const { return ordering_.rbegin(); }
-  reverse_iterator rend() { return ordering_.rend(); }
-  const_reverse_iterator rend() const { return ordering_.rend(); }
-
-  bool empty() const { return ordering_.empty(); }
-
- private:
-  template <class MruCacheType>
-  friend size_t trace_event::internal::DoEstimateMemoryUsageForMruCache(
-      const MruCacheType&);
-
-  PayloadList ordering_;
-  KeyIndex index_;
-
-  size_type max_size_;
-
-  DISALLOW_COPY_AND_ASSIGN(MRUCacheBase);
-};
-
-// MRUCache --------------------------------------------------------------------
-
-// A container that does not do anything to free its data. Use this when storing
-// value types (as opposed to pointers) in the list.
-template <class KeyType,
-          class PayloadType,
-          class CompareType = std::less<KeyType>>
-class MRUCache : public MRUCacheBase<KeyType, PayloadType, CompareType> {
- private:
-  using ParentType = MRUCacheBase<KeyType, PayloadType, CompareType>;
-
- public:
-  // See MRUCacheBase, noting the possibility of using NO_AUTO_EVICT.
-  explicit MRUCache(typename ParentType::size_type max_size)
-      : ParentType(max_size) {}
-  virtual ~MRUCache() = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MRUCache);
-};
-
-// HashingMRUCache ------------------------------------------------------------
-
-template <class KeyType, class ValueType, class HashType>
-struct MRUCacheHashMap {
-  typedef std::unordered_map<KeyType, ValueType, HashType> Type;
-};
-
-// This class is similar to MRUCache, except that it uses std::unordered_map as
-// the map type instead of std::map. Note that your KeyType must be hashable to
-// use this cache or you need to provide a hashing class.
-template <class KeyType, class PayloadType, class HashType = std::hash<KeyType>>
-class HashingMRUCache
-    : public MRUCacheBase<KeyType, PayloadType, HashType, MRUCacheHashMap> {
- private:
-  using ParentType =
-      MRUCacheBase<KeyType, PayloadType, HashType, MRUCacheHashMap>;
-
- public:
-  // See MRUCacheBase, noting the possibility of using NO_AUTO_EVICT.
-  explicit HashingMRUCache(typename ParentType::size_type max_size)
-      : ParentType(max_size) {}
-  virtual ~HashingMRUCache() = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(HashingMRUCache);
-};
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_MRU_CACHE_H_
diff --git a/base/containers/ring_buffer.h b/base/containers/ring_buffer.h
deleted file mode 100644
index 4e48907..0000000
--- a/base/containers/ring_buffer.h
+++ /dev/null
@@ -1,119 +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 BASE_CONTAINERS_RING_BUFFER_H_
-#define BASE_CONTAINERS_RING_BUFFER_H_
-
-#include <stddef.h>
-
-#include "base/logging.h"
-#include "base/macros.h"
-
-namespace base {
-
-// base::RingBuffer uses a fixed-size array, unlike base::circular_deque and
-// std::deque, and so, one can access only the last |kSize| elements. Also, you
-// can add elements to the front and read/modify random elements, but cannot
-// remove elements from the back. Therefore, it does not have a |Size| method,
-// only |BufferSize|, which is a constant, and |CurrentIndex|, which is the
-// number of elements added so far.
-//
-// If the above is sufficient for your use case, base::RingBuffer should be more
-// efficient than base::circular_deque.
-template <typename T, size_t kSize>
-class RingBuffer {
- public:
-  RingBuffer() : current_index_(0) {}
-
-  size_t BufferSize() const { return kSize; }
-
-  size_t CurrentIndex() const { return current_index_; }
-
-  // tests if a value was saved to this index
-  bool IsFilledIndex(size_t n) const { return BufferIndex(n) < current_index_; }
-
-  // n = 0 returns the oldest value and
-  // n = bufferSize() - 1 returns the most recent value.
-  const T& ReadBuffer(size_t n) const {
-    DCHECK(IsFilledIndex(n));
-    return buffer_[BufferIndex(n)];
-  }
-
-  T* MutableReadBuffer(size_t n) {
-    DCHECK(IsFilledIndex(n));
-    return &buffer_[BufferIndex(n)];
-  }
-
-  void SaveToBuffer(const T& value) {
-    buffer_[BufferIndex(0)] = value;
-    current_index_++;
-  }
-
-  void Clear() { current_index_ = 0; }
-
-  // Iterator has const access to the RingBuffer it got retrieved from.
-  class Iterator {
-   public:
-    size_t index() const { return index_; }
-
-    const T* operator->() const { return &buffer_.ReadBuffer(index_); }
-    const T* operator*() const { return &buffer_.ReadBuffer(index_); }
-
-    Iterator& operator++() {
-      index_++;
-      if (index_ == kSize)
-        out_of_range_ = true;
-      return *this;
-    }
-
-    Iterator& operator--() {
-      if (index_ == 0)
-        out_of_range_ = true;
-      index_--;
-      return *this;
-    }
-
-    operator bool() const {
-      return buffer_.IsFilledIndex(index_) && !out_of_range_;
-    }
-
-   private:
-    Iterator(const RingBuffer<T, kSize>& buffer, size_t index)
-        : buffer_(buffer), index_(index), out_of_range_(false) {}
-
-    const RingBuffer<T, kSize>& buffer_;
-    size_t index_;
-    bool out_of_range_;
-
-    friend class RingBuffer<T, kSize>;
-  };
-
-  // Returns an Iterator pointing to the oldest value in the buffer.
-  // Example usage (iterate from oldest to newest value):
-  //  for (RingBuffer<T, kSize>::Iterator it = ring_buffer.Begin(); it; ++it) {}
-  Iterator Begin() const {
-    if (current_index_ < kSize)
-      return Iterator(*this, kSize - current_index_);
-    return Iterator(*this, 0);
-  }
-
-  // Returns an Iterator pointing to the newest value in the buffer.
-  // Example usage (iterate backwards from newest to oldest value):
-  //  for (RingBuffer<T, kSize>::Iterator it = ring_buffer.End(); it; --it) {}
-  Iterator End() const { return Iterator(*this, kSize - 1); }
-
- private:
-  inline size_t BufferIndex(size_t n) const {
-    return (current_index_ + n) % kSize;
-  }
-
-  T buffer_[kSize];
-  size_t current_index_;
-
-  DISALLOW_COPY_AND_ASSIGN(RingBuffer);
-};
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_RING_BUFFER_H_
diff --git a/base/containers/small_map.h b/base/containers/small_map.h
deleted file mode 100644
index a235f11..0000000
--- a/base/containers/small_map.h
+++ /dev/null
@@ -1,659 +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_CONTAINERS_SMALL_MAP_H_
-#define BASE_CONTAINERS_SMALL_MAP_H_
-
-#include <stddef.h>
-
-#include <map>
-#include <new>
-#include <string>
-#include <utility>
-
-#include "base/logging.h"
-
-namespace base {
-
-// small_map is a container with a std::map-like interface. It starts out
-// backed by a unsorted array but switches to some other container type if it
-// grows beyond this fixed size.
-//
-// Please see //base/containers/README.md for an overview of which container
-// to select.
-//
-// PROS
-//
-//  - Good memory locality and low overhead for smaller maps.
-//  - Handles large maps without the degenerate performance of flat_map.
-//
-// CONS
-//
-//  - Larger code size than the alternatives.
-//
-// IMPORTANT NOTES
-//
-//  - Iterators are invalidated across mutations.
-//
-// DETAILS
-//
-// base::small_map will pick up the comparator from the underlying map type. In
-// std::map only a "less" operator is defined, which requires us to do two
-// comparisons per element when doing the brute-force search in the simple
-// array. std::unordered_map has a key_equal function which will be used.
-//
-// We define default overrides for the common map types to avoid this
-// double-compare, but you should be aware of this if you use your own
-// operator< for your map and supply yor own version of == to the small_map.
-// You can use regular operator== by just doing:
-//
-//   base::small_map<std::map<MyKey, MyValue>, 4, std::equal_to<KyKey>>
-//
-//
-// USAGE
-// -----
-//
-// NormalMap:  The map type to fall back to.  This also defines the key
-//             and value types for the small_map.
-// kArraySize:  The size of the initial array of results. This will be
-//              allocated with the small_map object rather than separately on
-//              the heap. Once the map grows beyond this size, the map type
-//              will be used instead.
-// EqualKey:  A functor which tests two keys for equality.  If the wrapped
-//            map type has a "key_equal" member (hash_map does), then that will
-//            be used by default. If the wrapped map type has a strict weak
-//            ordering "key_compare" (std::map does), that will be used to
-//            implement equality by default.
-// MapInit: A functor that takes a NormalMap* and uses it to initialize the map.
-//          This functor will be called at most once per small_map, when the map
-//          exceeds the threshold of kArraySize and we are about to copy values
-//          from the array to the map. The functor *must* initialize the
-//          NormalMap* argument with placement new, since after it runs we
-//          assume that the NormalMap has been initialized.
-//
-// example:
-//   base::small_map<std::map<string, int>> days;
-//   days["sunday"   ] = 0;
-//   days["monday"   ] = 1;
-//   days["tuesday"  ] = 2;
-//   days["wednesday"] = 3;
-//   days["thursday" ] = 4;
-//   days["friday"   ] = 5;
-//   days["saturday" ] = 6;
-
-namespace internal {
-
-template <typename NormalMap>
-class small_map_default_init {
- public:
-  void operator()(NormalMap* map) const { new (map) NormalMap(); }
-};
-
-// has_key_equal<M>::value is true iff there exists a type M::key_equal. This is
-// used to dispatch to one of the select_equal_key<> metafunctions below.
-template <typename M>
-struct has_key_equal {
-  typedef char sml;  // "small" is sometimes #defined so we use an abbreviation.
-  typedef struct { char dummy[2]; } big;
-  // Two functions, one accepts types that have a key_equal member, and one that
-  // accepts anything. They each return a value of a different size, so we can
-  // determine at compile-time which function would have been called.
-  template <typename U> static big test(typename U::key_equal*);
-  template <typename> static sml test(...);
-  // Determines if M::key_equal exists by looking at the size of the return
-  // type of the compiler-chosen test() function.
-  static const bool value = (sizeof(test<M>(0)) == sizeof(big));
-};
-template <typename M> const bool has_key_equal<M>::value;
-
-// Base template used for map types that do NOT have an M::key_equal member,
-// e.g., std::map<>. These maps have a strict weak ordering comparator rather
-// than an equality functor, so equality will be implemented in terms of that
-// comparator.
-//
-// There's a partial specialization of this template below for map types that do
-// have an M::key_equal member.
-template <typename M, bool has_key_equal_value>
-struct select_equal_key {
-  struct equal_key {
-    bool operator()(const typename M::key_type& left,
-                    const typename M::key_type& right) {
-      // Implements equality in terms of a strict weak ordering comparator.
-      typename M::key_compare comp;
-      return !comp(left, right) && !comp(right, left);
-    }
-  };
-};
-
-// Provide overrides to use operator== for key compare for the "normal" map and
-// hash map types. If you override the default comparator or allocator for a
-// map or hash_map, or use another type of map, this won't get used.
-//
-// If we switch to using std::unordered_map for base::hash_map, then the
-// hash_map specialization can be removed.
-template <typename KeyType, typename ValueType>
-struct select_equal_key<std::map<KeyType, ValueType>, false> {
-  struct equal_key {
-    bool operator()(const KeyType& left, const KeyType& right) {
-      return left == right;
-    }
-  };
-};
-template <typename KeyType, typename ValueType>
-struct select_equal_key<base::hash_map<KeyType, ValueType>, false> {
-  struct equal_key {
-    bool operator()(const KeyType& left, const KeyType& right) {
-      return left == right;
-    }
-  };
-};
-
-// Partial template specialization handles case where M::key_equal exists, e.g.,
-// hash_map<>.
-template <typename M>
-struct select_equal_key<M, true> {
-  typedef typename M::key_equal equal_key;
-};
-
-}  // namespace internal
-
-template <typename NormalMap,
-          int kArraySize = 4,
-          typename EqualKey = typename internal::select_equal_key<
-              NormalMap,
-              internal::has_key_equal<NormalMap>::value>::equal_key,
-          typename MapInit = internal::small_map_default_init<NormalMap>>
-class small_map {
-  // We cannot rely on the compiler to reject array of size 0.  In
-  // particular, gcc 2.95.3 does it but later versions allow 0-length
-  // arrays.  Therefore, we explicitly reject non-positive kArraySize
-  // here.
-  static_assert(kArraySize > 0, "default initial size should be positive");
-
- public:
-  typedef typename NormalMap::key_type key_type;
-  typedef typename NormalMap::mapped_type data_type;
-  typedef typename NormalMap::mapped_type mapped_type;
-  typedef typename NormalMap::value_type value_type;
-  typedef EqualKey key_equal;
-
-  small_map() : size_(0), functor_(MapInit()) {}
-
-  explicit small_map(const MapInit& functor) : size_(0), functor_(functor) {}
-
-  // Allow copy-constructor and assignment, since STL allows them too.
-  small_map(const small_map& src) {
-    // size_ and functor_ are initted in InitFrom()
-    InitFrom(src);
-  }
-  void operator=(const small_map& src) {
-    if (&src == this) return;
-
-    // This is not optimal. If src and dest are both using the small
-    // array, we could skip the teardown and reconstruct. One problem
-    // to be resolved is that the value_type itself is pair<const K,
-    // V>, and const K is not assignable.
-    Destroy();
-    InitFrom(src);
-  }
-  ~small_map() { Destroy(); }
-
-  class const_iterator;
-
-  class iterator {
-   public:
-    typedef typename NormalMap::iterator::iterator_category iterator_category;
-    typedef typename NormalMap::iterator::value_type value_type;
-    typedef typename NormalMap::iterator::difference_type difference_type;
-    typedef typename NormalMap::iterator::pointer pointer;
-    typedef typename NormalMap::iterator::reference reference;
-
-    inline iterator(): array_iter_(NULL) {}
-
-    inline iterator& operator++() {
-      if (array_iter_ != NULL) {
-        ++array_iter_;
-      } else {
-        ++hash_iter_;
-      }
-      return *this;
-    }
-    inline iterator operator++(int /*unused*/) {
-      iterator result(*this);
-      ++(*this);
-      return result;
-    }
-    inline iterator& operator--() {
-      if (array_iter_ != NULL) {
-        --array_iter_;
-      } else {
-        --hash_iter_;
-      }
-      return *this;
-    }
-    inline iterator operator--(int /*unused*/) {
-      iterator result(*this);
-      --(*this);
-      return result;
-    }
-    inline value_type* operator->() const {
-      if (array_iter_ != NULL) {
-        return array_iter_;
-      } else {
-        return hash_iter_.operator->();
-      }
-    }
-
-    inline value_type& operator*() const {
-      if (array_iter_ != NULL) {
-        return *array_iter_;
-      } else {
-        return *hash_iter_;
-      }
-    }
-
-    inline bool operator==(const iterator& other) const {
-      if (array_iter_ != NULL) {
-        return array_iter_ == other.array_iter_;
-      } else {
-        return other.array_iter_ == NULL && hash_iter_ == other.hash_iter_;
-      }
-    }
-
-    inline bool operator!=(const iterator& other) const {
-      return !(*this == other);
-    }
-
-    bool operator==(const const_iterator& other) const;
-    bool operator!=(const const_iterator& other) const;
-
-   private:
-    friend class small_map;
-    friend class const_iterator;
-    inline explicit iterator(value_type* init) : array_iter_(init) {}
-    inline explicit iterator(const typename NormalMap::iterator& init)
-      : array_iter_(NULL), hash_iter_(init) {}
-
-    value_type* array_iter_;
-    typename NormalMap::iterator hash_iter_;
-  };
-
-  class const_iterator {
-   public:
-    typedef typename NormalMap::const_iterator::iterator_category
-        iterator_category;
-    typedef typename NormalMap::const_iterator::value_type value_type;
-    typedef typename NormalMap::const_iterator::difference_type difference_type;
-    typedef typename NormalMap::const_iterator::pointer pointer;
-    typedef typename NormalMap::const_iterator::reference reference;
-
-    inline const_iterator(): array_iter_(NULL) {}
-    // Non-explicit ctor lets us convert regular iterators to const iterators
-    inline const_iterator(const iterator& other)
-      : array_iter_(other.array_iter_), hash_iter_(other.hash_iter_) {}
-
-    inline const_iterator& operator++() {
-      if (array_iter_ != NULL) {
-        ++array_iter_;
-      } else {
-        ++hash_iter_;
-      }
-      return *this;
-    }
-    inline const_iterator operator++(int /*unused*/) {
-      const_iterator result(*this);
-      ++(*this);
-      return result;
-    }
-
-    inline const_iterator& operator--() {
-      if (array_iter_ != NULL) {
-        --array_iter_;
-      } else {
-        --hash_iter_;
-      }
-      return *this;
-    }
-    inline const_iterator operator--(int /*unused*/) {
-      const_iterator result(*this);
-      --(*this);
-      return result;
-    }
-
-    inline const value_type* operator->() const {
-      if (array_iter_ != NULL) {
-        return array_iter_;
-      } else {
-        return hash_iter_.operator->();
-      }
-    }
-
-    inline const value_type& operator*() const {
-      if (array_iter_ != NULL) {
-        return *array_iter_;
-      } else {
-        return *hash_iter_;
-      }
-    }
-
-    inline bool operator==(const const_iterator& other) const {
-      if (array_iter_ != NULL) {
-        return array_iter_ == other.array_iter_;
-      } else {
-        return other.array_iter_ == NULL && hash_iter_ == other.hash_iter_;
-      }
-    }
-
-    inline bool operator!=(const const_iterator& other) const {
-      return !(*this == other);
-    }
-
-   private:
-    friend class small_map;
-    inline explicit const_iterator(const value_type* init)
-        : array_iter_(init) {}
-    inline explicit const_iterator(
-        const typename NormalMap::const_iterator& init)
-      : array_iter_(NULL), hash_iter_(init) {}
-
-    const value_type* array_iter_;
-    typename NormalMap::const_iterator hash_iter_;
-  };
-
-  iterator find(const key_type& key) {
-    key_equal compare;
-    if (size_ >= 0) {
-      for (int i = 0; i < size_; i++) {
-        if (compare(array_[i].first, key)) {
-          return iterator(array_ + i);
-        }
-      }
-      return iterator(array_ + size_);
-    } else {
-      return iterator(map()->find(key));
-    }
-  }
-
-  const_iterator find(const key_type& key) const {
-    key_equal compare;
-    if (size_ >= 0) {
-      for (int i = 0; i < size_; i++) {
-        if (compare(array_[i].first, key)) {
-          return const_iterator(array_ + i);
-        }
-      }
-      return const_iterator(array_ + size_);
-    } else {
-      return const_iterator(map()->find(key));
-    }
-  }
-
-  // Invalidates iterators.
-  data_type& operator[](const key_type& key) {
-    key_equal compare;
-
-    if (size_ >= 0) {
-      // operator[] searches backwards, favoring recently-added
-      // elements.
-      for (int i = size_-1; i >= 0; --i) {
-        if (compare(array_[i].first, key)) {
-          return array_[i].second;
-        }
-      }
-      if (size_ == kArraySize) {
-        ConvertToRealMap();
-        return map_[key];
-      } else {
-        new (&array_[size_]) value_type(key, data_type());
-        return array_[size_++].second;
-      }
-    } else {
-      return map_[key];
-    }
-  }
-
-  // Invalidates iterators.
-  std::pair<iterator, bool> insert(const value_type& x) {
-    key_equal compare;
-
-    if (size_ >= 0) {
-      for (int i = 0; i < size_; i++) {
-        if (compare(array_[i].first, x.first)) {
-          return std::make_pair(iterator(array_ + i), false);
-        }
-      }
-      if (size_ == kArraySize) {
-        ConvertToRealMap();  // Invalidates all iterators!
-        std::pair<typename NormalMap::iterator, bool> ret = map_.insert(x);
-        return std::make_pair(iterator(ret.first), ret.second);
-      } else {
-        new (&array_[size_]) value_type(x);
-        return std::make_pair(iterator(array_ + size_++), true);
-      }
-    } else {
-      std::pair<typename NormalMap::iterator, bool> ret = map_.insert(x);
-      return std::make_pair(iterator(ret.first), ret.second);
-    }
-  }
-
-  // Invalidates iterators.
-  template <class InputIterator>
-  void insert(InputIterator f, InputIterator l) {
-    while (f != l) {
-      insert(*f);
-      ++f;
-    }
-  }
-
-  // Invalidates iterators.
-  template <typename... Args>
-  std::pair<iterator, bool> emplace(Args&&... args) {
-    key_equal compare;
-
-    if (size_ >= 0) {
-      value_type x(std::forward<Args>(args)...);
-      for (int i = 0; i < size_; i++) {
-        if (compare(array_[i].first, x.first)) {
-          return std::make_pair(iterator(array_ + i), false);
-        }
-      }
-      if (size_ == kArraySize) {
-        ConvertToRealMap();  // Invalidates all iterators!
-        std::pair<typename NormalMap::iterator, bool> ret =
-            map_.emplace(std::move(x));
-        return std::make_pair(iterator(ret.first), ret.second);
-      } else {
-        new (&array_[size_]) value_type(std::move(x));
-        return std::make_pair(iterator(array_ + size_++), true);
-      }
-    } else {
-      std::pair<typename NormalMap::iterator, bool> ret =
-          map_.emplace(std::forward<Args>(args)...);
-      return std::make_pair(iterator(ret.first), ret.second);
-    }
-  }
-
-  iterator begin() {
-    if (size_ >= 0) {
-      return iterator(array_);
-    } else {
-      return iterator(map_.begin());
-    }
-  }
-  const_iterator begin() const {
-    if (size_ >= 0) {
-      return const_iterator(array_);
-    } else {
-      return const_iterator(map_.begin());
-    }
-  }
-
-  iterator end() {
-    if (size_ >= 0) {
-      return iterator(array_ + size_);
-    } else {
-      return iterator(map_.end());
-    }
-  }
-  const_iterator end() const {
-    if (size_ >= 0) {
-      return const_iterator(array_ + size_);
-    } else {
-      return const_iterator(map_.end());
-    }
-  }
-
-  void clear() {
-    if (size_ >= 0) {
-      for (int i = 0; i < size_; i++) {
-        array_[i].~value_type();
-      }
-    } else {
-      map_.~NormalMap();
-    }
-    size_ = 0;
-  }
-
-  // Invalidates iterators. Returns iterator following the last removed element.
-  iterator erase(const iterator& position) {
-    if (size_ >= 0) {
-      int i = position.array_iter_ - array_;
-      array_[i].~value_type();
-      --size_;
-      if (i != size_) {
-        new (&array_[i]) value_type(std::move(array_[size_]));
-        array_[size_].~value_type();
-        return iterator(array_ + i);
-      }
-      return end();
-    }
-    return iterator(map_.erase(position.hash_iter_));
-  }
-
-  size_t erase(const key_type& key) {
-    iterator iter = find(key);
-    if (iter == end()) return 0u;
-    erase(iter);
-    return 1u;
-  }
-
-  size_t count(const key_type& key) const {
-    return (find(key) == end()) ? 0 : 1;
-  }
-
-  size_t size() const {
-    if (size_ >= 0) {
-      return static_cast<size_t>(size_);
-    } else {
-      return map_.size();
-    }
-  }
-
-  bool empty() const {
-    if (size_ >= 0) {
-      return (size_ == 0);
-    } else {
-      return map_.empty();
-    }
-  }
-
-  // Returns true if we have fallen back to using the underlying map
-  // representation.
-  bool UsingFullMap() const {
-    return size_ < 0;
-  }
-
-  inline NormalMap* map() {
-    CHECK(UsingFullMap());
-    return &map_;
-  }
-  inline const NormalMap* map() const {
-    CHECK(UsingFullMap());
-    return &map_;
-  }
-
- private:
-  int size_;  // negative = using hash_map
-
-  MapInit functor_;
-
-  // We want to call constructors and destructors manually, but we don't want to
-  // allocate and deallocate the memory used for them separately. Since array_
-  // and map_ are mutually exclusive, we'll put them in a union.
-  union {
-    value_type array_[kArraySize];
-    NormalMap map_;
-  };
-
-  void ConvertToRealMap() {
-    // Storage for the elements in the temporary array. This is intentionally
-    // declared as a union to avoid having to default-construct |kArraySize|
-    // elements, only to move construct over them in the initial loop.
-    union Storage {
-      Storage() {}
-      ~Storage() {}
-      value_type array[kArraySize];
-    } temp;
-
-    // Move the current elements into a temporary array.
-    for (int i = 0; i < kArraySize; i++) {
-      new (&temp.array[i]) value_type(std::move(array_[i]));
-      array_[i].~value_type();
-    }
-
-    // Initialize the map.
-    size_ = -1;
-    functor_(&map_);
-
-    // Insert elements into it.
-    for (int i = 0; i < kArraySize; i++) {
-      map_.insert(std::move(temp.array[i]));
-      temp.array[i].~value_type();
-    }
-  }
-
-  // Helpers for constructors and destructors.
-  void InitFrom(const small_map& src) {
-    functor_ = src.functor_;
-    size_ = src.size_;
-    if (src.size_ >= 0) {
-      for (int i = 0; i < size_; i++) {
-        new (&array_[i]) value_type(src.array_[i]);
-      }
-    } else {
-      functor_(&map_);
-      map_ = src.map_;
-    }
-  }
-  void Destroy() {
-    if (size_ >= 0) {
-      for (int i = 0; i < size_; i++) {
-        array_[i].~value_type();
-      }
-    } else {
-      map_.~NormalMap();
-    }
-  }
-};
-
-template <typename NormalMap,
-          int kArraySize,
-          typename EqualKey,
-          typename Functor>
-inline bool small_map<NormalMap, kArraySize, EqualKey, Functor>::iterator::
-operator==(const const_iterator& other) const {
-  return other == *this;
-}
-template <typename NormalMap,
-          int kArraySize,
-          typename EqualKey,
-          typename Functor>
-inline bool small_map<NormalMap, kArraySize, EqualKey, Functor>::iterator::
-operator!=(const const_iterator& other) const {
-  return other != *this;
-}
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_SMALL_MAP_H_
diff --git a/base/containers/stack_container.h b/base/containers/stack_container.h
deleted file mode 100644
index 7d84d07..0000000
--- a/base/containers/stack_container.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.
-
-#ifndef BASE_CONTAINERS_STACK_CONTAINER_H_
-#define BASE_CONTAINERS_STACK_CONTAINER_H_
-
-#include <stddef.h>
-
-#include <vector>
-
-#include "base/macros.h"
-#include "build_config.h"
-
-namespace base {
-
-// This allocator can be used with STL containers to provide a stack buffer
-// from which to allocate memory and overflows onto the heap. This stack buffer
-// would be allocated on the stack and allows us to avoid heap operations in
-// some situations.
-//
-// STL likes to make copies of allocators, so the allocator itself can't hold
-// the data. Instead, we make the creator responsible for creating a
-// StackAllocator::Source which contains the data. Copying the allocator
-// merely copies the pointer to this shared source, so all allocators created
-// based on our allocator will share the same stack buffer.
-//
-// This stack buffer implementation is very simple. The first allocation that
-// fits in the stack buffer will use the stack buffer. Any subsequent
-// allocations will not use the stack buffer, even if there is unused room.
-// This makes it appropriate for array-like containers, but the caller should
-// be sure to reserve() in the container up to the stack buffer size. Otherwise
-// the container will allocate a small array which will "use up" the stack
-// buffer.
-template<typename T, size_t stack_capacity>
-class StackAllocator : public std::allocator<T> {
- public:
-  typedef typename std::allocator<T>::pointer pointer;
-  typedef typename std::allocator<T>::size_type size_type;
-
-  // Backing store for the allocator. The container owner is responsible for
-  // maintaining this for as long as any containers using this allocator are
-  // live.
-  struct Source {
-    Source() : used_stack_buffer_(false) {
-    }
-
-    // Casts the buffer in its right type.
-    T* stack_buffer() { return reinterpret_cast<T*>(stack_buffer_); }
-    const T* stack_buffer() const {
-      return reinterpret_cast<const T*>(&stack_buffer_);
-    }
-
-    // The buffer itself. It is not of type T because we don't want the
-    // constructors and destructors to be automatically called. Define a POD
-    // buffer of the right size instead.
-    alignas(T) char stack_buffer_[sizeof(T[stack_capacity])];
-#if defined(__GNUC__) && !defined(ARCH_CPU_X86_FAMILY)
-    static_assert(alignof(T) <= 16, "http://crbug.com/115612");
-#endif
-
-    // Set when the stack buffer is used for an allocation. We do not track
-    // how much of the buffer is used, only that somebody is using it.
-    bool used_stack_buffer_;
-  };
-
-  // Used by containers when they want to refer to an allocator of type U.
-  template<typename U>
-  struct rebind {
-    typedef StackAllocator<U, stack_capacity> other;
-  };
-
-  // For the straight up copy c-tor, we can share storage.
-  StackAllocator(const StackAllocator<T, stack_capacity>& rhs)
-      : std::allocator<T>(), source_(rhs.source_) {
-  }
-
-  // ISO C++ requires the following constructor to be defined,
-  // and std::vector in VC++2008SP1 Release fails with an error
-  // in the class _Container_base_aux_alloc_real (from <xutility>)
-  // if the constructor does not exist.
-  // For this constructor, we cannot share storage; there's
-  // no guarantee that the Source buffer of Ts is large enough
-  // for Us.
-  // TODO: If we were fancy pants, perhaps we could share storage
-  // iff sizeof(T) == sizeof(U).
-  template<typename U, size_t other_capacity>
-  StackAllocator(const StackAllocator<U, other_capacity>& other)
-      : source_(NULL) {
-  }
-
-  // This constructor must exist. It creates a default allocator that doesn't
-  // actually have a stack buffer. glibc's std::string() will compare the
-  // current allocator against the default-constructed allocator, so this
-  // should be fast.
-  StackAllocator() : source_(NULL) {
-  }
-
-  explicit StackAllocator(Source* source) : source_(source) {
-  }
-
-  // Actually do the allocation. Use the stack buffer if nobody has used it yet
-  // and the size requested fits. Otherwise, fall through to the standard
-  // allocator.
-  pointer allocate(size_type n, void* hint = 0) {
-    if (source_ != NULL && !source_->used_stack_buffer_
-        && n <= stack_capacity) {
-      source_->used_stack_buffer_ = true;
-      return source_->stack_buffer();
-    } else {
-      return std::allocator<T>::allocate(n, hint);
-    }
-  }
-
-  // Free: when trying to free the stack buffer, just mark it as free. For
-  // non-stack-buffer pointers, just fall though to the standard allocator.
-  void deallocate(pointer p, size_type n) {
-    if (source_ != NULL && p == source_->stack_buffer())
-      source_->used_stack_buffer_ = false;
-    else
-      std::allocator<T>::deallocate(p, n);
-  }
-
- private:
-  Source* source_;
-};
-
-// A wrapper around STL containers that maintains a stack-sized buffer that the
-// initial capacity of the vector is based on. Growing the container beyond the
-// stack capacity will transparently overflow onto the heap. The container must
-// support reserve().
-//
-// This will not work with std::string since some implementations allocate
-// more bytes than requested in calls to reserve(), forcing the allocation onto
-// the heap.  http://crbug.com/709273
-//
-// WATCH OUT: the ContainerType MUST use the proper StackAllocator for this
-// type. This object is really intended to be used only internally. You'll want
-// to use the wrappers below for different types.
-template<typename TContainerType, int stack_capacity>
-class StackContainer {
- public:
-  typedef TContainerType ContainerType;
-  typedef typename ContainerType::value_type ContainedType;
-  typedef StackAllocator<ContainedType, stack_capacity> Allocator;
-
-  // Allocator must be constructed before the container!
-  StackContainer() : allocator_(&stack_data_), container_(allocator_) {
-    // Make the container use the stack allocation by reserving our buffer size
-    // before doing anything else.
-    container_.reserve(stack_capacity);
-  }
-
-  // Getters for the actual container.
-  //
-  // Danger: any copies of this made using the copy constructor must have
-  // shorter lifetimes than the source. The copy will share the same allocator
-  // and therefore the same stack buffer as the original. Use std::copy to
-  // copy into a "real" container for longer-lived objects.
-  ContainerType& container() { return container_; }
-  const ContainerType& container() const { return container_; }
-
-  // Support operator-> to get to the container. This allows nicer syntax like:
-  //   StackContainer<...> foo;
-  //   std::sort(foo->begin(), foo->end());
-  ContainerType* operator->() { return &container_; }
-  const ContainerType* operator->() const { return &container_; }
-
-#ifdef UNIT_TEST
-  // Retrieves the stack source so that that unit tests can verify that the
-  // buffer is being used properly.
-  const typename Allocator::Source& stack_data() const {
-    return stack_data_;
-  }
-#endif
-
- protected:
-  typename Allocator::Source stack_data_;
-  Allocator allocator_;
-  ContainerType container_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(StackContainer);
-};
-
-// StackVector -----------------------------------------------------------------
-
-// Example:
-//   StackVector<int, 16> foo;
-//   foo->push_back(22);  // we have overloaded operator->
-//   foo[0] = 10;         // as well as operator[]
-template<typename T, size_t stack_capacity>
-class StackVector : public StackContainer<
-    std::vector<T, StackAllocator<T, stack_capacity> >,
-    stack_capacity> {
- public:
-  StackVector() : StackContainer<
-      std::vector<T, StackAllocator<T, stack_capacity> >,
-      stack_capacity>() {
-  }
-
-  // We need to put this in STL containers sometimes, which requires a copy
-  // constructor. We can't call the regular copy constructor because that will
-  // take the stack buffer from the original. Here, we create an empty object
-  // and make a stack buffer of its own.
-  StackVector(const StackVector<T, stack_capacity>& other)
-      : StackContainer<
-            std::vector<T, StackAllocator<T, stack_capacity> >,
-            stack_capacity>() {
-    this->container().assign(other->begin(), other->end());
-  }
-
-  StackVector<T, stack_capacity>& operator=(
-      const StackVector<T, stack_capacity>& other) {
-    this->container().assign(other->begin(), other->end());
-    return *this;
-  }
-
-  // Vectors are commonly indexed, which isn't very convenient even with
-  // operator-> (using "->at()" does exception stuff we don't want).
-  T& operator[](size_t i) { return this->container().operator[](i); }
-  const T& operator[](size_t i) const {
-    return this->container().operator[](i);
-  }
-};
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_STACK_CONTAINER_H_
diff --git a/base/containers/unique_ptr_adapters.h b/base/containers/unique_ptr_adapters.h
deleted file mode 100644
index 42fab19..0000000
--- a/base/containers/unique_ptr_adapters.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_CONTAINERS_UNIQUE_PTR_ADAPTERS_H_
-#define BASE_CONTAINERS_UNIQUE_PTR_ADAPTERS_H_
-
-#include <memory>
-
-namespace base {
-
-// This transparent comparator allows to lookup by raw pointer in
-// a container of unique pointers. This functionality is based on C++14
-// extensions to std::set/std::map interface, and can also be used
-// with base::flat_set/base::flat_map.
-//
-// Example usage:
-//   Foo* foo = ...
-//   std::set<std::unique_ptr<Foo>, base::UniquePtrComparator> set;
-//   set.insert(std::unique_ptr<Foo>(foo));
-//   ...
-//   auto it = set.find(foo);
-//   EXPECT_EQ(foo, it->get());
-//
-// You can find more information about transparent comparisons here:
-// http://en.cppreference.com/w/cpp/utility/functional/less_void
-struct UniquePtrComparator {
-  using is_transparent = int;
-
-  template <typename T>
-  bool operator()(const std::unique_ptr<T>& lhs,
-                  const std::unique_ptr<T>& rhs) const {
-    return lhs < rhs;
-  }
-
-  template <typename T>
-  bool operator()(const T* lhs, const std::unique_ptr<T>& rhs) const {
-    return lhs < rhs.get();
-  }
-
-  template <typename T>
-  bool operator()(const std::unique_ptr<T>& lhs, const T* rhs) const {
-    return lhs.get() < rhs;
-  }
-};
-
-// UniquePtrMatcher is useful for finding an element in a container of
-// unique_ptrs when you have the raw pointer.
-//
-// Example usage:
-//   std::vector<std::unique_ptr<Foo>> vector;
-//   Foo* element = ...
-//   auto iter = std::find_if(vector.begin(), vector.end(),
-//                            MatchesUniquePtr(element));
-//
-// Example of erasing from container:
-//   EraseIf(v, MatchesUniquePtr(element));
-//
-template <class T, class Deleter = std::default_delete<T>>
-struct UniquePtrMatcher {
-  explicit UniquePtrMatcher(T* t) : t_(t) {}
-
-  bool operator()(const std::unique_ptr<T, Deleter>& o) {
-    return o.get() == t_;
-  }
-
- private:
-  T* const t_;
-};
-
-template <class T, class Deleter = std::default_delete<T>>
-UniquePtrMatcher<T, Deleter> MatchesUniquePtr(T* t) {
-  return UniquePtrMatcher<T, Deleter>(t);
-}
-
-}  // namespace base
-
-#endif  // BASE_CONTAINERS_UNIQUE_PTR_ADAPTERS_H_
diff --git a/base/cpu.cc b/base/cpu.cc
deleted file mode 100644
index 68a6bbc..0000000
--- a/base/cpu.cc
+++ /dev/null
@@ -1,242 +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/cpu.h"
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "base/macros.h"
-#include "build_config.h"
-
-#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX))
-#include "base/files/file_util.h"
-#endif
-
-#if defined(ARCH_CPU_X86_FAMILY)
-#if defined(COMPILER_MSVC)
-#include <intrin.h>
-#include <immintrin.h>  // For _xgetbv()
-#endif
-#endif
-
-namespace base {
-
-CPU::CPU()
-  : signature_(0),
-    type_(0),
-    family_(0),
-    model_(0),
-    stepping_(0),
-    ext_model_(0),
-    ext_family_(0),
-    has_mmx_(false),
-    has_sse_(false),
-    has_sse2_(false),
-    has_sse3_(false),
-    has_ssse3_(false),
-    has_sse41_(false),
-    has_sse42_(false),
-    has_popcnt_(false),
-    has_avx_(false),
-    has_avx2_(false),
-    has_aesni_(false),
-    has_non_stop_time_stamp_counter_(false),
-    cpu_vendor_("unknown") {
-  Initialize();
-}
-
-namespace {
-
-#if defined(ARCH_CPU_X86_FAMILY)
-#if !defined(COMPILER_MSVC)
-
-#if defined(__pic__) && defined(__i386__)
-
-void __cpuid(int cpu_info[4], int info_type) {
-  __asm__ volatile(
-      "mov %%ebx, %%edi\n"
-      "cpuid\n"
-      "xchg %%edi, %%ebx\n"
-      : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]),
-        "=d"(cpu_info[3])
-      : "a"(info_type), "c"(0));
-}
-
-#else
-
-void __cpuid(int cpu_info[4], int info_type) {
-  __asm__ volatile("cpuid\n"
-                   : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]),
-                     "=d"(cpu_info[3])
-                   : "a"(info_type), "c"(0));
-}
-
-#endif
-
-// _xgetbv returns the value of an Intel Extended Control Register (XCR).
-// Currently only XCR0 is defined by Intel so |xcr| should always be zero.
-uint64_t _xgetbv(uint32_t xcr) {
-  uint32_t eax, edx;
-
-  __asm__ volatile (
-    "xgetbv" : "=a"(eax), "=d"(edx) : "c"(xcr));
-  return (static_cast<uint64_t>(edx) << 32) | eax;
-}
-
-#endif  // !defined(COMPILER_MSVC)
-#endif  // ARCH_CPU_X86_FAMILY
-
-#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX))
-std::string* CpuInfoBrand() {
-  static std::string* brand = []() {
-    // This function finds the value from /proc/cpuinfo under the key "model
-    // name" or "Processor". "model name" is used in Linux 3.8 and later (3.7
-    // and later for arm64) and is shown once per CPU. "Processor" is used in
-    // earler versions and is shown only once at the top of /proc/cpuinfo
-    // regardless of the number CPUs.
-    const char kModelNamePrefix[] = "model name\t: ";
-    const char kProcessorPrefix[] = "Processor\t: ";
-
-    std::string contents;
-    ReadFileToString(FilePath("/proc/cpuinfo"), &contents);
-    DCHECK(!contents.empty());
-
-    std::istringstream iss(contents);
-    std::string line;
-    while (std::getline(iss, line)) {
-      if (line.compare(0, strlen(kModelNamePrefix), kModelNamePrefix) == 0)
-        return new std::string(line.substr(strlen(kModelNamePrefix)));
-      if (line.compare(0, strlen(kProcessorPrefix), kProcessorPrefix) == 0)
-        return new std::string(line.substr(strlen(kProcessorPrefix)));
-    }
-
-    return new std::string();
-  }();
-
-  return brand;
-}
-#endif  // defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) ||
-        // defined(OS_LINUX))
-
-}  // namespace
-
-void CPU::Initialize() {
-#if defined(ARCH_CPU_X86_FAMILY)
-  int cpu_info[4] = {-1};
-  // This array is used to temporarily hold the vendor name and then the brand
-  // name. Thus it has to be big enough for both use cases. There are
-  // static_asserts below for each of the use cases to make sure this array is
-  // big enough.
-  char cpu_string[sizeof(cpu_info) * 3 + 1];
-
-  // __cpuid with an InfoType argument of 0 returns the number of
-  // valid Ids in CPUInfo[0] and the CPU identification string in
-  // the other three array elements. The CPU identification string is
-  // not in linear order. The code below arranges the information
-  // in a human readable form. The human readable order is CPUInfo[1] |
-  // CPUInfo[3] | CPUInfo[2]. CPUInfo[2] and CPUInfo[3] are swapped
-  // before using memcpy() to copy these three array elements to |cpu_string|.
-  __cpuid(cpu_info, 0);
-  int num_ids = cpu_info[0];
-  std::swap(cpu_info[2], cpu_info[3]);
-  static constexpr size_t kVendorNameSize = 3 * sizeof(cpu_info[1]);
-  static_assert(kVendorNameSize < arraysize(cpu_string),
-                "cpu_string too small");
-  memcpy(cpu_string, &cpu_info[1], kVendorNameSize);
-  cpu_string[kVendorNameSize] = '\0';
-  cpu_vendor_ = cpu_string;
-
-  // Interpret CPU feature information.
-  if (num_ids > 0) {
-    int cpu_info7[4] = {0};
-    __cpuid(cpu_info, 1);
-    if (num_ids >= 7) {
-      __cpuid(cpu_info7, 7);
-    }
-    signature_ = cpu_info[0];
-    stepping_ = cpu_info[0] & 0xf;
-    model_ = ((cpu_info[0] >> 4) & 0xf) + ((cpu_info[0] >> 12) & 0xf0);
-    family_ = (cpu_info[0] >> 8) & 0xf;
-    type_ = (cpu_info[0] >> 12) & 0x3;
-    ext_model_ = (cpu_info[0] >> 16) & 0xf;
-    ext_family_ = (cpu_info[0] >> 20) & 0xff;
-    has_mmx_ =   (cpu_info[3] & 0x00800000) != 0;
-    has_sse_ =   (cpu_info[3] & 0x02000000) != 0;
-    has_sse2_ =  (cpu_info[3] & 0x04000000) != 0;
-    has_sse3_ =  (cpu_info[2] & 0x00000001) != 0;
-    has_ssse3_ = (cpu_info[2] & 0x00000200) != 0;
-    has_sse41_ = (cpu_info[2] & 0x00080000) != 0;
-    has_sse42_ = (cpu_info[2] & 0x00100000) != 0;
-    has_popcnt_ = (cpu_info[2] & 0x00800000) != 0;
-
-    // AVX instructions will generate an illegal instruction exception unless
-    //   a) they are supported by the CPU,
-    //   b) XSAVE is supported by the CPU and
-    //   c) XSAVE is enabled by the kernel.
-    // See http://software.intel.com/en-us/blogs/2011/04/14/is-avx-enabled
-    //
-    // In addition, we have observed some crashes with the xgetbv instruction
-    // even after following Intel's example code. (See crbug.com/375968.)
-    // Because of that, we also test the XSAVE bit because its description in
-    // the CPUID documentation suggests that it signals xgetbv support.
-    has_avx_ =
-        (cpu_info[2] & 0x10000000) != 0 &&
-        (cpu_info[2] & 0x04000000) != 0 /* XSAVE */ &&
-        (cpu_info[2] & 0x08000000) != 0 /* OSXSAVE */ &&
-        (_xgetbv(0) & 6) == 6 /* XSAVE enabled by kernel */;
-    has_aesni_ = (cpu_info[2] & 0x02000000) != 0;
-    has_avx2_ = has_avx_ && (cpu_info7[1] & 0x00000020) != 0;
-  }
-
-  // Get the brand string of the cpu.
-  __cpuid(cpu_info, 0x80000000);
-  const int max_parameter = cpu_info[0];
-
-  static constexpr int kParameterStart = 0x80000002;
-  static constexpr int kParameterEnd = 0x80000004;
-  static constexpr int kParameterSize = kParameterEnd - kParameterStart + 1;
-  static_assert(kParameterSize * sizeof(cpu_info) + 1 == arraysize(cpu_string),
-                "cpu_string has wrong size");
-
-  if (max_parameter >= kParameterEnd) {
-    size_t i = 0;
-    for (int parameter = kParameterStart; parameter <= kParameterEnd;
-         ++parameter) {
-      __cpuid(cpu_info, parameter);
-      memcpy(&cpu_string[i], cpu_info, sizeof(cpu_info));
-      i += sizeof(cpu_info);
-    }
-    cpu_string[i] = '\0';
-    cpu_brand_ = cpu_string;
-  }
-
-  static constexpr int kParameterContainingNonStopTimeStampCounter = 0x80000007;
-  if (max_parameter >= kParameterContainingNonStopTimeStampCounter) {
-    __cpuid(cpu_info, kParameterContainingNonStopTimeStampCounter);
-    has_non_stop_time_stamp_counter_ = (cpu_info[3] & (1 << 8)) != 0;
-  }
-#elif defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX))
-  cpu_brand_ = *CpuInfoBrand();
-#endif
-}
-
-CPU::IntelMicroArchitecture CPU::GetIntelMicroArchitecture() const {
-  if (has_avx2()) return AVX2;
-  if (has_avx()) return AVX;
-  if (has_sse42()) return SSE42;
-  if (has_sse41()) return SSE41;
-  if (has_ssse3()) return SSSE3;
-  if (has_sse3()) return SSE3;
-  if (has_sse2()) return SSE2;
-  if (has_sse()) return SSE;
-  return PENTIUM;
-}
-
-}  // namespace base
diff --git a/base/cpu.h b/base/cpu.h
deleted file mode 100644
index 2c6caea..0000000
--- a/base/cpu.h
+++ /dev/null
@@ -1,88 +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_CPU_H_
-#define BASE_CPU_H_
-
-#include <string>
-
-#include "base/base_export.h"
-
-namespace base {
-
-// Query information about the processor.
-class BASE_EXPORT CPU final {
- public:
-  CPU();
-
-  enum IntelMicroArchitecture {
-    PENTIUM,
-    SSE,
-    SSE2,
-    SSE3,
-    SSSE3,
-    SSE41,
-    SSE42,
-    AVX,
-    AVX2,
-    MAX_INTEL_MICRO_ARCHITECTURE
-  };
-
-  // Accessors for CPU information.
-  const std::string& vendor_name() const { return cpu_vendor_; }
-  int signature() const { return signature_; }
-  int stepping() const { return stepping_; }
-  int model() const { return model_; }
-  int family() const { return family_; }
-  int type() const { return type_; }
-  int extended_model() const { return ext_model_; }
-  int extended_family() const { return ext_family_; }
-  bool has_mmx() const { return has_mmx_; }
-  bool has_sse() const { return has_sse_; }
-  bool has_sse2() const { return has_sse2_; }
-  bool has_sse3() const { return has_sse3_; }
-  bool has_ssse3() const { return has_ssse3_; }
-  bool has_sse41() const { return has_sse41_; }
-  bool has_sse42() const { return has_sse42_; }
-  bool has_popcnt() const { return has_popcnt_; }
-  bool has_avx() const { return has_avx_; }
-  bool has_avx2() const { return has_avx2_; }
-  bool has_aesni() const { return has_aesni_; }
-  bool has_non_stop_time_stamp_counter() const {
-    return has_non_stop_time_stamp_counter_;
-  }
-
-  IntelMicroArchitecture GetIntelMicroArchitecture() const;
-  const std::string& cpu_brand() const { return cpu_brand_; }
-
- private:
-  // Query the processor for CPUID information.
-  void Initialize();
-
-  int signature_;  // raw form of type, family, model, and stepping
-  int type_;  // process type
-  int family_;  // family of the processor
-  int model_;  // model of processor
-  int stepping_;  // processor revision number
-  int ext_model_;
-  int ext_family_;
-  bool has_mmx_;
-  bool has_sse_;
-  bool has_sse2_;
-  bool has_sse3_;
-  bool has_ssse3_;
-  bool has_sse41_;
-  bool has_sse42_;
-  bool has_popcnt_;
-  bool has_avx_;
-  bool has_avx2_;
-  bool has_aesni_;
-  bool has_non_stop_time_stamp_counter_;
-  std::string cpu_vendor_;
-  std::string cpu_brand_;
-};
-
-}  // namespace base
-
-#endif  // BASE_CPU_H_
diff --git a/base/file_descriptor_posix.h b/base/file_descriptor_posix.h
deleted file mode 100644
index 2a36611..0000000
--- a/base/file_descriptor_posix.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2006-2009 The Chromium Authors. 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_FILE_DESCRIPTOR_POSIX_H_
-#define BASE_FILE_DESCRIPTOR_POSIX_H_
-
-#include "base/files/file.h"
-#include "base/files/scoped_file.h"
-
-namespace base {
-
-// -----------------------------------------------------------------------------
-// We introduct a special structure for file descriptors in order that we are
-// able to use template specialisation to special-case their handling.
-//
-// IMPORTANT: This is primarily intended for use when sending file descriptors
-// over IPC. Even if |auto_close| is true, base::FileDescriptor does NOT close()
-// |fd| when going out of scope. Instead, a consumer of a base::FileDescriptor
-// must invoke close() on |fd| if |auto_close| is true.
-//
-// In the case of IPC, the the IPC subsystem knows to close() |fd| after sending
-// a message that contains a base::FileDescriptor if auto_close == true. On the
-// other end, the receiver must make sure to close() |fd| after it has finished
-// processing the IPC message. See the IPC::ParamTraits<> specialization in
-// ipc/ipc_message_utils.h for all the details.
-// -----------------------------------------------------------------------------
-struct FileDescriptor {
-  FileDescriptor() : fd(-1), auto_close(false) {}
-
-  FileDescriptor(int ifd, bool iauto_close) : fd(ifd), auto_close(iauto_close) {
-  }
-
-  FileDescriptor(File file) : fd(file.TakePlatformFile()), auto_close(true) {}
-  explicit FileDescriptor(ScopedFD fd) : fd(fd.release()), auto_close(true) {}
-
-  bool operator==(const FileDescriptor& other) const {
-    return (fd == other.fd && auto_close == other.auto_close);
-  }
-
-  bool operator!=(const FileDescriptor& other) const {
-    return !operator==(other);
-  }
-
-  // A comparison operator so that we can use these as keys in a std::map.
-  bool operator<(const FileDescriptor& other) const {
-    return other.fd < fd;
-  }
-
-  int fd;
-  // If true, this file descriptor should be closed after it has been used. For
-  // example an IPC system might interpret this flag as indicating that the
-  // file descriptor it has been given should be closed after use.
-  bool auto_close;
-};
-
-}  // namespace base
-
-#endif  // BASE_FILE_DESCRIPTOR_POSIX_H_
diff --git a/base/file_descriptor_store.cc b/base/file_descriptor_store.cc
deleted file mode 100644
index 71cf2b3..0000000
--- a/base/file_descriptor_store.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/file_descriptor_store.h"
-
-#include <utility>
-
-#include "base/logging.h"
-
-namespace base {
-
-FileDescriptorStore::Descriptor::Descriptor(const std::string& key,
-                                            base::ScopedFD fd)
-    : key(key),
-      fd(std::move(fd)),
-      region(base::MemoryMappedFile::Region::kWholeFile) {}
-
-FileDescriptorStore::Descriptor::Descriptor(
-    const std::string& key,
-    base::ScopedFD fd,
-    base::MemoryMappedFile::Region region)
-    : key(key), fd(std::move(fd)), region(region) {}
-
-FileDescriptorStore::Descriptor::Descriptor(
-    FileDescriptorStore::Descriptor&& other)
-    : key(other.key), fd(std::move(other.fd)), region(other.region) {}
-
-FileDescriptorStore::Descriptor::~Descriptor() = default;
-
-// static
-FileDescriptorStore& FileDescriptorStore::GetInstance() {
-  static FileDescriptorStore* store = new FileDescriptorStore;
-  return *store;
-}
-
-base::ScopedFD FileDescriptorStore::TakeFD(
-    const std::string& key,
-    base::MemoryMappedFile::Region* region) {
-  base::ScopedFD fd = MaybeTakeFD(key, region);
-  if (!fd.is_valid())
-    DLOG(DCHECK) << "Unknown global descriptor: " << key;
-  return fd;
-}
-
-base::ScopedFD FileDescriptorStore::MaybeTakeFD(
-    const std::string& key,
-    base::MemoryMappedFile::Region* region) {
-  auto iter = descriptors_.find(key);
-  if (iter == descriptors_.end())
-    return base::ScopedFD();
-  *region = iter->second.region;
-  base::ScopedFD result = std::move(iter->second.fd);
-  descriptors_.erase(iter);
-  return result;
-}
-
-void FileDescriptorStore::Set(const std::string& key, base::ScopedFD fd) {
-  Set(key, std::move(fd), base::MemoryMappedFile::Region::kWholeFile);
-}
-
-void FileDescriptorStore::Set(const std::string& key,
-                              base::ScopedFD fd,
-                              base::MemoryMappedFile::Region region) {
-  Descriptor descriptor(key, std::move(fd), region);
-  descriptors_.insert(std::make_pair(key, std::move(descriptor)));
-}
-
-FileDescriptorStore::FileDescriptorStore() = default;
-
-FileDescriptorStore::~FileDescriptorStore() = default;
-
-}  // namespace base
diff --git a/base/file_descriptor_store.h b/base/file_descriptor_store.h
deleted file mode 100644
index b6bd079..0000000
--- a/base/file_descriptor_store.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_FILE_DESCRIPTOR_STORE_H_
-#define BASE_FILE_DESCRIPTOR_STORE_H_
-
-#include <map>
-#include <string>
-
-#include "base/files/memory_mapped_file.h"
-#include "base/files/scoped_file.h"
-#include "base/macros.h"
-
-namespace base {
-
-// The file descriptor store is used to associate file descriptors with keys
-// that must be unique.
-// It is used to share file descriptors from a process to its child.
-class BASE_EXPORT FileDescriptorStore {
- public:
-  struct Descriptor {
-    Descriptor(const std::string& key, base::ScopedFD fd);
-    Descriptor(const std::string& key,
-               base::ScopedFD fd,
-               base::MemoryMappedFile::Region region);
-    Descriptor(Descriptor&& other);
-    ~Descriptor();
-
-    Descriptor& operator=(Descriptor&& other) = default;
-
-    // Globally unique key.
-    std::string key;
-    // Actual FD.
-    base::ScopedFD fd;
-    // Optional region, defaults to kWholeFile.
-    base::MemoryMappedFile::Region region;
-  };
-  using Mapping = std::map<std::string, Descriptor>;
-
-  // Returns the singleton instance of FileDescriptorStore.
-  static FileDescriptorStore& GetInstance();
-
-  // Gets a descriptor given a key and also populates |region|.
-  // It is a fatal error if the key is not known.
-  base::ScopedFD TakeFD(const std::string& key,
-                        base::MemoryMappedFile::Region* region);
-
-  // Gets a descriptor given a key. Returns an empty ScopedFD on error.
-  base::ScopedFD MaybeTakeFD(const std::string& key,
-                             base::MemoryMappedFile::Region* region);
-
-  // Sets the descriptor for the given |key|. This sets the region associated
-  // with |key| to kWholeFile.
-  void Set(const std::string& key, base::ScopedFD fd);
-
-  // Sets the descriptor and |region| for the given |key|.
-  void Set(const std::string& key,
-           base::ScopedFD fd,
-           base::MemoryMappedFile::Region region);
-
- private:
-  FileDescriptorStore();
-  ~FileDescriptorStore();
-
-  Mapping descriptors_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileDescriptorStore);
-};
-
-}  // namespace base
-
-#endif  // BASE_FILE_DESCRIPTOR_STORE_H_
diff --git a/base/files/file_util.h b/base/files/file_util.h
index 9c7c748..d95410a 100644
--- a/base/files/file_util.h
+++ b/base/files/file_util.h
@@ -30,7 +30,6 @@
 #if defined(OS_WIN)
 #include "base/win/windows_types.h"
 #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-#include "base/file_descriptor_posix.h"
 #include "base/logging.h"
 #include "base/posix/eintr_wrapper.h"
 #endif
diff --git a/base/files/file_util_win.cc b/base/files/file_util_win.cc
index c1a5ced..d59b7e4 100644
--- a/base/files/file_util_win.cc
+++ b/base/files/file_util_win.cc
@@ -23,7 +23,6 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/process/process_handle.h"
-#include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
@@ -33,6 +32,13 @@
 #include "base/win/scoped_handle.h"
 #include "base/win/windows_version.h"
 
+// #define needed to link in RtlGenRandom(), a.k.a. SystemFunction036.  See the
+// "Community Additions" comment on MSDN here:
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx
+#define SystemFunction036 NTAPI SystemFunction036
+#include <NTSecAPI.h>
+#undef SystemFunction036
+
 namespace base {
 
 namespace {
@@ -258,11 +264,24 @@
       bytes[1] & 0x0000ffff'ffffffffULL);
 }
 
+void RandBytes(void* output, size_t output_length) {
+  char* output_ptr = static_cast<char*>(output);
+  while (output_length > 0) {
+    const ULONG output_bytes_this_pass = static_cast<ULONG>(std::min(
+        output_length, static_cast<size_t>(std::numeric_limits<ULONG>::max())));
+    const bool success =
+        RtlGenRandom(output_ptr, output_bytes_this_pass) != FALSE;
+    CHECK(success);
+    output_length -= output_bytes_this_pass;
+    output_ptr += output_bytes_this_pass;
+  }
+}
+
 std::string GenerateGUID() {
   uint64_t sixteen_bytes[2];
   // Use base::RandBytes instead of crypto::RandBytes, because crypto calls the
   // base version directly, and to prevent the dependency from base/ to crypto/.
-  base::RandBytes(&sixteen_bytes, sizeof(sixteen_bytes));
+  RandBytes(&sixteen_bytes, sizeof(sixteen_bytes));
 
   // Set the GUID to version 4 as described in RFC 4122, section 4.4.
   // The format of GUID version 4 must be xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,
@@ -488,8 +507,7 @@
     new_dir_name.assign(prefix);
     new_dir_name.append(IntToString16(GetCurrentProcId()));
     new_dir_name.push_back('_');
-    new_dir_name.append(
-        IntToString16(RandInt(0, std::numeric_limits<int16_t>::max())));
+    new_dir_name.append(UTF8ToUTF16(GenerateGUID()));
 
     path_to_create = base_dir.Append(new_dir_name);
     if (::CreateDirectory(path_to_create.value().c_str(), NULL)) {
diff --git a/base/format_macros.h b/base/format_macros.h
deleted file mode 100644
index 46cd12c..0000000
--- a/base/format_macros.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. 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_FORMAT_MACROS_H_
-#define BASE_FORMAT_MACROS_H_
-
-// This file defines the format macros for some integer types.
-
-// To print a 64-bit value in a portable way:
-//   int64_t value;
-//   printf("xyz:%" PRId64, value);
-// The "d" in the macro corresponds to %d; you can also use PRIu64 etc.
-//
-// For wide strings, prepend "Wide" to the macro:
-//   int64_t value;
-//   StringPrintf(L"xyz: %" WidePRId64, value);
-//
-// To print a size_t value in a portable way:
-//   size_t size;
-//   printf("xyz: %" PRIuS, size);
-// The "u" in the macro corresponds to %u, and S is for "size".
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "build_config.h"
-
-#if (defined(OS_POSIX) || defined(OS_FUCHSIA)) && \
-    (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64)
-#error "inttypes.h has already been included before this header file, but "
-#error "without __STDC_FORMAT_MACROS defined."
-#endif
-
-#if (defined(OS_POSIX) || defined(OS_FUCHSIA)) && !defined(__STDC_FORMAT_MACROS)
-#define __STDC_FORMAT_MACROS
-#endif
-
-#include <inttypes.h>
-
-#if defined(OS_WIN)
-
-#if !defined(PRId64) || !defined(PRIu64) || !defined(PRIx64)
-#error "inttypes.h provided by win toolchain should define these."
-#endif
-
-#define WidePRId64 L"I64d"
-#define WidePRIu64 L"I64u"
-#define WidePRIx64 L"I64x"
-
-#if !defined(PRIuS)
-#define PRIuS "Iu"
-#endif
-
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-// GCC will concatenate wide and narrow strings correctly, so nothing needs to
-// be done here.
-#define WidePRId64 PRId64
-#define WidePRIu64 PRIu64
-#define WidePRIx64 PRIx64
-
-#if !defined(PRIuS)
-#define PRIuS "zu"
-#endif
-
-#endif  // defined(OS_WIN)
-
-// The size of NSInteger and NSUInteger varies between 32-bit and 64-bit
-// architectures and Apple does not provides standard format macros and
-// recommends casting. This has many drawbacks, so instead define macros
-// for formatting those types.
-#if defined(OS_MACOSX)
-#if defined(ARCH_CPU_64_BITS)
-#if !defined(PRIdNS)
-#define PRIdNS "ld"
-#endif
-#if !defined(PRIuNS)
-#define PRIuNS "lu"
-#endif
-#if !defined(PRIxNS)
-#define PRIxNS "lx"
-#endif
-#else  // defined(ARCH_CPU_64_BITS)
-#if !defined(PRIdNS)
-#define PRIdNS "d"
-#endif
-#if !defined(PRIuNS)
-#define PRIuNS "u"
-#endif
-#if !defined(PRIxNS)
-#define PRIxNS "x"
-#endif
-#endif
-#endif  // defined(OS_MACOSX)
-
-#endif  // BASE_FORMAT_MACROS_H_
diff --git a/base/hash.cc b/base/hash.cc
deleted file mode 100644
index ab5cebc..0000000
--- a/base/hash.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 "base/hash.h"
-
-// Definition in base/third_party/superfasthash/superfasthash.c. (Third-party
-// code did not come with its own header file, so declaring the function here.)
-// Note: This algorithm is also in Blink under Source/wtf/StringHasher.h.
-extern "C" uint32_t SuperFastHash(const char* data, int len);
-
-namespace base {
-
-uint32_t Hash(const void* data, size_t length) {
-  // Currently our in-memory hash is the same as the persistent hash. The
-  // split between in-memory and persistent hash functions is maintained to
-  // allow the in-memory hash function to be updated in the future.
-  return PersistentHash(data, length);
-}
-
-uint32_t Hash(const std::string& str) {
-  return PersistentHash(str.data(), str.size());
-}
-
-uint32_t Hash(const string16& str) {
-  return PersistentHash(str.data(), str.size() * sizeof(char16));
-}
-
-uint32_t PersistentHash(const void* data, size_t length) {
-  // This hash function must not change, since it is designed to be persistable
-  // to disk.
-  if (length > static_cast<size_t>(std::numeric_limits<int>::max())) {
-    NOTREACHED();
-    return 0;
-  }
-  return ::SuperFastHash(reinterpret_cast<const char*>(data),
-                         static_cast<int>(length));
-}
-
-uint32_t PersistentHash(const std::string& str) {
-  return PersistentHash(str.data(), str.size());
-}
-
-// Implement hashing for pairs of at-most 32 bit integer values.
-// When size_t is 32 bits, we turn the 64-bit hash code into 32 bits by using
-// multiply-add hashing. This algorithm, as described in
-// Theorem 4.3.3 of the thesis "Über die Komplexität der Multiplikation in
-// eingeschränkten Branchingprogrammmodellen" by Woelfel, is:
-//
-//   h32(x32, y32) = (h64(x32, y32) * rand_odd64 + rand16 * 2^16) % 2^64 / 2^32
-//
-// Contact danakj@chromium.org for any questions.
-size_t HashInts32(uint32_t value1, uint32_t value2) {
-  uint64_t value1_64 = value1;
-  uint64_t hash64 = (value1_64 << 32) | value2;
-
-  if (sizeof(size_t) >= sizeof(uint64_t))
-    return static_cast<size_t>(hash64);
-
-  uint64_t odd_random = 481046412LL << 32 | 1025306955LL;
-  uint32_t shift_random = 10121U << 16;
-
-  hash64 = hash64 * odd_random + shift_random;
-  size_t high_bits =
-      static_cast<size_t>(hash64 >> (8 * (sizeof(uint64_t) - sizeof(size_t))));
-  return high_bits;
-}
-
-// Implement hashing for pairs of up-to 64-bit integer values.
-// We use the compound integer hash method to produce a 64-bit hash code, by
-// breaking the two 64-bit inputs into 4 32-bit values:
-// http://opendatastructures.org/versions/edition-0.1d/ods-java/node33.html#SECTION00832000000000000000
-// Then we reduce our result to 32 bits if required, similar to above.
-size_t HashInts64(uint64_t value1, uint64_t value2) {
-  uint32_t short_random1 = 842304669U;
-  uint32_t short_random2 = 619063811U;
-  uint32_t short_random3 = 937041849U;
-  uint32_t short_random4 = 3309708029U;
-
-  uint32_t value1a = static_cast<uint32_t>(value1 & 0xffffffff);
-  uint32_t value1b = static_cast<uint32_t>((value1 >> 32) & 0xffffffff);
-  uint32_t value2a = static_cast<uint32_t>(value2 & 0xffffffff);
-  uint32_t value2b = static_cast<uint32_t>((value2 >> 32) & 0xffffffff);
-
-  uint64_t product1 = static_cast<uint64_t>(value1a) * short_random1;
-  uint64_t product2 = static_cast<uint64_t>(value1b) * short_random2;
-  uint64_t product3 = static_cast<uint64_t>(value2a) * short_random3;
-  uint64_t product4 = static_cast<uint64_t>(value2b) * short_random4;
-
-  uint64_t hash64 = product1 + product2 + product3 + product4;
-
-  if (sizeof(size_t) >= sizeof(uint64_t))
-    return static_cast<size_t>(hash64);
-
-  uint64_t odd_random = 1578233944LL << 32 | 194370989LL;
-  uint32_t shift_random = 20591U << 16;
-
-  hash64 = hash64 * odd_random + shift_random;
-  size_t high_bits =
-      static_cast<size_t>(hash64 >> (8 * (sizeof(uint64_t) - sizeof(size_t))));
-  return high_bits;
-}
-
-}  // namespace base
diff --git a/base/hash.h b/base/hash.h
deleted file mode 100644
index 165899e..0000000
--- a/base/hash.h
+++ /dev/null
@@ -1,69 +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 BASE_HASH_H_
-#define BASE_HASH_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <string>
-#include <utility>
-
-#include "base/base_export.h"
-#include "base/logging.h"
-#include "base/strings/string16.h"
-
-namespace base {
-
-// Computes a hash of a memory buffer. This hash function is subject to change
-// in the future, so use only for temporary in-memory structures. If you need
-// to persist a change on disk or between computers, use PersistentHash().
-//
-// WARNING: This hash function should not be used for any cryptographic purpose.
-BASE_EXPORT uint32_t Hash(const void* data, size_t length);
-BASE_EXPORT uint32_t Hash(const std::string& str);
-BASE_EXPORT uint32_t Hash(const string16& str);
-
-// Computes a hash of a memory buffer. This hash function must not change so
-// that code can use the hashed values for persistent storage purposes or
-// sending across the network. If a new persistent hash function is desired, a
-// new version will have to be added in addition.
-//
-// WARNING: This hash function should not be used for any cryptographic purpose.
-BASE_EXPORT uint32_t PersistentHash(const void* data, size_t length);
-BASE_EXPORT uint32_t PersistentHash(const std::string& str);
-
-// Hash pairs of 32-bit or 64-bit numbers.
-BASE_EXPORT size_t HashInts32(uint32_t value1, uint32_t value2);
-BASE_EXPORT size_t HashInts64(uint64_t value1, uint64_t value2);
-
-template <typename T1, typename T2>
-inline size_t HashInts(T1 value1, T2 value2) {
-  // This condition is expected to be compile-time evaluated and optimised away
-  // in release builds.
-  if (sizeof(T1) > sizeof(uint32_t) || (sizeof(T2) > sizeof(uint32_t)))
-    return HashInts64(value1, value2);
-
-  return HashInts32(value1, value2);
-}
-
-// A templated hasher for pairs of integer types. Example:
-//
-//   using MyPair = std::pair<int32_t, int32_t>;
-//   std::unordered_set<MyPair, base::IntPairHash<MyPair>> set;
-template <typename T>
-struct IntPairHash;
-
-template <typename Type1, typename Type2>
-struct IntPairHash<std::pair<Type1, Type2>> {
-  size_t operator()(std::pair<Type1, Type2> value) const {
-    return HashInts(value.first, value.second);
-  }
-};
-
-}  // namespace base
-
-#endif  // BASE_HASH_H_
diff --git a/base/json/OWNERS b/base/json/OWNERS
deleted file mode 100644
index 14fce2a..0000000
--- a/base/json/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-rsesek@chromium.org
diff --git a/base/json/json_correctness_fuzzer.cc b/base/json/json_correctness_fuzzer.cc
deleted file mode 100644
index 1f32d8c..0000000
--- a/base/json/json_correctness_fuzzer.cc
+++ /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.
-
-// A fuzzer that checks correctness of json parser/writer.
-// The fuzzer input is passed through parsing twice,
-// so that presumably valid json is parsed/written again.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
-
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
-#include "base/json/string_escape.h"
-#include "base/logging.h"
-#include "base/values.h"
-
-// Entry point for libFuzzer.
-// We will use the last byte of data as parsing options.
-// The rest will be used as text input to the parser.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  if (size < 2)
-    return 0;
-
-  int error_code, error_line, error_column;
-  std::string error_message;
-
-  // Create a copy of input buffer, as otherwise we don't catch
-  // overflow that touches the last byte (which is used in options).
-  std::unique_ptr<char[]> input(new char[size - 1]);
-  memcpy(input.get(), data, size - 1);
-
-  base::StringPiece input_string(input.get(), size - 1);
-
-  const int options = data[size - 1];
-  auto parsed_value = base::JSONReader::ReadAndReturnError(
-      input_string, options, &error_code, &error_message, &error_line,
-      &error_column);
-  if (!parsed_value)
-    return 0;
-
-  std::string parsed_output;
-  bool b = base::JSONWriter::Write(*parsed_value, &parsed_output);
-  LOG_ASSERT(b);
-
-  auto double_parsed_value = base::JSONReader::ReadAndReturnError(
-      parsed_output, options, &error_code, &error_message, &error_line,
-      &error_column);
-  LOG_ASSERT(double_parsed_value);
-  std::string double_parsed_output;
-  bool b2 =
-      base::JSONWriter::Write(*double_parsed_value, &double_parsed_output);
-  LOG_ASSERT(b2);
-
-  LOG_ASSERT(parsed_output == double_parsed_output)
-      << "Parser/Writer mismatch."
-      << "\nInput=" << base::GetQuotedJSONString(parsed_output)
-      << "\nOutput=" << base::GetQuotedJSONString(double_parsed_output);
-
-  return 0;
-}
diff --git a/base/json/json_reader_fuzzer.cc b/base/json/json_reader_fuzzer.cc
deleted file mode 100644
index a8490da..0000000
--- a/base/json/json_reader_fuzzer.cc
+++ /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.
-
-#include "base/json/json_reader.h"
-#include "base/values.h"
-
-int error_code, error_line, error_column;
-std::string error_message;
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  if (size < 2)
-    return 0;
-
-  // Create a copy of input buffer, as otherwise we don't catch
-  // overflow that touches the last byte (which is used in options).
-  std::unique_ptr<char[]> input(new char[size - 1]);
-  memcpy(input.get(), data, size - 1);
-
-  base::StringPiece input_string(input.get(), size - 1);
-
-  const int options = data[size - 1];
-  base::JSONReader::ReadAndReturnError(input_string, options, &error_code,
-                                       &error_message, &error_line,
-                                       &error_column);
-
-  return 0;
-}
diff --git a/base/json/string_escape_fuzzer.cc b/base/json/string_escape_fuzzer.cc
deleted file mode 100644
index e44bd4f..0000000
--- a/base/json/string_escape_fuzzer.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Chromium 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/json/string_escape.h"
-
-#include <memory>
-
-std::string escaped_string;
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  if (size < 2)
-    return 0;
-
-  const bool put_in_quotes = data[size - 1];
-
-  // Create a copy of input buffer, as otherwise we don't catch
-  // overflow that touches the last byte (which is used in put_in_quotes).
-  size_t actual_size_char8 = size - 1;
-  std::unique_ptr<char[]> input(new char[actual_size_char8]);
-  memcpy(input.get(), data, actual_size_char8);
-
-  base::StringPiece input_string(input.get(), actual_size_char8);
-  base::EscapeJSONString(input_string, put_in_quotes, &escaped_string);
-
-  // Test for wide-strings if available size is even.
-  if (actual_size_char8 & 1)
-    return 0;
-
-  size_t actual_size_char16 = actual_size_char8 / 2;
-  base::StringPiece16 input_string16(
-      reinterpret_cast<base::char16*>(input.get()), actual_size_char16);
-  base::EscapeJSONString(input_string16, put_in_quotes, &escaped_string);
-
-  return 0;
-}
diff --git a/base/linux_util.cc b/base/linux_util.cc
deleted file mode 100644
index 1f3ae49..0000000
--- a/base/linux_util.cc
+++ /dev/null
@@ -1,211 +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/linux_util.h"
-
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/files/file_util.h"
-#include "base/memory/singleton.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_tokenizer.h"
-#include "base/strings/string_util.h"
-#include "base/synchronization/lock.h"
-#include "build_config.h"
-
-namespace {
-
-// Not needed for OS_CHROMEOS.
-#if defined(OS_LINUX)
-enum LinuxDistroState {
-  STATE_DID_NOT_CHECK  = 0,
-  STATE_CHECK_STARTED  = 1,
-  STATE_CHECK_FINISHED = 2,
-};
-
-// Helper class for GetLinuxDistro().
-class LinuxDistroHelper {
- public:
-  // Retrieves the Singleton.
-  static LinuxDistroHelper* GetInstance() {
-    return base::Singleton<LinuxDistroHelper>::get();
-  }
-
-  // The simple state machine goes from:
-  // STATE_DID_NOT_CHECK -> STATE_CHECK_STARTED -> STATE_CHECK_FINISHED.
-  LinuxDistroHelper() : state_(STATE_DID_NOT_CHECK) {}
-  ~LinuxDistroHelper() = default;
-
-  // Retrieve the current state, if we're in STATE_DID_NOT_CHECK,
-  // we automatically move to STATE_CHECK_STARTED so nobody else will
-  // do the check.
-  LinuxDistroState State() {
-    base::AutoLock scoped_lock(lock_);
-    if (STATE_DID_NOT_CHECK == state_) {
-      state_ = STATE_CHECK_STARTED;
-      return STATE_DID_NOT_CHECK;
-    }
-    return state_;
-  }
-
-  // Indicate the check finished, move to STATE_CHECK_FINISHED.
-  void CheckFinished() {
-    base::AutoLock scoped_lock(lock_);
-    DCHECK_EQ(STATE_CHECK_STARTED, state_);
-    state_ = STATE_CHECK_FINISHED;
-  }
-
- private:
-  base::Lock lock_;
-  LinuxDistroState state_;
-};
-#endif  // if defined(OS_LINUX)
-
-bool GetTasksForProcess(pid_t pid, std::vector<pid_t>* tids) {
-  char buf[256];
-  snprintf(buf, sizeof(buf), "/proc/%d/task", pid);
-
-  DIR* task = opendir(buf);
-  if (!task) {
-    DLOG(WARNING) << "Cannot open " << buf;
-    return false;
-  }
-
-  struct dirent* dent;
-  while ((dent = readdir(task))) {
-    char* endptr;
-    const unsigned long int tid_ul = strtoul(dent->d_name, &endptr, 10);
-    if (tid_ul == ULONG_MAX || *endptr)
-      continue;
-    tids->push_back(tid_ul);
-  }
-  closedir(task);
-  return true;
-}
-
-}  // namespace
-
-namespace base {
-
-// Account for the terminating null character.
-static const int kDistroSize = 128 + 1;
-
-// We use this static string to hold the Linux distro info. If we
-// crash, the crash handler code will send this in the crash dump.
-char g_linux_distro[kDistroSize] = "Unknown";
-
-std::string GetLinuxDistro() {
-  LinuxDistroHelper* distro_state_singleton = LinuxDistroHelper::GetInstance();
-  LinuxDistroState state = distro_state_singleton->State();
-  if (STATE_CHECK_FINISHED == state)
-    return g_linux_distro;
-  if (STATE_CHECK_STARTED == state)
-    return "Unknown"; // Don't wait for other thread to finish.
-  DCHECK_EQ(state, STATE_DID_NOT_CHECK);
-  // We do this check only once per process. If it fails, there's
-  // little reason to believe it will work if we attempt to run
-  // lsb_release again.
-  std::vector<std::string> argv;
-  argv.push_back("lsb_release");
-  argv.push_back("-d");
-  std::string output;
-  GetAppOutput(CommandLine(argv), &output);
-  if (output.length() > 0) {
-    // lsb_release -d should return: Description:<tab>Distro Info
-    const char field[] = "Description:\t";
-    if (output.compare(0, strlen(field), field) == 0) {
-      SetLinuxDistro(output.substr(strlen(field)));
-    }
-  }
-  distro_state_singleton->CheckFinished();
-  return g_linux_distro;
-}
-
-void SetLinuxDistro(const std::string& distro) {
-  std::string trimmed_distro;
-  TrimWhitespaceASCII(distro, TRIM_ALL, &trimmed_distro);
-  strlcpy(g_linux_distro, trimmed_distro.c_str(), kDistroSize);
-}
-
-pid_t FindThreadIDWithSyscall(pid_t pid, const std::string& expected_data,
-                              bool* syscall_supported) {
-  if (syscall_supported != nullptr)
-    *syscall_supported = false;
-
-  std::vector<pid_t> tids;
-  if (!GetTasksForProcess(pid, &tids))
-    return -1;
-
-  std::unique_ptr<char[]> syscall_data(new char[expected_data.length()]);
-  for (pid_t tid : tids) {
-    char buf[256];
-    snprintf(buf, sizeof(buf), "/proc/%d/task/%d/syscall", pid, tid);
-    int fd = open(buf, O_RDONLY);
-    if (fd < 0)
-      continue;
-    if (syscall_supported != nullptr)
-      *syscall_supported = true;
-    bool read_ret = ReadFromFD(fd, syscall_data.get(), expected_data.length());
-    close(fd);
-    if (!read_ret)
-      continue;
-
-    if (0 == strncmp(expected_data.c_str(), syscall_data.get(),
-                     expected_data.length())) {
-      return tid;
-    }
-  }
-  return -1;
-}
-
-pid_t FindThreadID(pid_t pid, pid_t ns_tid, bool* ns_pid_supported) {
-  if (ns_pid_supported)
-    *ns_pid_supported = false;
-
-  std::vector<pid_t> tids;
-  if (!GetTasksForProcess(pid, &tids))
-    return -1;
-
-  for (pid_t tid : tids) {
-    char buf[256];
-    snprintf(buf, sizeof(buf), "/proc/%d/task/%d/status", pid, tid);
-    std::string status;
-    if (!ReadFileToString(FilePath(buf), &status))
-      return -1;
-    StringTokenizer tokenizer(status, "\n");
-    while (tokenizer.GetNext()) {
-      StringPiece value_str(tokenizer.token_piece());
-      if (!value_str.starts_with("NSpid"))
-        continue;
-      if (ns_pid_supported)
-        *ns_pid_supported = true;
-      std::vector<StringPiece> split_value_str = SplitStringPiece(
-          value_str, "\t", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
-      DCHECK_GE(split_value_str.size(), 2u);
-      int value;
-      // The last value in the list is the PID in the namespace.
-      if (StringToInt(split_value_str.back(), &value) && value == ns_tid) {
-        // The second value in the list is the real PID.
-        if (StringToInt(split_value_str[1], &value))
-          return value;
-      }
-      break;
-    }
-  }
-  return -1;
-}
-
-}  // namespace base
diff --git a/base/linux_util.h b/base/linux_util.h
deleted file mode 100644
index 272e06b..0000000
--- a/base/linux_util.h
+++ /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.
-
-#ifndef BASE_LINUX_UTIL_H_
-#define BASE_LINUX_UTIL_H_
-
-#include <stdint.h>
-#include <sys/types.h>
-
-#include <string>
-
-#include "base/base_export.h"
-
-namespace base {
-
-// This is declared here so the crash reporter can access the memory directly
-// in compromised context without going through the standard library.
-BASE_EXPORT extern char g_linux_distro[];
-
-// Get the Linux Distro if we can, or return "Unknown".
-BASE_EXPORT std::string GetLinuxDistro();
-
-// Set the Linux Distro string.
-BASE_EXPORT void SetLinuxDistro(const std::string& distro);
-
-// For a given process |pid|, look through all its threads and find the first
-// thread with /proc/[pid]/task/[thread_id]/syscall whose first N bytes matches
-// |expected_data|, where N is the length of |expected_data|.
-// Returns the thread id or -1 on error.  If |syscall_supported| is
-// set to false the kernel does not support syscall in procfs.
-BASE_EXPORT pid_t FindThreadIDWithSyscall(pid_t pid,
-                                          const std::string& expected_data,
-                                          bool* syscall_supported);
-
-// For a given process |pid|, look through all its threads and find the first
-// thread with /proc/[pid]/task/[thread_id]/status where NSpid matches |ns_tid|.
-// Returns the thread id or -1 on error.  If |ns_pid_supported| is
-// set to false the kernel does not support NSpid in procfs.
-BASE_EXPORT pid_t FindThreadID(pid_t pid, pid_t ns_tid, bool* ns_pid_supported);
-
-}  // namespace base
-
-#endif  // BASE_LINUX_UTIL_H_
diff --git a/base/mac/OWNERS b/base/mac/OWNERS
deleted file mode 100644
index 93e90e0..0000000
--- a/base/mac/OWNERS
+++ /dev/null
@@ -1,8 +0,0 @@
-mark@chromium.org
-thakis@chromium.org
-
-# sdk_forward_declarations.[h|mm] will likely need to be modified by Cocoa
-# developers in general.
-per-file sdk_forward_declarations.*=file://chrome/browser/ui/cocoa/OWNERS
-
-# COMPONENT: Internals
diff --git a/base/mac/authorization_util.h b/base/mac/authorization_util.h
deleted file mode 100644
index 4629039..0000000
--- a/base/mac/authorization_util.h
+++ /dev/null
@@ -1,82 +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_MAC_AUTHORIZATION_UTIL_H_
-#define BASE_MAC_AUTHORIZATION_UTIL_H_
-
-// AuthorizationExecuteWithPrivileges fork()s and exec()s the tool, but it
-// does not wait() for it.  It also doesn't provide the caller with access to
-// the forked pid.  If used irresponsibly, zombie processes will accumulate.
-//
-// Apple's really gotten us between a rock and a hard place, here.
-//
-// Fortunately, AuthorizationExecuteWithPrivileges does give access to the
-// tool's stdout (and stdin) via a FILE* pipe.  The tool can output its pid
-// to this pipe, and the main program can read it, and then have something
-// that it can wait() for.
-//
-// The contract is that any tool executed by the wrappers declared in this
-// file must print its pid to stdout on a line by itself before doing anything
-// else.
-//
-// http://developer.apple.com/library/mac/#samplecode/BetterAuthorizationSample/Listings/BetterAuthorizationSampleLib_c.html
-// (Look for "What's This About Zombies?")
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Authorization.h>
-#include <stdio.h>
-#include <sys/types.h>
-
-#include "base/base_export.h"
-
-namespace base {
-namespace mac {
-
-// Obtains an AuthorizationRef for the rights indicated by |rights|.  If
-// necessary, prompts the user for authentication. If the user is prompted,
-// |prompt| will be used as the prompt string and an icon appropriate for the
-// application will be displayed in a prompt dialog. Note that the system
-// appends its own text to the prompt string. |extraFlags| will be ORed
-// together with the default flags. Returns NULL on failure.
-BASE_EXPORT
-AuthorizationRef GetAuthorizationRightsWithPrompt(
-    AuthorizationRights* rights,
-    CFStringRef prompt,
-    AuthorizationFlags extraFlags);
-
-// Obtains an AuthorizationRef (using |GetAuthorizationRightsWithPrompt|) that
-// can be used to run commands as root.
-BASE_EXPORT
-AuthorizationRef AuthorizationCreateToRunAsRoot(CFStringRef prompt);
-
-// Calls straight through to AuthorizationExecuteWithPrivileges.  If that
-// call succeeds, |pid| will be set to the pid of the executed tool.  If the
-// pid can't be determined, |pid| will be set to -1.  |pid| must not be NULL.
-// |pipe| may be NULL, but the tool will always be executed with a pipe in
-// order to read the pid from its stdout.
-BASE_EXPORT
-OSStatus ExecuteWithPrivilegesAndGetPID(AuthorizationRef authorization,
-                                        const char* tool_path,
-                                        AuthorizationFlags options,
-                                        const char** arguments,
-                                        FILE** pipe,
-                                        pid_t* pid);
-
-// Calls ExecuteWithPrivilegesAndGetPID, and if that call succeeds, calls
-// waitpid() to wait for the process to exit.  If waitpid() succeeds, the
-// exit status is placed in |exit_status|, otherwise, -1 is stored.
-// |exit_status| may be NULL and this function will still wait for the process
-// to exit.
-BASE_EXPORT
-OSStatus ExecuteWithPrivilegesAndWait(AuthorizationRef authorization,
-                                      const char* tool_path,
-                                      AuthorizationFlags options,
-                                      const char** arguments,
-                                      FILE** pipe,
-                                      int* exit_status);
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_AUTHORIZATION_UTIL_H_
diff --git a/base/mac/authorization_util.mm b/base/mac/authorization_util.mm
deleted file mode 100644
index a3bc4f9..0000000
--- a/base/mac/authorization_util.mm
+++ /dev/null
@@ -1,201 +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/mac/authorization_util.h"
-
-#import <Foundation/Foundation.h>
-#include <stddef.h>
-#include <sys/wait.h>
-
-#include <string>
-
-#include "base/logging.h"
-#include "base/mac/bundle_locations.h"
-#include "base/mac/foundation_util.h"
-#include "base/mac/mac_logging.h"
-#include "base/mac/scoped_authorizationref.h"
-#include "base/macros.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-
-namespace base {
-namespace mac {
-
-AuthorizationRef GetAuthorizationRightsWithPrompt(
-    AuthorizationRights* rights,
-    CFStringRef prompt,
-    AuthorizationFlags extraFlags) {
-  // Create an empty AuthorizationRef.
-  ScopedAuthorizationRef authorization;
-  OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment,
-                                        kAuthorizationFlagDefaults,
-                                        authorization.get_pointer());
-  if (status != errAuthorizationSuccess) {
-    OSSTATUS_LOG(ERROR, status) << "AuthorizationCreate";
-    return NULL;
-  }
-
-  AuthorizationFlags flags = kAuthorizationFlagDefaults |
-                             kAuthorizationFlagInteractionAllowed |
-                             kAuthorizationFlagExtendRights |
-                             kAuthorizationFlagPreAuthorize |
-                             extraFlags;
-
-  // product_logo_32.png is used instead of app.icns because Authorization
-  // Services can't deal with .icns files.
-  NSString* icon_path =
-      [base::mac::FrameworkBundle() pathForResource:@"product_logo_32"
-                                             ofType:@"png"];
-  const char* icon_path_c = [icon_path fileSystemRepresentation];
-  size_t icon_path_length = icon_path_c ? strlen(icon_path_c) : 0;
-
-  // The OS will dispay |prompt| along with a sentence asking the user to type
-  // the "password to allow this."
-  NSString* prompt_ns = base::mac::CFToNSCast(prompt);
-  const char* prompt_c = [prompt_ns UTF8String];
-  size_t prompt_length = prompt_c ? strlen(prompt_c) : 0;
-
-  AuthorizationItem environment_items[] = {
-    {kAuthorizationEnvironmentIcon, icon_path_length, (void*)icon_path_c, 0},
-    {kAuthorizationEnvironmentPrompt, prompt_length, (void*)prompt_c, 0}
-  };
-
-  AuthorizationEnvironment environment = {arraysize(environment_items),
-                                          environment_items};
-
-  status = AuthorizationCopyRights(authorization,
-                                   rights,
-                                   &environment,
-                                   flags,
-                                   NULL);
-
-  if (status != errAuthorizationSuccess) {
-    if (status != errAuthorizationCanceled) {
-      OSSTATUS_LOG(ERROR, status) << "AuthorizationCopyRights";
-    }
-    return NULL;
-  }
-
-  return authorization.release();
-}
-
-AuthorizationRef AuthorizationCreateToRunAsRoot(CFStringRef prompt) {
-  // Specify the "system.privilege.admin" right, which allows
-  // AuthorizationExecuteWithPrivileges to run commands as root.
-  AuthorizationItem right_items[] = {
-    {kAuthorizationRightExecute, 0, NULL, 0}
-  };
-  AuthorizationRights rights = {arraysize(right_items), right_items};
-
-  return GetAuthorizationRightsWithPrompt(&rights, prompt, 0);
-}
-
-OSStatus ExecuteWithPrivilegesAndGetPID(AuthorizationRef authorization,
-                                        const char* tool_path,
-                                        AuthorizationFlags options,
-                                        const char** arguments,
-                                        FILE** pipe,
-                                        pid_t* pid) {
-  // pipe may be NULL, but this function needs one.  In that case, use a local
-  // pipe.
-  FILE* local_pipe;
-  FILE** pipe_pointer;
-  if (pipe) {
-    pipe_pointer = pipe;
-  } else {
-    pipe_pointer = &local_pipe;
-  }
-
-// AuthorizationExecuteWithPrivileges is deprecated in macOS 10.7, but no good
-// replacement exists. https://crbug.com/593133.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-  // AuthorizationExecuteWithPrivileges wants |char* const*| for |arguments|,
-  // but it doesn't actually modify the arguments, and that type is kind of
-  // silly and callers probably aren't dealing with that.  Put the cast here
-  // to make things a little easier on callers.
-  OSStatus status = AuthorizationExecuteWithPrivileges(authorization,
-                                                       tool_path,
-                                                       options,
-                                                       (char* const*)arguments,
-                                                       pipe_pointer);
-#pragma clang diagnostic pop
-  if (status != errAuthorizationSuccess) {
-    return status;
-  }
-
-  int line_pid = -1;
-  size_t line_length = 0;
-  char* line_c = fgetln(*pipe_pointer, &line_length);
-  if (line_c) {
-    if (line_length > 0 && line_c[line_length - 1] == '\n') {
-      // line_c + line_length is the start of the next line if there is one.
-      // Back up one character.
-      --line_length;
-    }
-    std::string line(line_c, line_length);
-    if (!base::StringToInt(line, &line_pid)) {
-      // StringToInt may have set line_pid to something, but if the conversion
-      // was imperfect, use -1.
-      LOG(ERROR) << "ExecuteWithPrivilegesAndGetPid: funny line: " << line;
-      line_pid = -1;
-    }
-  } else {
-    LOG(ERROR) << "ExecuteWithPrivilegesAndGetPid: no line";
-  }
-
-  if (!pipe) {
-    fclose(*pipe_pointer);
-  }
-
-  if (pid) {
-    *pid = line_pid;
-  }
-
-  return status;
-}
-
-OSStatus ExecuteWithPrivilegesAndWait(AuthorizationRef authorization,
-                                      const char* tool_path,
-                                      AuthorizationFlags options,
-                                      const char** arguments,
-                                      FILE** pipe,
-                                      int* exit_status) {
-  pid_t pid;
-  OSStatus status = ExecuteWithPrivilegesAndGetPID(authorization,
-                                                   tool_path,
-                                                   options,
-                                                   arguments,
-                                                   pipe,
-                                                   &pid);
-  if (status != errAuthorizationSuccess) {
-    return status;
-  }
-
-  // exit_status may be NULL, but this function needs it.  In that case, use a
-  // local version.
-  int local_exit_status;
-  int* exit_status_pointer;
-  if (exit_status) {
-    exit_status_pointer = exit_status;
-  } else {
-    exit_status_pointer = &local_exit_status;
-  }
-
-  if (pid != -1) {
-    pid_t wait_result = HANDLE_EINTR(waitpid(pid, exit_status_pointer, 0));
-    if (wait_result != pid) {
-      PLOG(ERROR) << "waitpid";
-      *exit_status_pointer = -1;
-    }
-  } else {
-    *exit_status_pointer = -1;
-  }
-
-  return status;
-}
-
-}  // namespace mac
-}  // namespace base
diff --git a/base/mac/call_with_eh_frame.cc b/base/mac/call_with_eh_frame.cc
deleted file mode 100644
index 35e01bc..0000000
--- a/base/mac/call_with_eh_frame.cc
+++ /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.
-
-#include "base/mac/call_with_eh_frame.h"
-
-#include <stdint.h>
-#include <unwind.h>
-
-#include "build_config.h"
-
-namespace base {
-namespace mac {
-
-#if defined(OS_IOS)
-// No iOS assembly implementation exists, so just call the block directly.
-void CallWithEHFrame(void (^block)(void)) {
-  block();
-}
-#else  // OS_MACOSX
-extern "C" _Unwind_Reason_Code __gxx_personality_v0(int,
-                                                    _Unwind_Action,
-                                                    uint64_t,
-                                                    struct _Unwind_Exception*,
-                                                    struct _Unwind_Context*);
-
-_Unwind_Reason_Code CxxPersonalityRoutine(
-    int version,
-    _Unwind_Action actions,
-    uint64_t exception_class,
-    struct _Unwind_Exception* exception_object,
-    struct _Unwind_Context* context) {
-  // Unwinding is a two-phase process: phase one searches for an exception
-  // handler, and phase two performs cleanup. For phase one, this custom
-  // personality will terminate the search. For phase two, this should delegate
-  // back to the standard personality routine.
-
-  if ((actions & _UA_SEARCH_PHASE) != 0) {
-    // Tell libunwind that this is the end of the stack. When it encounters the
-    // CallWithEHFrame, it will stop searching for an exception handler. The
-    // result is that no exception handler has been found higher on the stack,
-    // and any that are lower on the stack (e.g. in CFRunLoopRunSpecific), will
-    // now be skipped. Since this is reporting the end of the stack, and no
-    // exception handler will have been found, std::terminate() will be called.
-    return _URC_END_OF_STACK;
-  }
-
-  return __gxx_personality_v0(version, actions, exception_class,
-                              exception_object, context);
-}
-#endif  // defined(OS_IOS)
-
-}  // namespace mac
-}  // namespace base
diff --git a/base/mac/call_with_eh_frame.h b/base/mac/call_with_eh_frame.h
deleted file mode 100644
index 1f7d5e0..0000000
--- a/base/mac/call_with_eh_frame.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_MAC_CALL_WITH_EH_FRAME_H_
-#define BASE_MAC_CALL_WITH_EH_FRAME_H_
-
-#include "base/base_export.h"
-
-namespace base {
-namespace mac {
-
-// Invokes the specified block in a stack frame with a special exception
-// handler. This function creates an exception handling stack frame that
-// specifies a custom C++ exception personality routine, which terminates the
-// search for an exception handler at this frame.
-//
-// The purpose of this function is to prevent a try/catch statement in system
-// libraries, acting as a global exception handler, from handling exceptions
-// in such a way that disrupts the generation of useful stack traces.
-void BASE_EXPORT CallWithEHFrame(void (^block)(void));
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_CALL_WITH_EH_FRAME_H_
diff --git a/base/mac/call_with_eh_frame_asm.S b/base/mac/call_with_eh_frame_asm.S
deleted file mode 100644
index 0e399cf..0000000
--- a/base/mac/call_with_eh_frame_asm.S
+++ /dev/null
@@ -1,89 +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.
-
-// base::mac::CallWithEHFrame(void () block_pointer)
-#define CALL_WITH_EH_FRAME __ZN4base3mac15CallWithEHFrameEU13block_pointerFvvE
-
-  .section __TEXT,__text,regular,pure_instructions
-#if !defined(COMPONENT_BUILD)
-  .private_extern CALL_WITH_EH_FRAME
-#endif
-  .globl CALL_WITH_EH_FRAME
-  .align 4
-CALL_WITH_EH_FRAME:
-
-  .cfi_startproc
-
-  // Configure the C++ exception handler personality routine. Normally the
-  // compiler would emit ___gxx_personality_v0 here. The purpose of this
-  // function is to use a custom personality routine.
-  .cfi_personality 155, __ZN4base3mac21CxxPersonalityRoutineEi14_Unwind_ActionyP17_Unwind_ExceptionP15_Unwind_Context
-  .cfi_lsda 16, CallWithEHFrame_exception_table
-
-Lfunction_start:
-  pushq %rbp
-  .cfi_def_cfa_offset 16
-  .cfi_offset %rbp, -16
-  movq %rsp, %rbp
-  .cfi_def_cfa_register %rbp
-
-  // Load the function pointer from the block descriptor.
-  movq 16(%rdi), %rax
-
-  // Execute the block in the context of a C++ try{}.
-Ltry_start:
-  callq *%rax
-Ltry_end:
-  popq %rbp
-  ret
-
-  // Landing pad for the exception handler. This should never be called, since
-  // the personality routine will stop the search for an exception handler,
-  // which will cause the runtime to invoke the default terminate handler.
-Lcatch:
-  movq %rax, %rdi
-  callq ___cxa_begin_catch  // The ABI requires a call to the catch handler.
-  ud2  // In the event this is called, make it fatal.
-
-Lfunction_end:
-  .cfi_endproc
-
-// The C++ exception table that is used to identify this frame as an
-// exception handler. See http://llvm.org/docs/ExceptionHandling.html and
-// http://mentorembedded.github.io/cxx-abi/exceptions.pdf.
-  .section __TEXT,__gcc_except_tab
-  .align 2
-CallWithEHFrame_exception_table:
-  .byte 255  // DW_EH_PE_omit
-  .byte 155  // DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4
-  .asciz "\242\200\200"  // LE int128 for the number of bytes in this table.
-  .byte 3  // DW_EH_PE_udata4
-  .byte 26  // Callsite table length.
-
-// First callsite.
-CS1_begin = Ltry_start - Lfunction_start
-  .long CS1_begin
-CS1_end = Ltry_end - Ltry_start
-  .long CS1_end
-
-// First landing pad.
-LP1 = Lcatch - Lfunction_start
-  .long LP1
-  .byte 1  // Action record.
-
-// Second callsite.
-CS2_begin = Ltry_end - Lfunction_start
-  .long CS2_begin
-CS2_end = Lfunction_end - Ltry_end
-  .long CS2_end
-
-// Second landing pad (none).
-  .long 0
-  .byte 0  // No action.
-
-// Action table.
-  .byte 1  // Action record 1.
-  .byte 0  // No further action to take.
-  .long 0  // No type filter for this catch(){} clause.
-  .align 2
diff --git a/base/mac/close_nocancel.cc b/base/mac/close_nocancel.cc
deleted file mode 100644
index 8971e73..0000000
--- a/base/mac/close_nocancel.cc
+++ /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.
-
-// http://crbug.com/269623
-// http://openradar.appspot.com/14999594
-//
-// When the default version of close used on Mac OS X fails with EINTR, the
-// file descriptor is not in a deterministic state. It may have been closed,
-// or it may not have been. This makes it impossible to gracefully recover
-// from the error. If the close is retried after the FD has been closed, the
-// subsequent close can report EBADF, or worse, it can close an unrelated FD
-// opened by another thread. If the close is not retried after the FD has been
-// left open, the FD is leaked. Neither of these are good options.
-//
-// Mac OS X provides an alternate version of close, close$NOCANCEL. This
-// version will never fail with EINTR before the FD is actually closed. With
-// this version, it is thus safe to call close without checking for EINTR (as
-// the HANDLE_EINTR macro does) and not risk leaking the FD. In fact, mixing
-// this verison of close with HANDLE_EINTR is hazardous.
-//
-// The $NOCANCEL variants of various system calls are activated by compiling
-// with __DARWIN_NON_CANCELABLE, which prevents them from being pthread
-// cancellation points. Rather than taking such a heavy-handed approach, this
-// file implements an alternative: to use the $NOCANCEL variant of close (thus
-// preventing it from being a pthread cancellation point) without affecting
-// any other system calls.
-//
-// This file operates by providing a close function with the non-$NOCANCEL
-// symbol name expected for the compilation environment as set by <unistd.h>
-// and <sys/cdefs.h> (the DARWIN_ALIAS_C macro). That name is set by an asm
-// label on the declaration of the close function, so the definition of that
-// function receives that name. The function calls the $NOCANCEL variant, which
-// is resolved from libsyscall. By linking with this version of close prior to
-// the libsyscall version, close's implementation is overridden.
-
-#include <sys/cdefs.h>
-#include <unistd.h>
-
-// If the non-cancelable variants of all system calls have already been
-// chosen, do nothing.
-#if !__DARWIN_NON_CANCELABLE
-
-extern "C" {
-
-#if !__DARWIN_ONLY_UNIX_CONFORMANCE
-
-// When there's a choice between UNIX2003 and pre-UNIX2003. There's no
-// close$NOCANCEL symbol in this case, so use close$NOCANCEL$UNIX2003 as the
-// implementation. It does the same thing that close$NOCANCEL would do.
-#define close_implementation close$NOCANCEL$UNIX2003
-
-#else  // __DARWIN_ONLY_UNIX_CONFORMANCE
-
-// When only UNIX2003 is supported:
-#define close_implementation close$NOCANCEL
-
-#endif
-
-int close_implementation(int fd);
-
-int close(int fd) {
-  return close_implementation(fd);
-}
-
-#undef close_implementation
-
-}  // extern "C"
-
-#endif  // !__DARWIN_NON_CANCELABLE
diff --git a/base/mac/launch_services_util.h b/base/mac/launch_services_util.h
deleted file mode 100644
index 30d1eec..0000000
--- a/base/mac/launch_services_util.h
+++ /dev/null
@@ -1,31 +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_MAC_LAUNCH_SERVICES_UTIL_H_
-#define BASE_MAC_LAUNCH_SERVICES_UTIL_H_
-
-#import <AppKit/AppKit.h>
-
-#include "base/base_export.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/process/process.h"
-
-namespace base {
-namespace mac {
-
-// Launches the application bundle at |bundle_path|, passing argv[1..] from
-// |command_line| as command line arguments if the app isn't already running.
-// |launch_options| are passed directly to
-// -[NSWorkspace launchApplicationAtURL:options:configuration:error:].
-// Returns a valid process if the app was successfully launched.
-BASE_EXPORT Process
-OpenApplicationWithPath(const FilePath& bundle_path,
-                        const CommandLine& command_line,
-                        NSWorkspaceLaunchOptions launch_options);
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_LAUNCH_SERVICES_UTIL_H_
diff --git a/base/mac/launch_services_util.mm b/base/mac/launch_services_util.mm
deleted file mode 100644
index fa6e808..0000000
--- a/base/mac/launch_services_util.mm
+++ /dev/null
@@ -1,52 +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 "base/mac/launch_services_util.h"
-
-#include "base/logging.h"
-#include "base/strings/sys_string_conversions.h"
-
-namespace base {
-namespace mac {
-
-Process OpenApplicationWithPath(const base::FilePath& bundle_path,
-                                const CommandLine& command_line,
-                                NSWorkspaceLaunchOptions launch_options) {
-  NSString* bundle_url_spec = base::SysUTF8ToNSString(bundle_path.value());
-  NSURL* bundle_url = [NSURL fileURLWithPath:bundle_url_spec isDirectory:YES];
-  DCHECK(bundle_url);
-  if (!bundle_url) {
-    return Process();
-  }
-
-  // NSWorkspace automatically adds the binary path as the first argument and
-  // it should not be included into the list.
-  std::vector<std::string> argv = command_line.argv();
-  int argc = argv.size();
-  NSMutableArray* launch_args = [NSMutableArray arrayWithCapacity:argc - 1];
-  for (int i = 1; i < argc; ++i) {
-    [launch_args addObject:base::SysUTF8ToNSString(argv[i])];
-  }
-
-  NSDictionary* configuration = @{
-    NSWorkspaceLaunchConfigurationArguments : launch_args,
-  };
-  NSError* launch_error = nil;
-  // TODO(jeremya): this opens a new browser window if Chrome is already
-  // running without any windows open.
-  NSRunningApplication* app =
-      [[NSWorkspace sharedWorkspace] launchApplicationAtURL:bundle_url
-                                                    options:launch_options
-                                              configuration:configuration
-                                                      error:&launch_error];
-  if (launch_error) {
-    LOG(ERROR) << base::SysNSStringToUTF8([launch_error localizedDescription]);
-    return Process();
-  }
-  DCHECK(app);
-  return Process([app processIdentifier]);
-}
-
-}  // namespace mac
-}  // namespace base
diff --git a/base/mac/launchd.cc b/base/mac/launchd.cc
deleted file mode 100644
index 0337d2e..0000000
--- a/base/mac/launchd.cc
+++ /dev/null
@@ -1,75 +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/mac/launchd.h"
-
-#include "base/logging.h"
-#include "base/mac/scoped_launch_data.h"
-
-namespace base {
-namespace mac {
-
-// MessageForJob sends a single message to launchd with a simple dictionary
-// mapping |operation| to |job_label|, and returns the result of calling
-// launch_msg to send that message. On failure, returns NULL. The caller
-// assumes ownership of the returned launch_data_t object.
-launch_data_t MessageForJob(const std::string& job_label,
-                            const char* operation) {
-  // launch_data_alloc returns something that needs to be freed.
-  ScopedLaunchData message(launch_data_alloc(LAUNCH_DATA_DICTIONARY));
-  if (!message.is_valid()) {
-    LOG(ERROR) << "launch_data_alloc";
-    return NULL;
-  }
-
-  // launch_data_new_string returns something that needs to be freed, but
-  // the dictionary will assume ownership when launch_data_dict_insert is
-  // called, so put it in a scoper and .release() it when given to the
-  // dictionary.
-  ScopedLaunchData job_label_launchd(launch_data_new_string(job_label.c_str()));
-  if (!job_label_launchd.is_valid()) {
-    LOG(ERROR) << "launch_data_new_string";
-    return NULL;
-  }
-
-  if (!launch_data_dict_insert(message.get(), job_label_launchd.release(),
-                               operation)) {
-    return NULL;
-  }
-
-  return launch_msg(message.get());
-}
-
-pid_t PIDForJob(const std::string& job_label) {
-  ScopedLaunchData response(MessageForJob(job_label, LAUNCH_KEY_GETJOB));
-  if (!response.is_valid()) {
-    return -1;
-  }
-
-  launch_data_type_t response_type = launch_data_get_type(response.get());
-  if (response_type != LAUNCH_DATA_DICTIONARY) {
-    if (response_type == LAUNCH_DATA_ERRNO) {
-      LOG(ERROR) << "PIDForJob: error "
-                 << launch_data_get_errno(response.get());
-    } else {
-      LOG(ERROR) << "PIDForJob: expected dictionary, got " << response_type;
-    }
-    return -1;
-  }
-
-  launch_data_t pid_data =
-      launch_data_dict_lookup(response.get(), LAUNCH_JOBKEY_PID);
-  if (!pid_data)
-    return 0;
-
-  if (launch_data_get_type(pid_data) != LAUNCH_DATA_INTEGER) {
-    LOG(ERROR) << "PIDForJob: expected integer";
-    return -1;
-  }
-
-  return launch_data_get_integer(pid_data);
-}
-
-}  // namespace mac
-}  // namespace base
diff --git a/base/mac/launchd.h b/base/mac/launchd.h
deleted file mode 100644
index 9e4514e..0000000
--- a/base/mac/launchd.h
+++ /dev/null
@@ -1,34 +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_MAC_LAUNCHD_H_
-#define BASE_MAC_LAUNCHD_H_
-
-#include <launch.h>
-#include <sys/types.h>
-
-#include <string>
-
-#include "base/base_export.h"
-
-namespace base {
-namespace mac {
-
-// MessageForJob sends a single message to launchd with a simple dictionary
-// mapping |operation| to |job_label|, and returns the result of calling
-// launch_msg to send that message. On failure, returns NULL. The caller
-// assumes ownership of the returned launch_data_t object.
-BASE_EXPORT
-launch_data_t MessageForJob(const std::string& job_label,
-                            const char* operation);
-
-// Returns the process ID for |job_label| if the job is running, 0 if the job
-// is loaded but not running, or -1 on error.
-BASE_EXPORT
-pid_t PIDForJob(const std::string& job_label);
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_LAUNCHD_H_
diff --git a/base/mac/mach_port_broker.h b/base/mac/mach_port_broker.h
deleted file mode 100644
index 4554b6a..0000000
--- a/base/mac/mach_port_broker.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 BASE_MAC_MACH_PORT_BROKER_H_
-#define BASE_MAC_MACH_PORT_BROKER_H_
-
-#include <mach/mach.h>
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include "base/base_export.h"
-#include "base/mac/dispatch_source_mach.h"
-#include "base/mac/scoped_mach_port.h"
-#include "base/macros.h"
-#include "base/process/port_provider_mac.h"
-#include "base/process/process_handle.h"
-#include "base/synchronization/lock.h"
-
-namespace base {
-
-// On OS X, the task port of a process is required to collect metrics about the
-// process, and to insert Mach ports into the process. Running |task_for_pid()|
-// is only allowed for privileged code. However, a process has port rights to
-// all its subprocesses, so let the child processes send their Mach port to the
-// parent over IPC.
-//
-// Mach ports can only be sent over Mach IPC, not over the |socketpair()| that
-// the regular IPC system uses. Hence, the child processes opens a Mach
-// connection shortly after launching and ipc their mach data to the parent
-// process. A single |MachPortBroker| with a given name is expected to exist in
-// the parent process.
-//
-// Since this data arrives over a separate channel, it is not available
-// immediately after a child process has been started.
-class BASE_EXPORT MachPortBroker : public base::PortProvider {
- public:
-  // For use in child processes. This will send the task port of the current
-  // process over Mach IPC to the port registered by name (via this class) in
-  // the parent process. Returns true if the message was sent successfully
-  // and false if otherwise.
-  static bool ChildSendTaskPortToParent(const std::string& name);
-
-  // Returns the Mach port name to use when sending or receiving messages.
-  // Does the Right Thing in the browser and in child processes.
-  static std::string GetMachPortName(const std::string& name, bool is_child);
-
-  MachPortBroker(const std::string& name);
-  ~MachPortBroker() override;
-
-  // Performs any initialization work.
-  bool Init();
-
-  // Adds a placeholder to the map for the given pid with MACH_PORT_NULL.
-  // Callers are expected to later update the port with FinalizePid(). Callers
-  // MUST acquire the lock given by GetLock() before calling this method (and
-  // release the lock afterwards).
-  void AddPlaceholderForPid(base::ProcessHandle pid);
-
-  // Removes |pid| from the task port map. Callers MUST acquire the lock given
-  // by GetLock() before calling this method (and release the lock afterwards).
-  void InvalidatePid(base::ProcessHandle pid);
-
-  // The lock that protects this MachPortBroker object. Callers MUST acquire
-  // and release this lock around calls to AddPlaceholderForPid(),
-  // InvalidatePid(), and FinalizePid();
-  base::Lock& GetLock() { return lock_; }
-
-  // Implement |base::PortProvider|.
-  mach_port_t TaskForPid(base::ProcessHandle process) const override;
-
- private:
-  friend class MachPortBrokerTest;
-
-  // Message handler that is invoked on |dispatch_source_| when an
-  // incoming message needs to be received.
-  void HandleRequest();
-
-  // Updates the mapping for |pid| to include the given |mach_info|.  Does
-  // nothing if PlaceholderForPid() has not already been called for the given
-  // |pid|. Callers MUST acquire the lock given by GetLock() before calling
-  // this method (and release the lock afterwards).
-  void FinalizePid(base::ProcessHandle pid, mach_port_t task_port);
-
-  // Name used to identify a particular port broker.
-  const std::string name_;
-
-  // The Mach port on which the server listens.
-  base::mac::ScopedMachReceiveRight server_port_;
-
-  // The dispatch source and queue on which Mach messages will be received.
-  std::unique_ptr<base::DispatchSourceMach> dispatch_source_;
-
-  // Stores mach info for every process in the broker.
-  typedef std::map<base::ProcessHandle, mach_port_t> MachMap;
-  MachMap mach_map_;
-
-  // Mutex that guards |mach_map_|.
-  mutable base::Lock lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(MachPortBroker);
-};
-
-}  // namespace base
-
-#endif  // BASE_MAC_MACH_PORT_BROKER_H_
diff --git a/base/mac/mach_port_broker.mm b/base/mac/mach_port_broker.mm
deleted file mode 100644
index 6d9fec5..0000000
--- a/base/mac/mach_port_broker.mm
+++ /dev/null
@@ -1,184 +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/mac/mach_port_broker.h"
-
-#include <bsm/libbsm.h>
-#include <servers/bootstrap.h>
-
-#include "base/logging.h"
-#include "base/mac/foundation_util.h"
-#include "base/mac/mach_logging.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-
-namespace base {
-
-namespace {
-
-// Mach message structure used in the child as a sending message.
-struct MachPortBroker_ChildSendMsg {
-  mach_msg_header_t header;
-  mach_msg_body_t body;
-  mach_msg_port_descriptor_t child_task_port;
-};
-
-// Complement to the ChildSendMsg, this is used in the parent for receiving
-// a message. Contains a message trailer with audit information.
-struct MachPortBroker_ParentRecvMsg : public MachPortBroker_ChildSendMsg {
-  mach_msg_audit_trailer_t trailer;
-};
-
-}  // namespace
-
-// static
-bool MachPortBroker::ChildSendTaskPortToParent(const std::string& name) {
-  // Look up the named MachPortBroker port that's been registered with the
-  // bootstrap server.
-  mach_port_t parent_port;
-  kern_return_t kr = bootstrap_look_up(bootstrap_port,
-      const_cast<char*>(GetMachPortName(name, true).c_str()), &parent_port);
-  if (kr != KERN_SUCCESS) {
-    BOOTSTRAP_LOG(ERROR, kr) << "bootstrap_look_up";
-    return false;
-  }
-  base::mac::ScopedMachSendRight scoped_right(parent_port);
-
-  // Create the check in message. This will copy a send right on this process'
-  // (the child's) task port and send it to the parent.
-  MachPortBroker_ChildSendMsg msg;
-  bzero(&msg, sizeof(msg));
-  msg.header.msgh_bits = MACH_MSGH_BITS_REMOTE(MACH_MSG_TYPE_COPY_SEND) |
-                         MACH_MSGH_BITS_COMPLEX;
-  msg.header.msgh_remote_port = parent_port;
-  msg.header.msgh_size = sizeof(msg);
-  msg.body.msgh_descriptor_count = 1;
-  msg.child_task_port.name = mach_task_self();
-  msg.child_task_port.disposition = MACH_MSG_TYPE_PORT_SEND;
-  msg.child_task_port.type = MACH_MSG_PORT_DESCRIPTOR;
-
-  kr = mach_msg(&msg.header, MACH_SEND_MSG | MACH_SEND_TIMEOUT, sizeof(msg),
-      0, MACH_PORT_NULL, 100 /*milliseconds*/, MACH_PORT_NULL);
-  if (kr != KERN_SUCCESS) {
-    MACH_LOG(ERROR, kr) << "mach_msg";
-    return false;
-  }
-
-  return true;
-}
-
-// static
-std::string MachPortBroker::GetMachPortName(const std::string& name,
-                                            bool is_child) {
-  // In child processes, use the parent's pid.
-  const pid_t pid = is_child ? getppid() : getpid();
-  return base::StringPrintf(
-      "%s.%s.%d", base::mac::BaseBundleID(), name.c_str(), pid);
-}
-
-mach_port_t MachPortBroker::TaskForPid(base::ProcessHandle pid) const {
-  base::AutoLock lock(lock_);
-  MachPortBroker::MachMap::const_iterator it = mach_map_.find(pid);
-  if (it == mach_map_.end())
-    return MACH_PORT_NULL;
-  return it->second;
-}
-
-MachPortBroker::MachPortBroker(const std::string& name) : name_(name) {}
-
-MachPortBroker::~MachPortBroker() {}
-
-bool MachPortBroker::Init() {
-  DCHECK(server_port_.get() == MACH_PORT_NULL);
-
-  // Check in with launchd and publish the service name.
-  mach_port_t port;
-  kern_return_t kr = bootstrap_check_in(
-      bootstrap_port, GetMachPortName(name_, false).c_str(), &port);
-  if (kr != KERN_SUCCESS) {
-    BOOTSTRAP_LOG(ERROR, kr) << "bootstrap_check_in";
-    return false;
-  }
-  server_port_.reset(port);
-
-  // Start the dispatch source.
-  std::string queue_name =
-      base::StringPrintf("%s.MachPortBroker", base::mac::BaseBundleID());
-  dispatch_source_.reset(new base::DispatchSourceMach(
-      queue_name.c_str(), server_port_.get(), ^{ HandleRequest(); }));
-  dispatch_source_->Resume();
-
-  return true;
-}
-
-void MachPortBroker::AddPlaceholderForPid(base::ProcessHandle pid) {
-  lock_.AssertAcquired();
-  DCHECK_EQ(0u, mach_map_.count(pid));
-  mach_map_[pid] = MACH_PORT_NULL;
-}
-
-void MachPortBroker::InvalidatePid(base::ProcessHandle pid) {
-  lock_.AssertAcquired();
-
-  MachMap::iterator mach_it = mach_map_.find(pid);
-  if (mach_it != mach_map_.end()) {
-    kern_return_t kr = mach_port_deallocate(mach_task_self(), mach_it->second);
-    MACH_LOG_IF(WARNING, kr != KERN_SUCCESS, kr) << "mach_port_deallocate";
-    mach_map_.erase(mach_it);
-  }
-}
-
-void MachPortBroker::HandleRequest() {
-  MachPortBroker_ParentRecvMsg msg;
-  bzero(&msg, sizeof(msg));
-  msg.header.msgh_size = sizeof(msg);
-  msg.header.msgh_local_port = server_port_.get();
-
-  const mach_msg_option_t options = MACH_RCV_MSG |
-      MACH_RCV_TRAILER_TYPE(MACH_RCV_TRAILER_AUDIT) |
-      MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_AUDIT);
-
-  kern_return_t kr = mach_msg(&msg.header,
-                              options,
-                              0,
-                              sizeof(msg),
-                              server_port_.get(),
-                              MACH_MSG_TIMEOUT_NONE,
-                              MACH_PORT_NULL);
-  if (kr != KERN_SUCCESS) {
-    MACH_LOG(ERROR, kr) << "mach_msg";
-    return;
-  }
-
-  // Use the kernel audit information to make sure this message is from
-  // a task that this process spawned. The kernel audit token contains the
-  // unspoofable pid of the task that sent the message.
-  pid_t child_pid = audit_token_to_pid(msg.trailer.msgh_audit);
-  mach_port_t child_task_port = msg.child_task_port.name;
-
-  // Take the lock and update the broker information.
-  {
-    base::AutoLock lock(lock_);
-    FinalizePid(child_pid, child_task_port);
-  }
-  NotifyObservers(child_pid);
-}
-
-void MachPortBroker::FinalizePid(base::ProcessHandle pid,
-                                 mach_port_t task_port) {
-  lock_.AssertAcquired();
-
-  MachMap::iterator it = mach_map_.find(pid);
-  if (it == mach_map_.end()) {
-    // Do nothing for unknown pids.
-    LOG(ERROR) << "Unknown process " << pid << " is sending Mach IPC messages!";
-    return;
-  }
-
-  DCHECK(it->second == MACH_PORT_NULL);
-  if (it->second == MACH_PORT_NULL)
-    it->second = task_port;
-}
-
-}  // namespace base
diff --git a/base/mac/mach_port_util.cc b/base/mac/mach_port_util.cc
deleted file mode 100644
index 0eee210..0000000
--- a/base/mac/mach_port_util.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 "base/mac/mach_port_util.h"
-
-#include "base/logging.h"
-
-namespace base {
-
-namespace {
-
-// Struct for sending a complex Mach message.
-struct MachSendComplexMessage {
-  mach_msg_header_t header;
-  mach_msg_body_t body;
-  mach_msg_port_descriptor_t data;
-};
-
-// Struct for receiving a complex message.
-struct MachReceiveComplexMessage {
-  mach_msg_header_t header;
-  mach_msg_body_t body;
-  mach_msg_port_descriptor_t data;
-  mach_msg_trailer_t trailer;
-};
-
-}  // namespace
-
-kern_return_t SendMachPort(mach_port_t endpoint,
-                           mach_port_t port_to_send,
-                           int disposition) {
-  MachSendComplexMessage send_msg;
-  send_msg.header.msgh_bits =
-      MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE, 0) | MACH_MSGH_BITS_COMPLEX;
-  send_msg.header.msgh_size = sizeof(send_msg);
-  send_msg.header.msgh_remote_port = endpoint;
-  send_msg.header.msgh_local_port = MACH_PORT_NULL;
-  send_msg.header.msgh_reserved = 0;
-  send_msg.header.msgh_id = 0;
-  send_msg.body.msgh_descriptor_count = 1;
-  send_msg.data.name = port_to_send;
-  send_msg.data.disposition = disposition;
-  send_msg.data.type = MACH_MSG_PORT_DESCRIPTOR;
-
-  kern_return_t kr =
-      mach_msg(&send_msg.header, MACH_SEND_MSG | MACH_SEND_TIMEOUT,
-               send_msg.header.msgh_size,
-               0,                // receive limit
-               MACH_PORT_NULL,   // receive name
-               0,                // timeout
-               MACH_PORT_NULL);  // notification port
-
-  if (kr != KERN_SUCCESS)
-    mach_port_deallocate(mach_task_self(), endpoint);
-
-  return kr;
-}
-
-base::mac::ScopedMachSendRight ReceiveMachPort(mach_port_t port_to_listen_on) {
-  MachReceiveComplexMessage recv_msg;
-  mach_msg_header_t* recv_hdr = &recv_msg.header;
-  recv_hdr->msgh_local_port = port_to_listen_on;
-  recv_hdr->msgh_size = sizeof(recv_msg);
-
-  kern_return_t kr =
-      mach_msg(recv_hdr, MACH_RCV_MSG | MACH_RCV_TIMEOUT, 0,
-               recv_hdr->msgh_size, port_to_listen_on, 0, MACH_PORT_NULL);
-  if (kr != KERN_SUCCESS)
-    return base::mac::ScopedMachSendRight(MACH_PORT_NULL);
-  if (recv_msg.header.msgh_id != 0)
-    return base::mac::ScopedMachSendRight(MACH_PORT_NULL);
-  return base::mac::ScopedMachSendRight(recv_msg.data.name);
-}
-
-mach_port_name_t CreateIntermediateMachPort(
-    mach_port_t task_port,
-    base::mac::ScopedMachSendRight port_to_insert,
-    MachCreateError* error_code) {
-  DCHECK_NE(mach_task_self(), task_port);
-  DCHECK_NE(static_cast<mach_port_name_t>(MACH_PORT_NULL), task_port);
-
-  // Make a port with receive rights in the destination task.
-  mach_port_name_t endpoint;
-  kern_return_t kr =
-      mach_port_allocate(task_port, MACH_PORT_RIGHT_RECEIVE, &endpoint);
-  if (kr != KERN_SUCCESS) {
-    if (error_code)
-      *error_code = MachCreateError::ERROR_MAKE_RECEIVE_PORT;
-    return MACH_PORT_NULL;
-  }
-
-  // Change its message queue limit so that it accepts one message.
-  mach_port_limits limits = {};
-  limits.mpl_qlimit = 1;
-  kr = mach_port_set_attributes(task_port, endpoint, MACH_PORT_LIMITS_INFO,
-                                reinterpret_cast<mach_port_info_t>(&limits),
-                                MACH_PORT_LIMITS_INFO_COUNT);
-  if (kr != KERN_SUCCESS) {
-    if (error_code)
-      *error_code = MachCreateError::ERROR_SET_ATTRIBUTES;
-    mach_port_deallocate(task_port, endpoint);
-    return MACH_PORT_NULL;
-  }
-
-  // Get a send right.
-  mach_port_t send_once_right;
-  mach_msg_type_name_t send_right_type;
-  kr =
-      mach_port_extract_right(task_port, endpoint, MACH_MSG_TYPE_MAKE_SEND_ONCE,
-                              &send_once_right, &send_right_type);
-  if (kr != KERN_SUCCESS) {
-    if (error_code)
-      *error_code = MachCreateError::ERROR_EXTRACT_DEST_RIGHT;
-    mach_port_deallocate(task_port, endpoint);
-    return MACH_PORT_NULL;
-  }
-  DCHECK_EQ(static_cast<mach_msg_type_name_t>(MACH_MSG_TYPE_PORT_SEND_ONCE),
-            send_right_type);
-
-  // This call takes ownership of |send_once_right|.
-  kr = base::SendMachPort(
-      send_once_right, port_to_insert.get(), MACH_MSG_TYPE_COPY_SEND);
-  if (kr != KERN_SUCCESS) {
-    if (error_code)
-      *error_code = MachCreateError::ERROR_SEND_MACH_PORT;
-    mach_port_deallocate(task_port, endpoint);
-    return MACH_PORT_NULL;
-  }
-
-  // Endpoint is intentionally leaked into the destination task. An IPC must be
-  // sent to the destination task so that it can clean up this port.
-  return endpoint;
-}
-
-}  // namespace base
diff --git a/base/mac/mach_port_util.h b/base/mac/mach_port_util.h
deleted file mode 100644
index f7a7f32..0000000
--- a/base/mac/mach_port_util.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 BASE_MAC_MACH_PORT_UTIL_H_
-#define BASE_MAC_MACH_PORT_UTIL_H_
-
-#include <mach/mach.h>
-
-#include "base/base_export.h"
-#include "base/mac/scoped_mach_port.h"
-
-namespace base {
-
-enum class MachCreateError {
-    ERROR_MAKE_RECEIVE_PORT,
-    ERROR_SET_ATTRIBUTES,
-    ERROR_EXTRACT_DEST_RIGHT,
-    ERROR_SEND_MACH_PORT,
-};
-
-// Sends a Mach port to |dest_port|. Assumes that |dest_port| is a send once
-// right. Takes ownership of |dest_port|.
-BASE_EXPORT kern_return_t SendMachPort(mach_port_t dest_port,
-                                       mach_port_t port_to_send,
-                                       int disposition);
-
-// Receives a Mach port from |port_to_listen_on|, which should have exactly one
-// queued message. Returns |MACH_PORT_NULL| on any error.
-BASE_EXPORT base::mac::ScopedMachSendRight ReceiveMachPort(
-    mach_port_t port_to_listen_on);
-
-// Creates an intermediate Mach port in |task_port| and sends |port_to_insert|
-// as a mach_msg to the intermediate Mach port.
-// |task_port| is the task port of another process.
-// |port_to_insert| must be a send right in the current task's name space.
-// Returns the intermediate port on success, and MACH_PORT_NULL on failure.
-// On failure, |error_code| is set if not null.
-// This method takes ownership of |port_to_insert|. On success, ownership is
-// passed to the intermediate Mach port.
-BASE_EXPORT mach_port_name_t CreateIntermediateMachPort(
-    mach_port_t task_port,
-    base::mac::ScopedMachSendRight port_to_insert,
-    MachCreateError* error_code);
-
-}  // namespace base
-
-#endif  // BASE_MAC_MACH_PORT_UTIL_H_
diff --git a/base/mac/objc_release_properties.h b/base/mac/objc_release_properties.h
deleted file mode 100644
index d064cf9..0000000
--- a/base/mac/objc_release_properties.h
+++ /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.
-
-#if defined(__has_feature) && __has_feature(objc_arc)
-#error "ARC manages properties, so base::mac::ReleaseProperties isn't needed."
-#endif
-
-#ifndef BASE_MAC_OBJC_RELEASE_PROPERTIES_H_
-#define BASE_MAC_OBJC_RELEASE_PROPERTIES_H_
-
-#import <Foundation/Foundation.h>
-
-#include "base/base_export.h"
-
-// base::mac::ReleaseProperties(self) can be used in a class's -dealloc method
-// to release all properties marked "retain" or "copy" and backed by instance
-// variables. It only affects properties defined by the calling class, not
-// sub/superclass properties.
-//
-// Example usage:
-//
-//     @interface AllaysIBF : NSObject
-//
-//     @property(retain, nonatomic) NSString* string;
-//     @property(copy, nonatomic) NSMutableDictionary* dictionary;
-//     @property(assign, nonatomic) IBFDelegate* delegate;
-//
-//     @end  // @interface AllaysIBF
-//
-//     @implementation AllaysIBF
-//
-//     - (void)dealloc {
-//       base::mac::ReleaseProperties(self);
-//       [super dealloc];
-//     }
-//
-//     @end  // @implementation AllaysIBF
-//
-// self.string and self.dictionary will each be released, but self.delegate
-// will not because it is marked "assign", not "retain" or "copy".
-//
-// Another approach would be to provide a base class to inherit from whose
-// -dealloc walks the property lists of all subclasses to release their
-// properties. Distant subclasses might not expect it and over-release their
-// properties, so don't do that.
-
-namespace base {
-namespace mac {
-
-namespace details {
-
-BASE_EXPORT void ReleaseProperties(id, Class);
-
-}  // namespace details
-
-template <typename Self>
-void ReleaseProperties(Self* self) {
-  details::ReleaseProperties(self, [Self class]);
-}
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_OBJC_RELEASE_PROPERTIES_H_
diff --git a/base/mac/objc_release_properties.mm b/base/mac/objc_release_properties.mm
deleted file mode 100644
index d0006cf..0000000
--- a/base/mac/objc_release_properties.mm
+++ /dev/null
@@ -1,66 +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/mac/objc_release_properties.h"
-
-#include <memory>
-
-#include <objc/runtime.h>
-
-#include "base/logging.h"
-#include "base/memory/free_deleter.h"
-
-namespace {
-
-bool IsRetained(objc_property_t property) {
-  // The format of the string returned by property_getAttributes is documented
-  // at
-  // http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html#//apple_ref/doc/uid/TP40008048-CH101-SW6
-  const char* attribute = property_getAttributes(property);
-  while (attribute[0]) {
-    switch (attribute[0]) {
-      case 'C':  // copy
-      case '&':  // retain
-        return true;
-    }
-    do {
-      attribute++;
-    } while (attribute[0] && attribute[-1] != ',');
-  }
-  return false;
-}
-
-id ValueOf(id obj, objc_property_t property) {
-  std::unique_ptr<char, base::FreeDeleter> ivar_name(
-      property_copyAttributeValue(property, "V"));  // instance variable name
-  if (!ivar_name)
-    return nil;
-  id ivar_value = nil;
-  Ivar ivar = object_getInstanceVariable(obj, &*ivar_name,
-                                         reinterpret_cast<void**>(&ivar_value));
-  DCHECK(ivar);
-  return ivar_value;
-}
-
-}  // namespace
-
-namespace base {
-namespace mac {
-namespace details {
-
-void ReleaseProperties(id self, Class cls) {
-  unsigned int property_count;
-  std::unique_ptr<objc_property_t[], base::FreeDeleter> properties(
-      class_copyPropertyList(cls, &property_count));
-  for (size_t i = 0; i < property_count; ++i) {
-    objc_property_t property = properties[i];
-    if (!IsRetained(property))
-      continue;
-    [ValueOf(self, property) release];
-  }
-}
-
-}  // namespace details
-}  // namespace mac
-}  // namespace base
diff --git a/base/mac/os_crash_dumps.cc b/base/mac/os_crash_dumps.cc
deleted file mode 100644
index 95af009..0000000
--- a/base/mac/os_crash_dumps.cc
+++ /dev/null
@@ -1,61 +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.
-
-#include "base/mac/os_crash_dumps.h"
-
-#include <signal.h>
-#include <stddef.h>
-#include <unistd.h>
-
-#include "base/logging.h"
-#include "base/macros.h"
-
-namespace base {
-namespace mac {
-
-namespace {
-
-void ExitSignalHandler(int sig) {
-  // A call to exit() can call atexit() handlers.  If we SIGSEGV due
-  // to a corrupt heap, and if we have an atexit handler that
-  // allocates or frees memory, we are in trouble if we do not _exit.
-  _exit(128 + sig);
-}
-
-}  // namespace
-
-void DisableOSCrashDumps() {
-  // These are the POSIX signals corresponding to the Mach exceptions that
-  // Apple Crash Reporter handles.  See ux_exception() in xnu's
-  // bsd/uxkern/ux_exception.c and machine_exception() in xnu's
-  // bsd/dev/*/unix_signal.c.
-  const int signals_to_intercept[] = {
-    // Hardware faults
-    SIGILL,   // EXC_BAD_INSTRUCTION
-    SIGTRAP,  // EXC_BREAKPOINT
-    SIGFPE,   // EXC_ARITHMETIC
-    SIGBUS,   // EXC_BAD_ACCESS
-    SIGSEGV,  // EXC_BAD_ACCESS
-    // Not a hardware fault
-    SIGABRT
-  };
-
-  // For all these signals, just wire things up so we exit immediately.
-  for (size_t i = 0; i < arraysize(signals_to_intercept); ++i) {
-    struct sigaction act = {};
-    act.sa_handler = ExitSignalHandler;
-
-    // It is better to allow the signal handler to run on the stack
-    // registered with sigaltstack(), if one is present.
-    act.sa_flags = SA_ONSTACK;
-
-    if (sigemptyset(&act.sa_mask) != 0)
-      DPLOG(FATAL) << "sigemptyset() failed";
-    if (sigaction(signals_to_intercept[i], &act, NULL) != 0)
-      DPLOG(FATAL) << "sigaction() failed";
-  }
-}
-
-}  // namespace mac
-}  // namespace base
diff --git a/base/mac/os_crash_dumps.h b/base/mac/os_crash_dumps.h
deleted file mode 100644
index 31d90fb..0000000
--- a/base/mac/os_crash_dumps.h
+++ /dev/null
@@ -1,22 +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 BASE_MAC_OS_CRASH_DUMPS_H_
-#define BASE_MAC_OS_CRASH_DUMPS_H_
-
-#include "base/base_export.h"
-
-namespace base {
-namespace mac {
-
-// On Mac OS X, it can take a really long time for the OS crash handler to
-// process a Chrome crash when debugging symbols are available.  This
-// translates into a long wait until the process actually dies.  This call
-// disables Apple Crash Reporter entirely.
-BASE_EXPORT void DisableOSCrashDumps();
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_OS_CRASH_DUMPS_H_
diff --git a/base/mac/scoped_aedesc.h b/base/mac/scoped_aedesc.h
deleted file mode 100644
index 7327092..0000000
--- a/base/mac/scoped_aedesc.h
+++ /dev/null
@@ -1,52 +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 BASE_MAC_SCOPED_AEDESC_H_
-#define BASE_MAC_SCOPED_AEDESC_H_
-
-#import <CoreServices/CoreServices.h>
-
-#include "base/macros.h"
-
-namespace base {
-namespace mac {
-
-// The ScopedAEDesc is used to scope AppleEvent descriptors.  On creation,
-// it will store a NULL descriptor.  On destruction, it will dispose of the
-// descriptor.
-//
-// This class is parameterized for additional type safety checks.  You can use
-// the generic AEDesc type by not providing a template parameter:
-//  ScopedAEDesc<> desc;
-template <typename AEDescType = AEDesc>
-class ScopedAEDesc {
- public:
-  ScopedAEDesc() {
-    AECreateDesc(typeNull, NULL, 0, &desc_);
-  }
-
-  ~ScopedAEDesc() {
-    AEDisposeDesc(&desc_);
-  }
-
-  // Used for in parameters.
-  operator const AEDescType*() {
-    return &desc_;
-  }
-
-  // Used for out parameters.
-  AEDescType* OutPointer() {
-    return &desc_;
-  }
-
- private:
-  AEDescType desc_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedAEDesc);
-};
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_AEDESC_H_
diff --git a/base/mac/scoped_authorizationref.h b/base/mac/scoped_authorizationref.h
deleted file mode 100644
index b83f8df..0000000
--- a/base/mac/scoped_authorizationref.h
+++ /dev/null
@@ -1,82 +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_MAC_SCOPED_AUTHORIZATIONREF_H_
-#define BASE_MAC_SCOPED_AUTHORIZATIONREF_H_
-
-#include <Security/Authorization.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-
-// ScopedAuthorizationRef maintains ownership of an AuthorizationRef.  It is
-// patterned after the unique_ptr interface.
-
-namespace base {
-namespace mac {
-
-class ScopedAuthorizationRef {
- public:
-  explicit ScopedAuthorizationRef(AuthorizationRef authorization = NULL)
-      : authorization_(authorization) {
-  }
-
-  ~ScopedAuthorizationRef() {
-    if (authorization_) {
-      AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights);
-    }
-  }
-
-  void reset(AuthorizationRef authorization = NULL) {
-    if (authorization_ != authorization) {
-      if (authorization_) {
-        AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights);
-      }
-      authorization_ = authorization;
-    }
-  }
-
-  bool operator==(AuthorizationRef that) const {
-    return authorization_ == that;
-  }
-
-  bool operator!=(AuthorizationRef that) const {
-    return authorization_ != that;
-  }
-
-  operator AuthorizationRef() const {
-    return authorization_;
-  }
-
-  AuthorizationRef* get_pointer() { return &authorization_; }
-
-  AuthorizationRef get() const {
-    return authorization_;
-  }
-
-  void swap(ScopedAuthorizationRef& that) {
-    AuthorizationRef temp = that.authorization_;
-    that.authorization_ = authorization_;
-    authorization_ = temp;
-  }
-
-  // ScopedAuthorizationRef::release() is like std::unique_ptr<>::release. It is
-  // NOT a wrapper for AuthorizationFree(). To force a ScopedAuthorizationRef
-  // object to call AuthorizationFree(), use ScopedAuthorizationRef::reset().
-  AuthorizationRef release() WARN_UNUSED_RESULT {
-    AuthorizationRef temp = authorization_;
-    authorization_ = NULL;
-    return temp;
-  }
-
- private:
-  AuthorizationRef authorization_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedAuthorizationRef);
-};
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_AUTHORIZATIONREF_H_
diff --git a/base/mac/scoped_cffiledescriptorref.h b/base/mac/scoped_cffiledescriptorref.h
deleted file mode 100644
index 923a159..0000000
--- a/base/mac/scoped_cffiledescriptorref.h
+++ /dev/null
@@ -1,39 +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 BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_
-#define BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_
-
-#include <CoreFoundation/CoreFoundation.h>
-
-#include "base/scoped_generic.h"
-
-namespace base {
-namespace mac {
-
-namespace internal {
-
-struct ScopedCFFileDescriptorRefTraits {
-  static CFFileDescriptorRef InvalidValue() { return nullptr; }
-  static void Free(CFFileDescriptorRef ref) {
-    CFFileDescriptorInvalidate(ref);
-    CFRelease(ref);
-  }
-};
-
-}  // namespace internal
-
-// ScopedCFFileDescriptorRef is designed after ScopedCFTypeRef<>. On
-// destruction, it will invalidate the file descriptor.
-// ScopedCFFileDescriptorRef (unlike ScopedCFTypeRef<>) does not support RETAIN
-// semantics, copying, or assignment, as doing so would increase the chances
-// that a file descriptor is invalidated while still in use.
-using ScopedCFFileDescriptorRef =
-    ScopedGeneric<CFFileDescriptorRef,
-                  internal::ScopedCFFileDescriptorRefTraits>;
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_
diff --git a/base/mac/scoped_ionotificationportref.h b/base/mac/scoped_ionotificationportref.h
deleted file mode 100644
index 93ebc98..0000000
--- a/base/mac/scoped_ionotificationportref.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 BASE_MAC_SCOPED_IONOTIFICATIONPORTREF_H_
-#define BASE_MAC_SCOPED_IONOTIFICATIONPORTREF_H_
-
-#include <IOKit/IOKitLib.h>
-
-#include "base/scoped_generic.h"
-
-namespace base {
-namespace mac {
-
-namespace internal {
-
-struct ScopedIONotificationPortRefTraits {
-  static IONotificationPortRef InvalidValue() { return nullptr; }
-  static void Free(IONotificationPortRef object) {
-    IONotificationPortDestroy(object);
-  }
-};
-
-}  // namepsace internal
-
-using ScopedIONotificationPortRef =
-    ScopedGeneric<IONotificationPortRef,
-                  internal::ScopedIONotificationPortRefTraits>;
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_IONOTIFICATIONPORTREF_H_
diff --git a/base/mac/scoped_ioplugininterface.h b/base/mac/scoped_ioplugininterface.h
deleted file mode 100644
index 872da8e..0000000
--- a/base/mac/scoped_ioplugininterface.h
+++ /dev/null
@@ -1,38 +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_MAC_SCOPED_IOPLUGININTERFACE_H_
-#define BASE_MAC_SCOPED_IOPLUGININTERFACE_H_
-
-#include <IOKit/IOKitLib.h>
-
-#include "base/mac/scoped_typeref.h"
-
-namespace base {
-namespace mac {
-
-namespace internal {
-
-template <typename T>
-struct ScopedIOPluginInterfaceTraits {
-  static T InvalidValue() { return nullptr; }
-  static T Retain(T t) {
-    (*t)->AddRef(t);
-    return t;
-  }
-  static void Release(T t) { (*t)->Release(t); }
-};
-
-}  // namespace internal
-
-// Just like ScopedCFTypeRef but for IOCFPlugInInterface and friends
-// (IOUSBInterfaceStruct and IOUSBDeviceStruct320 in particular).
-template <typename T>
-using ScopedIOPluginInterface =
-    ScopedTypeRef<T**, internal::ScopedIOPluginInterfaceTraits<T**>>;
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_IOPLUGININTERFACE_H_
diff --git a/base/mac/scoped_launch_data.h b/base/mac/scoped_launch_data.h
deleted file mode 100644
index f4db330..0000000
--- a/base/mac/scoped_launch_data.h
+++ /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.
-
-#ifndef BASE_MAC_SCOPED_LAUNCH_DATA_H_
-#define BASE_MAC_SCOPED_LAUNCH_DATA_H_
-
-#include <launch.h>
-
-#include "base/scoped_generic.h"
-
-namespace base {
-namespace mac {
-
-namespace internal {
-
-struct ScopedLaunchDataTraits {
-  static launch_data_t InvalidValue() { return nullptr; }
-  static void Free(launch_data_t ldt) { launch_data_free(ldt); }
-};
-
-}  // namespace internal
-
-// Just like std::unique_ptr<> but for launch_data_t.
-using ScopedLaunchData =
-    ScopedGeneric<launch_data_t, internal::ScopedLaunchDataTraits>;
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_LAUNCH_DATA_H_
diff --git a/base/mac/scoped_mach_vm.cc b/base/mac/scoped_mach_vm.cc
deleted file mode 100644
index d52c77f..0000000
--- a/base/mac/scoped_mach_vm.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 "base/mac/scoped_mach_vm.h"
-
-namespace base {
-namespace mac {
-
-void ScopedMachVM::reset(vm_address_t address, vm_size_t size) {
-  DCHECK_EQ(address % PAGE_SIZE, 0u);
-  DCHECK_EQ(size % PAGE_SIZE, 0u);
-
-  if (size_) {
-    if (address_ < address) {
-      vm_deallocate(mach_task_self(),
-                    address_,
-                    std::min(size_, address - address_));
-    }
-    if (address_ + size_ > address + size) {
-      vm_address_t deallocate_start = std::max(address_, address + size);
-      vm_deallocate(mach_task_self(),
-                    deallocate_start,
-                    address_ + size_ - deallocate_start);
-    }
-  }
-
-  address_ = address;
-  size_ = size;
-}
-
-}  // namespace mac
-}  // namespace base
diff --git a/base/mac/scoped_mach_vm.h b/base/mac/scoped_mach_vm.h
deleted file mode 100644
index 58a13f6..0000000
--- a/base/mac/scoped_mach_vm.h
+++ /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.
-
-#ifndef BASE_MAC_SCOPED_MACH_VM_H_
-#define BASE_MAC_SCOPED_MACH_VM_H_
-
-#include <mach/mach.h>
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/base_export.h"
-#include "base/logging.h"
-#include "base/macros.h"
-
-// Use ScopedMachVM to supervise ownership of pages in the current process
-// through the Mach VM subsystem. Pages allocated with vm_allocate can be
-// released when exiting a scope with ScopedMachVM.
-//
-// The Mach VM subsystem operates on a page-by-page basis, and a single VM
-// allocation managed by a ScopedMachVM object may span multiple pages. As far
-// as Mach is concerned, allocated pages may be deallocated individually. This
-// is in contrast to higher-level allocators such as malloc, where the base
-// address of an allocation implies the size of an allocated block.
-// Consequently, it is not sufficient to just pass the base address of an
-// allocation to ScopedMachVM, it also needs to know the size of the
-// allocation. To avoid any confusion, both the base address and size must
-// be page-aligned.
-//
-// When dealing with Mach VM, base addresses will naturally be page-aligned,
-// but user-specified sizes may not be. If there's a concern that a size is
-// not page-aligned, use the mach_vm_round_page macro to correct it.
-//
-// Example:
-//
-//   vm_address_t address = 0;
-//   vm_size_t size = 12345;  // This requested size is not page-aligned.
-//   kern_return_t kr =
-//       vm_allocate(mach_task_self(), &address, size, VM_FLAGS_ANYWHERE);
-//   if (kr != KERN_SUCCESS) {
-//     return false;
-//   }
-//   ScopedMachVM vm_owner(address, mach_vm_round_page(size));
-
-namespace base {
-namespace mac {
-
-class BASE_EXPORT ScopedMachVM {
- public:
-  explicit ScopedMachVM(vm_address_t address = 0, vm_size_t size = 0)
-      : address_(address), size_(size) {
-    DCHECK_EQ(address % PAGE_SIZE, 0u);
-    DCHECK_EQ(size % PAGE_SIZE, 0u);
-  }
-
-  ~ScopedMachVM() {
-    if (size_) {
-      vm_deallocate(mach_task_self(), address_, size_);
-    }
-  }
-
-  void reset(vm_address_t address = 0, vm_size_t size = 0);
-
-  vm_address_t address() const {
-    return address_;
-  }
-
-  vm_size_t size() const {
-    return size_;
-  }
-
-  void swap(ScopedMachVM& that) {
-    std::swap(address_, that.address_);
-    std::swap(size_, that.size_);
-  }
-
-  void release() {
-    address_ = 0;
-    size_ = 0;
-  }
-
- private:
-  vm_address_t address_;
-  vm_size_t size_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedMachVM);
-};
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_MACH_VM_H_
diff --git a/base/mac/scoped_objc_class_swizzler.h b/base/mac/scoped_objc_class_swizzler.h
deleted file mode 100644
index e18e4ab..0000000
--- a/base/mac/scoped_objc_class_swizzler.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 BASE_MAC_SCOPED_OBJC_CLASS_SWIZZLER_H_
-#define BASE_MAC_SCOPED_OBJC_CLASS_SWIZZLER_H_
-
-#import <objc/runtime.h>
-
-#include "base/base_export.h"
-#include "base/macros.h"
-
-namespace base {
-namespace mac {
-
-// Within a given scope, swaps method implementations of a class interface, or
-// between two class interfaces. The argument and return types must match.
-class BASE_EXPORT ScopedObjCClassSwizzler {
- public:
-  // Given two classes that each respond to |selector|, swap the implementations
-  // of those methods.
-  ScopedObjCClassSwizzler(Class target, Class source, SEL selector);
-
-  // Given two selectors on the same class interface, |target| (e.g. via
-  // inheritance or categories), swap the implementations of methods |original|
-  // and |alternate|.
-  ScopedObjCClassSwizzler(Class target, SEL original, SEL alternate);
-
-  ~ScopedObjCClassSwizzler();
-
-  // Return a callable function pointer for the replaced method. To call this
-  // from the replacing function, the first two arguments should be |self| and
-  // |_cmd|. These are followed by the (variadic) method arguments.
-  IMP GetOriginalImplementation();
-
- private:
-  // Delegated constructor.
-  void Init(Class target, Class source, SEL original, SEL alternate);
-
-  Method old_selector_impl_;
-  Method new_selector_impl_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedObjCClassSwizzler);
-};
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_OBJC_CLASS_SWIZZLER_H_
diff --git a/base/mac/scoped_objc_class_swizzler.mm b/base/mac/scoped_objc_class_swizzler.mm
deleted file mode 100644
index 20e5c56..0000000
--- a/base/mac/scoped_objc_class_swizzler.mm
+++ /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.
-
-#import "base/mac/scoped_objc_class_swizzler.h"
-
-#include <string.h>
-
-#include "base/logging.h"
-
-namespace base {
-namespace mac {
-
-ScopedObjCClassSwizzler::ScopedObjCClassSwizzler(Class target,
-                                                 Class source,
-                                                 SEL selector)
-    : old_selector_impl_(NULL), new_selector_impl_(NULL) {
-  Init(target, source, selector, selector);
-}
-
-ScopedObjCClassSwizzler::ScopedObjCClassSwizzler(Class target,
-                                                 SEL original,
-                                                 SEL alternate)
-    : old_selector_impl_(NULL), new_selector_impl_(NULL) {
-  Init(target, target, original, alternate);
-}
-
-ScopedObjCClassSwizzler::~ScopedObjCClassSwizzler() {
-  if (old_selector_impl_ && new_selector_impl_)
-    method_exchangeImplementations(old_selector_impl_, new_selector_impl_);
-}
-
-IMP ScopedObjCClassSwizzler::GetOriginalImplementation() {
-  // Note that while the swizzle is in effect the "new" method is actually
-  // pointing to the original implementation, since they have been swapped.
-  return method_getImplementation(new_selector_impl_);
-}
-
-void ScopedObjCClassSwizzler::Init(Class target,
-                                   Class source,
-                                   SEL original,
-                                   SEL alternate) {
-  old_selector_impl_ = class_getInstanceMethod(target, original);
-  new_selector_impl_ = class_getInstanceMethod(source, alternate);
-  if (!old_selector_impl_ && !new_selector_impl_) {
-    // Try class methods.
-    old_selector_impl_ = class_getClassMethod(target, original);
-    new_selector_impl_ = class_getClassMethod(source, alternate);
-  }
-
-  DCHECK(old_selector_impl_);
-  DCHECK(new_selector_impl_);
-  if (!old_selector_impl_ || !new_selector_impl_)
-    return;
-
-  // The argument and return types must match exactly.
-  const char* old_types = method_getTypeEncoding(old_selector_impl_);
-  const char* new_types = method_getTypeEncoding(new_selector_impl_);
-  DCHECK(old_types);
-  DCHECK(new_types);
-  DCHECK_EQ(0, strcmp(old_types, new_types));
-  if (!old_types || !new_types || strcmp(old_types, new_types)) {
-    old_selector_impl_ = new_selector_impl_ = NULL;
-    return;
-  }
-
-  method_exchangeImplementations(old_selector_impl_, new_selector_impl_);
-}
-
-}  // namespace mac
-}  // namespace base
diff --git a/base/mac/scoped_sending_event.h b/base/mac/scoped_sending_event.h
deleted file mode 100644
index c579cef..0000000
--- a/base/mac/scoped_sending_event.h
+++ /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.
-
-#ifndef BASE_MAC_SCOPED_SENDING_EVENT_H_
-#define BASE_MAC_SCOPED_SENDING_EVENT_H_
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/message_loop/message_pump_mac.h"
-
-// Nested event loops can pump IPC messages, including
-// script-initiated tab closes, which could release objects that the
-// nested event loop might message.  CrAppProtocol defines how to ask
-// the embedding NSApplication subclass if an event is currently being
-// handled, in which case such closes are deferred to the top-level
-// event loop.
-//
-// ScopedSendingEvent allows script-initiated event loops to work like
-// a nested event loop, as such events do not arrive via -sendEvent:.
-// CrAppControlProtocol lets ScopedSendingEvent tell the embedding
-// NSApplication what to return from -handlingSendEvent.
-
-@protocol CrAppControlProtocol<CrAppProtocol>
-- (void)setHandlingSendEvent:(BOOL)handlingSendEvent;
-@end
-
-namespace base {
-namespace mac {
-
-class BASE_EXPORT ScopedSendingEvent {
- public:
-  ScopedSendingEvent();
-  ~ScopedSendingEvent();
-
- private:
-  // The NSApp in control at the time the constructor was run, to be
-  // sure the |handling_| setting is restored appropriately.
-  NSObject<CrAppControlProtocol>* app_;
-  BOOL handling_;  // Value of -[app_ handlingSendEvent] at construction.
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedSendingEvent);
-};
-
-}  // namespace mac
-}  // namespace base
-
-#endif  // BASE_MAC_SCOPED_SENDING_EVENT_H_
diff --git a/base/mac/scoped_sending_event.mm b/base/mac/scoped_sending_event.mm
deleted file mode 100644
index c3813d8..0000000
--- a/base/mac/scoped_sending_event.mm
+++ /dev/null
@@ -1,24 +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.
-
-#import "base/mac/scoped_sending_event.h"
-
-#include "base/logging.h"
-
-namespace base {
-namespace mac {
-
-ScopedSendingEvent::ScopedSendingEvent()
-    : app_(static_cast<NSObject<CrAppControlProtocol>*>(NSApp)) {
-  DCHECK([app_ conformsToProtocol:@protocol(CrAppControlProtocol)]);
-  handling_ = [app_ isHandlingSendEvent];
-  [app_ setHandlingSendEvent:YES];
-}
-
-ScopedSendingEvent::~ScopedSendingEvent() {
-  [app_ setHandlingSendEvent:handling_];
-}
-
-}  // namespace mac
-}  // namespace base
diff --git a/base/memory/ref_counted.cc b/base/memory/ref_counted.cc
index c2d40ef..79ab853 100644
--- a/base/memory/ref_counted.cc
+++ b/base/memory/ref_counted.cc
@@ -4,8 +4,6 @@
 
 #include "base/memory/ref_counted.h"
 
-#include "base/threading/thread_collision_warner.h"
-
 namespace base {
 
 namespace subtle {
diff --git a/base/memory/ref_counted.h b/base/memory/ref_counted.h
index 6466c19..5cb731c 100644
--- a/base/memory/ref_counted.h
+++ b/base/memory/ref_counted.h
@@ -15,7 +15,6 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/threading/thread_collision_warner.h"
 #include "build_config.h"
 
 namespace base {
diff --git a/base/numerics/OWNERS b/base/numerics/OWNERS
deleted file mode 100644
index 5493fba..0000000
--- a/base/numerics/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-jschuh@chromium.org
-tsepez@chromium.org
-
-
-# COMPONENT: Internals
diff --git a/base/numerics/README.md b/base/numerics/README.md
deleted file mode 100644
index 896b124..0000000
--- a/base/numerics/README.md
+++ /dev/null
@@ -1,409 +0,0 @@
-# `base/numerics`
-
-This directory contains a dependency-free, header-only library of templates
-providing well-defined semantics for safely and performantly handling a variety
-of numeric operations, including most common arithmetic operations and
-conversions.
-
-The public API is broken out into the following header files:
-
-*   `checked_math.h` contains the `CheckedNumeric` template class and helper
-    functions for performing arithmetic and conversion operations that detect
-    errors and boundary conditions (e.g. overflow, truncation, etc.).
-*   `clamped_math.h` contains the `ClampedNumeric` template class and
-    helper functions for performing fast, clamped (i.e. non-sticky saturating)
-    arithmetic operations and conversions.
-*   `safe_conversions.h` contains the `StrictNumeric` template class and
-    a collection of custom casting templates and helper functions for safely
-    converting between a range of numeric types.
-*   `safe_math.h` includes all of the previously mentioned headers.
-
-*** aside
-**Note:** The `Numeric` template types implicitly convert from C numeric types
-and `Numeric` templates that are convertable to an underlying C numeric type.
-The conversion priority for `Numeric` type coercions is:
-
-*   `StrictNumeric` coerces to `ClampedNumeric` and `CheckedNumeric`
-*   `ClampedNumeric` coerces to `CheckedNumeric`
-***
-
-[TOC]
-
-## Common patterns and use-cases
-
-The following covers the preferred style for the most common uses of this
-library. Please don't cargo-cult from anywhere else. 😉
-
-### Performing checked arithmetic conversions
-
-The `checked_cast` template converts between arbitrary arithmetic types, and is
-used for cases where a conversion failure should result in program termination:
-
-```cpp
-// Crash if signed_value is out of range for buff_size.
-size_t buff_size = checked_cast<size_t>(signed_value);
-```
-
-### Performing saturated (clamped) arithmetic conversions
-
-The `saturated_cast` template converts between arbitrary arithmetic types, and
-is used in cases where an out-of-bounds source value should be saturated to the
-corresponding maximum or minimum of the destination type:
-
-```cpp
-// Convert from float with saturation to INT_MAX, INT_MIN, or 0 for NaN.
-int int_value = saturated_cast<int>(floating_point_value);
-```
-
-### Enforcing arithmetic conversions at compile-time
-
-The `strict_cast` enforces type restrictions at compile-time and results in
-emitted code that is identical to a normal `static_cast`. However, a
-`strict_cast` assignment will fail to compile if the destination type cannot
-represent the full range of the source type:
-
-```cpp
-// Throw a compiler error if byte_value is changed to an out-of-range-type.
-int int_value = strict_cast<int>(byte_value);
-```
-
-You can also enforce these compile-time restrictions on function parameters by
-using the `StrictNumeric` template:
-
-```cpp
-// Throw a compiler error if the size argument cannot be represented by a
-// size_t (e.g. passing an int will fail to compile).
-bool AllocateBuffer(void** buffer, StrictCast<size_t> size);
-```
-
-### Comparing values between arbitrary arithmetic types
-
-Both the `StrictNumeric` and `ClampedNumeric` types provide well defined
-comparisons between arbitrary arithmetic types. This allows you to perform
-comparisons that are not legal or would trigger compiler warnings or errors
-under the normal arithmetic promotion rules:
-
-```cpp
-bool foo(unsigned value, int upper_bound) {
-  // Converting to StrictNumeric allows this comparison to work correctly.
-  if (MakeStrictNum(value) >= upper_bound)
-    return false;
-```
-
-*** note
-**Warning:** Do not perform manual conversions using the comparison operators.
-Instead, use the cast templates described in the previous sections, or the
-constexpr template functions `IsValueInRangeForNumericType` and
-`IsTypeInRangeForNumericType`, as these templates properly handle the full range
-of corner cases and employ various optimizations.
-***
-
-### Calculating a buffer size (checked arithmetic)
-
-When making exact calculations—such as for buffer lengths—it's often necessary
-to know when those calculations trigger an overflow, undefined behavior, or
-other boundary conditions. The `CheckedNumeric` template does this by storing
-a bit determining whether or not some arithmetic operation has occured that
-would put the variable in an "invalid" state. Attempting to extract the value
-from a variable in an invalid state will trigger a check/trap condition, that
-by default will result in process termination.
-
-Here's an example of a buffer calculation using a `CheckedNumeric` type (note:
-the AssignIfValid method will trigger a compile error if the result is ignored).
-
-```cpp
-// Calculate the buffer size and detect if an overflow occurs.
-size_t size;
-if (!CheckAdd(kHeaderSize, CheckMul(count, kItemSize)).AssignIfValid(&size)) {
-  // Handle an overflow error...
-}
-```
-
-### Calculating clamped coordinates (non-sticky saturating arithmetic)
-
-Certain classes of calculations—such as coordinate calculations—require
-well-defined semantics that always produce a valid result on boundary
-conditions. The `ClampedNumeric` template addresses this by providing
-performant, non-sticky saturating arithmetic operations.
-
-Here's an example of using a `ClampedNumeric` to calculate an operation
-insetting a rectangle.
-
-```cpp
-// Use clamped arithmetic since inset calculations might overflow.
-void Rect::Inset(int left, int top, int right, int bottom) {
-  origin_ += Vector2d(left, top);
-  set_width(ClampSub(width(), ClampAdd(left, right)));
-  set_height(ClampSub(height(), ClampAdd(top, bottom)));
-}
-```
-
-*** note
-The `ClampedNumeric` type is not "sticky", which means the saturation is not
-retained across individual operations. As such, one arithmetic operation may
-result in a saturated value, while the next operation may then "desaturate"
-the value. Here's an example:
-
-```cpp
-ClampedNumeric<int> value = INT_MAX;
-++value;  // value is still INT_MAX, due to saturation.
---value;  // value is now (INT_MAX - 1), because saturation is not sticky.
-```
-
-***
-
-## Conversion functions and StrictNumeric<> in safe_conversions.h
-
-This header includes a collection of helper `constexpr` templates for safely
-performing a range of conversions, assignments, and tests.
-
-### Safe casting templates
-
-*   `as_signed()` - Returns the supplied integral value as a signed type of
-    the same width.
-*   `as_unsigned()` - Returns the supplied integral value as an unsigned type
-    of the same width.
-*   `checked_cast<>()` - Analogous to `static_cast<>` for numeric types, except
-    that by default it will trigger a crash on an out-of-bounds conversion (e.g.
-    overflow, underflow, NaN to integral) or a compile error if the conversion
-    error can be detected at compile time. The crash handler can be overridden
-    to perform a behavior other than crashing.
-*   `saturated_cast<>()` - Analogous to `static_cast` for numeric types, except
-    that it returns a saturated result when the specified numeric conversion
-    would otherwise overflow or underflow. An NaN source returns 0 by
-    default, but can be overridden to return a different result.
-*   `strict_cast<>()` - Analogous to `static_cast` for numeric types, except
-    this causes a compile failure if the destination type is not large
-    enough to contain any value in the source type. It performs no runtime
-    checking and thus introduces no runtime overhead.
-
-### Other helper and conversion functions
-
-*   `IsValueInRangeForNumericType<>()` - A convenience function that returns
-    true if the type supplied as the template parameter can represent the value
-    passed as an argument to the function.
-*   `IsTypeInRangeForNumericType<>()` - A convenience function that evaluates
-    entirely at compile-time and returns true if the destination type (first
-    template parameter) can represent the full range of the source type
-    (second template parameter).
-*   `IsValueNegative()` - A convenience function that will accept any
-    arithmetic type as an argument and will return whether the value is less
-    than zero. Unsigned types always return false.
-*   `SafeUnsignedAbs()` - Returns the absolute value of the supplied integer
-    parameter as an unsigned result (thus avoiding an overflow if the value
-    is the signed, two's complement minimum).
-
-### StrictNumeric<>
-
-`StrictNumeric<>` is a wrapper type that performs assignments and copies via
-the `strict_cast` template, and can perform valid arithmetic comparisons
-across any range of arithmetic types. `StrictNumeric` is the return type for
-values extracted from a `CheckedNumeric` class instance. The raw numeric value
-is extracted via `static_cast` to the underlying type or any type with
-sufficient range to represent the underlying type.
-
-*   `MakeStrictNum()` - Creates a new `StrictNumeric` from the underlying type
-    of the supplied arithmetic or StrictNumeric type.
-*   `SizeT` - Alias for `StrictNumeric<size_t>`.
-
-## CheckedNumeric<> in checked_math.h
-
-`CheckedNumeric<>` implements all the logic and operators for detecting integer
-boundary conditions such as overflow, underflow, and invalid conversions.
-The `CheckedNumeric` type implicitly converts from floating point and integer
-data types, and contains overloads for basic arithmetic operations (i.e.: `+`,
-`-`, `*`, `/` for all types and `%`, `<<`, `>>`, `&`, `|`, `^` for integers).
-However, *the [variadic template functions
-](#CheckedNumeric_in-checked_math_h-Non_member-helper-functions)
-are the prefered API,* as they remove type ambiguities and help prevent a number
-of common errors. The variadic functions can also be more performant, as they
-eliminate redundant expressions that are unavoidable with the with the operator
-overloads. (Ideally the compiler should optimize those away, but better to avoid
-them in the first place.)
-
-Type promotions are a slightly modified version of the [standard C/C++ numeric
-promotions
-](http://en.cppreference.com/w/cpp/language/implicit_conversion#Numeric_promotions)
-with the two differences being that *there is no default promotion to int*
-and *bitwise logical operations always return an unsigned of the wider type.*
-
-### Members
-
-The unary negation, increment, and decrement operators are supported, along
-with the following unary arithmetic methods, which return a new
-`CheckedNumeric` as a result of the operation:
-
-*   `Abs()` - Absolute value.
-*   `UnsignedAbs()` - Absolute value as an equal-width unsigned underlying type
-    (valid for only integral types).
-*   `Max()` - Returns whichever is greater of the current instance or argument.
-    The underlying return type is whichever has the greatest magnitude.
-*   `Min()` - Returns whichever is lowest of the current instance or argument.
-    The underlying return type is whichever has can represent the lowest
-    number in the smallest width (e.g. int8_t over unsigned, int over
-    int8_t, and float over int).
-
-The following are for converting `CheckedNumeric` instances:
-
-*   `type` - The underlying numeric type.
-*   `AssignIfValid()` - Assigns the underlying value to the supplied
-    destination pointer if the value is currently valid and within the
-    range supported by the destination type. Returns true on success.
-*   `Cast<>()` - Instance method returning a `CheckedNumeric` derived from
-    casting the current instance to a `CheckedNumeric` of the supplied
-    destination type.
-
-*** aside
-The following member functions return a `StrictNumeric`, which is valid for
-comparison and assignment operations, but will trigger a compile failure on
-attempts to assign to a type of insufficient range. The underlying value can
-be extracted by an explicit `static_cast` to the underlying type or any type
-with sufficient range to represent the underlying type.
-***
-
-*   `IsValid()` - Returns true if the underlying numeric value is valid (i.e.
-    has not wrapped or saturated and is not the result of an invalid
-    conversion).
-*   `ValueOrDie()` - Returns the underlying value. If the state is not valid
-    this call will trigger a crash by default (but may be overridden by
-    supplying an alternate handler to the template).
-*   `ValueOrDefault()` - Returns the current value, or the supplied default if
-    the state is not valid (but will not crash).
-
-**Comparison operators are explicitly not provided** for `CheckedNumeric`
-types because they could result in a crash if the type is not in a valid state.
-Patterns like the following should be used instead:
-
-```cpp
-// Either input or padding (or both) may be arbitrary sizes.
-size_t buff_size;
-if (!CheckAdd(input, padding, kHeaderLength).AssignIfValid(&buff_size) ||
-     buff_size >= kMaxBuffer) {
-  // Handle an error...
-} else {
-  // Do stuff on success...
-}
-```
-
-### Non-member helper functions
-
-The following variadic convenience functions, which accept standard arithmetic
-or `CheckedNumeric` types, perform arithmetic operations, and return a
-`CheckedNumeric` result. The supported functions are:
-
-*   `CheckAdd()` - Addition.
-*   `CheckSub()` - Subtraction.
-*   `CheckMul()` - Multiplication.
-*   `CheckDiv()` - Division.
-*   `CheckMod()` - Modulus (integer only).
-*   `CheckLsh()` - Left integer shift (integer only).
-*   `CheckRsh()` - Right integer shift (integer only).
-*   `CheckAnd()` - Bitwise AND (integer only with unsigned result).
-*   `CheckOr()`  - Bitwise OR (integer only with unsigned result).
-*   `CheckXor()` - Bitwise XOR (integer only with unsigned result).
-*   `CheckMax()` - Maximum of supplied arguments.
-*   `CheckMin()` - Minimum of supplied arguments.
-
-The following wrapper functions can be used to avoid the template
-disambiguator syntax when converting a destination type.
-
-*   `IsValidForType<>()` in place of: `a.template IsValid<>()`
-*   `ValueOrDieForType<>()` in place of: `a.template ValueOrDie<>()`
-*   `ValueOrDefaultForType<>()` in place of: `a.template ValueOrDefault<>()`
-
-The following general utility methods is are useful for converting from
-arithmetic types to `CheckedNumeric` types:
-
-*   `MakeCheckedNum()` - Creates a new `CheckedNumeric` from the underlying type
-    of the supplied arithmetic or directly convertible type.
-
-## ClampedNumeric<> in clamped_math.h
-
-`ClampedNumeric<>` implements all the logic and operators for clamped
-(non-sticky saturating) arithmetic operations and conversions. The
-`ClampedNumeric` type implicitly converts back and forth between floating point
-and integer data types, saturating on assignment as appropriate. It contains
-overloads for basic arithmetic operations (i.e.: `+`, `-`, `*`, `/` for
-all types and `%`, `<<`, `>>`, `&`, `|`, `^` for integers) along with comparison
-operators for arithmetic types of any size. However, *the [variadic template
-functions
-](#ClampedNumeric_in-clamped_math_h-Non_member-helper-functions)
-are the prefered API,* as they remove type ambiguities and help prevent
-a number of common errors. The variadic functions can also be more performant,
-as they eliminate redundant expressions that are unavoidable with the operator
-overloads. (Ideally the compiler should optimize those away, but better to avoid
-them in the first place.)
-
-Type promotions are a slightly modified version of the [standard C/C++ numeric
-promotions
-](http://en.cppreference.com/w/cpp/language/implicit_conversion#Numeric_promotions)
-with the two differences being that *there is no default promotion to int*
-and *bitwise logical operations always return an unsigned of the wider type.*
-
-*** aside
-Most arithmetic operations saturate normally, to the numeric limit in the
-direction of the sign. The potentially unusual cases are:
-
-*   **Division:** Division by zero returns the saturated limit in the direction
-    of sign of the dividend (first argument). The one exception is 0/0, which
-	returns zero (although logically is NaN).
-*   **Modulus:** Division by zero returns the dividend (first argument).
-*   **Left shift:** Non-zero values saturate in the direction of the signed
-    limit (max/min), even for shifts larger than the bit width. 0 shifted any
-    amount results in 0.
-*   **Right shift:** Negative values saturate to -1. Positive or 0 saturates
-    to 0. (Effectively just an unbounded arithmetic-right-shift.)
-*   **Bitwise operations:** No saturation; bit pattern is identical to
-    non-saturated bitwise operations.
-***
-
-### Members
-
-The unary negation, increment, and decrement operators are supported, along
-with the following unary arithmetic methods, which return a new
-`ClampedNumeric` as a result of the operation:
-
-*   `Abs()` - Absolute value.
-*   `UnsignedAbs()` - Absolute value as an equal-width unsigned underlying type
-    (valid for only integral types).
-*   `Max()` - Returns whichever is greater of the current instance or argument.
-    The underlying return type is whichever has the greatest magnitude.
-*   `Min()` - Returns whichever is lowest of the current instance or argument.
-    The underlying return type is whichever has can represent the lowest
-    number in the smallest width (e.g. int8_t over unsigned, int over
-    int8_t, and float over int).
-
-The following are for converting `ClampedNumeric` instances:
-
-*   `type` - The underlying numeric type.
-*   `RawValue()` - Returns the raw value as the underlying arithmetic type. This
-    is useful when e.g. assigning to an auto type or passing as a deduced
-    template parameter.
-*   `Cast<>()` - Instance method returning a `ClampedNumeric` derived from
-    casting the current instance to a `ClampedNumeric` of the supplied
-    destination type.
-
-### Non-member helper functions
-
-The following variadic convenience functions, which accept standard arithmetic
-or `ClampedNumeric` types, perform arithmetic operations, and return a
-`ClampedNumeric` result. The supported functions are:
-
-*   `ClampAdd()` - Addition.
-*   `ClampSub()` - Subtraction.
-*   `ClampMul()` - Multiplication.
-*   `ClampDiv()` - Division.
-*   `ClampMod()` - Modulus (integer only).
-*   `ClampLsh()` - Left integer shift (integer only).
-*   `ClampRsh()` - Right integer shift (integer only).
-*   `ClampAnd()` - Bitwise AND (integer only with unsigned result).
-*   `ClampOr()`  - Bitwise OR (integer only with unsigned result).
-*   `ClampXor()` - Bitwise XOR (integer only with unsigned result).
-*   `ClampMax()` - Maximum of supplied arguments.
-*   `ClampMin()` - Minimum of supplied arguments.
-
-The following is a general utility method that is useful for converting
-to a `ClampedNumeric` type:
-
-*   `MakeClampedNum()` - Creates a new `ClampedNumeric` from the underlying type
-    of the supplied arithmetic or directly convertible type.
diff --git a/base/observer_list.h b/base/observer_list.h
deleted file mode 100644
index e900e43..0000000
--- a/base/observer_list.h
+++ /dev/null
@@ -1,307 +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 BASE_OBSERVER_LIST_H_
-#define BASE_OBSERVER_LIST_H_
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <iterator>
-#include <limits>
-#include <utility>
-#include <vector>
-
-#include "base/gtest_prod_util.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/stl_util.h"
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// OVERVIEW:
-//
-//   A list of observers. Unlike a standard vector or list, this container can
-//   be modified during iteration without invalidating the iterator. So, it
-//   safely handles the case of an observer removing itself or other observers
-//   from the list while observers are being notified.
-//
-//
-// WARNING:
-//
-//   ObserverList is not thread-compatible. Iterating on the same ObserverList
-//   simultaneously in different threads is not safe, even when the ObserverList
-//   itself is not modified.
-//
-//   For a thread-safe observer list, see ObserverListThreadSafe.
-//
-//
-// TYPICAL USAGE:
-//
-//   class MyWidget {
-//    public:
-//     ...
-//
-//     class Observer {
-//      public:
-//       virtual void OnFoo(MyWidget* w) = 0;
-//       virtual void OnBar(MyWidget* w, int x, int y) = 0;
-//     };
-//
-//     void AddObserver(Observer* obs) {
-//       observers_.AddObserver(obs);
-//     }
-//
-//     void RemoveObserver(const Observer* obs) {
-//       observers_.RemoveObserver(obs);
-//     }
-//
-//     void NotifyFoo() {
-//       for (Observer& obs : observers_)
-//         obs.OnFoo(this);
-//     }
-//
-//     void NotifyBar(int x, int y) {
-//       for (Observer& obs : observers_)
-//         obs.OnBar(this, x, y);
-//     }
-//
-//    private:
-//     base::ObserverList<Observer> observers_;
-//   };
-//
-//
-///////////////////////////////////////////////////////////////////////////////
-
-namespace base {
-
-// Enumeration of which observers are notified by ObserverList.
-enum class ObserverListPolicy {
-  // Specifies that any observers added during notification are notified.
-  // This is the default policy if no policy is provided to the constructor.
-  ALL,
-
-  // Specifies that observers added while sending out notification are not
-  // notified.
-  EXISTING_ONLY,
-};
-
-// When check_empty is true, assert that the list is empty on destruction.
-// When allow_reentrancy is false, iterating throught the list while already in
-// the iteration loop will result in DCHECK failure.
-// TODO(oshima): Change the default to non reentrant. https://crbug.com/812109
-template <class ObserverType,
-          bool check_empty = false,
-          bool allow_reentrancy = true>
-class ObserverList
-    : public SupportsWeakPtr<
-          ObserverList<ObserverType, check_empty, allow_reentrancy>> {
- public:
-  // An iterator class that can be used to access the list of observers.
-  class Iter {
-   public:
-    using iterator_category = std::forward_iterator_tag;
-    using value_type = ObserverType;
-    using difference_type = ptrdiff_t;
-    using pointer = ObserverType*;
-    using reference = ObserverType&;
-
-    Iter() : index_(0), max_index_(0) {}
-
-    explicit Iter(const ObserverList* list)
-        : list_(const_cast<ObserverList*>(list)->AsWeakPtr()),
-          index_(0),
-          max_index_(list->policy_ == ObserverListPolicy::ALL
-                         ? std::numeric_limits<size_t>::max()
-                         : list->observers_.size()) {
-      DCHECK(list_);
-      DCHECK(allow_reentrancy || !list_->live_iterator_count_);
-      EnsureValidIndex();
-      ++list_->live_iterator_count_;
-    }
-
-    ~Iter() {
-      if (!list_)
-        return;
-
-      DCHECK_GT(list_->live_iterator_count_, 0);
-      if (--list_->live_iterator_count_ == 0)
-        list_->Compact();
-    }
-
-    Iter(const Iter& other)
-        : list_(other.list_),
-          index_(other.index_),
-          max_index_(other.max_index_) {
-      if (list_)
-        ++list_->live_iterator_count_;
-    }
-
-    Iter& operator=(Iter other) {
-      using std::swap;
-      swap(list_, other.list_);
-      swap(index_, other.index_);
-      swap(max_index_, other.max_index_);
-      return *this;
-    }
-
-    bool operator==(const Iter& other) const {
-      return (is_end() && other.is_end()) ||
-             (list_.get() == other.list_.get() && index_ == other.index_);
-    }
-
-    bool operator!=(const Iter& other) const { return !(*this == other); }
-
-    Iter& operator++() {
-      if (list_) {
-        ++index_;
-        EnsureValidIndex();
-      }
-      return *this;
-    }
-
-    Iter operator++(int) {
-      Iter it(*this);
-      ++(*this);
-      return it;
-    }
-
-    ObserverType* operator->() const {
-      ObserverType* const current = GetCurrent();
-      DCHECK(current);
-      return current;
-    }
-
-    ObserverType& operator*() const {
-      ObserverType* const current = GetCurrent();
-      DCHECK(current);
-      return *current;
-    }
-
-   private:
-    FRIEND_TEST_ALL_PREFIXES(ObserverListTest, BasicStdIterator);
-    FRIEND_TEST_ALL_PREFIXES(ObserverListTest, StdIteratorRemoveFront);
-
-    ObserverType* GetCurrent() const {
-      DCHECK(list_);
-      DCHECK_LT(index_, clamped_max_index());
-      return list_->observers_[index_];
-    }
-
-    void EnsureValidIndex() {
-      DCHECK(list_);
-      const size_t max_index = clamped_max_index();
-      while (index_ < max_index && !list_->observers_[index_])
-        ++index_;
-    }
-
-    size_t clamped_max_index() const {
-      return std::min(max_index_, list_->observers_.size());
-    }
-
-    bool is_end() const { return !list_ || index_ == clamped_max_index(); }
-
-    WeakPtr<ObserverList> list_;
-
-    // When initially constructed and each time the iterator is incremented,
-    // |index_| is guaranteed to point to a non-null index if the iterator
-    // has not reached the end of the ObserverList.
-    size_t index_;
-    size_t max_index_;
-  };
-
-  using iterator = Iter;
-  using const_iterator = Iter;
-
-  const_iterator begin() const {
-    // An optimization: do not involve weak pointers for empty list.
-    return observers_.empty() ? const_iterator() : const_iterator(this);
-  }
-
-  const_iterator end() const { return const_iterator(); }
-
-  ObserverList() = default;
-  explicit ObserverList(ObserverListPolicy policy) : policy_(policy) {}
-
-  ~ObserverList() {
-    if (check_empty) {
-      Compact();
-      DCHECK(observers_.empty());
-    }
-  }
-
-  // Add an observer to this list. An observer should not be added to the same
-  // list more than once.
-  //
-  // Precondition: obs != nullptr
-  // Precondition: !HasObserver(obs)
-  void AddObserver(ObserverType* obs) {
-    DCHECK(obs);
-    if (HasObserver(obs)) {
-      NOTREACHED() << "Observers can only be added once!";
-      return;
-    }
-    observers_.push_back(obs);
-  }
-
-  // Removes the given observer from this list. Does nothing if this observer is
-  // not in this list.
-  void RemoveObserver(const ObserverType* obs) {
-    DCHECK(obs);
-    const auto it = std::find(observers_.begin(), observers_.end(), obs);
-    if (it == observers_.end())
-      return;
-
-    DCHECK_GE(live_iterator_count_, 0);
-    if (live_iterator_count_) {
-      *it = nullptr;
-    } else {
-      observers_.erase(it);
-    }
-  }
-
-  // Determine whether a particular observer is in the list.
-  bool HasObserver(const ObserverType* obs) const {
-    return ContainsValue(observers_, obs);
-  }
-
-  // Removes all the observers from this list.
-  void Clear() {
-    DCHECK_GE(live_iterator_count_, 0);
-    if (live_iterator_count_) {
-      std::fill(observers_.begin(), observers_.end(), nullptr);
-    } else {
-      observers_.clear();
-    }
-  }
-
-  bool might_have_observers() const { return !observers_.empty(); }
-
- private:
-  // Compacts list of observers by removing null pointers.
-  void Compact() {
-    observers_.erase(std::remove(observers_.begin(), observers_.end(), nullptr),
-                     observers_.end());
-  }
-
-  std::vector<ObserverType*> observers_;
-
-  // Number of active iterators referencing this ObserverList.
-  //
-  // This counter is not synchronized although it is modified by const
-  // iterators.
-  int live_iterator_count_ = 0;
-
-  const ObserverListPolicy policy_ = ObserverListPolicy::ALL;
-
-  DISALLOW_COPY_AND_ASSIGN(ObserverList);
-};
-
-template <class ObserverType, bool check_empty = false>
-using ReentrantObserverList = ObserverList<ObserverType, check_empty, true>;
-
-}  // namespace base
-
-#endif  // BASE_OBSERVER_LIST_H_
diff --git a/base/observer_list_threadsafe.h b/base/observer_list_threadsafe.h
deleted file mode 100644
index 05b5a56..0000000
--- a/base/observer_list_threadsafe.h
+++ /dev/null
@@ -1,237 +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_OBSERVER_LIST_THREADSAFE_H_
-#define BASE_OBSERVER_LIST_THREADSAFE_H_
-
-#include <unordered_map>
-
-#include "base/base_export.h"
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/observer_list.h"
-#include "base/sequenced_task_runner.h"
-#include "base/stl_util.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread_local.h"
-#include "build_config.h"
-
-// TODO(fdoray): Removing these includes causes IWYU failures in other headers,
-// remove them in a follow- up CL.
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// OVERVIEW:
-//
-//   A thread-safe container for a list of observers. This is similar to the
-//   observer_list (see observer_list.h), but it is more robust for multi-
-//   threaded situations.
-//
-//   The following use cases are supported:
-//    * Observers can register for notifications from any sequence. They are
-//      always notified on the sequence from which they were registered.
-//    * Any sequence may trigger a notification via Notify().
-//    * Observers can remove themselves from the observer list inside of a
-//      callback.
-//    * If one sequence is notifying observers concurrently with an observer
-//      removing itself from the observer list, the notifications will be
-//      silently dropped.
-//
-//   The drawback of the threadsafe observer list is that notifications are not
-//   as real-time as the non-threadsafe version of this class. Notifications
-//   will always be done via PostTask() to another sequence, whereas with the
-//   non-thread-safe observer_list, notifications happen synchronously.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-namespace base {
-namespace internal {
-
-class BASE_EXPORT ObserverListThreadSafeBase
-    : public RefCountedThreadSafe<ObserverListThreadSafeBase> {
- public:
-  ObserverListThreadSafeBase() = default;
-
- protected:
-  template <typename ObserverType, typename Method>
-  struct Dispatcher;
-
-  template <typename ObserverType, typename ReceiverType, typename... Params>
-  struct Dispatcher<ObserverType, void (ReceiverType::*)(Params...)> {
-    static void Run(void (ReceiverType::*m)(Params...),
-                    Params... params,
-                    ObserverType* obj) {
-      (obj->*m)(std::forward<Params>(params)...);
-    }
-  };
-
-  struct NotificationDataBase {
-    NotificationDataBase(void* observer_list_in, const Location& from_here_in)
-        : observer_list(observer_list_in), from_here(from_here_in) {}
-
-    void* observer_list;
-    Location from_here;
-  };
-
-  virtual ~ObserverListThreadSafeBase() = default;
-
-  static LazyInstance<ThreadLocalPointer<const NotificationDataBase>>::Leaky
-      tls_current_notification_;
-
- private:
-  friend class RefCountedThreadSafe<ObserverListThreadSafeBase>;
-
-  DISALLOW_COPY_AND_ASSIGN(ObserverListThreadSafeBase);
-};
-
-}  // namespace internal
-
-template <class ObserverType>
-class ObserverListThreadSafe : public internal::ObserverListThreadSafeBase {
- public:
-  ObserverListThreadSafe() = default;
-  explicit ObserverListThreadSafe(ObserverListPolicy policy)
-      : policy_(policy) {}
-
-  // Adds |observer| to the list. |observer| must not already be in the list.
-  void AddObserver(ObserverType* observer) {
-    // TODO(fdoray): Change this to a DCHECK once all call sites have a
-    // SequencedTaskRunnerHandle.
-    if (!SequencedTaskRunnerHandle::IsSet())
-      return;
-
-    AutoLock auto_lock(lock_);
-
-    // Add |observer| to the list of observers.
-    DCHECK(!ContainsKey(observers_, observer));
-    const scoped_refptr<SequencedTaskRunner> task_runner =
-        SequencedTaskRunnerHandle::Get();
-    observers_[observer] = task_runner;
-
-    // If this is called while a notification is being dispatched on this thread
-    // and |policy_| is ALL, |observer| must be notified (if a notification is
-    // being dispatched on another thread in parallel, the notification may or
-    // may not make it to |observer| depending on the outcome of the race to
-    // |lock_|).
-    if (policy_ == ObserverListPolicy::ALL) {
-      const NotificationDataBase* current_notification =
-          tls_current_notification_.Get().Get();
-      if (current_notification && current_notification->observer_list == this) {
-        task_runner->PostTask(
-            current_notification->from_here,
-            BindOnce(
-                &ObserverListThreadSafe<ObserverType>::NotifyWrapper, this,
-                observer,
-                *static_cast<const NotificationData*>(current_notification)));
-      }
-    }
-  }
-
-  // Remove an observer from the list if it is in the list.
-  //
-  // If a notification was sent to the observer but hasn't started to run yet,
-  // it will be aborted. If a notification has started to run, removing the
-  // observer won't stop it.
-  void RemoveObserver(ObserverType* observer) {
-    AutoLock auto_lock(lock_);
-    observers_.erase(observer);
-  }
-
-  // Verifies that the list is currently empty (i.e. there are no observers).
-  void AssertEmpty() const {
-#if DCHECK_IS_ON()
-    AutoLock auto_lock(lock_);
-    DCHECK(observers_.empty());
-#endif
-  }
-
-  // Asynchronously invokes a callback on all observers, on their registration
-  // sequence. You cannot assume that at the completion of the Notify call that
-  // all Observers have been Notified. The notification may still be pending
-  // delivery.
-  template <typename Method, typename... Params>
-  void Notify(const Location& from_here, Method m, Params&&... params) {
-    Callback<void(ObserverType*)> method =
-        Bind(&Dispatcher<ObserverType, Method>::Run, m,
-             std::forward<Params>(params)...);
-
-    AutoLock lock(lock_);
-    for (const auto& observer : observers_) {
-      observer.second->PostTask(
-          from_here,
-          BindOnce(&ObserverListThreadSafe<ObserverType>::NotifyWrapper, this,
-                   observer.first, NotificationData(this, from_here, method)));
-    }
-  }
-
- private:
-  friend class RefCountedThreadSafe<ObserverListThreadSafeBase>;
-
-  struct NotificationData : public NotificationDataBase {
-    NotificationData(ObserverListThreadSafe* observer_list_in,
-                     const Location& from_here_in,
-                     const Callback<void(ObserverType*)>& method_in)
-        : NotificationDataBase(observer_list_in, from_here_in),
-          method(method_in) {}
-
-    Callback<void(ObserverType*)> method;
-  };
-
-  ~ObserverListThreadSafe() override = default;
-
-  void NotifyWrapper(ObserverType* observer,
-                     const NotificationData& notification) {
-    {
-      AutoLock auto_lock(lock_);
-
-      // Check whether the observer still needs a notification.
-      auto it = observers_.find(observer);
-      if (it == observers_.end())
-        return;
-      DCHECK(it->second->RunsTasksInCurrentSequence());
-    }
-
-    // Keep track of the notification being dispatched on the current thread.
-    // This will be used if the callback below calls AddObserver().
-    //
-    // Note: |tls_current_notification_| may not be nullptr if this runs in a
-    // nested loop started by a notification callback. In that case, it is
-    // important to save the previous value to restore it later.
-    auto& tls_current_notification = tls_current_notification_.Get();
-    const NotificationDataBase* const previous_notification =
-        tls_current_notification.Get();
-    tls_current_notification.Set(&notification);
-
-    // Invoke the callback.
-    notification.method.Run(observer);
-
-    // Reset the notification being dispatched on the current thread to its
-    // previous value.
-    tls_current_notification.Set(previous_notification);
-  }
-
-  const ObserverListPolicy policy_ = ObserverListPolicy::ALL;
-
-  // Synchronizes access to |observers_|.
-  mutable Lock lock_;
-
-  // Keys are observers. Values are the SequencedTaskRunners on which they must
-  // be notified.
-  std::unordered_map<ObserverType*, scoped_refptr<SequencedTaskRunner>>
-      observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(ObserverListThreadSafe);
-};
-
-}  // namespace base
-
-#endif  // BASE_OBSERVER_LIST_THREADSAFE_H_
diff --git a/base/posix/unix_domain_socket.cc b/base/posix/unix_domain_socket.cc
deleted file mode 100644
index 17c8a24..0000000
--- a/base/posix/unix_domain_socket.cc
+++ /dev/null
@@ -1,288 +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 "base/posix/unix_domain_socket.h"
-
-#include <errno.h>
-#include <sys/socket.h>
-#if !defined(OS_NACL_NONSFI)
-#include <sys/un.h>
-#endif
-#include <unistd.h>
-
-#include <vector>
-
-#include "base/files/scoped_file.h"
-#include "base/logging.h"
-#include "base/pickle.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/stl_util.h"
-#include "build_config.h"
-
-#if !defined(OS_NACL_NONSFI)
-#include <sys/uio.h>
-#endif
-
-namespace base {
-
-const size_t UnixDomainSocket::kMaxFileDescriptors = 16;
-
-#if !defined(OS_NACL_NONSFI)
-bool CreateSocketPair(ScopedFD* one, ScopedFD* two) {
-  int raw_socks[2];
-#if defined(OS_MACOSX)
-  // macOS does not support SEQPACKET.
-  const int flags = SOCK_STREAM;
-#else
-  const int flags = SOCK_SEQPACKET;
-#endif
-  if (socketpair(AF_UNIX, flags, 0, raw_socks) == -1)
-    return false;
-#if defined(OS_MACOSX)
-  // On macOS, preventing SIGPIPE is done with socket option.
-  const int no_sigpipe = 1;
-  if (setsockopt(raw_socks[0], SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe,
-                 sizeof(no_sigpipe)) != 0)
-    return false;
-  if (setsockopt(raw_socks[1], SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe,
-                 sizeof(no_sigpipe)) != 0)
-    return false;
-#endif
-  one->reset(raw_socks[0]);
-  two->reset(raw_socks[1]);
-  return true;
-}
-
-// static
-bool UnixDomainSocket::EnableReceiveProcessId(int fd) {
-#if !defined(OS_MACOSX)
-  const int enable = 1;
-  return setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable)) == 0;
-#else
-  // SO_PASSCRED is not supported on macOS.
-  return true;
-#endif  // OS_MACOSX
-}
-#endif  // !defined(OS_NACL_NONSFI)
-
-// static
-bool UnixDomainSocket::SendMsg(int fd,
-                               const void* buf,
-                               size_t length,
-                               const std::vector<int>& fds) {
-  struct msghdr msg = {};
-  struct iovec iov = {const_cast<void*>(buf), length};
-  msg.msg_iov = &iov;
-  msg.msg_iovlen = 1;
-
-  char* control_buffer = nullptr;
-  if (fds.size()) {
-    const unsigned control_len = CMSG_SPACE(sizeof(int) * fds.size());
-    control_buffer = new char[control_len];
-
-    struct cmsghdr* cmsg;
-    msg.msg_control = control_buffer;
-    msg.msg_controllen = control_len;
-    cmsg = CMSG_FIRSTHDR(&msg);
-    cmsg->cmsg_level = SOL_SOCKET;
-    cmsg->cmsg_type = SCM_RIGHTS;
-    cmsg->cmsg_len = CMSG_LEN(sizeof(int) * fds.size());
-    memcpy(CMSG_DATA(cmsg), &fds[0], sizeof(int) * fds.size());
-    msg.msg_controllen = cmsg->cmsg_len;
-  }
-
-// Avoid a SIGPIPE if the other end breaks the connection.
-// Due to a bug in the Linux kernel (net/unix/af_unix.c) MSG_NOSIGNAL isn't
-// regarded for SOCK_SEQPACKET in the AF_UNIX domain, but it is mandated by
-// POSIX. On Mac MSG_NOSIGNAL is not supported, so we need to ensure that
-// SO_NOSIGPIPE is set during socket creation.
-#if defined(OS_MACOSX)
-  const int flags = 0;
-  int no_sigpipe = 0;
-  socklen_t no_sigpipe_len = sizeof(no_sigpipe);
-  DPCHECK(getsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe,
-                     &no_sigpipe_len) == 0)
-      << "Failed ot get socket option.";
-  DCHECK(no_sigpipe) << "SO_NOSIGPIPE not set on the socket.";
-#else
-  const int flags = MSG_NOSIGNAL;
-#endif  // OS_MACOSX
-  const ssize_t r = HANDLE_EINTR(sendmsg(fd, &msg, flags));
-  const bool ret = static_cast<ssize_t>(length) == r;
-  delete[] control_buffer;
-  return ret;
-}
-
-// static
-ssize_t UnixDomainSocket::RecvMsg(int fd,
-                                  void* buf,
-                                  size_t length,
-                                  std::vector<ScopedFD>* fds) {
-  return UnixDomainSocket::RecvMsgWithPid(fd, buf, length, fds, nullptr);
-}
-
-// static
-ssize_t UnixDomainSocket::RecvMsgWithPid(int fd,
-                                         void* buf,
-                                         size_t length,
-                                         std::vector<ScopedFD>* fds,
-                                         ProcessId* pid) {
-  return UnixDomainSocket::RecvMsgWithFlags(fd, buf, length, 0, fds, pid);
-}
-
-// static
-ssize_t UnixDomainSocket::RecvMsgWithFlags(int fd,
-                                           void* buf,
-                                           size_t length,
-                                           int flags,
-                                           std::vector<ScopedFD>* fds,
-                                           ProcessId* out_pid) {
-  fds->clear();
-
-  struct msghdr msg = {};
-  struct iovec iov = {buf, length};
-  msg.msg_iov = &iov;
-  msg.msg_iovlen = 1;
-
-  const size_t kControlBufferSize =
-      CMSG_SPACE(sizeof(int) * kMaxFileDescriptors)
-#if !defined(OS_NACL_NONSFI) && !defined(OS_MACOSX)
-      // The PNaCl toolchain for Non-SFI binary build and macOS do not support
-      // ucred. macOS supports xucred, but this structure is insufficient.
-      + CMSG_SPACE(sizeof(struct ucred))
-#endif  // OS_NACL_NONSFI or OS_MACOSX
-      ;
-  char control_buffer[kControlBufferSize];
-  msg.msg_control = control_buffer;
-  msg.msg_controllen = sizeof(control_buffer);
-
-  const ssize_t r = HANDLE_EINTR(recvmsg(fd, &msg, flags));
-  if (r == -1)
-    return -1;
-
-  int* wire_fds = nullptr;
-  unsigned wire_fds_len = 0;
-  ProcessId pid = -1;
-
-  if (msg.msg_controllen > 0) {
-    struct cmsghdr* cmsg;
-    for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-      const unsigned payload_len = cmsg->cmsg_len - CMSG_LEN(0);
-      if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
-        DCHECK_EQ(payload_len % sizeof(int), 0u);
-        DCHECK_EQ(wire_fds, static_cast<void*>(nullptr));
-        wire_fds = reinterpret_cast<int*>(CMSG_DATA(cmsg));
-        wire_fds_len = payload_len / sizeof(int);
-      }
-#if !defined(OS_NACL_NONSFI) && !defined(OS_MACOSX)
-      // The PNaCl toolchain for Non-SFI binary build and macOS do not support
-      // SCM_CREDENTIALS.
-      if (cmsg->cmsg_level == SOL_SOCKET &&
-          cmsg->cmsg_type == SCM_CREDENTIALS) {
-        DCHECK_EQ(payload_len, sizeof(struct ucred));
-        DCHECK_EQ(pid, -1);
-        pid = reinterpret_cast<struct ucred*>(CMSG_DATA(cmsg))->pid;
-      }
-#endif  // !defined(OS_NACL_NONSFI) && !defined(OS_MACOSX)
-    }
-  }
-
-  if (msg.msg_flags & MSG_TRUNC || msg.msg_flags & MSG_CTRUNC) {
-    if (msg.msg_flags & MSG_CTRUNC) {
-      // Extraordinary case, not caller fixable. Log something.
-      LOG(ERROR) << "recvmsg returned MSG_CTRUNC flag, buffer len is "
-                 << msg.msg_controllen;
-    }
-    for (unsigned i = 0; i < wire_fds_len; ++i)
-      close(wire_fds[i]);
-    errno = EMSGSIZE;
-    return -1;
-  }
-
-  if (wire_fds) {
-    for (unsigned i = 0; i < wire_fds_len; ++i)
-      fds->push_back(ScopedFD(wire_fds[i]));  // TODO(mdempsky): emplace_back
-  }
-
-  if (out_pid) {
-#if defined(OS_MACOSX)
-    socklen_t pid_size = sizeof(pid);
-    if (getsockopt(fd, SOL_LOCAL, LOCAL_PEERPID, &pid, &pid_size) != 0)
-      pid = -1;
-#else
-    // |pid| will legitimately be -1 if we read EOF, so only DCHECK if we
-    // actually received a message.  Unfortunately, Linux allows sending zero
-    // length messages, which are indistinguishable from EOF, so this check
-    // has false negatives.
-    if (r > 0 || msg.msg_controllen > 0)
-      DCHECK_GE(pid, 0);
-#endif
-
-    *out_pid = pid;
-  }
-
-  return r;
-}
-
-#if !defined(OS_NACL_NONSFI)
-// static
-ssize_t UnixDomainSocket::SendRecvMsg(int fd,
-                                      uint8_t* reply,
-                                      unsigned max_reply_len,
-                                      int* result_fd,
-                                      const Pickle& request) {
-  return UnixDomainSocket::SendRecvMsgWithFlags(fd, reply, max_reply_len,
-                                                0, /* recvmsg_flags */
-                                                result_fd, request);
-}
-
-// static
-ssize_t UnixDomainSocket::SendRecvMsgWithFlags(int fd,
-                                               uint8_t* reply,
-                                               unsigned max_reply_len,
-                                               int recvmsg_flags,
-                                               int* result_fd,
-                                               const Pickle& request) {
-  // This socketpair is only used for the IPC and is cleaned up before
-  // returning.
-  ScopedFD recv_sock, send_sock;
-  if (!CreateSocketPair(&recv_sock, &send_sock))
-    return -1;
-
-  {
-    std::vector<int> send_fds;
-    send_fds.push_back(send_sock.get());
-    if (!SendMsg(fd, request.data(), request.size(), send_fds))
-      return -1;
-  }
-
-  // Close the sending end of the socket right away so that if our peer closes
-  // it before sending a response (e.g., from exiting), RecvMsgWithFlags() will
-  // return EOF instead of hanging.
-  send_sock.reset();
-
-  std::vector<ScopedFD> recv_fds;
-  // When porting to OSX keep in mind it doesn't support MSG_NOSIGNAL, so the
-  // sender might get a SIGPIPE.
-  const ssize_t reply_len = RecvMsgWithFlags(
-      recv_sock.get(), reply, max_reply_len, recvmsg_flags, &recv_fds, nullptr);
-  recv_sock.reset();
-  if (reply_len == -1)
-    return -1;
-
-  // If we received more file descriptors than caller expected, then we treat
-  // that as an error.
-  if (recv_fds.size() > (result_fd != nullptr ? 1 : 0)) {
-    NOTREACHED();
-    return -1;
-  }
-
-  if (result_fd)
-    *result_fd = recv_fds.empty() ? -1 : recv_fds[0].release();
-
-  return reply_len;
-}
-#endif  // !defined(OS_NACL_NONSFI)
-
-}  // namespace base
diff --git a/base/posix/unix_domain_socket.h b/base/posix/unix_domain_socket.h
deleted file mode 100644
index 0bbd064..0000000
--- a/base/posix/unix_domain_socket.h
+++ /dev/null
@@ -1,111 +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 BASE_POSIX_UNIX_DOMAIN_SOCKET_H_
-#define BASE_POSIX_UNIX_DOMAIN_SOCKET_H_
-
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <vector>
-
-#include "base/base_export.h"
-#include "base/files/scoped_file.h"
-#include "base/process/process_handle.h"
-#include "build_config.h"
-
-namespace base {
-
-class Pickle;
-
-#if !defined(OS_NACL_NONSFI)
-// Creates a connected pair of UNIX-domain SOCK_SEQPACKET sockets, and passes
-// ownership of the newly allocated file descriptors to |one| and |two|.
-// Returns true on success.
-bool BASE_EXPORT CreateSocketPair(ScopedFD* one, ScopedFD* two);
-#endif
-
-class BASE_EXPORT UnixDomainSocket {
- public:
-  // Maximum number of file descriptors that can be read by RecvMsg().
-  static const size_t kMaxFileDescriptors;
-
-#if !defined(OS_NACL_NONSFI)
-  // Use to enable receiving process IDs in RecvMsgWithPid.  Should be called on
-  // the receiving socket (i.e., the socket passed to RecvMsgWithPid). Returns
-  // true if successful.
-  static bool EnableReceiveProcessId(int fd);
-#endif  // !defined(OS_NACL_NONSFI)
-
-  // Use sendmsg to write the given msg and include a vector of file
-  // descriptors. Returns true if successful.
-  static bool SendMsg(int fd,
-                      const void* msg,
-                      size_t length,
-                      const std::vector<int>& fds);
-
-  // Use recvmsg to read a message and an array of file descriptors. Returns
-  // -1 on failure. Note: will read, at most, |kMaxFileDescriptors| descriptors.
-  static ssize_t RecvMsg(int fd,
-                         void* msg,
-                         size_t length,
-                         std::vector<ScopedFD>* fds);
-
-  // Same as RecvMsg above, but also returns the sender's process ID (as seen
-  // from the caller's namespace).  However, before using this function to
-  // receive process IDs, EnableReceiveProcessId() should be called on the
-  // receiving socket.
-  static ssize_t RecvMsgWithPid(int fd,
-                                void* msg,
-                                size_t length,
-                                std::vector<ScopedFD>* fds,
-                                ProcessId* pid);
-
-#if !defined(OS_NACL_NONSFI)
-  // Perform a sendmsg/recvmsg pair.
-  //   1. This process creates a UNIX SEQPACKET socketpair. Using
-  //      connection-oriented sockets (SEQPACKET or STREAM) is critical here,
-  //      because if one of the ends closes the other one must be notified.
-  //   2. This process writes a request to |fd| with an SCM_RIGHTS control
-  //      message containing on end of the fresh socket pair.
-  //   3. This process blocks reading from the other end of the fresh
-  //      socketpair.
-  //   4. The target process receives the request, processes it and writes the
-  //      reply to the end of the socketpair contained in the request.
-  //   5. This process wakes up and continues.
-  //
-  //   fd: descriptor to send the request on
-  //   reply: buffer for the reply
-  //   reply_len: size of |reply|
-  //   result_fd: (may be NULL) the file descriptor returned in the reply
-  //              (if any)
-  //   request: the bytes to send in the request
-  static ssize_t SendRecvMsg(int fd,
-                             uint8_t* reply,
-                             unsigned reply_len,
-                             int* result_fd,
-                             const Pickle& request);
-
-  // Similar to SendRecvMsg(), but |recvmsg_flags| allows to control the flags
-  // of the recvmsg(2) call.
-  static ssize_t SendRecvMsgWithFlags(int fd,
-                                      uint8_t* reply,
-                                      unsigned reply_len,
-                                      int recvmsg_flags,
-                                      int* result_fd,
-                                      const Pickle& request);
-#endif  // !defined(OS_NACL_NONSFI)
- private:
-  // Similar to RecvMsg, but allows to specify |flags| for recvmsg(2).
-  static ssize_t RecvMsgWithFlags(int fd,
-                                  void* msg,
-                                  size_t length,
-                                  int flags,
-                                  std::vector<ScopedFD>* fds,
-                                  ProcessId* pid);
-};
-
-}  // namespace base
-
-#endif  // BASE_POSIX_UNIX_DOMAIN_SOCKET_H_
diff --git a/base/post_task_and_reply_with_result_internal.h b/base/post_task_and_reply_with_result_internal.h
deleted file mode 100644
index 6f50de8..0000000
--- a/base/post_task_and_reply_with_result_internal.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 BASE_POST_TASK_AND_REPLY_WITH_RESULT_INTERNAL_H_
-#define BASE_POST_TASK_AND_REPLY_WITH_RESULT_INTERNAL_H_
-
-#include <utility>
-
-#include "base/callback.h"
-
-namespace base {
-
-namespace internal {
-
-// Adapts a function that produces a result via a return value to
-// one that returns via an output parameter.
-template <typename ReturnType>
-void ReturnAsParamAdapter(OnceCallback<ReturnType()> func, ReturnType* result) {
-  *result = std::move(func).Run();
-}
-
-// Adapts a T* result to a callblack that expects a T.
-template <typename TaskReturnType, typename ReplyArgType>
-void ReplyAdapter(OnceCallback<void(ReplyArgType)> callback,
-                  TaskReturnType* result) {
-  std::move(callback).Run(std::move(*result));
-}
-
-}  // namespace internal
-
-}  // namespace base
-
-#endif  // BASE_POST_TASK_AND_REPLY_WITH_RESULT_INTERNAL_H_
diff --git a/base/process/port_provider_mac.cc b/base/process/port_provider_mac.cc
deleted file mode 100644
index 23d214c..0000000
--- a/base/process/port_provider_mac.cc
+++ /dev/null
@@ -1,28 +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/process/port_provider_mac.h"
-
-namespace base {
-
-PortProvider::PortProvider() : lock_(), observer_list_() {}
-PortProvider::~PortProvider() {}
-
-void PortProvider::AddObserver(Observer* observer) {
-  base::AutoLock l(lock_);
-  observer_list_.AddObserver(observer);
-}
-
-void PortProvider::RemoveObserver(Observer* observer) {
-  base::AutoLock l(lock_);
-  observer_list_.RemoveObserver(observer);
-}
-
-void PortProvider::NotifyObservers(ProcessHandle process) {
-  base::AutoLock l(lock_);
-  for (auto& observer : observer_list_)
-    observer.OnReceivedTaskPort(process);
-}
-
-}  // namespace base
diff --git a/base/process/port_provider_mac.h b/base/process/port_provider_mac.h
deleted file mode 100644
index 2f40297..0000000
--- a/base/process/port_provider_mac.h
+++ /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.
-
-#ifndef BASE_PROCESS_PORT_PROVIDER_MAC_H_
-#define BASE_PROCESS_PORT_PROVIDER_MAC_H_
-
-#include <mach/mach.h>
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/observer_list.h"
-#include "base/process/process_handle.h"
-#include "base/synchronization/lock.h"
-
-namespace base {
-
-// Abstract base class that provides a mapping from ProcessHandle (pid_t) to the
-// Mach task port. This replicates task_for_pid(), which requires root
-// privileges.
-class BASE_EXPORT PortProvider {
- public:
-  PortProvider();
-  virtual ~PortProvider();
-
-  class Observer {
-   public:
-    virtual ~Observer() {};
-    // Called by the PortProvider to notify observers that the task port was
-    // received for a given process.
-    // No guarantees are made about the thread on which this notification will
-    // be sent.
-    // Observers must not call AddObserver() or RemoveObserver() in this
-    // callback, as doing so will deadlock.
-    virtual void OnReceivedTaskPort(ProcessHandle process) = 0;
-  };
-
-  // Returns the mach task port for |process| if possible, or else
-  // |MACH_PORT_NULL|.
-  virtual mach_port_t TaskForPid(ProcessHandle process) const = 0;
-
-  // Observer interface.
-  void AddObserver(Observer* observer);
-  void RemoveObserver(Observer* observer);
-
- protected:
-  // Called by subclasses to send a notification to observers.
-  void NotifyObservers(ProcessHandle process);
-
- private:
-  // ObserverList is not thread-safe, so |lock_| ensures consistency of
-  // |observer_list_|.
-  base::Lock lock_;
-  base::ObserverList<Observer> observer_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(PortProvider);
-};
-
-}  // namespace base
-
-#endif  // BASE_PROCESS_PORT_PROVIDER_MAC_H_
diff --git a/base/process/process.h b/base/process/process.h
index 2633355..dbfc701 100644
--- a/base/process/process.h
+++ b/base/process/process.h
@@ -15,10 +15,6 @@
 #include "base/win/scoped_handle.h"
 #endif
 
-#if defined(OS_MACOSX)
-#include "base/process/port_provider_mac.h"
-#endif
-
 namespace base {
 
 // Provides a move-only encapsulation of a process.
@@ -64,15 +60,6 @@
   static Process OpenWithAccess(ProcessId pid, DWORD desired_access);
 #endif
 
-  // Creates an object from a |handle| owned by someone else.
-  // Don't use this for new code. It is only intended to ease the migration to
-  // a strict ownership model.
-  // TODO(rvargas) crbug.com/417532: Remove this code.
-  static Process DeprecatedGetProcessFromHandle(ProcessHandle handle);
-
-  // Returns true if processes can be backgrounded.
-  static bool CanBackgroundProcesses();
-
   // Terminates the current process immediately with |exit_code|.
   [[noreturn]] static void TerminateCurrentProcessImmediately(int exit_code);
 
@@ -132,38 +119,6 @@
   // process though that should be avoided.
   void Exited(int exit_code) const;
 
-#if defined(OS_MACOSX)
-  // The Mac needs a Mach port in order to manipulate a process's priority,
-  // and there's no good way to get that from base given the pid. These Mac
-  // variants of the IsProcessBackgrounded and SetProcessBackgrounded API take
-  // a port provider for this reason. See crbug.com/460102
-  //
-  // A process is backgrounded when its task priority is
-  // |TASK_BACKGROUND_APPLICATION|.
-  //
-  // Returns true if the port_provider can locate a task port for the process
-  // and it is backgrounded. If port_provider is null, returns false.
-  bool IsProcessBackgrounded(PortProvider* port_provider) const;
-
-  // Set the process as backgrounded. If value is
-  // true, the priority of the associated task will be set to
-  // TASK_BACKGROUND_APPLICATION. If value is false, the
-  // priority of the process will be set to TASK_FOREGROUND_APPLICATION.
-  //
-  // Returns true if the priority was changed, false otherwise. If
-  // |port_provider| is null, this is a no-op and it returns false.
-  bool SetProcessBackgrounded(PortProvider* port_provider, bool value);
-#else
-  // A process is backgrounded when it's priority is lower than normal.
-  // Return true if this process is backgrounded, false otherwise.
-  bool IsProcessBackgrounded() const;
-
-  // Set a process as backgrounded. If value is true, the priority of the
-  // process will be lowered. If value is false, the priority of the process
-  // will be made "normal" - equivalent to default process priority.
-  // Returns true if the priority was changed, false otherwise.
-  bool SetProcessBackgrounded(bool value);
-#endif  // defined(OS_MACOSX)
   // Returns an integer representing the priority of a process. The meaning
   // of this value is OS dependent.
   int GetPriority() const;
diff --git a/base/process/process_linux.cc b/base/process/process_linux.cc
deleted file mode 100644
index 066c647..0000000
--- a/base/process/process_linux.cc
+++ /dev/null
@@ -1,60 +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 "base/process/process.h"
-
-#include <errno.h>
-#include <sys/resource.h>
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/lock.h"
-#include "build_config.h"
-
-namespace base {
-
-namespace {
-
-const int kForegroundPriority = 0;
-
-const int kBackgroundPriority = 5;
-
-bool CanReraisePriority() {
-  // We won't be able to raise the priority if we don't have the right rlimit.
-  // The limit may be adjusted in /etc/security/limits.conf for PAM systems.
-  struct rlimit rlim;
-  return (getrlimit(RLIMIT_NICE, &rlim) == 0) &&
-         (20 - kForegroundPriority) <= static_cast<int>(rlim.rlim_cur);
-}
-
-}  // namespace
-
-// static
-bool Process::CanBackgroundProcesses() {
-  static const bool can_reraise_priority = CanReraisePriority();
-  return can_reraise_priority;
-}
-
-bool Process::IsProcessBackgrounded() const {
-  DCHECK(IsValid());
-
-  return GetPriority() == kBackgroundPriority;
-}
-
-bool Process::SetProcessBackgrounded(bool background) {
-  DCHECK(IsValid());
-
-  if (!CanBackgroundProcesses())
-    return false;
-
-  int priority = background ? kBackgroundPriority : kForegroundPriority;
-  int result = setpriority(PRIO_PROCESS, process_, priority);
-  DPCHECK(result == 0);
-  return result == 0;
-}
-
-}  // namespace base
diff --git a/base/process/process_mac.cc b/base/process/process_mac.cc
deleted file mode 100644
index cd47c62..0000000
--- a/base/process/process_mac.cc
+++ /dev/null
@@ -1,72 +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/process/process.h"
-
-#include <mach/mach.h>
-
-#include "base/mac/mach_logging.h"
-
-namespace base {
-
-bool Process::CanBackgroundProcesses() {
-  return false;
-}
-
-bool Process::IsProcessBackgrounded(PortProvider* port_provider) const {
-  DCHECK(IsValid());
-  if (port_provider == nullptr || !CanBackgroundProcesses())
-    return false;
-
-  mach_port_t task_port = port_provider->TaskForPid(Pid());
-  if (task_port == TASK_NULL)
-    return false;
-
-  task_category_policy_data_t category_policy;
-  mach_msg_type_number_t task_info_count = TASK_CATEGORY_POLICY_COUNT;
-  boolean_t get_default = FALSE;
-
-  kern_return_t result =
-      task_policy_get(task_port, TASK_CATEGORY_POLICY,
-                      reinterpret_cast<task_policy_t>(&category_policy),
-                      &task_info_count, &get_default);
-  MACH_LOG_IF(ERROR, result != KERN_SUCCESS, result)
-      << "task_policy_get TASK_CATEGORY_POLICY";
-
-  if (result == KERN_SUCCESS && get_default == FALSE) {
-    return category_policy.role == TASK_BACKGROUND_APPLICATION;
-  }
-  return false;
-}
-
-bool Process::SetProcessBackgrounded(PortProvider* port_provider,
-                                     bool background) {
-  DCHECK(IsValid());
-  if (port_provider == nullptr || !CanBackgroundProcesses())
-    return false;
-
-  mach_port_t task_port = port_provider->TaskForPid(Pid());
-  if (task_port == TASK_NULL)
-    return false;
-
-  if (IsProcessBackgrounded(port_provider) == background)
-    return true;
-
-  task_category_policy category_policy;
-  category_policy.role =
-      background ? TASK_BACKGROUND_APPLICATION : TASK_FOREGROUND_APPLICATION;
-  kern_return_t result =
-      task_policy_set(task_port, TASK_CATEGORY_POLICY,
-                      reinterpret_cast<task_policy_t>(&category_policy),
-                      TASK_CATEGORY_POLICY_COUNT);
-
-  if (result != KERN_SUCCESS) {
-    MACH_LOG(ERROR, result) << "task_policy_set TASK_CATEGORY_POLICY";
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace base
diff --git a/base/process/process_posix.cc b/base/process/process_posix.cc
index 57a4f67..3cc9182 100644
--- a/base/process/process_posix.cc
+++ b/base/process/process_posix.cc
@@ -258,19 +258,6 @@
 }
 
 // static
-Process Process::DeprecatedGetProcessFromHandle(ProcessHandle handle) {
-  DCHECK_NE(handle, GetCurrentProcessHandle());
-  return Process(handle);
-}
-
-#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_AIX)
-// static
-bool Process::CanBackgroundProcesses() {
-  return false;
-}
-#endif  // !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_AIX)
-
-// static
 void Process::TerminateCurrentProcessImmediately(int exit_code) {
   _exit(exit_code);
 }
@@ -346,22 +333,6 @@
 
 void Process::Exited(int exit_code) const {}
 
-#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_AIX)
-bool Process::IsProcessBackgrounded() const {
-  // See SetProcessBackgrounded().
-  DCHECK(IsValid());
-  return false;
-}
-
-bool Process::SetProcessBackgrounded(bool value) {
-  // Not implemented for POSIX systems other than Linux and Mac. With POSIX, if
-  // we were to lower the process priority we wouldn't be able to raise it back
-  // to its initial priority.
-  NOTIMPLEMENTED();
-  return false;
-}
-#endif  // !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_AIX)
-
 int Process::GetPriority() const {
   DCHECK(IsValid());
   return getpriority(PRIO_PROCESS, process_);
diff --git a/base/process/process_win.cc b/base/process/process_win.cc
index 48f598f..f5bd59e 100644
--- a/base/process/process_win.cc
+++ b/base/process/process_win.cc
@@ -65,23 +65,6 @@
 }
 
 // static
-Process Process::DeprecatedGetProcessFromHandle(ProcessHandle handle) {
-  DCHECK_NE(handle, ::GetCurrentProcess());
-  ProcessHandle out_handle;
-  if (!::DuplicateHandle(GetCurrentProcess(), handle,
-                         GetCurrentProcess(), &out_handle,
-                         0, FALSE, DUPLICATE_SAME_ACCESS)) {
-    return Process();
-  }
-  return Process(out_handle);
-}
-
-// static
-bool Process::CanBackgroundProcesses() {
-  return true;
-}
-
-// static
 void Process::TerminateCurrentProcessImmediately(int exit_code) {
   ::TerminateProcess(GetCurrentProcess(), exit_code);
   // There is some ambiguity over whether the call above can return. Rather than
@@ -182,31 +165,6 @@
 void Process::Exited(int exit_code) const {
 }
 
-bool Process::IsProcessBackgrounded() const {
-  DCHECK(IsValid());
-  DWORD priority = GetPriority();
-  if (priority == 0)
-    return false;  // Failure case.
-  return ((priority == BELOW_NORMAL_PRIORITY_CLASS) ||
-          (priority == IDLE_PRIORITY_CLASS));
-}
-
-bool Process::SetProcessBackgrounded(bool value) {
-  DCHECK(IsValid());
-  // Vista and above introduce a real background mode, which not only
-  // sets the priority class on the threads but also on the IO generated
-  // by it. Unfortunately it can only be set for the calling process.
-  DWORD priority;
-  if (is_current()) {
-    priority = value ? PROCESS_MODE_BACKGROUND_BEGIN :
-                       PROCESS_MODE_BACKGROUND_END;
-  } else {
-    priority = value ? IDLE_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS;
-  }
-
-  return (::SetPriorityClass(Handle(), priority) != 0);
-}
-
 int Process::GetPriority() const {
   DCHECK(IsValid());
   return ::GetPriorityClass(Handle());
diff --git a/base/rand_util.cc b/base/rand_util.cc
deleted file mode 100644
index 5881ef2..0000000
--- a/base/rand_util.cc
+++ /dev/null
@@ -1,82 +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 "base/rand_util.h"
-
-#include <limits.h>
-#include <math.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <limits>
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-
-namespace base {
-
-uint64_t RandUint64() {
-  uint64_t number;
-  RandBytes(&number, sizeof(number));
-  return number;
-}
-
-int RandInt(int min, int max) {
-  DCHECK_LE(min, max);
-
-  uint64_t range = static_cast<uint64_t>(max) - min + 1;
-  // |range| is at most UINT_MAX + 1, so the result of RandGenerator(range)
-  // is at most UINT_MAX.  Hence it's safe to cast it from uint64_t to int64_t.
-  int result =
-      static_cast<int>(min + static_cast<int64_t>(base::RandGenerator(range)));
-  DCHECK_GE(result, min);
-  DCHECK_LE(result, max);
-  return result;
-}
-
-double RandDouble() {
-  return BitsToOpenEndedUnitInterval(base::RandUint64());
-}
-
-double BitsToOpenEndedUnitInterval(uint64_t bits) {
-  // We try to get maximum precision by masking out as many bits as will fit
-  // in the target type's mantissa, and raising it to an appropriate power to
-  // produce output in the range [0, 1).  For IEEE 754 doubles, the mantissa
-  // is expected to accommodate 53 bits.
-
-  static_assert(std::numeric_limits<double>::radix == 2,
-                "otherwise use scalbn");
-  static const int kBits = std::numeric_limits<double>::digits;
-  uint64_t random_bits = bits & ((UINT64_C(1) << kBits) - 1);
-  double result = ldexp(static_cast<double>(random_bits), -1 * kBits);
-  DCHECK_GE(result, 0.0);
-  DCHECK_LT(result, 1.0);
-  return result;
-}
-
-uint64_t RandGenerator(uint64_t range) {
-  DCHECK_GT(range, 0u);
-  // We must discard random results above this number, as they would
-  // make the random generator non-uniform (consider e.g. if
-  // MAX_UINT64 was 7 and |range| was 5, then a result of 1 would be twice
-  // as likely as a result of 3 or 4).
-  uint64_t max_acceptable_value =
-      (std::numeric_limits<uint64_t>::max() / range) * range - 1;
-
-  uint64_t value;
-  do {
-    value = base::RandUint64();
-  } while (value > max_acceptable_value);
-
-  return value % range;
-}
-
-std::string RandBytesAsString(size_t length) {
-  DCHECK_GT(length, 0u);
-  std::string result;
-  RandBytes(WriteInto(&result, length + 1), length);
-  return result;
-}
-
-}  // namespace base
diff --git a/base/rand_util.h b/base/rand_util.h
deleted file mode 100644
index 32c8fc7..0000000
--- a/base/rand_util.h
+++ /dev/null
@@ -1,78 +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_RAND_UTIL_H_
-#define BASE_RAND_UTIL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <string>
-
-#include "base/base_export.h"
-#include "build_config.h"
-
-namespace base {
-
-// Returns a random number in range [0, UINT64_MAX]. Thread-safe.
-BASE_EXPORT uint64_t RandUint64();
-
-// Returns a random number between min and max (inclusive). Thread-safe.
-BASE_EXPORT int RandInt(int min, int max);
-
-// Returns a random number in range [0, range).  Thread-safe.
-BASE_EXPORT uint64_t RandGenerator(uint64_t range);
-
-// Returns a random double in range [0, 1). Thread-safe.
-BASE_EXPORT double RandDouble();
-
-// Given input |bits|, convert with maximum precision to a double in
-// the range [0, 1). Thread-safe.
-BASE_EXPORT double BitsToOpenEndedUnitInterval(uint64_t bits);
-
-// Fills |output_length| bytes of |output| with random data. Thread-safe.
-//
-// Although implementations are required to use a cryptographically secure
-// random number source, code outside of base/ that relies on this should use
-// crypto::RandBytes instead to ensure the requirement is easily discoverable.
-BASE_EXPORT void RandBytes(void* output, size_t output_length);
-
-// Fills a string of length |length| with random data and returns it.
-// |length| should be nonzero. Thread-safe.
-//
-// Note that this is a variation of |RandBytes| with a different return type.
-// The returned string is likely not ASCII/UTF-8. Use with care.
-//
-// Although implementations are required to use a cryptographically secure
-// random number source, code outside of base/ that relies on this should use
-// crypto::RandBytes instead to ensure the requirement is easily discoverable.
-BASE_EXPORT std::string RandBytesAsString(size_t length);
-
-// An STL UniformRandomBitGenerator backed by RandUint64.
-// TODO(tzik): Consider replacing this with a faster implementation.
-class RandomBitGenerator {
- public:
-  using result_type = uint64_t;
-  static constexpr result_type min() { return 0; }
-  static constexpr result_type max() { return UINT64_MAX; }
-  result_type operator()() const { return RandUint64(); }
-
-  RandomBitGenerator() = default;
-  ~RandomBitGenerator() = default;
-};
-
-// Shuffles [first, last) randomly. Thread-safe.
-template <typename Itr>
-void RandomShuffle(Itr first, Itr last) {
-  std::shuffle(first, last, RandomBitGenerator());
-}
-
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-BASE_EXPORT int GetUrandomFD();
-#endif
-
-}  // namespace base
-
-#endif  // BASE_RAND_UTIL_H_
diff --git a/base/rand_util_nacl.cc b/base/rand_util_nacl.cc
deleted file mode 100644
index b26b408..0000000
--- a/base/rand_util_nacl.cc
+++ /dev/null
@@ -1,27 +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/rand_util.h"
-
-#include <nacl/nacl_random.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/logging.h"
-
-namespace base {
-
-void RandBytes(void* output, size_t output_length) {
-  char* output_ptr = static_cast<char*>(output);
-  while (output_length > 0) {
-    size_t nread;
-    const int error = nacl_secure_random(output_ptr, output_length, &nread);
-    CHECK_EQ(error, 0);
-    CHECK_LE(nread, output_length);
-    output_ptr += nread;
-    output_length -= nread;
-  }
-}
-
-}  // namespace base
diff --git a/base/rand_util_posix.cc b/base/rand_util_posix.cc
deleted file mode 100644
index 13ecaf5..0000000
--- a/base/rand_util_posix.cc
+++ /dev/null
@@ -1,57 +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/rand_util.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <unistd.h>
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-
-namespace {
-
-// We keep the file descriptor for /dev/urandom around so we don't need to
-// reopen it (which is expensive), and since we may not even be able to reopen
-// it if we are later put in a sandbox. This class wraps the file descriptor so
-// we can use LazyInstance to handle opening it on the first access.
-class URandomFd {
- public:
-  URandomFd() : fd_(HANDLE_EINTR(open("/dev/urandom", O_RDONLY | O_CLOEXEC))) {
-    DCHECK_GE(fd_, 0) << "Cannot open /dev/urandom: " << errno;
-  }
-
-  ~URandomFd() { close(fd_); }
-
-  int fd() const { return fd_; }
-
- private:
-  const int fd_;
-};
-
-URandomFd* GetInstance() {
-  static URandomFd* instance = new URandomFd;
-  return instance;
-}
-
-}  // namespace
-
-namespace base {
-
-void RandBytes(void* output, size_t output_length) {
-  const int urandom_fd = GetInstance()->fd();
-  const bool success =
-      ReadFromFD(urandom_fd, static_cast<char*>(output), output_length);
-  CHECK(success);
-}
-
-int GetUrandomFD(void) {
-  return GetInstance()->fd();
-}
-
-}  // namespace base
diff --git a/base/rand_util_win.cc b/base/rand_util_win.cc
deleted file mode 100644
index e85c216..0000000
--- a/base/rand_util_win.cc
+++ /dev/null
@@ -1,38 +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/rand_util.h"
-
-#include <windows.h>
-#include <stddef.h>
-#include <stdint.h>
-
-// #define needed to link in RtlGenRandom(), a.k.a. SystemFunction036.  See the
-// "Community Additions" comment on MSDN here:
-// http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx
-#define SystemFunction036 NTAPI SystemFunction036
-#include <NTSecAPI.h>
-#undef SystemFunction036
-
-#include <algorithm>
-#include <limits>
-
-#include "base/logging.h"
-
-namespace base {
-
-void RandBytes(void* output, size_t output_length) {
-  char* output_ptr = static_cast<char*>(output);
-  while (output_length > 0) {
-    const ULONG output_bytes_this_pass = static_cast<ULONG>(std::min(
-        output_length, static_cast<size_t>(std::numeric_limits<ULONG>::max())));
-    const bool success =
-        RtlGenRandom(output_ptr, output_bytes_this_pass) != FALSE;
-    CHECK(success);
-    output_length -= output_bytes_this_pass;
-    output_ptr += output_bytes_this_pass;
-  }
-}
-
-}  // namespace base
diff --git a/base/scoped_observer.h b/base/scoped_observer.h
deleted file mode 100644
index 7f1d6fb..0000000
--- a/base/scoped_observer.h
+++ /dev/null
@@ -1,63 +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_SCOPED_OBSERVER_H_
-#define BASE_SCOPED_OBSERVER_H_
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/stl_util.h"
-
-// ScopedObserver is used to keep track of the set of sources an object has
-// attached itself to as an observer. When ScopedObserver is destroyed it
-// removes the object as an observer from all sources it has been added to.
-template <class Source, class Observer>
-class ScopedObserver {
- public:
-  explicit ScopedObserver(Observer* observer) : observer_(observer) {}
-
-  ~ScopedObserver() {
-    RemoveAll();
-  }
-
-  // Adds the object passed to the constructor as an observer on |source|.
-  void Add(Source* source) {
-    sources_.push_back(source);
-    source->AddObserver(observer_);
-  }
-
-  // Remove the object passed to the constructor as an observer from |source|.
-  void Remove(Source* source) {
-    auto it = std::find(sources_.begin(), sources_.end(), source);
-    DCHECK(it != sources_.end());
-    sources_.erase(it);
-    source->RemoveObserver(observer_);
-  }
-
-  void RemoveAll() {
-    for (size_t i = 0; i < sources_.size(); ++i)
-      sources_[i]->RemoveObserver(observer_);
-    sources_.clear();
-  }
-
-  bool IsObserving(Source* source) const {
-    return base::ContainsValue(sources_, source);
-  }
-
-  bool IsObservingSources() const { return !sources_.empty(); }
-
- private:
-  Observer* observer_;
-
-  std::vector<Source*> sources_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedObserver);
-};
-
-#endif  // BASE_SCOPED_OBSERVER_H_
diff --git a/base/strings/OWNERS b/base/strings/OWNERS
deleted file mode 100644
index 5381872..0000000
--- a/base/strings/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-per-file safe_sprintf*=jln@chromium.org
-per-file safe_sprintf*=mdempsky@chromium.org
diff --git a/base/strings/latin1_string_conversions.cc b/base/strings/latin1_string_conversions.cc
deleted file mode 100644
index dca62ce..0000000
--- a/base/strings/latin1_string_conversions.cc
+++ /dev/null
@@ -1,19 +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/strings/latin1_string_conversions.h"
-
-namespace base {
-
-string16 Latin1OrUTF16ToUTF16(size_t length,
-                              const Latin1Char* latin1,
-                              const char16* utf16) {
-  if (!length)
-    return string16();
-  if (latin1)
-    return string16(latin1, latin1 + length);
-  return string16(utf16, utf16 + length);
-}
-
-}  // namespace base
diff --git a/base/strings/latin1_string_conversions.h b/base/strings/latin1_string_conversions.h
deleted file mode 100644
index 42113ef..0000000
--- a/base/strings/latin1_string_conversions.h
+++ /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.
-
-#ifndef BASE_STRINGS_LATIN1_STRING_CONVERSIONS_H_
-#define BASE_STRINGS_LATIN1_STRING_CONVERSIONS_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/base_export.h"
-#include "base/strings/string16.h"
-
-namespace base {
-
-// This definition of Latin1Char matches the definition of LChar in Blink. We
-// use unsigned char rather than char to make less tempting to mix and match
-// Latin-1 and UTF-8 characters..
-typedef unsigned char Latin1Char;
-
-// This somewhat odd function is designed to help us convert from Blink Strings
-// to string16. A Blink string is either backed by an array of Latin-1
-// characters or an array of UTF-16 characters. This function is called by
-// WebString::operator string16() to convert one or the other character array
-// to string16. This function is defined here rather than in WebString.h to
-// avoid binary bloat in all the callers of the conversion operator.
-BASE_EXPORT string16 Latin1OrUTF16ToUTF16(size_t length,
-                                          const Latin1Char* latin1,
-                                          const char16* utf16);
-
-}  // namespace base
-
-#endif  // BASE_STRINGS_LATIN1_STRING_CONVERSIONS_H_
diff --git a/base/strings/nullable_string16.cc b/base/strings/nullable_string16.cc
deleted file mode 100644
index 076b282..0000000
--- a/base/strings/nullable_string16.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "base/strings/nullable_string16.h"
-
-#include <ostream>
-#include <utility>
-
-namespace base {
-NullableString16::NullableString16() = default;
-NullableString16::NullableString16(const NullableString16& other) = default;
-NullableString16::NullableString16(NullableString16&& other) = default;
-
-NullableString16::NullableString16(const string16& string, bool is_null) {
-  if (!is_null)
-    string_.emplace(string);
-}
-
-NullableString16::NullableString16(Optional<string16> optional_string16)
-    : string_(std::move(optional_string16)) {}
-
-NullableString16::~NullableString16() = default;
-NullableString16& NullableString16::operator=(const NullableString16& other) =
-    default;
-NullableString16& NullableString16::operator=(NullableString16&& other) =
-    default;
-
-std::ostream& operator<<(std::ostream& out, const NullableString16& value) {
-  return value.is_null() ? out << "(null)" : out << value.string();
-}
-
-}  // namespace base
diff --git a/base/strings/nullable_string16.h b/base/strings/nullable_string16.h
deleted file mode 100644
index abddee0..0000000
--- a/base/strings/nullable_string16.h
+++ /dev/null
@@ -1,55 +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 BASE_STRINGS_NULLABLE_STRING16_H_
-#define BASE_STRINGS_NULLABLE_STRING16_H_
-
-#include <iosfwd>
-
-#include "base/base_export.h"
-#include "base/optional.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_util.h"
-
-namespace base {
-
-// This class is a simple wrapper for string16 which also contains a null
-// state.  This should be used only where the difference between null and
-// empty is meaningful.
-class BASE_EXPORT NullableString16 {
- public:
-  NullableString16();
-  NullableString16(const NullableString16& other);
-  NullableString16(NullableString16&& other);
-  NullableString16(const string16& string, bool is_null);
-  explicit NullableString16(Optional<string16> optional_string16);
-  ~NullableString16();
-
-  NullableString16& operator=(const NullableString16& other);
-  NullableString16& operator=(NullableString16&& other);
-
-  const string16& string() const {
-    return string_ ? *string_ : EmptyString16();
-  }
-  bool is_null() const { return !string_; }
-  const Optional<string16>& as_optional_string16() const { return string_; }
-
- private:
-  Optional<string16> string_;
-};
-
-inline bool operator==(const NullableString16& a, const NullableString16& b) {
-  return a.as_optional_string16() == b.as_optional_string16();
-}
-
-inline bool operator!=(const NullableString16& a, const NullableString16& b) {
-  return !(a == b);
-}
-
-BASE_EXPORT std::ostream& operator<<(std::ostream& out,
-                                     const NullableString16& value);
-
-}  // namespace base
-
-#endif  // BASE_STRINGS_NULLABLE_STRING16_H_
diff --git a/base/strings/old_utf_string_conversions.cc b/base/strings/old_utf_string_conversions.cc
deleted file mode 100644
index b6edb29..0000000
--- a/base/strings/old_utf_string_conversions.cc
+++ /dev/null
@@ -1,262 +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.
-
-#include "base/strings/old_utf_string_conversions.h"
-
-#include <stdint.h>
-
-#include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "build_config.h"
-
-namespace base_old {
-
-using base::IsStringASCII;
-using base::ReadUnicodeCharacter;
-using base::WriteUnicodeCharacter;
-
-template<typename CHAR>
-void PrepareForUTF8Output(const CHAR* src,
-                          size_t src_len,
-                          std::string* output) {
-  output->clear();
-  if (src_len == 0)
-    return;
-  if (src[0] < 0x80) {
-    // Assume that the entire input will be ASCII.
-    output->reserve(src_len);
-  } else {
-    // Assume that the entire input is non-ASCII and will have 3 bytes per char.
-    output->reserve(src_len * 3);
-  }
-}
-
-template<typename STRING>
-void PrepareForUTF16Or32Output(const char* src,
-                               size_t src_len,
-                               STRING* output) {
-  output->clear();
-  if (src_len == 0)
-    return;
-  if (static_cast<unsigned char>(src[0]) < 0x80) {
-    // Assume the input is all ASCII, which means 1:1 correspondence.
-    output->reserve(src_len);
-  } else {
-    // Otherwise assume that the UTF-8 sequences will have 2 bytes for each
-    // character.
-    output->reserve(src_len / 2);
-  }
-}
-
-namespace {
-
-// Generalized Unicode converter -----------------------------------------------
-
-// Converts the given source Unicode character type to the given destination
-// Unicode character type as a STL string. The given input buffer and size
-// determine the source, and the given output STL string will be replaced by
-// the result.
-template <typename SRC_CHAR, typename DEST_STRING>
-bool ConvertUnicode(const SRC_CHAR* src, size_t src_len, DEST_STRING* output) {
-  // ICU requires 32-bit numbers.
-  bool success = true;
-  int32_t src_len32 = static_cast<int32_t>(src_len);
-  for (int32_t i = 0; i < src_len32; i++) {
-    uint32_t code_point;
-    if (ReadUnicodeCharacter(src, src_len32, &i, &code_point)) {
-      WriteUnicodeCharacter(code_point, output);
-    } else {
-      WriteUnicodeCharacter(0xFFFD, output);
-      success = false;
-    }
-  }
-
-  return success;
-}
-
-}  // namespace
-
-// UTF-8 <-> Wide --------------------------------------------------------------
-
-bool WideToUTF8(const wchar_t* src, size_t src_len, std::string* output) {
-  if (IsStringASCII(std::wstring(src, src_len))) {
-    output->assign(src, src + src_len);
-    return true;
-  } else {
-    PrepareForUTF8Output(src, src_len, output);
-    return ConvertUnicode(src, src_len, output);
-  }
-}
-
-std::string WideToUTF8(const std::wstring& wide) {
-  if (IsStringASCII(wide)) {
-    return std::string(wide.data(), wide.data() + wide.length());
-  }
-
-  std::string ret;
-  PrepareForUTF8Output(wide.data(), wide.length(), &ret);
-  ConvertUnicode(wide.data(), wide.length(), &ret);
-  return ret;
-}
-
-bool UTF8ToWide(const char* src, size_t src_len, std::wstring* output) {
-  if (IsStringASCII(StringPiece(src, src_len))) {
-    output->assign(src, src + src_len);
-    return true;
-  } else {
-    PrepareForUTF16Or32Output(src, src_len, output);
-    return ConvertUnicode(src, src_len, output);
-  }
-}
-
-std::wstring UTF8ToWide(StringPiece utf8) {
-  if (IsStringASCII(utf8)) {
-    return std::wstring(utf8.begin(), utf8.end());
-  }
-
-  std::wstring ret;
-  PrepareForUTF16Or32Output(utf8.data(), utf8.length(), &ret);
-  ConvertUnicode(utf8.data(), utf8.length(), &ret);
-  return ret;
-}
-
-// UTF-16 <-> Wide -------------------------------------------------------------
-
-#if defined(WCHAR_T_IS_UTF16)
-
-// When wide == UTF-16, then conversions are a NOP.
-bool WideToUTF16(const wchar_t* src, size_t src_len, string16* output) {
-  output->assign(src, src_len);
-  return true;
-}
-
-string16 WideToUTF16(const std::wstring& wide) {
-  return wide;
-}
-
-bool UTF16ToWide(const char16* src, size_t src_len, std::wstring* output) {
-  output->assign(src, src_len);
-  return true;
-}
-
-std::wstring UTF16ToWide(const string16& utf16) {
-  return utf16;
-}
-
-#elif defined(WCHAR_T_IS_UTF32)
-
-bool WideToUTF16(const wchar_t* src, size_t src_len, string16* output) {
-  output->clear();
-  // Assume that normally we won't have any non-BMP characters so the counts
-  // will be the same.
-  output->reserve(src_len);
-  return ConvertUnicode(src, src_len, output);
-}
-
-string16 WideToUTF16(const std::wstring& wide) {
-  string16 ret;
-  WideToUTF16(wide.data(), wide.length(), &ret);
-  return ret;
-}
-
-bool UTF16ToWide(const char16* src, size_t src_len, std::wstring* output) {
-  output->clear();
-  // Assume that normally we won't have any non-BMP characters so the counts
-  // will be the same.
-  output->reserve(src_len);
-  return ConvertUnicode(src, src_len, output);
-}
-
-std::wstring UTF16ToWide(const string16& utf16) {
-  std::wstring ret;
-  UTF16ToWide(utf16.data(), utf16.length(), &ret);
-  return ret;
-}
-
-#endif  // defined(WCHAR_T_IS_UTF32)
-
-// UTF16 <-> UTF8 --------------------------------------------------------------
-
-#if defined(WCHAR_T_IS_UTF32)
-
-bool UTF8ToUTF16(const char* src, size_t src_len, string16* output) {
-  if (IsStringASCII(StringPiece(src, src_len))) {
-    output->assign(src, src + src_len);
-    return true;
-  } else {
-    PrepareForUTF16Or32Output(src, src_len, output);
-    return ConvertUnicode(src, src_len, output);
-  }
-}
-
-string16 UTF8ToUTF16(StringPiece utf8) {
-  if (IsStringASCII(utf8)) {
-    return string16(utf8.begin(), utf8.end());
-  }
-
-  string16 ret;
-  PrepareForUTF16Or32Output(utf8.data(), utf8.length(), &ret);
-  // Ignore the success flag of this call, it will do the best it can for
-  // invalid input, which is what we want here.
-  ConvertUnicode(utf8.data(), utf8.length(), &ret);
-  return ret;
-}
-
-bool UTF16ToUTF8(const char16* src, size_t src_len, std::string* output) {
-  if (IsStringASCII(StringPiece16(src, src_len))) {
-    output->assign(src, src + src_len);
-    return true;
-  } else {
-    PrepareForUTF8Output(src, src_len, output);
-    return ConvertUnicode(src, src_len, output);
-  }
-}
-
-std::string UTF16ToUTF8(StringPiece16 utf16) {
-  std::string ret;
-  // Ignore the success flag of this call, it will do the best it can for
-  // invalid input, which is what we want here.
-  UTF16ToUTF8(utf16.data(), utf16.length(), &ret);
-  return ret;
-}
-
-#elif defined(WCHAR_T_IS_UTF16)
-// Easy case since we can use the "wide" versions we already wrote above.
-
-bool UTF8ToUTF16(const char* src, size_t src_len, string16* output) {
-  return UTF8ToWide(src, src_len, output);
-}
-
-string16 UTF8ToUTF16(StringPiece utf8) {
-  return UTF8ToWide(utf8);
-}
-
-bool UTF16ToUTF8(const char16* src, size_t src_len, std::string* output) {
-  return WideToUTF8(src, src_len, output);
-}
-
-std::string UTF16ToUTF8(StringPiece16 utf16) {
-  if (IsStringASCII(utf16))
-    return std::string(utf16.data(), utf16.data() + utf16.length());
-
-  std::string ret;
-  PrepareForUTF8Output(utf16.data(), utf16.length(), &ret);
-  ConvertUnicode(utf16.data(), utf16.length(), &ret);
-  return ret;
-}
-
-#endif
-
-string16 ASCIIToUTF16(StringPiece ascii) {
-  DCHECK(IsStringASCII(ascii)) << ascii;
-  return string16(ascii.begin(), ascii.end());
-}
-
-std::string UTF16ToASCII(StringPiece16 utf16) {
-  DCHECK(IsStringASCII(utf16)) << UTF16ToUTF8(utf16);
-  return std::string(utf16.begin(), utf16.end());
-}
-
-}  // namespace base_old
diff --git a/base/strings/old_utf_string_conversions.h b/base/strings/old_utf_string_conversions.h
deleted file mode 100644
index 2f0c6c5..0000000
--- a/base/strings/old_utf_string_conversions.h
+++ /dev/null
@@ -1,64 +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 BASE_STRINGS_OLD_UTF_STRING_CONVERSIONS_H_
-#define BASE_STRINGS_OLD_UTF_STRING_CONVERSIONS_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/base_export.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-
-namespace base_old {
-
-using base::char16;
-using base::string16;
-using base::StringPiece16;
-using base::StringPiece;
-
-// These convert between UTF-8, -16, and -32 strings. They are potentially slow,
-// so avoid unnecessary conversions. The low-level versions return a boolean
-// indicating whether the conversion was 100% valid. In this case, it will still
-// do the best it can and put the result in the output buffer. The versions that
-// return strings ignore this error and just return the best conversion
-// possible.
-BASE_EXPORT bool WideToUTF8(const wchar_t* src,
-                            size_t src_len,
-                            std::string* output);
-BASE_EXPORT std::string WideToUTF8(const std::wstring& wide);
-BASE_EXPORT bool UTF8ToWide(const char* src,
-                            size_t src_len,
-                            std::wstring* output);
-BASE_EXPORT std::wstring UTF8ToWide(StringPiece utf8);
-
-BASE_EXPORT bool WideToUTF16(const wchar_t* src,
-                             size_t src_len,
-                             string16* output);
-BASE_EXPORT string16 WideToUTF16(const std::wstring& wide);
-BASE_EXPORT bool UTF16ToWide(const char16* src,
-                             size_t src_len,
-                             std::wstring* output);
-BASE_EXPORT std::wstring UTF16ToWide(const string16& utf16);
-
-BASE_EXPORT bool UTF8ToUTF16(const char* src, size_t src_len, string16* output);
-BASE_EXPORT string16 UTF8ToUTF16(StringPiece utf8);
-BASE_EXPORT bool UTF16ToUTF8(const char16* src,
-                             size_t src_len,
-                             std::string* output);
-BASE_EXPORT std::string UTF16ToUTF8(StringPiece16 utf16);
-
-// This converts an ASCII string, typically a hardcoded constant, to a UTF16
-// string.
-BASE_EXPORT string16 ASCIIToUTF16(StringPiece ascii);
-
-// Converts to 7-bit ASCII by truncating. The result must be known to be ASCII
-// beforehand.
-BASE_EXPORT std::string UTF16ToASCII(StringPiece16 utf16);
-
-}  // namespace base_old
-
-#endif  // BASE_STRINGS_OLD_UTF_STRING_CONVERSIONS_H_
diff --git a/base/strings/pattern.cc b/base/strings/pattern.cc
deleted file mode 100644
index f3de0af..0000000
--- a/base/strings/pattern.cc
+++ /dev/null
@@ -1,155 +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/strings/pattern.h"
-
-#include "base/third_party/icu/icu_utf.h"
-
-namespace base {
-
-namespace {
-
-constexpr bool IsWildcard(base_icu::UChar32 character) {
-  return character == '*' || character == '?';
-}
-
-// Searches for the next subpattern of |pattern| in |string|, up to the given
-// |maximum_distance|. The subpattern extends from the start of |pattern| up to
-// the first wildcard character (or the end of the string). If the value of
-// |maximum_distance| is negative, the maximum distance is considered infinite.
-template <typename CHAR, typename NEXT>
-constexpr bool SearchForChars(const CHAR** pattern,
-                              const CHAR* pattern_end,
-                              const CHAR** string,
-                              const CHAR* string_end,
-                              int maximum_distance,
-                              NEXT next) {
-  const CHAR* pattern_start = *pattern;
-  const CHAR* string_start = *string;
-  bool escape = false;
-  while (true) {
-    if (*pattern == pattern_end) {
-      // If this is the end of the pattern, only accept the end of the string;
-      // anything else falls through to the mismatch case.
-      if (*string == string_end)
-        return true;
-    } else {
-      // If we have found a wildcard, we're done.
-      if (!escape && IsWildcard(**pattern))
-        return true;
-
-      // Check if the escape character is found. If so, skip it and move to the
-      // next character.
-      if (!escape && **pattern == '\\') {
-        escape = true;
-        next(pattern, pattern_end);
-        continue;
-      }
-
-      escape = false;
-
-      if (*string == string_end)
-        return false;
-
-      // Check if the chars match, if so, increment the ptrs.
-      const CHAR* pattern_next = *pattern;
-      const CHAR* string_next = *string;
-      base_icu::UChar32 pattern_char = next(&pattern_next, pattern_end);
-      if (pattern_char == next(&string_next, string_end) &&
-          pattern_char != CBU_SENTINEL) {
-        *pattern = pattern_next;
-        *string = string_next;
-        continue;
-      }
-    }
-
-    // Mismatch. If we have reached the maximum distance, return false,
-    // otherwise restart at the beginning of the pattern with the next character
-    // in the string.
-    // TODO(bauerb): This is a naive implementation of substring search, which
-    // could be implemented with a more efficient algorithm, e.g.
-    // Knuth-Morris-Pratt (at the expense of requiring preprocessing).
-    if (maximum_distance == 0)
-      return false;
-
-    // Because unlimited distance is represented as -1, this will never reach 0
-    // and therefore fail the match above.
-    maximum_distance--;
-    *pattern = pattern_start;
-    next(&string_start, string_end);
-    *string = string_start;
-  }
-}
-
-// Consumes consecutive wildcard characters (? or *). Returns the maximum number
-// of characters matched by the sequence of wildcards, or -1 if the wildcards
-// match an arbitrary number of characters (which is the case if it contains at
-// least one *).
-template <typename CHAR, typename NEXT>
-constexpr int EatWildcards(const CHAR** pattern, const CHAR* end, NEXT next) {
-  int num_question_marks = 0;
-  bool has_asterisk = false;
-  while (*pattern != end) {
-    if (**pattern == '?') {
-      num_question_marks++;
-    } else if (**pattern == '*') {
-      has_asterisk = true;
-    } else {
-      break;
-    }
-
-    next(pattern, end);
-  }
-  return has_asterisk ? -1 : num_question_marks;
-}
-
-template <typename CHAR, typename NEXT>
-constexpr bool MatchPatternT(const CHAR* eval,
-                             const CHAR* eval_end,
-                             const CHAR* pattern,
-                             const CHAR* pattern_end,
-                             NEXT next) {
-  do {
-    int maximum_wildcard_length = EatWildcards(&pattern, pattern_end, next);
-    if (!SearchForChars(&pattern, pattern_end, &eval, eval_end,
-                        maximum_wildcard_length, next)) {
-      return false;
-    }
-  } while (pattern != pattern_end);
-  return true;
-}
-
-struct NextCharUTF8 {
-  base_icu::UChar32 operator()(const char** p, const char* end) {
-    base_icu::UChar32 c;
-    int offset = 0;
-    CBU8_NEXT(*p, offset, end - *p, c);
-    *p += offset;
-    return c;
-  }
-};
-
-struct NextCharUTF16 {
-  base_icu::UChar32 operator()(const char16** p, const char16* end) {
-    base_icu::UChar32 c;
-    int offset = 0;
-    CBU16_NEXT(*p, offset, end - *p, c);
-    *p += offset;
-    return c;
-  }
-};
-
-}  // namespace
-
-bool MatchPattern(StringPiece eval, StringPiece pattern) {
-  return MatchPatternT(eval.data(), eval.data() + eval.size(), pattern.data(),
-                       pattern.data() + pattern.size(), NextCharUTF8());
-}
-
-bool MatchPattern(StringPiece16 eval, StringPiece16 pattern) {
-  return MatchPatternT(eval.data(), eval.data() + eval.size(), pattern.data(),
-                       pattern.data() + pattern.size(), NextCharUTF16());
-}
-
-}  // namespace base
diff --git a/base/strings/pattern.h b/base/strings/pattern.h
deleted file mode 100644
index b5172ab..0000000
--- a/base/strings/pattern.h
+++ /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.
-
-#ifndef BASE_STRINGS_PATTERN_H_
-#define BASE_STRINGS_PATTERN_H_
-
-#include "base/base_export.h"
-#include "base/strings/string_piece.h"
-
-namespace base {
-
-// Returns true if the |string| passed in matches the |pattern|. The pattern
-// string can contain wildcards like * and ?.
-//
-// The backslash character (\) is an escape character for * and ?.
-// ? matches 0 or 1 character, while * matches 0 or more characters.
-BASE_EXPORT bool MatchPattern(StringPiece string, StringPiece pattern);
-BASE_EXPORT bool MatchPattern(StringPiece16 string, StringPiece16 pattern);
-
-}  // namespace base
-
-#endif  // BASE_STRINGS_PATTERN_H_
diff --git a/base/strings/safe_sprintf.cc b/base/strings/safe_sprintf.cc
deleted file mode 100644
index 8c6e8ca..0000000
--- a/base/strings/safe_sprintf.cc
+++ /dev/null
@@ -1,686 +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/strings/safe_sprintf.h"
-
-#include <errno.h>
-#include <string.h>
-
-#include <limits>
-
-#include "base/macros.h"
-#include "build_config.h"
-
-#if !defined(NDEBUG)
-// In debug builds, we use RAW_CHECK() to print useful error messages, if
-// SafeSPrintf() is called with broken arguments.
-// As our contract promises that SafeSPrintf() can be called from any
-// restricted run-time context, it is not actually safe to call logging
-// functions from it; and we only ever do so for debug builds and hope for the
-// best. We should _never_ call any logging function other than RAW_CHECK(),
-// and we should _never_ include any logging code that is active in production
-// builds. Most notably, we should not include these logging functions in
-// unofficial release builds, even though those builds would otherwise have
-// DCHECKS() enabled.
-// In other words; please do not remove the #ifdef around this #include.
-// Instead, in production builds we opt for returning a degraded result,
-// whenever an error is encountered.
-// E.g. The broken function call
-//        SafeSPrintf("errno = %d (%x)", errno, strerror(errno))
-//      will print something like
-//        errno = 13, (%x)
-//      instead of
-//        errno = 13 (Access denied)
-//      In most of the anticipated use cases, that's probably the preferred
-//      behavior.
-#include "base/logging.h"
-#define DEBUG_CHECK RAW_CHECK
-#else
-#define DEBUG_CHECK(x) do { if (x) { } } while (0)
-#endif
-
-namespace base {
-namespace strings {
-
-// The code in this file is extremely careful to be async-signal-safe.
-//
-// Most obviously, we avoid calling any code that could dynamically allocate
-// memory. Doing so would almost certainly result in bugs and dead-locks.
-// We also avoid calling any other STL functions that could have unintended
-// side-effects involving memory allocation or access to other shared
-// resources.
-//
-// But on top of that, we also avoid calling other library functions, as many
-// of them have the side-effect of calling getenv() (in order to deal with
-// localization) or accessing errno. The latter sounds benign, but there are
-// several execution contexts where it isn't even possible to safely read let
-// alone write errno.
-//
-// The stated design goal of the SafeSPrintf() function is that it can be
-// called from any context that can safely call C or C++ code (i.e. anything
-// that doesn't require assembly code).
-//
-// For a brief overview of some but not all of the issues with async-signal-
-// safety, refer to:
-// http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html
-
-namespace {
-const size_t kSSizeMaxConst = ((size_t)(ssize_t)-1) >> 1;
-
-const char kUpCaseHexDigits[]   = "0123456789ABCDEF";
-const char kDownCaseHexDigits[] = "0123456789abcdef";
-}
-
-#if defined(NDEBUG)
-// We would like to define kSSizeMax as std::numeric_limits<ssize_t>::max(),
-// but C++ doesn't allow us to do that for constants. Instead, we have to
-// use careful casting and shifting. We later use a static_assert to
-// verify that this worked correctly.
-namespace {
-const size_t kSSizeMax = kSSizeMaxConst;
-}
-#else  // defined(NDEBUG)
-// For efficiency, we really need kSSizeMax to be a constant. But for unit
-// tests, it should be adjustable. This allows us to verify edge cases without
-// having to fill the entire available address space. As a compromise, we make
-// kSSizeMax adjustable in debug builds, and then only compile that particular
-// part of the unit test in debug builds.
-namespace {
-static size_t kSSizeMax = kSSizeMaxConst;
-}
-
-namespace internal {
-void SetSafeSPrintfSSizeMaxForTest(size_t max) {
-  kSSizeMax = max;
-}
-
-size_t GetSafeSPrintfSSizeMaxForTest() {
-  return kSSizeMax;
-}
-}
-#endif  // defined(NDEBUG)
-
-namespace {
-class Buffer {
- public:
-  // |buffer| is caller-allocated storage that SafeSPrintf() writes to. It
-  // has |size| bytes of writable storage. It is the caller's responsibility
-  // to ensure that the buffer is at least one byte in size, so that it fits
-  // the trailing NUL that will be added by the destructor. The buffer also
-  // must be smaller or equal to kSSizeMax in size.
-  Buffer(char* buffer, size_t size)
-      : buffer_(buffer),
-        size_(size - 1),  // Account for trailing NUL byte
-        count_(0) {
-// MSVS2013's standard library doesn't mark max() as constexpr yet. cl.exe
-// supports static_cast but doesn't really implement constexpr yet so it doesn't
-// complain, but clang does.
-#if __cplusplus >= 201103 && !(defined(__clang__) && defined(OS_WIN))
-    static_assert(kSSizeMaxConst ==
-                      static_cast<size_t>(std::numeric_limits<ssize_t>::max()),
-                  "kSSizeMaxConst should be the max value of an ssize_t");
-#endif
-    DEBUG_CHECK(size > 0);
-    DEBUG_CHECK(size <= kSSizeMax);
-  }
-
-  ~Buffer() {
-    // The code calling the constructor guaranteed that there was enough space
-    // to store a trailing NUL -- and in debug builds, we are actually
-    // verifying this with DEBUG_CHECK()s in the constructor. So, we can
-    // always unconditionally write the NUL byte in the destructor.  We do not
-    // need to adjust the count_, as SafeSPrintf() copies snprintf() in not
-    // including the NUL byte in its return code.
-    *GetInsertionPoint() = '\000';
-  }
-
-  // Returns true, iff the buffer is filled all the way to |kSSizeMax-1|. The
-  // caller can now stop adding more data, as GetCount() has reached its
-  // maximum possible value.
-  inline bool OutOfAddressableSpace() const {
-    return count_ == static_cast<size_t>(kSSizeMax - 1);
-  }
-
-  // Returns the number of bytes that would have been emitted to |buffer_|
-  // if it was sized sufficiently large. This number can be larger than
-  // |size_|, if the caller provided an insufficiently large output buffer.
-  // But it will never be bigger than |kSSizeMax-1|.
-  inline ssize_t GetCount() const {
-    DEBUG_CHECK(count_ < kSSizeMax);
-    return static_cast<ssize_t>(count_);
-  }
-
-  // Emits one |ch| character into the |buffer_| and updates the |count_| of
-  // characters that are currently supposed to be in the buffer.
-  // Returns "false", iff the buffer was already full.
-  // N.B. |count_| increases even if no characters have been written. This is
-  // needed so that GetCount() can return the number of bytes that should
-  // have been allocated for the |buffer_|.
-  inline bool Out(char ch) {
-    if (size_ >= 1 && count_ < size_) {
-      buffer_[count_] = ch;
-      return IncrementCountByOne();
-    }
-    // |count_| still needs to be updated, even if the buffer has been
-    // filled completely. This allows SafeSPrintf() to return the number of
-    // bytes that should have been emitted.
-    IncrementCountByOne();
-    return false;
-  }
-
-  // Inserts |padding|-|len| bytes worth of padding into the |buffer_|.
-  // |count_| will also be incremented by the number of bytes that were meant
-  // to be emitted. The |pad| character is typically either a ' ' space
-  // or a '0' zero, but other non-NUL values are legal.
-  // Returns "false", iff the the |buffer_| filled up (i.e. |count_|
-  // overflowed |size_|) at any time during padding.
-  inline bool Pad(char pad, size_t padding, size_t len) {
-    DEBUG_CHECK(pad);
-    DEBUG_CHECK(padding <= kSSizeMax);
-    for (; padding > len; --padding) {
-      if (!Out(pad)) {
-        if (--padding) {
-          IncrementCount(padding-len);
-        }
-        return false;
-      }
-    }
-    return true;
-  }
-
-  // POSIX doesn't define any async-signal-safe function for converting
-  // an integer to ASCII. Define our own version.
-  //
-  // This also gives us the ability to make the function a little more
-  // powerful and have it deal with |padding|, with truncation, and with
-  // predicting the length of the untruncated output.
-  //
-  // IToASCII() converts an integer |i| to ASCII.
-  //
-  // Unlike similar functions in the standard C library, it never appends a
-  // NUL character. This is left for the caller to do.
-  //
-  // While the function signature takes a signed int64_t, the code decides at
-  // run-time whether to treat the argument as signed (int64_t) or as unsigned
-  // (uint64_t) based on the value of |sign|.
-  //
-  // It supports |base|s 2 through 16. Only a |base| of 10 is allowed to have
-  // a |sign|. Otherwise, |i| is treated as unsigned.
-  //
-  // For bases larger than 10, |upcase| decides whether lower-case or upper-
-  // case letters should be used to designate digits greater than 10.
-  //
-  // Padding can be done with either '0' zeros or ' ' spaces. Padding has to
-  // be positive and will always be applied to the left of the output.
-  //
-  // Prepends a |prefix| to the number (e.g. "0x"). This prefix goes to
-  // the left of |padding|, if |pad| is '0'; and to the right of |padding|
-  // if |pad| is ' '.
-  //
-  // Returns "false", if the |buffer_| overflowed at any time.
-  bool IToASCII(bool sign, bool upcase, int64_t i, int base,
-                char pad, size_t padding, const char* prefix);
-
- private:
-  // Increments |count_| by |inc| unless this would cause |count_| to
-  // overflow |kSSizeMax-1|. Returns "false", iff an overflow was detected;
-  // it then clamps |count_| to |kSSizeMax-1|.
-  inline bool IncrementCount(size_t inc) {
-    // "inc" is either 1 or a "padding" value. Padding is clamped at
-    // run-time to at most kSSizeMax-1. So, we know that "inc" is always in
-    // the range 1..kSSizeMax-1.
-    // This allows us to compute "kSSizeMax - 1 - inc" without incurring any
-    // integer overflows.
-    DEBUG_CHECK(inc <= kSSizeMax - 1);
-    if (count_ > kSSizeMax - 1 - inc) {
-      count_ = kSSizeMax - 1;
-      return false;
-    } else {
-      count_ += inc;
-      return true;
-    }
-  }
-
-  // Convenience method for the common case of incrementing |count_| by one.
-  inline bool IncrementCountByOne() {
-    return IncrementCount(1);
-  }
-
-  // Return the current insertion point into the buffer. This is typically
-  // at |buffer_| + |count_|, but could be before that if truncation
-  // happened. It always points to one byte past the last byte that was
-  // successfully placed into the |buffer_|.
-  inline char* GetInsertionPoint() const {
-    size_t idx = count_;
-    if (idx > size_) {
-      idx = size_;
-    }
-    return buffer_ + idx;
-  }
-
-  // User-provided buffer that will receive the fully formatted output string.
-  char* buffer_;
-
-  // Number of bytes that are available in the buffer excluding the trailing
-  // NUL byte that will be added by the destructor.
-  const size_t size_;
-
-  // Number of bytes that would have been emitted to the buffer, if the buffer
-  // was sufficiently big. This number always excludes the trailing NUL byte
-  // and it is guaranteed to never grow bigger than kSSizeMax-1.
-  size_t count_;
-
-  DISALLOW_COPY_AND_ASSIGN(Buffer);
-};
-
-
-bool Buffer::IToASCII(bool sign, bool upcase, int64_t i, int base,
-                      char pad, size_t padding, const char* prefix) {
-  // Sanity check for parameters. None of these should ever fail, but see
-  // above for the rationale why we can't call CHECK().
-  DEBUG_CHECK(base >= 2);
-  DEBUG_CHECK(base <= 16);
-  DEBUG_CHECK(!sign || base == 10);
-  DEBUG_CHECK(pad == '0' || pad == ' ');
-  DEBUG_CHECK(padding <= kSSizeMax);
-  DEBUG_CHECK(!(sign && prefix && *prefix));
-
-  // Handle negative numbers, if the caller indicated that |i| should be
-  // treated as a signed number; otherwise treat |i| as unsigned (even if the
-  // MSB is set!)
-  // Details are tricky, because of limited data-types, but equivalent pseudo-
-  // code would look like:
-  //   if (sign && i < 0)
-  //     prefix = "-";
-  //   num = abs(i);
-  int minint = 0;
-  uint64_t num;
-  if (sign && i < 0) {
-    prefix = "-";
-
-    // Turn our number positive.
-    if (i == std::numeric_limits<int64_t>::min()) {
-      // The most negative integer needs special treatment.
-      minint = 1;
-      num = static_cast<uint64_t>(-(i + 1));
-    } else {
-      // "Normal" negative numbers are easy.
-      num = static_cast<uint64_t>(-i);
-    }
-  } else {
-    num = static_cast<uint64_t>(i);
-  }
-
-  // If padding with '0' zero, emit the prefix or '-' character now. Otherwise,
-  // make the prefix accessible in reverse order, so that we can later output
-  // it right between padding and the number.
-  // We cannot choose the easier approach of just reversing the number, as that
-  // fails in situations where we need to truncate numbers that have padding
-  // and/or prefixes.
-  const char* reverse_prefix = nullptr;
-  if (prefix && *prefix) {
-    if (pad == '0') {
-      while (*prefix) {
-        if (padding) {
-          --padding;
-        }
-        Out(*prefix++);
-      }
-      prefix = nullptr;
-    } else {
-      for (reverse_prefix = prefix; *reverse_prefix; ++reverse_prefix) {
-      }
-    }
-  } else
-    prefix = nullptr;
-  const size_t prefix_length = reverse_prefix - prefix;
-
-  // Loop until we have converted the entire number. Output at least one
-  // character (i.e. '0').
-  size_t start = count_;
-  size_t discarded = 0;
-  bool started = false;
-  do {
-    // Make sure there is still enough space left in our output buffer.
-    if (count_ >= size_) {
-      if (start < size_) {
-        // It is rare that we need to output a partial number. But if asked
-        // to do so, we will still make sure we output the correct number of
-        // leading digits.
-        // Since we are generating the digits in reverse order, we actually
-        // have to discard digits in the order that we have already emitted
-        // them. This is essentially equivalent to:
-        //   memmove(buffer_ + start, buffer_ + start + 1, size_ - start - 1)
-        for (char* move = buffer_ + start, *end = buffer_ + size_ - 1;
-             move < end;
-             ++move) {
-          *move = move[1];
-        }
-        ++discarded;
-        --count_;
-      } else if (count_ - size_ > 1) {
-        // Need to increment either |count_| or |discarded| to make progress.
-        // The latter is more efficient, as it eventually triggers fast
-        // handling of padding. But we have to ensure we don't accidentally
-        // change the overall state (i.e. switch the state-machine from
-        // discarding to non-discarding). |count_| needs to always stay
-        // bigger than |size_|.
-        --count_;
-        ++discarded;
-      }
-    }
-
-    // Output the next digit and (if necessary) compensate for the most
-    // negative integer needing special treatment. This works because,
-    // no matter the bit width of the integer, the lowest-most decimal
-    // integer always ends in 2, 4, 6, or 8.
-    if (!num && started) {
-      if (reverse_prefix > prefix) {
-        Out(*--reverse_prefix);
-      } else {
-        Out(pad);
-      }
-    } else {
-      started = true;
-      Out((upcase ? kUpCaseHexDigits : kDownCaseHexDigits)[num%base + minint]);
-    }
-
-    minint = 0;
-    num /= base;
-
-    // Add padding, if requested.
-    if (padding > 0) {
-      --padding;
-
-      // Performance optimization for when we are asked to output excessive
-      // padding, but our output buffer is limited in size.  Even if we output
-      // a 64bit number in binary, we would never write more than 64 plus
-      // prefix non-padding characters. So, once this limit has been passed,
-      // any further state change can be computed arithmetically; we know that
-      // by this time, our entire final output consists of padding characters
-      // that have all already been output.
-      if (discarded > 8*sizeof(num) + prefix_length) {
-        IncrementCount(padding);
-        padding = 0;
-      }
-    }
-  } while (num || padding || (reverse_prefix > prefix));
-
-  // Conversion to ASCII actually resulted in the digits being in reverse
-  // order. We can't easily generate them in forward order, as we can't tell
-  // the number of characters needed until we are done converting.
-  // So, now, we reverse the string (except for the possible '-' sign).
-  char* front = buffer_ + start;
-  char* back = GetInsertionPoint();
-  while (--back > front) {
-    char ch = *back;
-    *back = *front;
-    *front++ = ch;
-  }
-
-  IncrementCount(discarded);
-  return !discarded;
-}
-
-}  // anonymous namespace
-
-namespace internal {
-
-ssize_t SafeSNPrintf(char* buf, size_t sz, const char* fmt, const Arg* args,
-                     const size_t max_args) {
-  // Make sure that at least one NUL byte can be written, and that the buffer
-  // never overflows kSSizeMax. Not only does that use up most or all of the
-  // address space, it also would result in a return code that cannot be
-  // represented.
-  if (static_cast<ssize_t>(sz) < 1) {
-    return -1;
-  } else if (sz > kSSizeMax) {
-    sz = kSSizeMax;
-  }
-
-  // Iterate over format string and interpret '%' arguments as they are
-  // encountered.
-  Buffer buffer(buf, sz);
-  size_t padding;
-  char pad;
-  for (unsigned int cur_arg = 0; *fmt && !buffer.OutOfAddressableSpace(); ) {
-    if (*fmt++ == '%') {
-      padding = 0;
-      pad = ' ';
-      char ch = *fmt++;
-    format_character_found:
-      switch (ch) {
-      case '0': case '1': case '2': case '3': case '4':
-      case '5': case '6': case '7': case '8': case '9':
-        // Found a width parameter. Convert to an integer value and store in
-        // "padding". If the leading digit is a zero, change the padding
-        // character from a space ' ' to a zero '0'.
-        pad = ch == '0' ? '0' : ' ';
-        for (;;) {
-          // The maximum allowed padding fills all the available address
-          // space and leaves just enough space to insert the trailing NUL.
-          const size_t max_padding = kSSizeMax - 1;
-          if (padding > max_padding/10 ||
-              10*padding > max_padding - (ch - '0')) {
-            DEBUG_CHECK(padding <= max_padding/10 &&
-                        10*padding <= max_padding - (ch - '0'));
-            // Integer overflow detected. Skip the rest of the width until
-            // we find the format character, then do the normal error handling.
-          padding_overflow:
-            padding = max_padding;
-            while ((ch = *fmt++) >= '0' && ch <= '9') {
-            }
-            if (cur_arg < max_args) {
-              ++cur_arg;
-            }
-            goto fail_to_expand;
-          }
-          padding = 10*padding + ch - '0';
-          if (padding > max_padding) {
-            // This doesn't happen for "sane" values of kSSizeMax. But once
-            // kSSizeMax gets smaller than about 10, our earlier range checks
-            // are incomplete. Unittests do trigger this artificial corner
-            // case.
-            DEBUG_CHECK(padding <= max_padding);
-            goto padding_overflow;
-          }
-          ch = *fmt++;
-          if (ch < '0' || ch > '9') {
-            // Reached the end of the width parameter. This is where the format
-            // character is found.
-            goto format_character_found;
-          }
-        }
-        break;
-      case 'c': {  // Output an ASCII character.
-        // Check that there are arguments left to be inserted.
-        if (cur_arg >= max_args) {
-          DEBUG_CHECK(cur_arg < max_args);
-          goto fail_to_expand;
-        }
-
-        // Check that the argument has the expected type.
-        const Arg& arg = args[cur_arg++];
-        if (arg.type != Arg::INT && arg.type != Arg::UINT) {
-          DEBUG_CHECK(arg.type == Arg::INT || arg.type == Arg::UINT);
-          goto fail_to_expand;
-        }
-
-        // Apply padding, if needed.
-        buffer.Pad(' ', padding, 1);
-
-        // Convert the argument to an ASCII character and output it.
-        char as_char = static_cast<char>(arg.integer.i);
-        if (!as_char) {
-          goto end_of_output_buffer;
-        }
-        buffer.Out(as_char);
-        break; }
-      case 'd':    // Output a possibly signed decimal value.
-      case 'o':    // Output an unsigned octal value.
-      case 'x':    // Output an unsigned hexadecimal value.
-      case 'X':
-      case 'p': {  // Output a pointer value.
-        // Check that there are arguments left to be inserted.
-        if (cur_arg >= max_args) {
-          DEBUG_CHECK(cur_arg < max_args);
-          goto fail_to_expand;
-        }
-
-        const Arg& arg = args[cur_arg++];
-        int64_t i;
-        const char* prefix = nullptr;
-        if (ch != 'p') {
-          // Check that the argument has the expected type.
-          if (arg.type != Arg::INT && arg.type != Arg::UINT) {
-            DEBUG_CHECK(arg.type == Arg::INT || arg.type == Arg::UINT);
-            goto fail_to_expand;
-          }
-          i = arg.integer.i;
-
-          if (ch != 'd') {
-            // The Arg() constructor automatically performed sign expansion on
-            // signed parameters. This is great when outputting a %d decimal
-            // number, but can result in unexpected leading 0xFF bytes when
-            // outputting a %x hexadecimal number. Mask bits, if necessary.
-            // We have to do this here, instead of in the Arg() constructor, as
-            // the Arg() constructor cannot tell whether we will output a %d
-            // or a %x. Only the latter should experience masking.
-            if (arg.integer.width < sizeof(int64_t)) {
-              i &= (1LL << (8*arg.integer.width)) - 1;
-            }
-          }
-        } else {
-          // Pointer values require an actual pointer or a string.
-          if (arg.type == Arg::POINTER) {
-            i = reinterpret_cast<uintptr_t>(arg.ptr);
-          } else if (arg.type == Arg::STRING) {
-            i = reinterpret_cast<uintptr_t>(arg.str);
-          } else if (arg.type == Arg::INT &&
-                     arg.integer.width == sizeof(NULL) &&
-                     arg.integer.i == 0) {  // Allow C++'s version of NULL
-            i = 0;
-          } else {
-            DEBUG_CHECK(arg.type == Arg::POINTER || arg.type == Arg::STRING);
-            goto fail_to_expand;
-          }
-
-          // Pointers always include the "0x" prefix.
-          prefix = "0x";
-        }
-
-        // Use IToASCII() to convert to ASCII representation. For decimal
-        // numbers, optionally print a sign. For hexadecimal numbers,
-        // distinguish between upper and lower case. %p addresses are always
-        // printed as upcase. Supports base 8, 10, and 16. Prints padding
-        // and/or prefixes, if so requested.
-        buffer.IToASCII(ch == 'd' && arg.type == Arg::INT,
-                        ch != 'x', i,
-                        ch == 'o' ? 8 : ch == 'd' ? 10 : 16,
-                        pad, padding, prefix);
-        break; }
-      case 's': {
-        // Check that there are arguments left to be inserted.
-        if (cur_arg >= max_args) {
-          DEBUG_CHECK(cur_arg < max_args);
-          goto fail_to_expand;
-        }
-
-        // Check that the argument has the expected type.
-        const Arg& arg = args[cur_arg++];
-        const char *s;
-        if (arg.type == Arg::STRING) {
-          s = arg.str ? arg.str : "<NULL>";
-        } else if (arg.type == Arg::INT && arg.integer.width == sizeof(NULL) &&
-                   arg.integer.i == 0) {  // Allow C++'s version of NULL
-          s = "<NULL>";
-        } else {
-          DEBUG_CHECK(arg.type == Arg::STRING);
-          goto fail_to_expand;
-        }
-
-        // Apply padding, if needed. This requires us to first check the
-        // length of the string that we are outputting.
-        if (padding) {
-          size_t len = 0;
-          for (const char* src = s; *src++; ) {
-            ++len;
-          }
-          buffer.Pad(' ', padding, len);
-        }
-
-        // Printing a string involves nothing more than copying it into the
-        // output buffer and making sure we don't output more bytes than
-        // available space; Out() takes care of doing that.
-        for (const char* src = s; *src; ) {
-          buffer.Out(*src++);
-        }
-        break; }
-      case '%':
-        // Quoted percent '%' character.
-        goto copy_verbatim;
-      fail_to_expand:
-        // C++ gives us tools to do type checking -- something that snprintf()
-        // could never really do. So, whenever we see arguments that don't
-        // match up with the format string, we refuse to output them. But
-        // since we have to be extremely conservative about being async-
-        // signal-safe, we are limited in the type of error handling that we
-        // can do in production builds (in debug builds we can use
-        // DEBUG_CHECK() and hope for the best). So, all we do is pass the
-        // format string unchanged. That should eventually get the user's
-        // attention; and in the meantime, it hopefully doesn't lose too much
-        // data.
-      default:
-        // Unknown or unsupported format character. Just copy verbatim to
-        // output.
-        buffer.Out('%');
-        DEBUG_CHECK(ch);
-        if (!ch) {
-          goto end_of_format_string;
-        }
-        buffer.Out(ch);
-        break;
-      }
-    } else {
-  copy_verbatim:
-    buffer.Out(fmt[-1]);
-    }
-  }
- end_of_format_string:
- end_of_output_buffer:
-  return buffer.GetCount();
-}
-
-}  // namespace internal
-
-ssize_t SafeSNPrintf(char* buf, size_t sz, const char* fmt) {
-  // Make sure that at least one NUL byte can be written, and that the buffer
-  // never overflows kSSizeMax. Not only does that use up most or all of the
-  // address space, it also would result in a return code that cannot be
-  // represented.
-  if (static_cast<ssize_t>(sz) < 1) {
-    return -1;
-  } else if (sz > kSSizeMax) {
-    sz = kSSizeMax;
-  }
-
-  Buffer buffer(buf, sz);
-
-  // In the slow-path, we deal with errors by copying the contents of
-  // "fmt" unexpanded. This means, if there are no arguments passed, the
-  // SafeSPrintf() function always degenerates to a version of strncpy() that
-  // de-duplicates '%' characters.
-  const char* src = fmt;
-  for (; *src; ++src) {
-    buffer.Out(*src);
-    DEBUG_CHECK(src[0] != '%' || src[1] == '%');
-    if (src[0] == '%' && src[1] == '%') {
-      ++src;
-    }
-  }
-  return buffer.GetCount();
-}
-
-}  // namespace strings
-}  // namespace base
diff --git a/base/strings/safe_sprintf.h b/base/strings/safe_sprintf.h
deleted file mode 100644
index 56a6eaf..0000000
--- a/base/strings/safe_sprintf.h
+++ /dev/null
@@ -1,246 +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 BASE_STRINGS_SAFE_SPRINTF_H_
-#define BASE_STRINGS_SAFE_SPRINTF_H_
-
-#include "build_config.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-// For ssize_t
-#include <unistd.h>
-#endif
-
-#include "base/base_export.h"
-
-namespace base {
-namespace strings {
-
-#if defined(COMPILER_MSVC)
-// Define ssize_t inside of our namespace.
-#if defined(_WIN64)
-typedef __int64 ssize_t;
-#else
-typedef long ssize_t;
-#endif
-#endif
-
-// SafeSPrintf() is a type-safe and completely self-contained version of
-// snprintf().
-//
-// SafeSNPrintf() is an alternative function signature that can be used when
-// not dealing with fixed-sized buffers. When possible, SafeSPrintf() should
-// always be used instead of SafeSNPrintf()
-//
-// These functions allow for formatting complicated messages from contexts that
-// require strict async-signal-safety. In fact, it is safe to call them from
-// any low-level execution context, as they are guaranteed to make no library
-// or system calls. It deliberately never touches "errno", either.
-//
-// The only exception to this rule is that in debug builds the code calls
-// RAW_CHECK() to help diagnose problems when the format string does not
-// match the rest of the arguments. In release builds, no CHECK()s are used,
-// and SafeSPrintf() instead returns an output string that expands only
-// those arguments that match their format characters. Mismatched arguments
-// are ignored.
-//
-// The code currently only supports a subset of format characters:
-//   %c, %o, %d, %x, %X, %p, and %s.
-//
-// SafeSPrintf() aims to be as liberal as reasonably possible. Integer-like
-// values of arbitrary width can be passed to all of the format characters
-// that expect integers. Thus, it is explicitly legal to pass an "int" to
-// "%c", and output will automatically look at the LSB only. It is also
-// explicitly legal to pass either signed or unsigned values, and the format
-// characters will automatically interpret the arguments accordingly.
-//
-// It is still not legal to mix-and-match integer-like values with pointer
-// values. For instance, you cannot pass a pointer to %x, nor can you pass an
-// integer to %p.
-//
-// The one exception is "0" zero being accepted by "%p". This works-around
-// the problem of C++ defining NULL as an integer-like value.
-//
-// All format characters take an optional width parameter. This must be a
-// positive integer. For %d, %o, %x, %X and %p, if the width starts with
-// a leading '0', padding is done with '0' instead of ' ' characters.
-//
-// There are a few features of snprintf()-style format strings, that
-// SafeSPrintf() does not support at this time.
-//
-// If an actual user showed up, there is no particularly strong reason they
-// couldn't be added. But that assumes that the trade-offs between complexity
-// and utility are favorable.
-//
-// For example, adding support for negative padding widths, and for %n are all
-// likely to be viewed positively. They are all clearly useful, low-risk, easy
-// to test, don't jeopardize the async-signal-safety of the code, and overall
-// have little impact on other parts of SafeSPrintf() function.
-//
-// On the other hands, adding support for alternate forms, positional
-// arguments, grouping, wide characters, localization or floating point numbers
-// are all unlikely to ever be added.
-//
-// SafeSPrintf() and SafeSNPrintf() mimic the behavior of snprintf() and they
-// return the number of bytes needed to store the untruncated output. This
-// does *not* include the terminating NUL byte.
-//
-// They return -1, iff a fatal error happened. This typically can only happen,
-// if the buffer size is a) negative, or b) zero (i.e. not even the NUL byte
-// can be written). The return value can never be larger than SSIZE_MAX-1.
-// This ensures that the caller can always add one to the signed return code
-// in order to determine the amount of storage that needs to be allocated.
-//
-// While the code supports type checking and while it is generally very careful
-// to avoid printing incorrect values, it tends to be conservative in printing
-// as much as possible, even when given incorrect parameters. Typically, in
-// case of an error, the format string will not be expanded. (i.e. something
-// like SafeSPrintf(buf, "%p %d", 1, 2) results in "%p 2"). See above for
-// the use of RAW_CHECK() in debug builds, though.
-//
-// Basic example:
-//   char buf[20];
-//   base::strings::SafeSPrintf(buf, "The answer: %2d", 42);
-//
-// Example with dynamically sized buffer (async-signal-safe). This code won't
-// work on Visual studio, as it requires dynamically allocating arrays on the
-// stack. Consider picking a smaller value for |kMaxSize| if stack size is
-// limited and known. On the other hand, if the parameters to SafeSNPrintf()
-// are trusted and not controllable by the user, you can consider eliminating
-// the check for |kMaxSize| altogether. The current value of SSIZE_MAX is
-// essentially a no-op that just illustrates how to implement an upper bound:
-//   const size_t kInitialSize = 128;
-//   const size_t kMaxSize = std::numeric_limits<ssize_t>::max();
-//   size_t size = kInitialSize;
-//   for (;;) {
-//     char buf[size];
-//     size = SafeSNPrintf(buf, size, "Error message \"%s\"\n", err) + 1;
-//     if (sizeof(buf) < kMaxSize && size > kMaxSize) {
-//       size = kMaxSize;
-//       continue;
-//     } else if (size > sizeof(buf))
-//       continue;
-//     write(2, buf, size-1);
-//     break;
-//   }
-
-namespace internal {
-// Helpers that use C++ overloading, templates, and specializations to deduce
-// and record type information from function arguments. This allows us to
-// later write a type-safe version of snprintf().
-
-struct Arg {
-  enum Type { INT, UINT, STRING, POINTER };
-
-  // Any integer-like value.
-  Arg(signed char c) : type(INT) {
-    integer.i = c;
-    integer.width = sizeof(char);
-  }
-  Arg(unsigned char c) : type(UINT) {
-    integer.i = c;
-    integer.width = sizeof(char);
-  }
-  Arg(signed short j) : type(INT) {
-    integer.i = j;
-    integer.width = sizeof(short);
-  }
-  Arg(unsigned short j) : type(UINT) {
-    integer.i = j;
-    integer.width = sizeof(short);
-  }
-  Arg(signed int j) : type(INT) {
-    integer.i = j;
-    integer.width = sizeof(int);
-  }
-  Arg(unsigned int j) : type(UINT) {
-    integer.i = j;
-    integer.width = sizeof(int);
-  }
-  Arg(signed long j) : type(INT) {
-    integer.i = j;
-    integer.width = sizeof(long);
-  }
-  Arg(unsigned long j) : type(UINT) {
-    integer.i = j;
-    integer.width = sizeof(long);
-  }
-  Arg(signed long long j) : type(INT) {
-    integer.i = j;
-    integer.width = sizeof(long long);
-  }
-  Arg(unsigned long long j) : type(UINT) {
-    integer.i = j;
-    integer.width = sizeof(long long);
-  }
-
-  // A C-style text string.
-  Arg(const char* s) : str(s), type(STRING) { }
-  Arg(char* s)       : str(s), type(STRING) { }
-
-  // Any pointer value that can be cast to a "void*".
-  template<class T> Arg(T* p) : ptr((void*)p), type(POINTER) { }
-
-  union {
-    // An integer-like value.
-    struct {
-      int64_t       i;
-      unsigned char width;
-    } integer;
-
-    // A C-style text string.
-    const char* str;
-
-    // A pointer to an arbitrary object.
-    const void* ptr;
-  };
-  const enum Type type;
-};
-
-// This is the internal function that performs the actual formatting of
-// an snprintf()-style format string.
-BASE_EXPORT ssize_t SafeSNPrintf(char* buf, size_t sz, const char* fmt,
-                                 const Arg* args, size_t max_args);
-
-#if !defined(NDEBUG)
-// In debug builds, allow unit tests to artificially lower the kSSizeMax
-// constant that is used as a hard upper-bound for all buffers. In normal
-// use, this constant should always be std::numeric_limits<ssize_t>::max().
-BASE_EXPORT void SetSafeSPrintfSSizeMaxForTest(size_t max);
-BASE_EXPORT size_t GetSafeSPrintfSSizeMaxForTest();
-#endif
-
-}  // namespace internal
-
-template<typename... Args>
-ssize_t SafeSNPrintf(char* buf, size_t N, const char* fmt, Args... args) {
-  // Use Arg() object to record type information and then copy arguments to an
-  // array to make it easier to iterate over them.
-  const internal::Arg arg_array[] = { args... };
-  return internal::SafeSNPrintf(buf, N, fmt, arg_array, sizeof...(args));
-}
-
-template<size_t N, typename... Args>
-ssize_t SafeSPrintf(char (&buf)[N], const char* fmt, Args... args) {
-  // Use Arg() object to record type information and then copy arguments to an
-  // array to make it easier to iterate over them.
-  const internal::Arg arg_array[] = { args... };
-  return internal::SafeSNPrintf(buf, N, fmt, arg_array, sizeof...(args));
-}
-
-// Fast-path when we don't actually need to substitute any arguments.
-BASE_EXPORT ssize_t SafeSNPrintf(char* buf, size_t N, const char* fmt);
-template<size_t N>
-inline ssize_t SafeSPrintf(char (&buf)[N], const char* fmt) {
-  return SafeSNPrintf(buf, N, fmt);
-}
-
-}  // namespace strings
-}  // namespace base
-
-#endif  // BASE_STRINGS_SAFE_SPRINTF_H_
diff --git a/base/strings/strcat.cc b/base/strings/strcat.cc
deleted file mode 100644
index 3d5b2ca..0000000
--- a/base/strings/strcat.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/strcat.h"
-
-namespace base {
-
-namespace {
-
-// Reserves an additional amount of size in the given string, growing by at
-// least 2x. Used by StrAppend().
-//
-// The "at least 2x" growing rule duplicates the exponential growth of
-// std::string. The problem is that most implementations of reserve() will grow
-// exactly to the requested amount instead of exponentially growing like would
-// happen when appending normally. If we didn't do this, an append after the
-// call to StrAppend() would definitely cause a reallocation, and loops with
-// StrAppend() calls would have O(n^2) complexity to execute. Instead, we want
-// StrAppend() to have the same semantics as std::string::append().
-//
-// If the string is empty, we assume that exponential growth is not necessary.
-template <typename String>
-void ReserveAdditional(String* str, typename String::size_type additional) {
-  str->reserve(std::max(str->size() + additional, str->size() * 2));
-}
-
-template <typename DestString, typename InputString>
-void StrAppendT(DestString* dest, span<const InputString> pieces) {
-  size_t additional_size = 0;
-  for (const auto& cur : pieces)
-    additional_size += cur.size();
-  ReserveAdditional(dest, additional_size);
-
-  for (const auto& cur : pieces)
-    dest->append(cur.data(), cur.size());
-}
-
-}  // namespace
-
-std::string StrCat(span<const StringPiece> pieces) {
-  std::string result;
-  StrAppendT(&result, pieces);
-  return result;
-}
-
-string16 StrCat(span<const StringPiece16> pieces) {
-  string16 result;
-  StrAppendT(&result, pieces);
-  return result;
-}
-
-std::string StrCat(span<const std::string> pieces) {
-  std::string result;
-  StrAppendT(&result, pieces);
-  return result;
-}
-
-string16 StrCat(span<const string16> pieces) {
-  string16 result;
-  StrAppendT(&result, pieces);
-  return result;
-}
-
-void StrAppend(std::string* dest, span<const StringPiece> pieces) {
-  StrAppendT(dest, pieces);
-}
-
-void StrAppend(string16* dest, span<const StringPiece16> pieces) {
-  StrAppendT(dest, pieces);
-}
-
-void StrAppend(std::string* dest, span<const std::string> pieces) {
-  StrAppendT(dest, pieces);
-}
-
-void StrAppend(string16* dest, span<const string16> pieces) {
-  StrAppendT(dest, pieces);
-}
-
-}  // namespace base
diff --git a/base/strings/strcat.h b/base/strings/strcat.h
deleted file mode 100644
index b2fcaae..0000000
--- a/base/strings/strcat.h
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_STRINGS_STRCAT_H_
-#define BASE_STRINGS_STRCAT_H_
-
-#include <initializer_list>
-
-#include "base/base_export.h"
-#include "base/compiler_specific.h"
-#include "base/containers/span.h"
-#include "base/strings/string_piece.h"
-#include "build_config.h"
-
-#if defined(OS_WIN)
-// To resolve a conflict with Win32 API StrCat macro.
-#include "base/win/windows_types.h"
-#endif
-
-namespace base {
-
-// StrCat ----------------------------------------------------------------------
-//
-// StrCat is a function to perform concatenation on a sequence of strings.
-// It is preferrable to a sequence of "a + b + c" because it is both faster and
-// generates less code.
-//
-//   std::string result = base::StrCat({"foo ", result, "\nfoo ", bar});
-//
-// To join an array of strings with a separator, see base::JoinString in
-// base/strings/string_util.h.
-//
-// MORE INFO
-//
-// StrCat can see all arguments at once, so it can allocate one return buffer
-// of exactly the right size and copy once, as opposed to a sequence of
-// operator+ which generates a series of temporary strings, copying as it goes.
-// And by using StringPiece arguments, StrCat can avoid creating temporary
-// string objects for char* constants.
-//
-// ALTERNATIVES
-//
-// Internal Google / Abseil has a similar StrCat function. That version takes
-// an overloaded number of arguments instead of initializer list (overflowing
-// to initializer list for many arguments). We don't have any legacy
-// requirements and using only initializer_list is simpler and generates
-// roughly the same amount of code at the call sites.
-//
-// Abseil's StrCat also allows numbers by using an intermediate class that can
-// be implicitly constructed from either a string or various number types. This
-// class formats the numbers into a static buffer for increased performance,
-// and the call sites look nice.
-//
-// As-written Abseil's helper class for numbers generates slightly more code
-// than the raw StringPiece version. We can de-inline the helper class'
-// constructors which will cause the StringPiece constructors to be de-inlined
-// for this call and generate slightly less code. This is something we can
-// explore more in the future.
-
-BASE_EXPORT std::string StrCat(span<const StringPiece> pieces);
-BASE_EXPORT string16 StrCat(span<const StringPiece16> pieces);
-BASE_EXPORT std::string StrCat(span<const std::string> pieces);
-BASE_EXPORT string16 StrCat(span<const string16> pieces);
-
-// Initializer list forwards to the array version.
-inline std::string StrCat(std::initializer_list<StringPiece> pieces) {
-  return StrCat(make_span(pieces.begin(), pieces.size()));
-}
-inline string16 StrCat(std::initializer_list<StringPiece16> pieces) {
-  return StrCat(make_span(pieces.begin(), pieces.size()));
-}
-
-// StrAppend -------------------------------------------------------------------
-//
-// Appends a sequence of strings to a destination. Prefer:
-//   StrAppend(&foo, ...);
-// over:
-//   foo += StrCat(...);
-// because it avoids a temporary string allocation and copy.
-
-BASE_EXPORT void StrAppend(std::string* dest, span<const StringPiece> pieces);
-BASE_EXPORT void StrAppend(string16* dest, span<const StringPiece16> pieces);
-BASE_EXPORT void StrAppend(std::string* dest, span<const std::string> pieces);
-BASE_EXPORT void StrAppend(string16* dest, span<const string16> pieces);
-
-// Initializer list forwards to the array version.
-inline void StrAppend(std::string* dest,
-                      std::initializer_list<StringPiece> pieces) {
-  return StrAppend(dest, make_span(pieces.begin(), pieces.size()));
-}
-inline void StrAppend(string16* dest,
-                      std::initializer_list<StringPiece16> pieces) {
-  return StrAppend(dest, make_span(pieces.begin(), pieces.size()));
-}
-
-}  // namespace base
-
-#endif  // BASE_STRINGS_STRCAT_H_
diff --git a/base/strings/string_number_conversions_fuzzer.cc b/base/strings/string_number_conversions_fuzzer.cc
deleted file mode 100644
index 2fed7de..0000000
--- a/base/strings/string_number_conversions_fuzzer.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 <stddef.h>
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/strings/string_number_conversions.h"
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  base::StringPiece string_piece_input(reinterpret_cast<const char*>(data),
-                                       size);
-  std::string string_input(reinterpret_cast<const char*>(data), size);
-
-  int out_int;
-  base::StringToInt(string_piece_input, &out_int);
-  unsigned out_uint;
-  base::StringToUint(string_piece_input, &out_uint);
-  int64_t out_int64;
-  base::StringToInt64(string_piece_input, &out_int64);
-  uint64_t out_uint64;
-  base::StringToUint64(string_piece_input, &out_uint64);
-  size_t out_size;
-  base::StringToSizeT(string_piece_input, &out_size);
-
-  // Test for StringPiece16 if size is even.
-  if (size % 2 == 0) {
-    base::StringPiece16 string_piece_input16(
-        reinterpret_cast<const base::char16*>(data), size / 2);
-
-    base::StringToInt(string_piece_input16, &out_int);
-    base::StringToUint(string_piece_input16, &out_uint);
-    base::StringToInt64(string_piece_input16, &out_int64);
-    base::StringToUint64(string_piece_input16, &out_uint64);
-    base::StringToSizeT(string_piece_input16, &out_size);
-  }
-
-  double out_double;
-  base::StringToDouble(string_input, &out_double);
-
-  base::HexStringToInt(string_piece_input, &out_int);
-  base::HexStringToUInt(string_piece_input, &out_uint);
-  base::HexStringToInt64(string_piece_input, &out_int64);
-  base::HexStringToUInt64(string_piece_input, &out_uint64);
-  std::vector<uint8_t> out_bytes;
-  base::HexStringToBytes(string_piece_input, &out_bytes);
-
-  base::HexEncode(data, size);
-
-  // Convert the numbers back to strings.
-  base::NumberToString(out_int);
-  base::NumberToString16(out_int);
-  base::NumberToString(out_uint);
-  base::NumberToString16(out_uint);
-  base::NumberToString(out_int64);
-  base::NumberToString16(out_int64);
-  base::NumberToString(out_uint64);
-  base::NumberToString16(out_uint64);
-  base::NumberToString(out_double);
-  base::NumberToString16(out_double);
-
-  return 0;
-}
diff --git a/base/strings/string_tokenizer_fuzzer.cc b/base/strings/string_tokenizer_fuzzer.cc
deleted file mode 100644
index 917041b..0000000
--- a/base/strings/string_tokenizer_fuzzer.cc
+++ /dev/null
@@ -1,56 +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 <string>
-
-#include "base/strings/string_tokenizer.h"
-
-void GetAllTokens(base::StringTokenizer& t) {
-  while (t.GetNext()) {
-    (void)t.token();
-  }
-}
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  uint8_t size_t_bytes = sizeof(size_t);
-  if (size < size_t_bytes + 1) {
-    return 0;
-  }
-
-  // Calculate pattern size based on remaining bytes, otherwise fuzzing is
-  // inefficient with bailouts in most cases.
-  size_t pattern_size =
-      *reinterpret_cast<const size_t*>(data) % (size - size_t_bytes);
-
-  std::string pattern(reinterpret_cast<const char*>(data + size_t_bytes),
-                      pattern_size);
-  std::string input(
-      reinterpret_cast<const char*>(data + size_t_bytes + pattern_size),
-      size - pattern_size - size_t_bytes);
-
-  // Allow quote_chars and options to be set. Otherwise full coverage
-  // won't be possible since IsQuote, FullGetNext and other functions
-  // won't be called.
-  base::StringTokenizer t(input, pattern);
-  GetAllTokens(t);
-
-  base::StringTokenizer t_quote(input, pattern);
-  t_quote.set_quote_chars("\"");
-  GetAllTokens(t_quote);
-
-  base::StringTokenizer t_options(input, pattern);
-  t_options.set_options(base::StringTokenizer::RETURN_DELIMS);
-  GetAllTokens(t_options);
-
-  base::StringTokenizer t_quote_and_options(input, pattern);
-  t_quote_and_options.set_quote_chars("\"");
-  t_quote_and_options.set_options(base::StringTokenizer::RETURN_DELIMS);
-  GetAllTokens(t_quote_and_options);
-
-  return 0;
-}
diff --git a/base/strings/utf_string_conversions_fuzzer.cc b/base/strings/utf_string_conversions_fuzzer.cc
deleted file mode 100644
index 37d4be2..0000000
--- a/base/strings/utf_string_conversions_fuzzer.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Chromium 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/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-
-std::string output_std_string;
-std::wstring output_std_wstring;
-base::string16 output_string16;
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  base::StringPiece string_piece_input(reinterpret_cast<const char*>(data),
-                                       size);
-
-  base::UTF8ToWide(string_piece_input);
-  base::UTF8ToWide(reinterpret_cast<const char*>(data), size,
-                   &output_std_wstring);
-  base::UTF8ToUTF16(string_piece_input);
-  base::UTF8ToUTF16(reinterpret_cast<const char*>(data), size,
-                    &output_string16);
-
-  // Test for char16.
-  if (size % 2 == 0) {
-    base::StringPiece16 string_piece_input16(
-        reinterpret_cast<const base::char16*>(data), size / 2);
-    base::UTF16ToWide(output_string16);
-    base::UTF16ToWide(reinterpret_cast<const base::char16*>(data), size / 2,
-                      &output_std_wstring);
-    base::UTF16ToUTF8(string_piece_input16);
-    base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(data), size / 2,
-                      &output_std_string);
-  }
-
-  // Test for wchar_t.
-  size_t wchar_t_size = sizeof(wchar_t);
-  if (size % wchar_t_size == 0) {
-    base::WideToUTF8(output_std_wstring);
-    base::WideToUTF8(reinterpret_cast<const wchar_t*>(data),
-                     size / wchar_t_size, &output_std_string);
-    base::WideToUTF16(output_std_wstring);
-    base::WideToUTF16(reinterpret_cast<const wchar_t*>(data),
-                      size / wchar_t_size, &output_string16);
-  }
-
-  // Test for ASCII. This condition is needed to avoid hitting instant CHECK
-  // failures.
-  if (base::IsStringASCII(string_piece_input)) {
-    output_string16 = base::ASCIIToUTF16(string_piece_input);
-    base::StringPiece16 string_piece_input16(output_string16);
-    base::UTF16ToASCII(string_piece_input16);
-  }
-
-  return 0;
-}
diff --git a/base/strings/utf_string_conversions_regression_fuzzer.cc b/base/strings/utf_string_conversions_regression_fuzzer.cc
deleted file mode 100644
index ca6b4a2..0000000
--- a/base/strings/utf_string_conversions_regression_fuzzer.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2018 The Chromium 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/logging.h"
-#include "base/strings/old_utf_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-
-namespace {
-
-void UTF8ToCheck(const uint8_t* data, size_t size) {
-  const auto* src = reinterpret_cast<const char*>(data);
-  const size_t src_len = size;
-
-  // UTF16
-  {
-    base::string16 new_out;
-    bool new_res = base::UTF8ToUTF16(src, src_len, &new_out);
-
-    base::string16 old_out;
-    bool old_res = base_old::UTF8ToUTF16(src, src_len, &old_out);
-
-    CHECK(new_res == old_res);
-    CHECK(new_out == old_out);
-  }
-
-  // Wide
-  {
-    std::wstring new_out;
-    bool new_res = base::UTF8ToWide(src, src_len, &new_out);
-
-    std::wstring old_out;
-    bool old_res = base_old::UTF8ToWide(src, src_len, &old_out);
-
-    CHECK(new_res == old_res);
-    CHECK(new_out == old_out);
-  }
-}
-
-void UTF16ToCheck(const uint8_t* data, size_t size) {
-  const auto* src = reinterpret_cast<const base::char16*>(data);
-  const size_t src_len = size / 2;
-
-  // UTF8
-  {
-    std::string new_out;
-    bool new_res = base::UTF16ToUTF8(src, src_len, &new_out);
-
-    std::string old_out;
-    bool old_res = base_old::UTF16ToUTF8(src, src_len, &old_out);
-
-    CHECK(new_res == old_res);
-    CHECK(new_out == old_out);
-  }
-
-  // Wide
-  {
-    std::wstring new_out;
-    bool new_res = base::UTF16ToWide(src, src_len, &new_out);
-
-    std::wstring old_out;
-    bool old_res = base_old::UTF16ToWide(src, src_len, &old_out);
-
-    CHECK(new_res == old_res);
-    CHECK(new_out == old_out);
-  }
-}
-
-void WideToCheck(const uint8_t* data, size_t size) {
-  const auto* src = reinterpret_cast<const wchar_t*>(data);
-  const size_t src_len = size / 4;  // It's OK even if Wide is 16bit.
-
-  // UTF8
-  {
-    std::string new_out;
-    bool new_res = base::WideToUTF8(src, src_len, &new_out);
-
-    std::string old_out;
-    bool old_res = base_old::WideToUTF8(src, src_len, &old_out);
-
-    CHECK(new_res == old_res);
-    CHECK(new_out == old_out);
-  }
-
-  // UTF16
-  {
-    base::string16 new_out;
-    bool new_res = base::WideToUTF16(src, src_len, &new_out);
-
-    base::string16 old_out;
-    bool old_res = base_old::WideToUTF16(src, src_len, &old_out);
-
-    CHECK(new_res == old_res);
-    CHECK(new_out == old_out);
-  }
-}
-
-}  // namespace
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  UTF8ToCheck(data, size);
-  UTF16ToCheck(data, size);
-  WideToCheck(data, size);
-  return 0;
-}
diff --git a/base/synchronization/atomic_flag.cc b/base/synchronization/atomic_flag.cc
deleted file mode 100644
index 6cc0e87..0000000
--- a/base/synchronization/atomic_flag.cc
+++ /dev/null
@@ -1,26 +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 "base/synchronization/atomic_flag.h"
-
-#include "base/logging.h"
-
-namespace base {
-
-AtomicFlag::AtomicFlag() {
-}
-
-void AtomicFlag::Set() {
-  base::subtle::Release_Store(&flag_, 1);
-}
-
-bool AtomicFlag::IsSet() const {
-  return base::subtle::Acquire_Load(&flag_) != 0;
-}
-
-void AtomicFlag::UnsafeResetForTesting() {
-  base::subtle::Release_Store(&flag_, 0);
-}
-
-}  // namespace base
diff --git a/base/synchronization/atomic_flag.h b/base/synchronization/atomic_flag.h
deleted file mode 100644
index d033054..0000000
--- a/base/synchronization/atomic_flag.h
+++ /dev/null
@@ -1,42 +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 BASE_SYNCHRONIZATION_ATOMIC_FLAG_H_
-#define BASE_SYNCHRONIZATION_ATOMIC_FLAG_H_
-
-#include "base/atomicops.h"
-#include "base/base_export.h"
-#include "base/macros.h"
-
-namespace base {
-
-// A flag that can safely be set from one thread and read from other threads.
-//
-// This class IS NOT intended for synchronization between threads.
-class BASE_EXPORT AtomicFlag {
- public:
-  AtomicFlag();
-  ~AtomicFlag() = default;
-
-  // Set the flag. Must always be called from the same sequence.
-  void Set();
-
-  // Returns true iff the flag was set. If this returns true, the current thread
-  // is guaranteed to be synchronized with all memory operations on the sequence
-  // which invoked Set() up until at least the first call to Set() on it.
-  bool IsSet() const;
-
-  // Resets the flag. Be careful when using this: callers might not expect
-  // IsSet() to return false after returning true once.
-  void UnsafeResetForTesting();
-
- private:
-  base::subtle::Atomic32 flag_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(AtomicFlag);
-};
-
-}  // namespace base
-
-#endif  // BASE_SYNCHRONIZATION_ATOMIC_FLAG_H_
diff --git a/base/synchronization/cancellation_flag.h b/base/synchronization/cancellation_flag.h
deleted file mode 100644
index 39094e2..0000000
--- a/base/synchronization/cancellation_flag.h
+++ /dev/null
@@ -1,20 +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 BASE_SYNCHRONIZATION_CANCELLATION_FLAG_H_
-#define BASE_SYNCHRONIZATION_CANCELLATION_FLAG_H_
-
-#include "base/synchronization/atomic_flag.h"
-
-namespace base {
-
-// Use inheritance instead of "using" to allow forward declaration of "class
-// CancellationFlag".
-// TODO(fdoray): Replace CancellationFlag with AtomicFlag throughout the
-// codebase and delete this file. crbug.com/630251
-class CancellationFlag : public AtomicFlag {};
-
-}  // namespace base
-
-#endif  // BASE_SYNCHRONIZATION_CANCELLATION_FLAG_H_
diff --git a/base/synchronization/spin_wait.h b/base/synchronization/spin_wait.h
deleted file mode 100644
index 9b147cd..0000000
--- a/base/synchronization/spin_wait.h
+++ /dev/null
@@ -1,50 +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 provides a macro ONLY for use in testing.
-// DO NOT USE IN PRODUCTION CODE.  There are much better ways to wait.
-
-// This code is very helpful in testing multi-threaded code, without depending
-// on almost any primitives.  This is especially helpful if you are testing
-// those primitive multi-threaded constructs.
-
-// We provide a simple one argument spin wait (for 1 second), and a generic
-// spin wait (for longer periods of time).
-
-#ifndef BASE_SYNCHRONIZATION_SPIN_WAIT_H_
-#define BASE_SYNCHRONIZATION_SPIN_WAIT_H_
-
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-
-// Provide a macro that will wait no longer than 1 second for an asynchronous
-// change is the value of an expression.
-// A typical use would be:
-//
-//   SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(0 == f(x));
-//
-// The expression will be evaluated repeatedly until it is true, or until
-// the time (1 second) expires.
-// Since tests generally have a 5 second watch dog timer, this spin loop is
-// typically used to get the padding needed on a given test platform to assure
-// that the test passes, even if load varies, and external events vary.
-
-#define SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(expression) \
-    SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(base::TimeDelta::FromSeconds(1), \
-                                     (expression))
-
-#define SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(delta, expression) do { \
-  base::TimeTicks start = base::TimeTicks::Now(); \
-  const base::TimeDelta kTimeout = delta; \
-    while (!(expression)) { \
-      if (kTimeout < base::TimeTicks::Now() - start) { \
-      EXPECT_LE((base::TimeTicks::Now() - start).InMilliseconds(), \
-                kTimeout.InMilliseconds()) << "Timed out"; \
-        break; \
-      } \
-      base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); \
-    } \
-  } while (0)
-
-#endif  // BASE_SYNCHRONIZATION_SPIN_WAIT_H_
diff --git a/base/synchronization/waitable_event_perftest.cc b/base/synchronization/waitable_event_perftest.cc
deleted file mode 100644
index 1888077..0000000
--- a/base/synchronization/waitable_event_perftest.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/synchronization/waitable_event.h"
-
-#include <numeric>
-
-#include "base/threading/simple_thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
-
-namespace base {
-
-namespace {
-
-class TraceWaitableEvent {
- public:
-  TraceWaitableEvent(size_t samples)
-      : event_(WaitableEvent::ResetPolicy::AUTOMATIC,
-               WaitableEvent::InitialState::NOT_SIGNALED),
-        samples_(samples) {
-    signal_times_.reserve(samples);
-    wait_times_.reserve(samples);
-  }
-
-  ~TraceWaitableEvent() = default;
-
-  void Signal() {
-    TimeTicks start = TimeTicks::Now();
-    event_.Signal();
-    signal_times_.push_back(TimeTicks::Now() - start);
-  }
-
-  void Wait() {
-    TimeTicks start = TimeTicks::Now();
-    event_.Wait();
-    wait_times_.push_back(TimeTicks::Now() - start);
-  }
-
-  bool TimedWaitUntil(const TimeTicks& end_time) {
-    TimeTicks start = TimeTicks::Now();
-    bool signaled = event_.TimedWaitUntil(end_time);
-    wait_times_.push_back(TimeTicks::Now() - start);
-    return signaled;
-  }
-
-  bool IsSignaled() { return event_.IsSignaled(); }
-
-  const std::vector<TimeDelta>& signal_times() const { return signal_times_; }
-  const std::vector<TimeDelta>& wait_times() const { return wait_times_; }
-  size_t samples() const { return samples_; }
-
- private:
-  WaitableEvent event_;
-
-  std::vector<TimeDelta> signal_times_;
-  std::vector<TimeDelta> wait_times_;
-
-  const size_t samples_;
-
-  DISALLOW_COPY_AND_ASSIGN(TraceWaitableEvent);
-};
-
-class SignalerThread : public SimpleThread {
- public:
-  SignalerThread(TraceWaitableEvent* waiter, TraceWaitableEvent* signaler)
-      : SimpleThread("WaitableEventPerfTest signaler"),
-        waiter_(waiter),
-        signaler_(signaler) {}
-
-  ~SignalerThread() override = default;
-
-  void Run() override {
-    while (!stop_event_.IsSignaled()) {
-      if (waiter_)
-        waiter_->Wait();
-      if (signaler_)
-        signaler_->Signal();
-    }
-  }
-
-  // Signals the thread to stop on the next iteration of its loop (which
-  // will happen immediately if no |waiter_| is present or is signaled.
-  void RequestStop() { stop_event_.Signal(); }
-
- private:
-  WaitableEvent stop_event_{WaitableEvent::ResetPolicy::MANUAL,
-                            WaitableEvent::InitialState::NOT_SIGNALED};
-  TraceWaitableEvent* waiter_;
-  TraceWaitableEvent* signaler_;
-  DISALLOW_COPY_AND_ASSIGN(SignalerThread);
-};
-
-void PrintPerfWaitableEvent(const TraceWaitableEvent* event,
-                            const std::string& modifier,
-                            const std::string& trace) {
-  TimeDelta signal_time = std::accumulate(
-      event->signal_times().begin(), event->signal_times().end(), TimeDelta());
-  TimeDelta wait_time = std::accumulate(event->wait_times().begin(),
-                                        event->wait_times().end(), TimeDelta());
-  perf_test::PrintResult(
-      "signal_time", modifier, trace,
-      static_cast<size_t>(signal_time.InNanoseconds()) / event->samples(),
-      "ns/sample", true);
-  perf_test::PrintResult(
-      "wait_time", modifier, trace,
-      static_cast<size_t>(wait_time.InNanoseconds()) / event->samples(),
-      "ns/sample", true);
-}
-
-}  // namespace
-
-TEST(WaitableEventPerfTest, SingleThread) {
-  const size_t kSamples = 1000;
-
-  TraceWaitableEvent event(kSamples);
-
-  for (size_t i = 0; i < kSamples; ++i) {
-    event.Signal();
-    event.Wait();
-  }
-
-  PrintPerfWaitableEvent(&event, "", "singlethread-1000-samples");
-}
-
-TEST(WaitableEventPerfTest, MultipleThreads) {
-  const size_t kSamples = 1000;
-
-  TraceWaitableEvent waiter(kSamples);
-  TraceWaitableEvent signaler(kSamples);
-
-  // The other thread will wait and signal on the respective opposite events.
-  SignalerThread thread(&signaler, &waiter);
-  thread.Start();
-
-  for (size_t i = 0; i < kSamples; ++i) {
-    signaler.Signal();
-    waiter.Wait();
-  }
-
-  // Signal the stop event and then make sure the signaler event it is
-  // waiting on is also signaled.
-  thread.RequestStop();
-  signaler.Signal();
-
-  thread.Join();
-
-  PrintPerfWaitableEvent(&waiter, "_waiter", "multithread-1000-samples");
-  PrintPerfWaitableEvent(&signaler, "_signaler", "multithread-1000-samples");
-}
-
-TEST(WaitableEventPerfTest, Throughput) {
-  // Reserve a lot of sample space.
-  const size_t kCapacity = 500000;
-  TraceWaitableEvent event(kCapacity);
-
-  SignalerThread thread(nullptr, &event);
-  thread.Start();
-
-  TimeTicks end_time = TimeTicks::Now() + TimeDelta::FromSeconds(1);
-  size_t count = 0;
-  while (event.TimedWaitUntil(end_time)) {
-    ++count;
-  }
-
-  thread.RequestStop();
-  thread.Join();
-
-  perf_test::PrintResult("counts", "", "throughput", count, "signals", true);
-  PrintPerfWaitableEvent(&event, "", "throughput");
-
-  // Make sure that allocation didn't happen during the test.
-  EXPECT_LE(event.signal_times().capacity(), kCapacity);
-  EXPECT_LE(event.wait_times().capacity(), kCapacity);
-}
-
-}  // namespace base
diff --git a/base/task/OWNERS b/base/task/OWNERS
deleted file mode 100644
index 0f3ad5e..0000000
--- a/base/task/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-fdoray@chromium.org
-gab@chromium.org
-robliao@chromium.org
-
-# TEAM: scheduler-dev@chromium.org
-# COMPONENT: Internals>TaskScheduler
diff --git a/base/task/README.md b/base/task/README.md
deleted file mode 100644
index 0db116a..0000000
--- a/base/task/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-This directory has the following layout (WIP):
-- base/task/: public APIs for posting tasks and managing task queues.
-- base/task/task_scheduler/: implementation of the TaskScheduler.
-- base/task/sequence_manager/: implementation of the SequenceManager.
-
-Apart from embedders explicitly managing a TaskScheduler and/or SequenceManager
-instance(s) for their process/threads, the vast majority of users should only
-need APIs in base/task/.
-
-Documentation:
-- [Threading and tasks](https://chromium.googlesource.com/chromium/src/+/lkcr/docs/threading_and_tasks.md)
-- [Callbacks](https://chromium.googlesource.com/chromium/src/+/lkcr/docs/callback.md)
diff --git a/base/task/cancelable_task_tracker.cc b/base/task/cancelable_task_tracker.cc
deleted file mode 100644
index f304da8..0000000
--- a/base/task/cancelable_task_tracker.cc
+++ /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.
-
-#include "base/task/cancelable_task_tracker.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback_helpers.h"
-#include "base/location.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/cancellation_flag.h"
-#include "base/task_runner.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-
-namespace base {
-
-namespace {
-
-void RunIfNotCanceled(const CancellationFlag* flag, OnceClosure task) {
-  if (!flag->IsSet())
-    std::move(task).Run();
-}
-
-void RunIfNotCanceledThenUntrack(const CancellationFlag* flag,
-                                 OnceClosure task,
-                                 OnceClosure untrack) {
-  RunIfNotCanceled(flag, std::move(task));
-  std::move(untrack).Run();
-}
-
-bool IsCanceled(const CancellationFlag* flag,
-                ScopedClosureRunner* cleanup_runner) {
-  return flag->IsSet();
-}
-
-void RunAndDeleteFlag(OnceClosure closure, const CancellationFlag* flag) {
-  std::move(closure).Run();
-  delete flag;
-}
-
-void RunOrPostToTaskRunner(TaskRunner* task_runner, OnceClosure closure) {
-  if (task_runner->RunsTasksInCurrentSequence())
-    std::move(closure).Run();
-  else
-    task_runner->PostTask(FROM_HERE, std::move(closure));
-}
-
-}  // namespace
-
-// static
-const CancelableTaskTracker::TaskId CancelableTaskTracker::kBadTaskId = 0;
-
-CancelableTaskTracker::CancelableTaskTracker()
-    : next_id_(1),weak_factory_(this) {}
-
-CancelableTaskTracker::~CancelableTaskTracker() {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-
-  TryCancelAll();
-}
-
-CancelableTaskTracker::TaskId CancelableTaskTracker::PostTask(
-    TaskRunner* task_runner,
-    const Location& from_here,
-    OnceClosure task) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-
-  return PostTaskAndReply(task_runner, from_here, std::move(task), DoNothing());
-}
-
-CancelableTaskTracker::TaskId CancelableTaskTracker::PostTaskAndReply(
-    TaskRunner* task_runner,
-    const Location& from_here,
-    OnceClosure task,
-    OnceClosure reply) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-
-  // We need a SequencedTaskRunnerHandle to run |reply|.
-  DCHECK(SequencedTaskRunnerHandle::IsSet());
-
-  // Owned by reply callback below.
-  CancellationFlag* flag = new CancellationFlag();
-
-  TaskId id = next_id_;
-  next_id_++;  // int64_t is big enough that we ignore the potential overflow.
-
-  OnceClosure untrack_closure =
-      BindOnce(&CancelableTaskTracker::Untrack, weak_factory_.GetWeakPtr(), id);
-  bool success = task_runner->PostTaskAndReply(
-      from_here, BindOnce(&RunIfNotCanceled, flag, std::move(task)),
-      BindOnce(&RunIfNotCanceledThenUntrack, Owned(flag), std::move(reply),
-               std::move(untrack_closure)));
-
-  if (!success)
-    return kBadTaskId;
-
-  Track(id, flag);
-  return id;
-}
-
-CancelableTaskTracker::TaskId CancelableTaskTracker::NewTrackedTaskId(
-    IsCanceledCallback* is_canceled_cb) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  DCHECK(SequencedTaskRunnerHandle::IsSet());
-
-  TaskId id = next_id_;
-  next_id_++;  // int64_t is big enough that we ignore the potential overflow.
-
-  // Will be deleted by |untrack_and_delete_flag| after Untrack().
-  CancellationFlag* flag = new CancellationFlag();
-
-  OnceClosure untrack_and_delete_flag = BindOnce(
-      &RunAndDeleteFlag,
-      BindOnce(&CancelableTaskTracker::Untrack, weak_factory_.GetWeakPtr(), id),
-      flag);
-
-  // Will always run |untrack_and_delete_flag| on current sequence.
-  ScopedClosureRunner* untrack_and_delete_flag_runner =
-      new ScopedClosureRunner(BindOnce(
-          &RunOrPostToTaskRunner, RetainedRef(SequencedTaskRunnerHandle::Get()),
-          std::move(untrack_and_delete_flag)));
-
-  *is_canceled_cb =
-      Bind(&IsCanceled, flag, Owned(untrack_and_delete_flag_runner));
-
-  Track(id, flag);
-  return id;
-}
-
-void CancelableTaskTracker::TryCancel(TaskId id) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-
-  const auto it = task_flags_.find(id);
-  if (it == task_flags_.end()) {
-    // Two possibilities:
-    //
-    //   1. The task has already been untracked.
-    //   2. The TaskId is bad or unknown.
-    //
-    // Since this function is best-effort, it's OK to ignore these.
-    return;
-  }
-  it->second->Set();
-}
-
-void CancelableTaskTracker::TryCancelAll() {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  for (const auto& it : task_flags_)
-    it.second->Set();
-  weak_factory_.InvalidateWeakPtrs();
-  task_flags_.clear();
-}
-
-bool CancelableTaskTracker::HasTrackedTasks() const {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  return !task_flags_.empty();
-}
-
-void CancelableTaskTracker::Track(TaskId id, CancellationFlag* flag) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  bool success = task_flags_.insert(std::make_pair(id, flag)).second;
-  DCHECK(success);
-}
-
-void CancelableTaskTracker::Untrack(TaskId id) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  size_t num = task_flags_.erase(id);
-  DCHECK_EQ(1u, num);
-}
-
-}  // namespace base
diff --git a/base/task/cancelable_task_tracker.h b/base/task/cancelable_task_tracker.h
deleted file mode 100644
index e5e6b5e..0000000
--- a/base/task/cancelable_task_tracker.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.
-
-// CancelableTaskTracker posts tasks (in the form of a Closure) to a
-// TaskRunner, and is able to cancel the task later if it's not needed
-// anymore.  On destruction, CancelableTaskTracker will cancel all
-// tracked tasks.
-//
-// Each cancelable task can be associated with a reply (also a Closure). After
-// the task is run on the TaskRunner, |reply| will be posted back to
-// originating TaskRunner.
-//
-// NOTE:
-//
-// CancelableCallback (base/cancelable_callback.h) and WeakPtr binding are
-// preferred solutions for canceling a task. However, they don't support
-// cancelation from another sequence. This is sometimes a performance critical
-// requirement. E.g. We need to cancel database lookup task on DB thread when
-// user changes inputed text. If it is performance critical to do a best effort
-// cancelation of a task, then CancelableTaskTracker is appropriate, otherwise
-// use one of the other mechanisms.
-//
-// THREAD-SAFETY:
-//
-// 1. A CancelableTaskTracker object must be created, used, and destroyed on a
-//    single sequence.
-//
-// 2. It's safe to destroy a CancelableTaskTracker while there are outstanding
-//    tasks. This is commonly used to cancel all outstanding tasks.
-//
-// 3. The task is deleted on the target sequence, and the reply are deleted on
-//    the originating sequence.
-//
-// 4. IsCanceledCallback can be run or deleted on any sequence.
-#ifndef BASE_TASK_CANCELABLE_TASK_TRACKER_H_
-#define BASE_TASK_CANCELABLE_TASK_TRACKER_H_
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/base_export.h"
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/containers/small_map.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/post_task_and_reply_with_result_internal.h"
-#include "base/sequence_checker.h"
-
-namespace base {
-
-class CancellationFlag;
-class Location;
-class TaskRunner;
-
-class BASE_EXPORT CancelableTaskTracker {
- public:
-  // All values except kBadTaskId are valid.
-  typedef int64_t TaskId;
-  static const TaskId kBadTaskId;
-
-  typedef Callback<bool()> IsCanceledCallback;
-
-  CancelableTaskTracker();
-
-  // Cancels all tracked tasks.
-  ~CancelableTaskTracker();
-
-  TaskId PostTask(TaskRunner* task_runner,
-                  const Location& from_here,
-                  OnceClosure task);
-
-  TaskId PostTaskAndReply(TaskRunner* task_runner,
-                          const Location& from_here,
-                          OnceClosure task,
-                          OnceClosure reply);
-
-  template <typename TaskReturnType, typename ReplyArgType>
-  TaskId PostTaskAndReplyWithResult(TaskRunner* task_runner,
-                                    const Location& from_here,
-                                    OnceCallback<TaskReturnType()> task,
-                                    OnceCallback<void(ReplyArgType)> reply) {
-    TaskReturnType* result = new TaskReturnType();
-    return PostTaskAndReply(
-        task_runner, from_here,
-        BindOnce(&internal::ReturnAsParamAdapter<TaskReturnType>,
-                 std::move(task), Unretained(result)),
-        BindOnce(&internal::ReplyAdapter<TaskReturnType, ReplyArgType>,
-                 std::move(reply), Owned(result)));
-  }
-
-  // Callback version of PostTaskWithTraitsAndReplyWithResult above.
-  // Though RepeatingCallback is convertible to OnceCallback, we need this since
-  // we can not use template deduction and object conversion at once on the
-  // overload resolution.
-  // TODO(tzik): Update all callers of the Callback version to use OnceCallback.
-  template <typename TaskReturnType, typename ReplyArgType>
-  TaskId PostTaskAndReplyWithResult(TaskRunner* task_runner,
-                                    const Location& from_here,
-                                    Callback<TaskReturnType()> task,
-                                    Callback<void(ReplyArgType)> reply) {
-    return PostTaskAndReplyWithResult(
-        task_runner, from_here,
-        static_cast<OnceCallback<TaskReturnType()>>(std::move(task)),
-        static_cast<OnceCallback<void(ReplyArgType)>>(std::move(reply)));
-  }
-
-  // Creates a tracked TaskId and an associated IsCanceledCallback. Client can
-  // later call TryCancel() with the returned TaskId, and run |is_canceled_cb|
-  // from any thread to check whether the TaskId is canceled.
-  //
-  // The returned task ID is tracked until the last copy of
-  // |is_canceled_cb| is destroyed.
-  //
-  // Note. This function is used to address some special cancelation requirement
-  // in existing code. You SHOULD NOT need this function in new code.
-  TaskId NewTrackedTaskId(IsCanceledCallback* is_canceled_cb);
-
-  // After calling this function, |task| and |reply| will not run. If the
-  // cancelation happens when |task| is running or has finished running, |reply|
-  // will not run. If |reply| is running or has finished running, cancellation
-  // is a noop.
-  //
-  // Note. It's OK to cancel a |task| for more than once. The later calls are
-  // noops.
-  void TryCancel(TaskId id);
-
-  // It's OK to call this function for more than once. The later calls are
-  // noops.
-  void TryCancelAll();
-
-  // Returns true iff there are in-flight tasks that are still being
-  // tracked.
-  bool HasTrackedTasks() const;
-
- private:
-  void Track(TaskId id, CancellationFlag* flag);
-  void Untrack(TaskId id);
-
-  // Typically the number of tasks are 0-2 and occationally 3-4. But since
-  // this is a general API that could be used in unexpected ways, use a
-  // small_map instead of a flat_map to avoid falling over if there are many
-  // tasks.
-  small_map<std::map<TaskId, CancellationFlag*>, 4> task_flags_;
-
-  TaskId next_id_;
-  SequenceChecker sequence_checker_;
-
-  WeakPtrFactory<CancelableTaskTracker> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(CancelableTaskTracker);
-};
-
-}  // namespace base
-
-#endif  // BASE_TASK_CANCELABLE_TASK_TRACKER_H_
diff --git a/base/task/sequence_manager/OWNERS b/base/task/sequence_manager/OWNERS
deleted file mode 100644
index ac6eae8..0000000
--- a/base/task/sequence_manager/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-altimin@chromium.org
-alexclarke@chromium.org
-skyostil@chromium.org
-
-# TEAM: scheduler-dev@chromium.org
-# Component: Blink>Scheduling
diff --git a/base/task/task_scheduler/OWNERS b/base/task/task_scheduler/OWNERS
deleted file mode 100644
index 0f3ad5e..0000000
--- a/base/task/task_scheduler/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-fdoray@chromium.org
-gab@chromium.org
-robliao@chromium.org
-
-# TEAM: scheduler-dev@chromium.org
-# COMPONENT: Internals>TaskScheduler
diff --git a/base/third_party/nspr/LICENSE b/base/third_party/nspr/LICENSE
deleted file mode 100644
index eba7b77..0000000
--- a/base/third_party/nspr/LICENSE
+++ /dev/null
@@ -1,35 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (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.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Netscape Portable Runtime (NSPR).
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998-2000
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
diff --git a/base/third_party/nspr/OWNERS b/base/third_party/nspr/OWNERS
deleted file mode 100644
index 20ba660..0000000
--- a/base/third_party/nspr/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-rsleevi@chromium.org
-wtc@chromium.org
diff --git a/base/third_party/nspr/README.chromium b/base/third_party/nspr/README.chromium
deleted file mode 100644
index 3659a2c..0000000
--- a/base/third_party/nspr/README.chromium
+++ /dev/null
@@ -1,3 +0,0 @@
-Name: Netscape Portable Runtime (NSPR)
-URL: http://www.mozilla.org/projects/nspr/
-License: MPL 1.1/GPL 2.0/LGPL 2.1
diff --git a/base/third_party/nspr/prtime.cc b/base/third_party/nspr/prtime.cc
deleted file mode 100644
index 8a3f7c0..0000000
--- a/base/third_party/nspr/prtime.cc
+++ /dev/null
@@ -1,1186 +0,0 @@
-/* Portions are Copyright (C) 2011 Google Inc */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (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.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Netscape Portable Runtime (NSPR).
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998-2000
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-/*
- * prtime.cc --
- * NOTE: The original nspr file name is prtime.c
- *
- *     NSPR date and time functions
- *
- * CVS revision 3.37
- */
-
-/*
- * The following functions were copied from the NSPR prtime.c file.
- * PR_ParseTimeString
- *   We inlined the new PR_ParseTimeStringToExplodedTime function to avoid
- *   copying PR_ExplodeTime and PR_LocalTimeParameters.  (The PR_ExplodeTime
- *   and PR_ImplodeTime calls cancel each other out.)
- * PR_NormalizeTime
- * PR_GMTParameters
- * PR_ImplodeTime
- *   Upstream implementation from
- *   http://lxr.mozilla.org/nspr/source/pr/src/misc/prtime.c#221
- * All types and macros are defined in the base/third_party/prtime.h file.
- * These have been copied from the following nspr files. We have only copied
- * over the types we need.
- * 1. prtime.h
- * 2. prtypes.h
- * 3. prlong.h
- *
- * Unit tests are in base/time/pr_time_unittest.cc.
- */
-
-#include <limits.h>
-
-#include "base/logging.h"
-#include "base/third_party/nspr/prtime.h"
-#include "build_config.h"
-
-#include <errno.h>  /* for EINVAL */
-#include <time.h>
-
-/*
- * The COUNT_LEAPS macro counts the number of leap years passed by
- * till the start of the given year Y.  At the start of the year 4
- * A.D. the number of leap years passed by is 0, while at the start of
- * the year 5 A.D. this count is 1. The number of years divisible by
- * 100 but not divisible by 400 (the non-leap years) is deducted from
- * the count to get the correct number of leap years.
- *
- * The COUNT_DAYS macro counts the number of days since 01/01/01 till the
- * start of the given year Y. The number of days at the start of the year
- * 1 is 0 while the number of days at the start of the year 2 is 365
- * (which is ((2)-1) * 365) and so on. The reference point is 01/01/01
- * midnight 00:00:00.
- */
-
-#define COUNT_LEAPS(Y) (((Y)-1) / 4 - ((Y)-1) / 100 + ((Y)-1) / 400)
-#define COUNT_DAYS(Y) (((Y)-1) * 365 + COUNT_LEAPS(Y))
-#define DAYS_BETWEEN_YEARS(A, B) (COUNT_DAYS(B) - COUNT_DAYS(A))
-
-/* Implements the Unix localtime_r() function for windows */
-#if defined(OS_WIN)
-static void localtime_r(const time_t* secs, struct tm* time) {
-  (void) localtime_s(time, secs);
-}
-#endif
-
-/*
- * Static variables used by functions in this file
- */
-
-/*
- * The following array contains the day of year for the last day of
- * each month, where index 1 is January, and day 0 is January 1.
- */
-
-static const int lastDayOfMonth[2][13] = {
-    {-1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364},
-    {-1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}
-};
-
-/*
- * The number of days in a month
- */
-
-static const PRInt8 nDays[2][12] = {
-    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
-    {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
-};
-
-/*
- *------------------------------------------------------------------------
- *
- * PR_ImplodeTime --
- *
- *     Cf. time_t mktime(struct tm *tp)
- *     Note that 1 year has < 2^25 seconds.  So an PRInt32 is large enough.
- *
- *------------------------------------------------------------------------
- */
-PRTime
-PR_ImplodeTime(const PRExplodedTime *exploded)
-{
-  PRExplodedTime copy;
-  PRTime retVal;
-  PRInt64 secPerDay, usecPerSec;
-  PRInt64 temp;
-  PRInt64 numSecs64;
-  PRInt32 numDays;
-  PRInt32 numSecs;
-
-  /* Normalize first.  Do this on our copy */
-  copy = *exploded;
-  PR_NormalizeTime(&copy, PR_GMTParameters);
-
-  numDays = DAYS_BETWEEN_YEARS(1970, copy.tm_year);
-
-  numSecs = copy.tm_yday * 86400 + copy.tm_hour * 3600 + copy.tm_min * 60 +
-            copy.tm_sec;
-
-  LL_I2L(temp, numDays);
-  LL_I2L(secPerDay, 86400);
-  LL_MUL(temp, temp, secPerDay);
-  LL_I2L(numSecs64, numSecs);
-  LL_ADD(numSecs64, numSecs64, temp);
-
-  /* apply the GMT and DST offsets */
-  LL_I2L(temp, copy.tm_params.tp_gmt_offset);
-  LL_SUB(numSecs64, numSecs64, temp);
-  LL_I2L(temp, copy.tm_params.tp_dst_offset);
-  LL_SUB(numSecs64, numSecs64, temp);
-
-  LL_I2L(usecPerSec, 1000000L);
-  LL_MUL(temp, numSecs64, usecPerSec);
-  LL_I2L(retVal, copy.tm_usec);
-  LL_ADD(retVal, retVal, temp);
-
-  return retVal;
-}
-
-/*
- *-------------------------------------------------------------------------
- *
- * IsLeapYear --
- *
- *     Returns 1 if the year is a leap year, 0 otherwise.
- *
- *-------------------------------------------------------------------------
- */
-
-static int IsLeapYear(PRInt16 year)
-{
-    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
-        return 1;
-    else
-        return 0;
-}
-
-/*
- * 'secOffset' should be less than 86400 (i.e., a day).
- * 'time' should point to a normalized PRExplodedTime.
- */
-
-static void
-ApplySecOffset(PRExplodedTime *time, PRInt32 secOffset)
-{
-    time->tm_sec += secOffset;
-
-    /* Note that in this implementation we do not count leap seconds */
-    if (time->tm_sec < 0 || time->tm_sec >= 60) {
-        time->tm_min += time->tm_sec / 60;
-        time->tm_sec %= 60;
-        if (time->tm_sec < 0) {
-            time->tm_sec += 60;
-            time->tm_min--;
-        }
-    }
-
-    if (time->tm_min < 0 || time->tm_min >= 60) {
-        time->tm_hour += time->tm_min / 60;
-        time->tm_min %= 60;
-        if (time->tm_min < 0) {
-            time->tm_min += 60;
-            time->tm_hour--;
-        }
-    }
-
-    if (time->tm_hour < 0) {
-        /* Decrement mday, yday, and wday */
-        time->tm_hour += 24;
-        time->tm_mday--;
-        time->tm_yday--;
-        if (time->tm_mday < 1) {
-            time->tm_month--;
-            if (time->tm_month < 0) {
-                time->tm_month = 11;
-                time->tm_year--;
-                if (IsLeapYear(time->tm_year))
-                    time->tm_yday = 365;
-                else
-                    time->tm_yday = 364;
-            }
-            time->tm_mday = nDays[IsLeapYear(time->tm_year)][time->tm_month];
-        }
-        time->tm_wday--;
-        if (time->tm_wday < 0)
-            time->tm_wday = 6;
-    } else if (time->tm_hour > 23) {
-        /* Increment mday, yday, and wday */
-        time->tm_hour -= 24;
-        time->tm_mday++;
-        time->tm_yday++;
-        if (time->tm_mday >
-                nDays[IsLeapYear(time->tm_year)][time->tm_month]) {
-            time->tm_mday = 1;
-            time->tm_month++;
-            if (time->tm_month > 11) {
-                time->tm_month = 0;
-                time->tm_year++;
-                time->tm_yday = 0;
-            }
-        }
-        time->tm_wday++;
-        if (time->tm_wday > 6)
-            time->tm_wday = 0;
-    }
-}
-
-void
-PR_NormalizeTime(PRExplodedTime *time, PRTimeParamFn params)
-{
-    int daysInMonth;
-    PRInt32 numDays;
-
-    /* Get back to GMT */
-    time->tm_sec -= time->tm_params.tp_gmt_offset
-            + time->tm_params.tp_dst_offset;
-    time->tm_params.tp_gmt_offset = 0;
-    time->tm_params.tp_dst_offset = 0;
-
-    /* Now normalize GMT */
-
-    if (time->tm_usec < 0 || time->tm_usec >= 1000000) {
-        time->tm_sec +=  time->tm_usec / 1000000;
-        time->tm_usec %= 1000000;
-        if (time->tm_usec < 0) {
-            time->tm_usec += 1000000;
-            time->tm_sec--;
-        }
-    }
-
-    /* Note that we do not count leap seconds in this implementation */
-    if (time->tm_sec < 0 || time->tm_sec >= 60) {
-        time->tm_min += time->tm_sec / 60;
-        time->tm_sec %= 60;
-        if (time->tm_sec < 0) {
-            time->tm_sec += 60;
-            time->tm_min--;
-        }
-    }
-
-    if (time->tm_min < 0 || time->tm_min >= 60) {
-        time->tm_hour += time->tm_min / 60;
-        time->tm_min %= 60;
-        if (time->tm_min < 0) {
-            time->tm_min += 60;
-            time->tm_hour--;
-        }
-    }
-
-    if (time->tm_hour < 0 || time->tm_hour >= 24) {
-        time->tm_mday += time->tm_hour / 24;
-        time->tm_hour %= 24;
-        if (time->tm_hour < 0) {
-            time->tm_hour += 24;
-            time->tm_mday--;
-        }
-    }
-
-    /* Normalize month and year before mday */
-    if (time->tm_month < 0 || time->tm_month >= 12) {
-        time->tm_year += static_cast<PRInt16>(time->tm_month / 12);
-        time->tm_month %= 12;
-        if (time->tm_month < 0) {
-            time->tm_month += 12;
-            time->tm_year--;
-        }
-    }
-
-    /* Now that month and year are in proper range, normalize mday */
-
-    if (time->tm_mday < 1) {
-        /* mday too small */
-        do {
-            /* the previous month */
-            time->tm_month--;
-            if (time->tm_month < 0) {
-                time->tm_month = 11;
-                time->tm_year--;
-            }
-            time->tm_mday += nDays[IsLeapYear(time->tm_year)][time->tm_month];
-        } while (time->tm_mday < 1);
-    } else {
-        daysInMonth = nDays[IsLeapYear(time->tm_year)][time->tm_month];
-        while (time->tm_mday > daysInMonth) {
-            /* mday too large */
-            time->tm_mday -= daysInMonth;
-            time->tm_month++;
-            if (time->tm_month > 11) {
-                time->tm_month = 0;
-                time->tm_year++;
-            }
-            daysInMonth = nDays[IsLeapYear(time->tm_year)][time->tm_month];
-        }
-    }
-
-    /* Recompute yday and wday */
-    time->tm_yday = static_cast<PRInt16>(time->tm_mday +
-            lastDayOfMonth[IsLeapYear(time->tm_year)][time->tm_month]);
-
-    numDays = DAYS_BETWEEN_YEARS(1970, time->tm_year) + time->tm_yday;
-    time->tm_wday = (numDays + 4) % 7;
-    if (time->tm_wday < 0) {
-        time->tm_wday += 7;
-    }
-
-    /* Recompute time parameters */
-
-    time->tm_params = params(time);
-
-    ApplySecOffset(time, time->tm_params.tp_gmt_offset
-            + time->tm_params.tp_dst_offset);
-}
-
-/*
- *------------------------------------------------------------------------
- *
- * PR_GMTParameters --
- *
- *     Returns the PRTimeParameters for Greenwich Mean Time.
- *     Trivially, both the tp_gmt_offset and tp_dst_offset fields are 0.
- *
- *------------------------------------------------------------------------
- */
-
-PRTimeParameters
-PR_GMTParameters(const PRExplodedTime *gmt)
-{
-    PRTimeParameters retVal = { 0, 0 };
-    return retVal;
-}
-
-/*
- * The following code implements PR_ParseTimeString().  It is based on
- * ns/lib/xp/xp_time.c, revision 1.25, by Jamie Zawinski <jwz@netscape.com>.
- */
-
-/*
- * We only recognize the abbreviations of a small subset of time zones
- * in North America, Europe, and Japan.
- *
- * PST/PDT: Pacific Standard/Daylight Time
- * MST/MDT: Mountain Standard/Daylight Time
- * CST/CDT: Central Standard/Daylight Time
- * EST/EDT: Eastern Standard/Daylight Time
- * AST: Atlantic Standard Time
- * NST: Newfoundland Standard Time
- * GMT: Greenwich Mean Time
- * BST: British Summer Time
- * MET: Middle Europe Time
- * EET: Eastern Europe Time
- * JST: Japan Standard Time
- */
-
-typedef enum
-{
-  TT_UNKNOWN,
-
-  TT_SUN, TT_MON, TT_TUE, TT_WED, TT_THU, TT_FRI, TT_SAT,
-
-  TT_JAN, TT_FEB, TT_MAR, TT_APR, TT_MAY, TT_JUN,
-  TT_JUL, TT_AUG, TT_SEP, TT_OCT, TT_NOV, TT_DEC,
-
-  TT_PST, TT_PDT, TT_MST, TT_MDT, TT_CST, TT_CDT, TT_EST, TT_EDT,
-  TT_AST, TT_NST, TT_GMT, TT_BST, TT_MET, TT_EET, TT_JST
-} TIME_TOKEN;
-
-/*
- * This parses a time/date string into a PRTime
- * (microseconds after "1-Jan-1970 00:00:00 GMT").
- * It returns PR_SUCCESS on success, and PR_FAILURE
- * if the time/date string can't be parsed.
- *
- * Many formats are handled, including:
- *
- *   14 Apr 89 03:20:12
- *   14 Apr 89 03:20 GMT
- *   Fri, 17 Mar 89 4:01:33
- *   Fri, 17 Mar 89 4:01 GMT
- *   Mon Jan 16 16:12 PDT 1989
- *   Mon Jan 16 16:12 +0130 1989
- *   6 May 1992 16:41-JST (Wednesday)
- *   22-AUG-1993 10:59:12.82
- *   22-AUG-1993 10:59pm
- *   22-AUG-1993 12:59am
- *   22-AUG-1993 12:59 PM
- *   Friday, August 04, 1995 3:54 PM
- *   06/21/95 04:24:34 PM
- *   20/06/95 21:07
- *   95-06-08 19:32:48 EDT
- *   1995-06-17T23:11:25.342156Z
- *
- * If the input string doesn't contain a description of the timezone,
- * we consult the `default_to_gmt' to decide whether the string should
- * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE).
- * The correct value for this argument depends on what standard specified
- * the time string which you are parsing.
- */
-
-PRStatus
-PR_ParseTimeString(
-        const char *string,
-        PRBool default_to_gmt,
-        PRTime *result_imploded)
-{
-  PRExplodedTime tm;
-  PRExplodedTime *result = &tm;
-  TIME_TOKEN dotw = TT_UNKNOWN;
-  TIME_TOKEN month = TT_UNKNOWN;
-  TIME_TOKEN zone = TT_UNKNOWN;
-  int zone_offset = -1;
-  int dst_offset = 0;
-  int date = -1;
-  PRInt32 year = -1;
-  int hour = -1;
-  int min = -1;
-  int sec = -1;
-  int usec = -1;
-
-  const char *rest = string;
-
-  int iterations = 0;
-
-  PR_ASSERT(string && result);
-  if (!string || !result) return PR_FAILURE;
-
-  while (*rest)
-        {
-
-          if (iterations++ > 1000)
-                {
-                  return PR_FAILURE;
-                }
-
-          switch (*rest)
-                {
-                case 'a': case 'A':
-                  if (month == TT_UNKNOWN &&
-                          (rest[1] == 'p' || rest[1] == 'P') &&
-                          (rest[2] == 'r' || rest[2] == 'R'))
-                        month = TT_APR;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 's' || rest[1] == 'S') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_AST;
-                  else if (month == TT_UNKNOWN &&
-                                   (rest[1] == 'u' || rest[1] == 'U') &&
-                                   (rest[2] == 'g' || rest[2] == 'G'))
-                        month = TT_AUG;
-                  break;
-                case 'b': case 'B':
-                  if (zone == TT_UNKNOWN &&
-                          (rest[1] == 's' || rest[1] == 'S') &&
-                          (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_BST;
-                  break;
-                case 'c': case 'C':
-                  if (zone == TT_UNKNOWN &&
-                          (rest[1] == 'd' || rest[1] == 'D') &&
-                          (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_CDT;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 's' || rest[1] == 'S') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_CST;
-                  break;
-                case 'd': case 'D':
-                  if (month == TT_UNKNOWN &&
-                          (rest[1] == 'e' || rest[1] == 'E') &&
-                          (rest[2] == 'c' || rest[2] == 'C'))
-                        month = TT_DEC;
-                  break;
-                case 'e': case 'E':
-                  if (zone == TT_UNKNOWN &&
-                          (rest[1] == 'd' || rest[1] == 'D') &&
-                          (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_EDT;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 'e' || rest[1] == 'E') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_EET;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 's' || rest[1] == 'S') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_EST;
-                  break;
-                case 'f': case 'F':
-                  if (month == TT_UNKNOWN &&
-                          (rest[1] == 'e' || rest[1] == 'E') &&
-                          (rest[2] == 'b' || rest[2] == 'B'))
-                        month = TT_FEB;
-                  else if (dotw == TT_UNKNOWN &&
-                                   (rest[1] == 'r' || rest[1] == 'R') &&
-                                   (rest[2] == 'i' || rest[2] == 'I'))
-                        dotw = TT_FRI;
-                  break;
-                case 'g': case 'G':
-                  if (zone == TT_UNKNOWN &&
-                          (rest[1] == 'm' || rest[1] == 'M') &&
-                          (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_GMT;
-                  break;
-                case 'j': case 'J':
-                  if (month == TT_UNKNOWN &&
-                          (rest[1] == 'a' || rest[1] == 'A') &&
-                          (rest[2] == 'n' || rest[2] == 'N'))
-                        month = TT_JAN;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 's' || rest[1] == 'S') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_JST;
-                  else if (month == TT_UNKNOWN &&
-                                   (rest[1] == 'u' || rest[1] == 'U') &&
-                                   (rest[2] == 'l' || rest[2] == 'L'))
-                        month = TT_JUL;
-                  else if (month == TT_UNKNOWN &&
-                                   (rest[1] == 'u' || rest[1] == 'U') &&
-                                   (rest[2] == 'n' || rest[2] == 'N'))
-                        month = TT_JUN;
-                  break;
-                case 'm': case 'M':
-                  if (month == TT_UNKNOWN &&
-                          (rest[1] == 'a' || rest[1] == 'A') &&
-                          (rest[2] == 'r' || rest[2] == 'R'))
-                        month = TT_MAR;
-                  else if (month == TT_UNKNOWN &&
-                                   (rest[1] == 'a' || rest[1] == 'A') &&
-                                   (rest[2] == 'y' || rest[2] == 'Y'))
-                        month = TT_MAY;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 'd' || rest[1] == 'D') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_MDT;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 'e' || rest[1] == 'E') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_MET;
-                  else if (dotw == TT_UNKNOWN &&
-                                   (rest[1] == 'o' || rest[1] == 'O') &&
-                                   (rest[2] == 'n' || rest[2] == 'N'))
-                        dotw = TT_MON;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 's' || rest[1] == 'S') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_MST;
-                  break;
-                case 'n': case 'N':
-                  if (month == TT_UNKNOWN &&
-                          (rest[1] == 'o' || rest[1] == 'O') &&
-                          (rest[2] == 'v' || rest[2] == 'V'))
-                        month = TT_NOV;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 's' || rest[1] == 'S') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_NST;
-                  break;
-                case 'o': case 'O':
-                  if (month == TT_UNKNOWN &&
-                          (rest[1] == 'c' || rest[1] == 'C') &&
-                          (rest[2] == 't' || rest[2] == 'T'))
-                        month = TT_OCT;
-                  break;
-                case 'p': case 'P':
-                  if (zone == TT_UNKNOWN &&
-                          (rest[1] == 'd' || rest[1] == 'D') &&
-                          (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_PDT;
-                  else if (zone == TT_UNKNOWN &&
-                                   (rest[1] == 's' || rest[1] == 'S') &&
-                                   (rest[2] == 't' || rest[2] == 'T'))
-                        zone = TT_PST;
-                  break;
-                case 's': case 'S':
-                  if (dotw == TT_UNKNOWN &&
-                          (rest[1] == 'a' || rest[1] == 'A') &&
-                          (rest[2] == 't' || rest[2] == 'T'))
-                        dotw = TT_SAT;
-                  else if (month == TT_UNKNOWN &&
-                                   (rest[1] == 'e' || rest[1] == 'E') &&
-                                   (rest[2] == 'p' || rest[2] == 'P'))
-                        month = TT_SEP;
-                  else if (dotw == TT_UNKNOWN &&
-                                   (rest[1] == 'u' || rest[1] == 'U') &&
-                                   (rest[2] == 'n' || rest[2] == 'N'))
-                        dotw = TT_SUN;
-                  break;
-                case 't': case 'T':
-                  if (dotw == TT_UNKNOWN &&
-                          (rest[1] == 'h' || rest[1] == 'H') &&
-                          (rest[2] == 'u' || rest[2] == 'U'))
-                        dotw = TT_THU;
-                  else if (dotw == TT_UNKNOWN &&
-                                   (rest[1] == 'u' || rest[1] == 'U') &&
-                                   (rest[2] == 'e' || rest[2] == 'E'))
-                        dotw = TT_TUE;
-                  break;
-                case 'u': case 'U':
-                  if (zone == TT_UNKNOWN &&
-                          (rest[1] == 't' || rest[1] == 'T') &&
-                          !(rest[2] >= 'A' && rest[2] <= 'Z') &&
-                          !(rest[2] >= 'a' && rest[2] <= 'z'))
-                        /* UT is the same as GMT but UTx is not. */
-                        zone = TT_GMT;
-                  break;
-                case 'w': case 'W':
-                  if (dotw == TT_UNKNOWN &&
-                          (rest[1] == 'e' || rest[1] == 'E') &&
-                          (rest[2] == 'd' || rest[2] == 'D'))
-                        dotw = TT_WED;
-                  break;
-
-                case '+': case '-':
-                  {
-                        const char *end;
-                        int sign;
-                        if (zone_offset != -1)
-                          {
-                                /* already got one... */
-                                rest++;
-                                break;
-                          }
-                        if (zone != TT_UNKNOWN && zone != TT_GMT)
-                          {
-                                /* GMT+0300 is legal, but PST+0300 is not. */
-                                rest++;
-                                break;
-                          }
-
-                        sign = ((*rest == '+') ? 1 : -1);
-                        rest++; /* move over sign */
-                        end = rest;
-                        while (*end >= '0' && *end <= '9')
-                          end++;
-                        if (rest == end) /* no digits here */
-                          break;
-
-                        if ((end - rest) == 4)
-                          /* offset in HHMM */
-                          zone_offset = (((((rest[0]-'0')*10) + (rest[1]-'0')) * 60) +
-                                                         (((rest[2]-'0')*10) + (rest[3]-'0')));
-                        else if ((end - rest) == 2)
-                          /* offset in hours */
-                          zone_offset = (((rest[0]-'0')*10) + (rest[1]-'0')) * 60;
-                        else if ((end - rest) == 1)
-                          /* offset in hours */
-                          zone_offset = (rest[0]-'0') * 60;
-                        else
-                          /* 3 or >4 */
-                          break;
-
-                        zone_offset *= sign;
-                        zone = TT_GMT;
-                        break;
-                  }
-
-                case '0': case '1': case '2': case '3': case '4':
-                case '5': case '6': case '7': case '8': case '9':
-                  {
-                        int tmp_hour = -1;
-                        int tmp_min = -1;
-                        int tmp_sec = -1;
-                        int tmp_usec = -1;
-                        const char *end = rest + 1;
-                        while (*end >= '0' && *end <= '9')
-                          end++;
-
-                        /* end is now the first character after a range of digits. */
-
-                        if (*end == ':')
-                          {
-                                if (hour >= 0 && min >= 0) /* already got it */
-                                  break;
-
-                                /* We have seen "[0-9]+:", so this is probably HH:MM[:SS] */
-                                if ((end - rest) > 2)
-                                  /* it is [0-9][0-9][0-9]+: */
-                                  break;
-                                else if ((end - rest) == 2)
-                                  tmp_hour = ((rest[0]-'0')*10 +
-                                                          (rest[1]-'0'));
-                                else
-                                  tmp_hour = (rest[0]-'0');
-
-                                /* move over the colon, and parse minutes */
-
-                                rest = ++end;
-                                while (*end >= '0' && *end <= '9')
-                                  end++;
-
-                                if (end == rest)
-                                  /* no digits after first colon? */
-                                  break;
-                                else if ((end - rest) > 2)
-                                  /* it is [0-9][0-9][0-9]+: */
-                                  break;
-                                else if ((end - rest) == 2)
-                                  tmp_min = ((rest[0]-'0')*10 +
-                                                         (rest[1]-'0'));
-                                else
-                                  tmp_min = (rest[0]-'0');
-
-                                /* now go for seconds */
-                                rest = end;
-                                if (*rest == ':')
-                                  rest++;
-                                end = rest;
-                                while (*end >= '0' && *end <= '9')
-                                  end++;
-
-                                if (end == rest)
-                                  /* no digits after second colon - that's ok. */
-                                  ;
-                                else if ((end - rest) > 2)
-                                  /* it is [0-9][0-9][0-9]+: */
-                                  break;
-                                else if ((end - rest) == 2)
-                                  tmp_sec = ((rest[0]-'0')*10 +
-                                                         (rest[1]-'0'));
-                                else
-                                  tmp_sec = (rest[0]-'0');
-
-                                /* fractional second */
-                                rest = end;
-                                if (*rest == '.')
-                                  {
-                                    rest++;
-                                    end++;
-                                    tmp_usec = 0;
-                                    /* use up to 6 digits, skip over the rest */
-                                    while (*end >= '0' && *end <= '9')
-                                      {
-                                        if (end - rest < 6)
-                                          tmp_usec = tmp_usec * 10 + *end - '0';
-                                        end++;
-                                      }
-                                    int ndigits = end - rest;
-                                    while (ndigits++ < 6)
-                                      tmp_usec *= 10;
-                                    rest = end;
-                                  }
-
-                                if (*rest == 'Z')
-                                  {
-                                    zone = TT_GMT;
-                                    rest++;
-                                  }
-                                else if (tmp_hour <= 12)
-                                  {
-                                    /* If we made it here, we've parsed hour and min,
-                                       and possibly sec, so the current token is a time.
-                                       Now skip over whitespace and see if there's an AM
-                                       or PM directly following the time.
-                                    */
-                                        const char *s = end;
-                                        while (*s && (*s == ' ' || *s == '\t'))
-                                          s++;
-                                        if ((s[0] == 'p' || s[0] == 'P') &&
-                                                (s[1] == 'm' || s[1] == 'M'))
-                                          /* 10:05pm == 22:05, and 12:05pm == 12:05 */
-                                          tmp_hour = (tmp_hour == 12 ? 12 : tmp_hour + 12);
-                                        else if (tmp_hour == 12 &&
-                                                         (s[0] == 'a' || s[0] == 'A') &&
-                                                         (s[1] == 'm' || s[1] == 'M'))
-                                          /* 12:05am == 00:05 */
-                                          tmp_hour = 0;
-                                  }
-
-                                hour = tmp_hour;
-                                min = tmp_min;
-                                sec = tmp_sec;
-                                usec = tmp_usec;
-                                rest = end;
-                                break;
-                          }
-                        else if ((*end == '/' || *end == '-') &&
-                                         end[1] >= '0' && end[1] <= '9')
-                          {
-                                /* Perhaps this is 6/16/95, 16/6/95, 6-16-95, or 16-6-95
-                                   or even 95-06-05 or 1995-06-22.
-                                 */
-                                int n1, n2, n3;
-                                const char *s;
-
-                                if (month != TT_UNKNOWN)
-                                  /* if we saw a month name, this can't be. */
-                                  break;
-
-                                s = rest;
-
-                                n1 = (*s++ - '0');                                /* first 1, 2 or 4 digits */
-                                if (*s >= '0' && *s <= '9')
-                                  {
-                                    n1 = n1*10 + (*s++ - '0');
-
-                                    if (*s >= '0' && *s <= '9')            /* optional digits 3 and 4 */
-                                      {
-                                        n1 = n1*10 + (*s++ - '0');
-                                        if (*s < '0' || *s > '9')
-                                          break;
-                                        n1 = n1*10 + (*s++ - '0');
-                                      }
-                                  }
-
-                                if (*s != '/' && *s != '-')                /* slash */
-                                  break;
-                                s++;
-
-                                if (*s < '0' || *s > '9')                /* second 1 or 2 digits */
-                                  break;
-                                n2 = (*s++ - '0');
-                                if (*s >= '0' && *s <= '9')
-                                  n2 = n2*10 + (*s++ - '0');
-
-                                if (*s != '/' && *s != '-')                /* slash */
-                                  break;
-                                s++;
-
-                                if (*s < '0' || *s > '9')                /* third 1, 2, 4, or 5 digits */
-                                  break;
-                                n3 = (*s++ - '0');
-                                if (*s >= '0' && *s <= '9')
-                                  n3 = n3*10 + (*s++ - '0');
-
-                                if (*s >= '0' && *s <= '9')            /* optional digits 3, 4, and 5 */
-                                  {
-                                        n3 = n3*10 + (*s++ - '0');
-                                        if (*s < '0' || *s > '9')
-                                          break;
-                                        n3 = n3*10 + (*s++ - '0');
-                                        if (*s >= '0' && *s <= '9')
-                                          n3 = n3*10 + (*s++ - '0');
-                                  }
-
-                                if (*s == 'T' && s[1] >= '0' && s[1] <= '9')
-                                  /* followed by ISO 8601 T delimiter and number is ok */
-                                  ;
-                                else if ((*s >= '0' && *s <= '9') ||
-                                         (*s >= 'A' && *s <= 'Z') ||
-                                         (*s >= 'a' && *s <= 'z'))
-                                  /* but other alphanumerics are not ok */
-                                  break;
-
-                                /* Ok, we parsed three multi-digit numbers, with / or -
-                                   between them.  Now decide what the hell they are
-                                   (DD/MM/YY or MM/DD/YY or [YY]YY/MM/DD.)
-                                 */
-
-                                if (n1 > 31 || n1 == 0)  /* must be [YY]YY/MM/DD */
-                                  {
-                                        if (n2 > 12) break;
-                                        if (n3 > 31) break;
-                                        year = n1;
-                                        if (year < 70)
-                                            year += 2000;
-                                        else if (year < 100)
-                                            year += 1900;
-                                        month = (TIME_TOKEN)(n2 + ((int)TT_JAN) - 1);
-                                        date = n3;
-                                        rest = s;
-                                        break;
-                                  }
-
-                                if (n1 > 12 && n2 > 12)  /* illegal */
-                                  {
-                                        rest = s;
-                                        break;
-                                  }
-
-                                if (n3 < 70)
-                                    n3 += 2000;
-                                else if (n3 < 100)
-                                    n3 += 1900;
-
-                                if (n1 > 12)  /* must be DD/MM/YY */
-                                  {
-                                        date = n1;
-                                        month = (TIME_TOKEN)(n2 + ((int)TT_JAN) - 1);
-                                        year = n3;
-                                  }
-                                else                  /* assume MM/DD/YY */
-                                  {
-                                        /* #### In the ambiguous case, should we consult the
-                                           locale to find out the local default? */
-                                        month = (TIME_TOKEN)(n1 + ((int)TT_JAN) - 1);
-                                        date = n2;
-                                        year = n3;
-                                  }
-                                rest = s;
-                          }
-                        else if ((*end >= 'A' && *end <= 'Z') ||
-                                         (*end >= 'a' && *end <= 'z'))
-                          /* Digits followed by non-punctuation - what's that? */
-                          ;
-                        else if ((end - rest) == 5)                /* five digits is a year */
-                          year = (year < 0
-                                          ? ((rest[0]-'0')*10000L +
-                                                 (rest[1]-'0')*1000L +
-                                                 (rest[2]-'0')*100L +
-                                                 (rest[3]-'0')*10L +
-                                                 (rest[4]-'0'))
-                                          : year);
-                        else if ((end - rest) == 4)                /* four digits is a year */
-                          year = (year < 0
-                                          ? ((rest[0]-'0')*1000L +
-                                                 (rest[1]-'0')*100L +
-                                                 (rest[2]-'0')*10L +
-                                                 (rest[3]-'0'))
-                                          : year);
-                        else if ((end - rest) == 2)                /* two digits - date or year */
-                          {
-                                int n = ((rest[0]-'0')*10 +
-                                                 (rest[1]-'0'));
-                                /* If we don't have a date (day of the month) and we see a number
-                                     less than 32, then assume that is the date.
-
-                                         Otherwise, if we have a date and not a year, assume this is the
-                                         year.  If it is less than 70, then assume it refers to the 21st
-                                         century.  If it is two digits (>= 70), assume it refers to this
-                                         century.  Otherwise, assume it refers to an unambiguous year.
-
-                                         The world will surely end soon.
-                                   */
-                                if (date < 0 && n < 32)
-                                  date = n;
-                                else if (year < 0)
-                                  {
-                                        if (n < 70)
-                                          year = 2000 + n;
-                                        else if (n < 100)
-                                          year = 1900 + n;
-                                        else
-                                          year = n;
-                                  }
-                                /* else what the hell is this. */
-                          }
-                        else if ((end - rest) == 1)                /* one digit - date */
-                          date = (date < 0 ? (rest[0]-'0') : date);
-                        /* else, three or more than five digits - what's that? */
-
-                        break;
-                  }   /* case '0' .. '9' */
-                }   /* switch */
-
-          /* Skip to the end of this token, whether we parsed it or not.
-             Tokens are delimited by whitespace, or ,;-+/()[] but explicitly not .:
-             'T' is also treated as delimiter when followed by a digit (ISO 8601).
-           */
-          while (*rest &&
-                         *rest != ' ' && *rest != '\t' &&
-                         *rest != ',' && *rest != ';' &&
-                         *rest != '-' && *rest != '+' &&
-                         *rest != '/' &&
-                         *rest != '(' && *rest != ')' && *rest != '[' && *rest != ']' &&
-                         !(*rest == 'T' && rest[1] >= '0' && rest[1] <= '9')
-                )
-                rest++;
-          /* skip over uninteresting chars. */
-        SKIP_MORE:
-          while (*rest == ' ' || *rest == '\t' ||
-                 *rest == ',' || *rest == ';' || *rest == '/' ||
-                 *rest == '(' || *rest == ')' || *rest == '[' || *rest == ']')
-                rest++;
-
-          /* "-" is ignored at the beginning of a token if we have not yet
-                 parsed a year (e.g., the second "-" in "30-AUG-1966"), or if
-                 the character after the dash is not a digit. */         
-          if (*rest == '-' && ((rest > string &&
-              isalpha((unsigned char)rest[-1]) && year < 0) ||
-              rest[1] < '0' || rest[1] > '9'))
-                {
-                  rest++;
-                  goto SKIP_MORE;
-                }
-
-          /* Skip T that may precede ISO 8601 time. */
-          if (*rest == 'T' && rest[1] >= '0' && rest[1] <= '9')
-            rest++;
-        }   /* while */
-
-  if (zone != TT_UNKNOWN && zone_offset == -1)
-        {
-          switch (zone)
-                {
-                case TT_PST: zone_offset = -8 * 60; break;
-                case TT_PDT: zone_offset = -8 * 60; dst_offset = 1 * 60; break;
-                case TT_MST: zone_offset = -7 * 60; break;
-                case TT_MDT: zone_offset = -7 * 60; dst_offset = 1 * 60; break;
-                case TT_CST: zone_offset = -6 * 60; break;
-                case TT_CDT: zone_offset = -6 * 60; dst_offset = 1 * 60; break;
-                case TT_EST: zone_offset = -5 * 60; break;
-                case TT_EDT: zone_offset = -5 * 60; dst_offset = 1 * 60; break;
-                case TT_AST: zone_offset = -4 * 60; break;
-                case TT_NST: zone_offset = -3 * 60 - 30; break;
-                case TT_GMT: zone_offset =  0 * 60; break;
-                case TT_BST: zone_offset =  0 * 60; dst_offset = 1 * 60; break;
-                case TT_MET: zone_offset =  1 * 60; break;
-                case TT_EET: zone_offset =  2 * 60; break;
-                case TT_JST: zone_offset =  9 * 60; break;
-                default:
-                  PR_ASSERT (0);
-                  break;
-                }
-        }
-
-  /* If we didn't find a year, month, or day-of-the-month, we can't
-         possibly parse this, and in fact, mktime() will do something random
-         (I'm seeing it return "Tue Feb  5 06:28:16 2036", which is no doubt
-         a numerologically significant date... */
-  if (month == TT_UNKNOWN || date == -1 || year == -1 || year > PR_INT16_MAX)
-      return PR_FAILURE;
-
-  memset(result, 0, sizeof(*result));
-  if (usec != -1)
-        result->tm_usec = usec;
-  if (sec != -1)
-        result->tm_sec = sec;
-  if (min != -1)
-        result->tm_min = min;
-  if (hour != -1)
-        result->tm_hour = hour;
-  if (date != -1)
-        result->tm_mday = date;
-  if (month != TT_UNKNOWN)
-        result->tm_month = (((int)month) - ((int)TT_JAN));
-  if (year != -1)
-        result->tm_year = static_cast<PRInt16>(year);
-  if (dotw != TT_UNKNOWN)
-        result->tm_wday = static_cast<PRInt8>(((int)dotw) - ((int)TT_SUN));
-  /*
-   * Mainly to compute wday and yday, but normalized time is also required
-   * by the check below that works around a Visual C++ 2005 mktime problem.
-   */
-  PR_NormalizeTime(result, PR_GMTParameters);
-  /* The remaining work is to set the gmt and dst offsets in tm_params. */
-
-  if (zone == TT_UNKNOWN && default_to_gmt)
-        {
-          /* No zone was specified, so pretend the zone was GMT. */
-          zone = TT_GMT;
-          zone_offset = 0;
-        }
-
-  if (zone_offset == -1)
-         {
-           /* no zone was specified, and we're to assume that everything
-             is local. */
-          struct tm localTime;
-          time_t secs;
-
-          PR_ASSERT(result->tm_month > -1 &&
-                    result->tm_mday > 0 &&
-                    result->tm_hour > -1 &&
-                    result->tm_min > -1 &&
-                    result->tm_sec > -1);
-
-            /*
-             * To obtain time_t from a tm structure representing the local
-             * time, we call mktime().  However, we need to see if we are
-             * on 1-Jan-1970 or before.  If we are, we can't call mktime()
-             * because mktime() will crash on win16. In that case, we
-             * calculate zone_offset based on the zone offset at
-             * 00:00:00, 2 Jan 1970 GMT, and subtract zone_offset from the
-             * date we are parsing to transform the date to GMT.  We also
-             * do so if mktime() returns (time_t) -1 (time out of range).
-           */
-
-          /* month, day, hours, mins and secs are always non-negative
-             so we dont need to worry about them. */
-          if (result->tm_year >= 1970)
-                {
-                  localTime.tm_sec = result->tm_sec;
-                  localTime.tm_min = result->tm_min;
-                  localTime.tm_hour = result->tm_hour;
-                  localTime.tm_mday = result->tm_mday;
-                  localTime.tm_mon = result->tm_month;
-                  localTime.tm_year = result->tm_year - 1900;
-                  /* Set this to -1 to tell mktime "I don't care".  If you set
-                     it to 0 or 1, you are making assertions about whether the
-                     date you are handing it is in daylight savings mode or not;
-                     and if you're wrong, it will "fix" it for you. */
-                  localTime.tm_isdst = -1;
-
-#if _MSC_VER == 1400  /* 1400 = Visual C++ 2005 (8.0) */
-                  /*
-                   * mktime will return (time_t) -1 if the input is a date
-                   * after 23:59:59, December 31, 3000, US Pacific Time (not
-                   * UTC as documented): 
-                   * http://msdn.microsoft.com/en-us/library/d1y53h2a(VS.80).aspx
-                   * But if the year is 3001, mktime also invokes the invalid
-                   * parameter handler, causing the application to crash.  This
-                   * problem has been reported in
-                   * http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=266036.
-                   * We avoid this crash by not calling mktime if the date is
-                   * out of range.  To use a simple test that works in any time
-                   * zone, we consider year 3000 out of range as well.  (See
-                   * bug 480740.)
-                   */
-                  if (result->tm_year >= 3000) {
-                      /* Emulate what mktime would have done. */
-                      errno = EINVAL;
-                      secs = (time_t) -1;
-                  } else {
-                      secs = mktime(&localTime);
-                  }
-#else
-                  secs = mktime(&localTime);
-#endif
-                  if (secs != (time_t) -1)
-                    {
-                      *result_imploded = (PRInt64)secs * PR_USEC_PER_SEC;
-                      *result_imploded += result->tm_usec;
-                      return PR_SUCCESS;
-                    }
-                }
-                
-                /* So mktime() can't handle this case.  We assume the
-                   zone_offset for the date we are parsing is the same as
-                   the zone offset on 00:00:00 2 Jan 1970 GMT. */
-                secs = 86400;
-                localtime_r(&secs, &localTime);
-                zone_offset = localTime.tm_min
-                              + 60 * localTime.tm_hour
-                              + 1440 * (localTime.tm_mday - 2);
-        }
-
-  result->tm_params.tp_gmt_offset = zone_offset * 60;
-  result->tm_params.tp_dst_offset = dst_offset * 60;
-
-  *result_imploded = PR_ImplodeTime(result);
-  return PR_SUCCESS;
-}
diff --git a/base/third_party/nspr/prtime.h b/base/third_party/nspr/prtime.h
deleted file mode 100644
index 20bae38..0000000
--- a/base/third_party/nspr/prtime.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/* Portions are Copyright (C) 2011 Google Inc */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (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.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Netscape Portable Runtime (NSPR).
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998-2000
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-/*
- *---------------------------------------------------------------------------
- *
- * prtime.h --
- *
- *     NSPR date and time functions
- * CVS revision 3.10
- * This file contains definitions of NSPR's basic types required by
- * prtime.cc. These types have been copied over from the following NSPR
- * files prtime.h, prtypes.h(CVS revision 3.35), prlong.h(CVS revision 3.13)
- *
- *---------------------------------------------------------------------------
- */
-
-#ifndef BASE_PRTIME_H__
-#define BASE_PRTIME_H__
-
-#include <stdint.h>
-
-#include "base/base_export.h"
-
-typedef int8_t PRInt8;
-typedef int16_t PRInt16;
-typedef int32_t PRInt32;
-typedef int64_t PRInt64;
-typedef int PRIntn;
-
-typedef PRIntn PRBool;
-#define PR_TRUE 1
-#define PR_FALSE 0
-
-typedef enum { PR_FAILURE = -1, PR_SUCCESS = 0 } PRStatus;
-
-#define PR_ASSERT DCHECK
-#define PR_CALLBACK
-#define PR_INT16_MAX 32767
-#define NSPR_API(__type) extern __type
-
-/*
- * Long-long (64-bit signed integer type) support macros used by
- * PR_ImplodeTime().
- * See http://lxr.mozilla.org/nspr/source/pr/include/prlong.h
- */
-
-#define LL_I2L(l, i) ((l) = (PRInt64)(i))
-#define LL_MUL(r, a, b) ((r) = (a) * (b))
-#define LL_ADD(r, a, b) ((r) = (a) + (b))
-#define LL_SUB(r, a, b) ((r) = (a) - (b))
-
-/**********************************************************************/
-/************************* TYPES AND CONSTANTS ************************/
-/**********************************************************************/
-
-#define PR_MSEC_PER_SEC		1000UL
-#define PR_USEC_PER_SEC		1000000UL
-#define PR_NSEC_PER_SEC		1000000000UL
-#define PR_USEC_PER_MSEC	1000UL
-#define PR_NSEC_PER_MSEC	1000000UL
-
-/*
- * PRTime --
- *
- *     NSPR represents basic time as 64-bit signed integers relative
- *     to midnight (00:00:00), January 1, 1970 Greenwich Mean Time (GMT).
- *     (GMT is also known as Coordinated Universal Time, UTC.)
- *     The units of time are in microseconds. Negative times are allowed
- *     to represent times prior to the January 1970 epoch. Such values are
- *     intended to be exported to other systems or converted to human
- *     readable form.
- *
- *     Notes on porting: PRTime corresponds to time_t in ANSI C.  NSPR 1.0
- *     simply uses PRInt64.
- */
-
-typedef PRInt64 PRTime;
-
-/*
- * Time zone and daylight saving time corrections applied to GMT to
- * obtain the local time of some geographic location
- */
-
-typedef struct PRTimeParameters {
-    PRInt32 tp_gmt_offset;     /* the offset from GMT in seconds */
-    PRInt32 tp_dst_offset;     /* contribution of DST in seconds */
-} PRTimeParameters;
-
-/*
- * PRExplodedTime --
- *
- *     Time broken down into human-readable components such as year, month,
- *     day, hour, minute, second, and microsecond.  Time zone and daylight
- *     saving time corrections may be applied.  If they are applied, the
- *     offsets from the GMT must be saved in the 'tm_params' field so that
- *     all the information is available to reconstruct GMT.
- *
- *     Notes on porting: PRExplodedTime corrresponds to struct tm in
- *     ANSI C, with the following differences:
- *       - an additional field tm_usec;
- *       - replacing tm_isdst by tm_params;
- *       - the month field is spelled tm_month, not tm_mon;
- *       - we use absolute year, AD, not the year since 1900.
- *     The corresponding type in NSPR 1.0 is called PRTime.  Below is
- *     a table of date/time type correspondence in the three APIs:
- *         API          time since epoch          time in components
- *       ANSI C             time_t                  struct tm
- *       NSPR 1.0           PRInt64                   PRTime
- *       NSPR 2.0           PRTime                  PRExplodedTime
- */
-
-typedef struct PRExplodedTime {
-    PRInt32 tm_usec;		    /* microseconds past tm_sec (0-99999)  */
-    PRInt32 tm_sec;             /* seconds past tm_min (0-61, accomodating
-                                   up to two leap seconds) */	
-    PRInt32 tm_min;             /* minutes past tm_hour (0-59) */
-    PRInt32 tm_hour;            /* hours past tm_day (0-23) */
-    PRInt32 tm_mday;            /* days past tm_mon (1-31, note that it
-				                starts from 1) */
-    PRInt32 tm_month;           /* months past tm_year (0-11, Jan = 0) */
-    PRInt16 tm_year;            /* absolute year, AD (note that we do not
-				                count from 1900) */
-
-    PRInt8 tm_wday;		        /* calculated day of the week
-				                (0-6, Sun = 0) */
-    PRInt16 tm_yday;            /* calculated day of the year
-				                (0-365, Jan 1 = 0) */
-
-    PRTimeParameters tm_params;  /* time parameters used by conversion */
-} PRExplodedTime;
-
-/*
- * PRTimeParamFn --
- *
- *     A function of PRTimeParamFn type returns the time zone and
- *     daylight saving time corrections for some geographic location,
- *     given the current time in GMT.  The input argument gmt should
- *     point to a PRExplodedTime that is in GMT, i.e., whose
- *     tm_params contains all 0's.
- *
- *     For any time zone other than GMT, the computation is intended to
- *     consist of two steps:
- *       - Figure out the time zone correction, tp_gmt_offset.  This number
- *         usually depends on the geographic location only.  But it may
- *         also depend on the current time.  For example, all of China
- *         is one time zone right now.  But this situation may change
- *         in the future.
- *       - Figure out the daylight saving time correction, tp_dst_offset.
- *         This number depends on both the geographic location and the
- *         current time.  Most of the DST rules are expressed in local
- *         current time.  If so, one should apply the time zone correction
- *         to GMT before applying the DST rules.
- */
-
-typedef PRTimeParameters (PR_CALLBACK *PRTimeParamFn)(const PRExplodedTime *gmt);
-
-/**********************************************************************/
-/****************************** FUNCTIONS *****************************/
-/**********************************************************************/
-
-NSPR_API(PRTime)
-PR_ImplodeTime(const PRExplodedTime *exploded);
-
-/*
- * Adjust exploded time to normalize field overflows after manipulation.
- * Note that the following fields of PRExplodedTime should not be
- * manipulated:
- *   - tm_month and tm_year: because the number of days in a month and
- *     number of days in a year are not constant, it is ambiguous to
- *     manipulate the month and year fields, although one may be tempted
- *     to.  For example, what does "a month from January 31st" mean?
- *   - tm_wday and tm_yday: these fields are calculated by NSPR.  Users
- *     should treat them as "read-only".
- */
-
-NSPR_API(void) PR_NormalizeTime(
-    PRExplodedTime *exploded, PRTimeParamFn params);
-
-/**********************************************************************/
-/*********************** TIME PARAMETER FUNCTIONS *********************/
-/**********************************************************************/
-
-/* Time parameters that represent Greenwich Mean Time */
-NSPR_API(PRTimeParameters) PR_GMTParameters(const PRExplodedTime *gmt);
-
-/*
- * This parses a time/date string into a PRTime
- * (microseconds after "1-Jan-1970 00:00:00 GMT").
- * It returns PR_SUCCESS on success, and PR_FAILURE
- * if the time/date string can't be parsed.
- *
- * Many formats are handled, including:
- *
- *   14 Apr 89 03:20:12
- *   14 Apr 89 03:20 GMT
- *   Fri, 17 Mar 89 4:01:33
- *   Fri, 17 Mar 89 4:01 GMT
- *   Mon Jan 16 16:12 PDT 1989
- *   Mon Jan 16 16:12 +0130 1989
- *   6 May 1992 16:41-JST (Wednesday)
- *   22-AUG-1993 10:59:12.82
- *   22-AUG-1993 10:59pm
- *   22-AUG-1993 12:59am
- *   22-AUG-1993 12:59 PM
- *   Friday, August 04, 1995 3:54 PM
- *   06/21/95 04:24:34 PM
- *   20/06/95 21:07
- *   95-06-08 19:32:48 EDT
- *   1995-06-17T23:11:25.342156Z
- *
- * If the input string doesn't contain a description of the timezone,
- * we consult the `default_to_gmt' to decide whether the string should
- * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE).
- * The correct value for this argument depends on what standard specified
- * the time string which you are parsing.
- */
-
-/*
- * This is the only funtion that should be called from outside base, and only
- * from the unit test.
- */
-
-BASE_EXPORT PRStatus PR_ParseTimeString (
-	const char *string,
-	PRBool default_to_gmt,
-	PRTime *result);
-
-#endif  // BASE_PRTIME_H__
diff --git a/base/threading/OWNERS b/base/threading/OWNERS
deleted file mode 100644
index 4198e99..0000000
--- a/base/threading/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-# For thread_resrictions.*
-jam@chromium.org
diff --git a/base/threading/thread_collision_warner.cc b/base/threading/thread_collision_warner.cc
deleted file mode 100644
index 547e11c..0000000
--- a/base/threading/thread_collision_warner.cc
+++ /dev/null
@@ -1,64 +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.
-
-#include "base/threading/thread_collision_warner.h"
-
-#include "base/logging.h"
-#include "base/threading/platform_thread.h"
-
-namespace base {
-
-void DCheckAsserter::warn() {
-  NOTREACHED() << "Thread Collision";
-}
-
-static subtle::Atomic32 CurrentThread() {
-  const PlatformThreadId current_thread_id = PlatformThread::CurrentId();
-  // We need to get the thread id into an atomic data type. This might be a
-  // truncating conversion, but any loss-of-information just increases the
-  // chance of a fault negative, not a false positive.
-  const subtle::Atomic32 atomic_thread_id =
-      static_cast<subtle::Atomic32>(current_thread_id);
-
-  return atomic_thread_id;
-}
-
-void ThreadCollisionWarner::EnterSelf() {
-  // If the active thread is 0 then I'll write the current thread ID
-  // if two or more threads arrive here only one will succeed to
-  // write on valid_thread_id_ the current thread ID.
-  subtle::Atomic32 current_thread_id = CurrentThread();
-
-  int previous_value = subtle::NoBarrier_CompareAndSwap(&valid_thread_id_,
-                                                        0,
-                                                        current_thread_id);
-  if (previous_value != 0 && previous_value != current_thread_id) {
-    // gotcha! a thread is trying to use the same class and that is
-    // not current thread.
-    asserter_->warn();
-  }
-
-  subtle::NoBarrier_AtomicIncrement(&counter_, 1);
-}
-
-void ThreadCollisionWarner::Enter() {
-  subtle::Atomic32 current_thread_id = CurrentThread();
-
-  if (subtle::NoBarrier_CompareAndSwap(&valid_thread_id_,
-                                       0,
-                                       current_thread_id) != 0) {
-    // gotcha! another thread is trying to use the same class.
-    asserter_->warn();
-  }
-
-  subtle::NoBarrier_AtomicIncrement(&counter_, 1);
-}
-
-void ThreadCollisionWarner::Leave() {
-  if (subtle::Barrier_AtomicIncrement(&counter_, -1) == 0) {
-    subtle::NoBarrier_Store(&valid_thread_id_, 0);
-  }
-}
-
-}  // namespace base
diff --git a/base/threading/thread_collision_warner.h b/base/threading/thread_collision_warner.h
deleted file mode 100644
index b6993f6..0000000
--- a/base/threading/thread_collision_warner.h
+++ /dev/null
@@ -1,245 +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_THREADING_THREAD_COLLISION_WARNER_H_
-#define BASE_THREADING_THREAD_COLLISION_WARNER_H_
-
-#include <memory>
-
-#include "base/atomicops.h"
-#include "base/base_export.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-
-// A helper class alongside macros to be used to verify assumptions about thread
-// safety of a class.
-//
-// Example: Queue implementation non thread-safe but still usable if clients
-//          are synchronized somehow.
-//
-//          In this case the macro DFAKE_SCOPED_LOCK has to be
-//          used, it checks that if a thread is inside the push/pop then
-//          noone else is still inside the pop/push
-//
-// class NonThreadSafeQueue {
-//  public:
-//   ...
-//   void push(int) { DFAKE_SCOPED_LOCK(push_pop_); ... }
-//   int pop() { DFAKE_SCOPED_LOCK(push_pop_); ... }
-//   ...
-//  private:
-//   DFAKE_MUTEX(push_pop_);
-// };
-//
-//
-// Example: Queue implementation non thread-safe but still usable if clients
-//          are synchronized somehow, it calls a method to "protect" from
-//          a "protected" method
-//
-//          In this case the macro DFAKE_SCOPED_RECURSIVE_LOCK
-//          has to be used, it checks that if a thread is inside the push/pop
-//          then noone else is still inside the pop/push
-//
-// class NonThreadSafeQueue {
-//  public:
-//   void push(int) {
-//     DFAKE_SCOPED_LOCK(push_pop_);
-//     ...
-//   }
-//   int pop() {
-//     DFAKE_SCOPED_RECURSIVE_LOCK(push_pop_);
-//     bar();
-//     ...
-//   }
-//   void bar() { DFAKE_SCOPED_RECURSIVE_LOCK(push_pop_); ... }
-//   ...
-//  private:
-//   DFAKE_MUTEX(push_pop_);
-// };
-//
-//
-// Example: Queue implementation not usable even if clients are synchronized,
-//          so only one thread in the class life cycle can use the two members
-//          push/pop.
-//
-//          In this case the macro DFAKE_SCOPED_LOCK_THREAD_LOCKED pins the
-//          specified
-//          critical section the first time a thread enters push or pop, from
-//          that time on only that thread is allowed to execute push or pop.
-//
-// class NonThreadSafeQueue {
-//  public:
-//   ...
-//   void push(int) { DFAKE_SCOPED_LOCK_THREAD_LOCKED(push_pop_); ... }
-//   int pop() { DFAKE_SCOPED_LOCK_THREAD_LOCKED(push_pop_); ... }
-//   ...
-//  private:
-//   DFAKE_MUTEX(push_pop_);
-// };
-//
-//
-// Example: Class that has to be contructed/destroyed on same thread, it has
-//          a "shareable" method (with external synchronization) and a not
-//          shareable method (even with external synchronization).
-//
-//          In this case 3 Critical sections have to be defined
-//
-// class ExoticClass {
-//  public:
-//   ExoticClass() { DFAKE_SCOPED_LOCK_THREAD_LOCKED(ctor_dtor_); ... }
-//   ~ExoticClass() { DFAKE_SCOPED_LOCK_THREAD_LOCKED(ctor_dtor_); ... }
-//
-//   void Shareable() { DFAKE_SCOPED_LOCK(shareable_section_); ... }
-//   void NotShareable() { DFAKE_SCOPED_LOCK_THREAD_LOCKED(ctor_dtor_); ... }
-//   ...
-//  private:
-//   DFAKE_MUTEX(ctor_dtor_);
-//   DFAKE_MUTEX(shareable_section_);
-// };
-
-
-#if !defined(NDEBUG)
-
-// Defines a class member that acts like a mutex. It is used only as a
-// verification tool.
-#define DFAKE_MUTEX(obj) \
-     mutable base::ThreadCollisionWarner obj
-// Asserts the call is never called simultaneously in two threads. Used at
-// member function scope.
-#define DFAKE_SCOPED_LOCK(obj) \
-     base::ThreadCollisionWarner::ScopedCheck s_check_##obj(&obj)
-// Asserts the call is never called simultaneously in two threads. Used at
-// member function scope. Same as DFAKE_SCOPED_LOCK but allows recursive locks.
-#define DFAKE_SCOPED_RECURSIVE_LOCK(obj) \
-     base::ThreadCollisionWarner::ScopedRecursiveCheck sr_check_##obj(&obj)
-// Asserts the code is always executed in the same thread.
-#define DFAKE_SCOPED_LOCK_THREAD_LOCKED(obj) \
-     base::ThreadCollisionWarner::Check check_##obj(&obj)
-
-#else
-
-#define DFAKE_MUTEX(obj) typedef void InternalFakeMutexType##obj
-#define DFAKE_SCOPED_LOCK(obj) ((void)0)
-#define DFAKE_SCOPED_RECURSIVE_LOCK(obj) ((void)0)
-#define DFAKE_SCOPED_LOCK_THREAD_LOCKED(obj) ((void)0)
-
-#endif
-
-namespace base {
-
-// The class ThreadCollisionWarner uses an Asserter to notify the collision
-// AsserterBase is the interfaces and DCheckAsserter is the default asserter
-// used. During the unit tests is used another class that doesn't "DCHECK"
-// in case of collision (check thread_collision_warner_unittests.cc)
-struct BASE_EXPORT AsserterBase {
-  virtual ~AsserterBase() = default;
-  virtual void warn() = 0;
-};
-
-struct BASE_EXPORT DCheckAsserter : public AsserterBase {
-  ~DCheckAsserter() override = default;
-  void warn() override;
-};
-
-class BASE_EXPORT ThreadCollisionWarner {
- public:
-  // The parameter asserter is there only for test purpose
-  explicit ThreadCollisionWarner(AsserterBase* asserter = new DCheckAsserter())
-      : valid_thread_id_(0),
-        counter_(0),
-        asserter_(asserter) {}
-
-  ~ThreadCollisionWarner() {
-    delete asserter_;
-  }
-
-  // This class is meant to be used through the macro
-  // DFAKE_SCOPED_LOCK_THREAD_LOCKED
-  // it doesn't leave the critical section, as opposed to ScopedCheck,
-  // because the critical section being pinned is allowed to be used only
-  // from one thread
-  class BASE_EXPORT Check {
-   public:
-    explicit Check(ThreadCollisionWarner* warner)
-        : warner_(warner) {
-      warner_->EnterSelf();
-    }
-
-    ~Check() = default;
-
-   private:
-    ThreadCollisionWarner* warner_;
-
-    DISALLOW_COPY_AND_ASSIGN(Check);
-  };
-
-  // This class is meant to be used through the macro
-  // DFAKE_SCOPED_LOCK
-  class BASE_EXPORT ScopedCheck {
-   public:
-    explicit ScopedCheck(ThreadCollisionWarner* warner)
-        : warner_(warner) {
-      warner_->Enter();
-    }
-
-    ~ScopedCheck() {
-      warner_->Leave();
-    }
-
-   private:
-    ThreadCollisionWarner* warner_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedCheck);
-  };
-
-  // This class is meant to be used through the macro
-  // DFAKE_SCOPED_RECURSIVE_LOCK
-  class BASE_EXPORT ScopedRecursiveCheck {
-   public:
-    explicit ScopedRecursiveCheck(ThreadCollisionWarner* warner)
-        : warner_(warner) {
-      warner_->EnterSelf();
-    }
-
-    ~ScopedRecursiveCheck() {
-      warner_->Leave();
-    }
-
-   private:
-    ThreadCollisionWarner* warner_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedRecursiveCheck);
-  };
-
- private:
-  // This method stores the current thread identifier and does a DCHECK
-  // if a another thread has already done it, it is safe if same thread
-  // calls this multiple time (recursion allowed).
-  void EnterSelf();
-
-  // Same as EnterSelf but recursion is not allowed.
-  void Enter();
-
-  // Removes the thread_id stored in order to allow other threads to
-  // call EnterSelf or Enter.
-  void Leave();
-
-  // This stores the thread id that is inside the critical section, if the
-  // value is 0 then no thread is inside.
-  volatile subtle::Atomic32 valid_thread_id_;
-
-  // Counter to trace how many time a critical section was "pinned"
-  // (when allowed) in order to unpin it when counter_ reaches 0.
-  volatile subtle::Atomic32 counter_;
-
-  // Here only for class unit tests purpose, during the test I need to not
-  // DCHECK but notify the collision with something else.
-  AsserterBase* asserter_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadCollisionWarner);
-};
-
-}  // namespace base
-
-#endif  // BASE_THREADING_THREAD_COLLISION_WARNER_H_
diff --git a/base/time/OWNERS b/base/time/OWNERS
deleted file mode 100644
index ff0520a..0000000
--- a/base/time/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-miu@chromium.org
-
-# COMPONENT: Internals>Core
diff --git a/base/time/default_tick_clock.cc b/base/time/default_tick_clock.cc
deleted file mode 100644
index 188c3cf..0000000
--- a/base/time/default_tick_clock.cc
+++ /dev/null
@@ -1,23 +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/time/default_tick_clock.h"
-
-#include "base/no_destructor.h"
-
-namespace base {
-
-DefaultTickClock::~DefaultTickClock() = default;
-
-TimeTicks DefaultTickClock::NowTicks() const {
-  return TimeTicks::Now();
-}
-
-// static
-const DefaultTickClock* DefaultTickClock::GetInstance() {
-  static const base::NoDestructor<DefaultTickClock> default_tick_clock;
-  return default_tick_clock.get();
-}
-
-}  // namespace base
diff --git a/base/time/default_tick_clock.h b/base/time/default_tick_clock.h
deleted file mode 100644
index 78f8a99..0000000
--- a/base/time/default_tick_clock.h
+++ /dev/null
@@ -1,27 +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_TIME_DEFAULT_TICK_CLOCK_H_
-#define BASE_TIME_DEFAULT_TICK_CLOCK_H_
-
-#include "base/base_export.h"
-#include "base/time/tick_clock.h"
-
-namespace base {
-
-// DefaultClock is a Clock implementation that uses TimeTicks::Now().
-class BASE_EXPORT DefaultTickClock : public TickClock {
- public:
-  ~DefaultTickClock() override;
-
-  // Simply returns TimeTicks::Now().
-  TimeTicks NowTicks() const override;
-
-  // Returns a shared instance of DefaultTickClock. This is thread-safe.
-  static const DefaultTickClock* GetInstance();
-};
-
-}  // namespace base
-
-#endif  // BASE_TIME_DEFAULT_TICK_CLOCK_H_
diff --git a/base/time/tick_clock.cc b/base/time/tick_clock.cc
deleted file mode 100644
index 79e396d..0000000
--- a/base/time/tick_clock.cc
+++ /dev/null
@@ -1,11 +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/time/tick_clock.h"
-
-namespace base {
-
-TickClock::~TickClock() = default;
-
-}  // namespace base
diff --git a/base/time/tick_clock.h b/base/time/tick_clock.h
deleted file mode 100644
index dc57354..0000000
--- a/base/time/tick_clock.h
+++ /dev/null
@@ -1,40 +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_TIME_TICK_CLOCK_H_
-#define BASE_TIME_TICK_CLOCK_H_
-
-#include "base/base_export.h"
-#include "base/time/time.h"
-
-namespace base {
-
-// A TickClock is an interface for objects that vend TimeTicks.  It is
-// intended to be able to test the behavior of classes with respect to
-// non-decreasing time.
-//
-// See DefaultTickClock (base/time/default_tick_clock.h) for the default
-// implementation that simply uses TimeTicks::Now().
-//
-// (Other implementations that use TimeTicks::NowFromSystemTime() should
-// be added as needed.)
-//
-// See SimpleTestTickClock (base/test/simple_test_tick_clock.h) for a
-// simple test implementation.
-//
-// See Clock (base/time/clock.h) for the equivalent interface for Times.
-class BASE_EXPORT TickClock {
- public:
-  virtual ~TickClock();
-
-  // NowTicks() must be safe to call from any thread.  The caller may
-  // assume that NowTicks() is monotonic (but not strictly monotonic).
-  // In other words, the returned TimeTicks will never decrease with
-  // time, although they might "stand still".
-  virtual TimeTicks NowTicks() const = 0;
-};
-
-}  // namespace base
-
-#endif  // BASE_TIME_TICK_CLOCK_H_
diff --git a/base/time/time.cc b/base/time/time.cc
index 577895c..bd746b3 100644
--- a/base/time/time.cc
+++ b/base/time/time.cc
@@ -14,7 +14,6 @@
 #include "base/macros.h"
 #include "base/no_destructor.h"
 #include "base/strings/stringprintf.h"
-#include "base/third_party/nspr/prtime.h"
 #include "base/time/time_override.h"
 #include "build_config.h"
 
@@ -291,27 +290,6 @@
 }
 
 // static
-bool Time::FromStringInternal(const char* time_string,
-                              bool is_local,
-                              Time* parsed_time) {
-  DCHECK((time_string != nullptr) && (parsed_time != nullptr));
-
-  if (time_string[0] == '\0')
-    return false;
-
-  PRTime result_time = 0;
-  PRStatus result = PR_ParseTimeString(time_string,
-                                       is_local ? PR_FALSE : PR_TRUE,
-                                       &result_time);
-  if (PR_SUCCESS != result)
-    return false;
-
-  result_time += kTimeTToMicrosecondsOffset;
-  *parsed_time = Time(result_time);
-  return true;
-}
-
-// static
 bool Time::ExplodedMostlyEquals(const Exploded& lhs, const Exploded& rhs) {
   return lhs.year == rhs.year && lhs.month == rhs.month &&
          lhs.day_of_month == rhs.day_of_month && lhs.hour == rhs.hour &&
diff --git a/base/time/time.h b/base/time/time.h
index 936c746..eef95f3 100644
--- a/base/time/time.h
+++ b/base/time/time.h
@@ -619,23 +619,6 @@
     return FromExploded(true, exploded, time);
   }
 
-  // Converts a string representation of time to a Time object.
-  // An example of a time string which is converted is as below:-
-  // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified
-  // in the input string, FromString assumes local time and FromUTCString
-  // assumes UTC. A timezone that cannot be parsed (e.g. "UTC" which is not
-  // specified in RFC822) is treated as if the timezone is not specified.
-  // TODO(iyengar) Move the FromString/FromTimeT/ToTimeT/FromFileTime to
-  // a new time converter class.
-  static bool FromString(const char* time_string,
-                         Time* parsed_time) WARN_UNUSED_RESULT {
-    return FromStringInternal(time_string, true, parsed_time);
-  }
-  static bool FromUTCString(const char* time_string,
-                            Time* parsed_time) WARN_UNUSED_RESULT {
-    return FromStringInternal(time_string, false, parsed_time);
-  }
-
   // Fills the given exploded structure with either the local time or UTC from
   // this time structure (containing UTC).
   void UTCExplode(Exploded* exploded) const {
@@ -675,17 +658,6 @@
                            const Exploded& exploded,
                            Time* time) WARN_UNUSED_RESULT;
 
-  // Converts a string representation of time to a Time object.
-  // An example of a time string which is converted is as below:-
-  // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified
-  // in the input string, local time |is_local = true| or
-  // UTC |is_local = false| is assumed. A timezone that cannot be parsed
-  // (e.g. "UTC" which is not specified in RFC822) is treated as if the
-  // timezone is not specified.
-  static bool FromStringInternal(const char* time_string,
-                                 bool is_local,
-                                 Time* parsed_time) WARN_UNUSED_RESULT;
-
   // Comparison does not consider |day_of_week| when doing the operation.
   static bool ExplodedMostlyEquals(const Exploded& lhs,
                                    const Exploded& rhs) WARN_UNUSED_RESULT;
@@ -866,12 +838,6 @@
     return TimeTicks(us);
   }
 
-#if defined(OS_WIN)
- protected:
-  typedef DWORD (*TickFunctionType)(void);
-  static TickFunctionType SetMockTickFunction(TickFunctionType ticker);
-#endif
-
  private:
   friend class time_internal::TimeBase<TimeTicks>;
 
@@ -896,10 +862,8 @@
   static bool IsSupported() WARN_UNUSED_RESULT {
 #if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
     (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID) ||  \
-    defined(OS_FUCHSIA)
+    defined(OS_FUCHSIA) || defined(OS_WIN)
     return true;
-#elif defined(OS_WIN)
-    return IsSupportedWin();
 #else
     return false;
 #endif
@@ -956,7 +920,6 @@
   // allow testing.
   static double TSCTicksPerSecond();
 
-  static bool IsSupportedWin() WARN_UNUSED_RESULT;
   static void WaitUntilInitializedWin();
 #endif
 };
diff --git a/base/time/time_to_iso8601.cc b/base/time/time_to_iso8601.cc
deleted file mode 100644
index 27e7bfc..0000000
--- a/base/time/time_to_iso8601.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2018 The Chromium 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/time/time_to_iso8601.h"
-
-#include "base/strings/stringprintf.h"
-#include "base/time/time.h"
-
-namespace base {
-
-std::string TimeToISO8601(const Time& t) {
-  Time::Exploded exploded;
-  t.UTCExplode(&exploded);
-  return StringPrintf("%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", exploded.year,
-                      exploded.month, exploded.day_of_month, exploded.hour,
-                      exploded.minute, exploded.second, exploded.millisecond);
-}
-
-}  // namespace base
diff --git a/base/time/time_to_iso8601.h b/base/time/time_to_iso8601.h
deleted file mode 100644
index 2643484..0000000
--- a/base/time/time_to_iso8601.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2018 The Chromium Authors. 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_TIME_TIME_TO_ISO8601_H_
-#define BASE_TIME_TIME_TO_ISO8601_H_
-
-#include <string>
-
-#include "base/base_export.h"
-
-namespace base {
-
-class Time;
-
-BASE_EXPORT std::string TimeToISO8601(const base::Time& t);
-
-}  // namespace base
-
-#endif  // BASE_TIME_TIME_TO_ISO8601_H_
diff --git a/base/time/time_win.cc b/base/time/time_win.cc
index 9c6eba0..6767fd6 100644
--- a/base/time/time_win.cc
+++ b/base/time/time_win.cc
@@ -39,7 +39,6 @@
 
 #include "base/atomicops.h"
 #include "base/bit_cast.h"
-#include "base/cpu.h"
 #include "base/logging.h"
 #include "base/synchronization/lock.h"
 #include "base/threading/platform_thread.h"
@@ -361,81 +360,6 @@
 
 namespace {
 
-// We define a wrapper to adapt between the __stdcall and __cdecl call of the
-// mock function, and to avoid a static constructor.  Assigning an import to a
-// function pointer directly would require setup code to fetch from the IAT.
-DWORD timeGetTimeWrapper() {
-  return timeGetTime();
-}
-
-DWORD (*g_tick_function)(void) = &timeGetTimeWrapper;
-
-// A structure holding the most significant bits of "last seen" and a
-// "rollover" counter.
-union LastTimeAndRolloversState {
-  // The state as a single 32-bit opaque value.
-  subtle::Atomic32 as_opaque_32;
-
-  // The state as usable values.
-  struct {
-    // The top 8-bits of the "last" time. This is enough to check for rollovers
-    // and the small bit-size means fewer CompareAndSwap operations to store
-    // changes in state, which in turn makes for fewer retries.
-    uint8_t last_8;
-    // A count of the number of detected rollovers. Using this as bits 47-32
-    // of the upper half of a 64-bit value results in a 48-bit tick counter.
-    // This extends the total rollover period from about 49 days to about 8800
-    // years while still allowing it to be stored with last_8 in a single
-    // 32-bit value.
-    uint16_t rollovers;
-  } as_values;
-};
-subtle::Atomic32 g_last_time_and_rollovers = 0;
-static_assert(
-    sizeof(LastTimeAndRolloversState) <= sizeof(g_last_time_and_rollovers),
-    "LastTimeAndRolloversState does not fit in a single atomic word");
-
-// We use timeGetTime() to implement TimeTicks::Now().  This can be problematic
-// because it returns the number of milliseconds since Windows has started,
-// which will roll over the 32-bit value every ~49 days.  We try to track
-// rollover ourselves, which works if TimeTicks::Now() is called at least every
-// 48.8 days (not 49 days because only changes in the top 8 bits get noticed).
-TimeTicks RolloverProtectedNow() {
-  LastTimeAndRolloversState state;
-  DWORD now;  // DWORD is always unsigned 32 bits.
-
-  while (true) {
-    // Fetch the "now" and "last" tick values, updating "last" with "now" and
-    // incrementing the "rollovers" counter if the tick-value has wrapped back
-    // around. Atomic operations ensure that both "last" and "rollovers" are
-    // always updated together.
-    int32_t original = subtle::Acquire_Load(&g_last_time_and_rollovers);
-    state.as_opaque_32 = original;
-    now = g_tick_function();
-    uint8_t now_8 = static_cast<uint8_t>(now >> 24);
-    if (now_8 < state.as_values.last_8)
-      ++state.as_values.rollovers;
-    state.as_values.last_8 = now_8;
-
-    // If the state hasn't changed, exit the loop.
-    if (state.as_opaque_32 == original)
-      break;
-
-    // Save the changed state. If the existing value is unchanged from the
-    // original, exit the loop.
-    int32_t check = subtle::Release_CompareAndSwap(
-        &g_last_time_and_rollovers, original, state.as_opaque_32);
-    if (check == original)
-      break;
-
-    // Another thread has done something in between so retry from the top.
-  }
-
-  return TimeTicks() +
-         TimeDelta::FromMilliseconds(
-             now + (static_cast<uint64_t>(state.as_values.rollovers) << 32));
-}
-
 // Discussion of tick counter options on Windows:
 //
 // (1) CPU cycle counter. (Retrieved via RDTSC)
@@ -511,35 +435,12 @@
   return TimeTicks() + QPCValueToTimeDelta(QPCNowRaw());
 }
 
-bool IsBuggyAthlon(const CPU& cpu) {
-  // On Athlon X2 CPUs (e.g. model 15) QueryPerformanceCounter is unreliable.
-  return cpu.vendor_name() == "AuthenticAMD" && cpu.family() == 15;
-}
-
 void InitializeNowFunctionPointer() {
   LARGE_INTEGER ticks_per_sec = {};
   if (!QueryPerformanceFrequency(&ticks_per_sec))
     ticks_per_sec.QuadPart = 0;
 
-  // If Windows cannot provide a QPC implementation, TimeTicks::Now() must use
-  // the low-resolution clock.
-  //
-  // If the QPC implementation is expensive and/or unreliable, TimeTicks::Now()
-  // will still use the low-resolution clock. A CPU lacking a non-stop time
-  // counter will cause Windows to provide an alternate QPC implementation that
-  // works, but is expensive to use. Certain Athlon CPUs are known to make the
-  // QPC implementation unreliable.
-  //
-  // Otherwise, Now uses the high-resolution QPC clock. As of 21 August 2015,
-  // ~72% of users fall within this category.
-  TimeTicksNowFunction now_function;
-  CPU cpu;
-  if (ticks_per_sec.QuadPart <= 0 ||
-      !cpu.has_non_stop_time_stamp_counter() || IsBuggyAthlon(cpu)) {
-    now_function = &RolloverProtectedNow;
-  } else {
-    now_function = &QPCNow;
-  }
+  TimeTicksNowFunction now_function = &QPCNow;
 
   // Threading note 1: In an unlikely race condition, it's possible for two or
   // more threads to enter InitializeNowFunctionPointer() in parallel. This is
@@ -569,15 +470,6 @@
 
 }  // namespace
 
-// static
-TimeTicks::TickFunctionType TimeTicks::SetMockTickFunction(
-    TickFunctionType ticker) {
-  TickFunctionType old = g_tick_function;
-  g_tick_function = ticker;
-  subtle::NoBarrier_Store(&g_last_time_and_rollovers, 0);
-  return old;
-}
-
 namespace subtle {
 TimeTicks TimeTicksNowIgnoringOverride() {
   return g_time_ticks_now_ignoring_override_function();
@@ -646,13 +538,6 @@
 }
 
 // static
-bool ThreadTicks::IsSupportedWin() {
-  static bool is_supported =
-      CPU().has_non_stop_time_stamp_counter() && !IsBuggyAthlon(CPU());
-  return is_supported;
-}
-
-// static
 void ThreadTicks::WaitUntilInitializedWin() {
   while (TSCTicksPerSecond() == 0)
     ::Sleep(10);
diff --git a/base/timer/mock_timer.cc b/base/timer/mock_timer.cc
deleted file mode 100644
index ca0893b..0000000
--- a/base/timer/mock_timer.cc
+++ /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.
-
-#include "base/timer/mock_timer.h"
-
-namespace base {
-
-MockTimer::MockTimer(bool retain_user_task, bool is_repeating)
-    : Timer(retain_user_task, is_repeating),
-      is_running_(false) {
-}
-
-MockTimer::MockTimer(const Location& posted_from,
-                     TimeDelta delay,
-                     const base::Closure& user_task,
-                     bool is_repeating)
-    : Timer(true, is_repeating), delay_(delay), is_running_(false) {}
-
-MockTimer::~MockTimer() = default;
-
-bool MockTimer::IsRunning() const {
-  return is_running_;
-}
-
-base::TimeDelta MockTimer::GetCurrentDelay() const {
-  return delay_;
-}
-
-void MockTimer::Start(const Location& posted_from,
-                      TimeDelta delay,
-                      const base::Closure& user_task) {
-  delay_ = delay;
-  user_task_ = user_task;
-  Reset();
-}
-
-void MockTimer::Stop() {
-  is_running_ = false;
-  if (!retain_user_task())
-    user_task_.Reset();
-}
-
-void MockTimer::Reset() {
-  DCHECK(!user_task_.is_null());
-  is_running_ = true;
-}
-
-void MockTimer::Fire() {
-  DCHECK(is_running_);
-  base::Closure old_task = user_task_;
-  if (is_repeating())
-    Reset();
-  else
-    Stop();
-  old_task.Run();
-}
-
-}  // namespace base
diff --git a/base/timer/mock_timer.h b/base/timer/mock_timer.h
deleted file mode 100644
index 49394b2..0000000
--- a/base/timer/mock_timer.h
+++ /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.
-
-#ifndef BASE_TIMER_MOCK_TIMER_H_
-#define BASE_TIMER_MOCK_TIMER_H_
-
-#include "base/timer/timer.h"
-
-namespace base {
-
-class BASE_EXPORT MockTimer : public Timer {
- public:
-  MockTimer(bool retain_user_task, bool is_repeating);
-  MockTimer(const Location& posted_from,
-            TimeDelta delay,
-            const base::Closure& user_task,
-            bool is_repeating);
-  ~MockTimer() override;
-
-  // base::Timer implementation.
-  bool IsRunning() const override;
-  base::TimeDelta GetCurrentDelay() const override;
-  void Start(const Location& posted_from,
-             base::TimeDelta delay,
-             const base::Closure& user_task) override;
-  void Stop() override;
-  void Reset() override;
-
-  // Testing methods.
-  void Fire();
-
- private:
-  base::Closure user_task_;
-  TimeDelta delay_;
-  bool is_running_;
-};
-
-}  // namespace base
-
-#endif  // BASE_TIMER_MOCK_TIMER_H_
diff --git a/base/win/OWNERS b/base/win/OWNERS
deleted file mode 100644
index 4593b2c..0000000
--- a/base/win/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-brucedawson@chromium.org
-grt@chromium.org
-jschuh@chromium.org
-robliao@chromium.org
-scottmg@chromium.org
-
-# COMPONENT: Internals>PlatformIntegration
diff --git a/build/gen.py b/build/gen.py
index d72f39b..ed92d2f 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -236,7 +236,6 @@
         'base/files/file_util.cc',
         'base/files/scoped_file.cc',
         'base/files/scoped_temp_dir.cc',
-        'base/hash.cc',
         'base/json/json_parser.cc',
         'base/json/json_reader.cc',
         'base/json/json_string_value_serializer.cc',
@@ -250,9 +249,7 @@
         'base/process/memory.cc',
         'base/process/process_handle.cc',
         'base/process/process_iterator.cc',
-        'base/rand_util.cc',
         'base/sha1.cc',
-        'base/strings/pattern.cc',
         'base/strings/string_number_conversions.cc',
         'base/strings/string_piece.cc',
         'base/strings/string_split.cc',
@@ -261,13 +258,8 @@
         'base/strings/stringprintf.cc',
         'base/strings/utf_string_conversion_utils.cc',
         'base/strings/utf_string_conversions.cc',
-        'base/synchronization/atomic_flag.cc',
         'base/third_party/icu/icu_utf.cc',
-        'base/third_party/nspr/prtime.cc',
-        'base/threading/thread_collision_warner.cc',
         'base/time/clock.cc',
-        'base/time/default_tick_clock.cc',
-        'base/time/tick_clock.cc',
         'base/time/time.cc',
         'base/timer/elapsed_timer.cc',
         'base/value_iterators.cc',
@@ -360,7 +352,6 @@
         'tools/gn/output_file.cc',
         'tools/gn/parse_node_value_adapter.cc',
         'tools/gn/parser.cc',
-        'tools/gn/parser_fuzzer.cc',
         'tools/gn/parse_tree.cc',
         'tools/gn/path_output.cc',
         'tools/gn/pattern.cc',
@@ -484,7 +475,6 @@
         'base/process/kill_posix.cc',
         'base/process/process_handle_posix.cc',
         'base/process/process_posix.cc',
-        'base/rand_util_posix.cc',
         'base/strings/string16.cc',
         'base/synchronization/condition_variable_posix.cc',
         'base/synchronization/lock_impl_posix.cc',
@@ -499,7 +489,6 @@
         'base/process/process_handle_linux.cc',
         'base/process/process_info_linux.cc',
         'base/process/process_iterator_linux.cc',
-        'base/process/process_linux.cc',
         'base/strings/sys_string_conversions_posix.cc',
         'base/synchronization/waitable_event_posix.cc',
         'base/time/time_exploded_posix.cc',
@@ -519,13 +508,10 @@
     static_libraries['base']['sources'].extend([
         'base/files/file_util_mac.mm',
         'base/mac/bundle_locations.mm',
-        'base/mac/call_with_eh_frame.cc',
-        'base/mac/call_with_eh_frame_asm.S',
         'base/mac/dispatch_source_mach.cc',
         'base/mac/foundation_util.mm',
         'base/mac/mach_logging.cc',
         'base/mac/scoped_mach_port.cc',
-        'base/mac/scoped_mach_vm.cc',
         'base/mac/scoped_nsautorelease_pool.mm',
         'base/process/process_handle_mac.cc',
         'base/process/process_info_mac.cc',
@@ -546,7 +532,6 @@
 
   if is_win:
     static_libraries['base']['sources'].extend([
-        'base/cpu.cc',
         'base/files/file_enumerator_win.cc',
         'base/files/file_util_win.cc',
         'base/files/file_win.cc',
@@ -556,7 +541,6 @@
         'base/process/process_info_win.cc',
         'base/process/process_iterator_win.cc',
         'base/process/process_win.cc',
-        'base/rand_util_win.cc',
         'base/strings/sys_string_conversions_win.cc',
         'base/synchronization/condition_variable_win.cc',
         'base/synchronization/lock_impl_win.cc',
diff --git a/tools/gn/OWNERS b/tools/gn/OWNERS
deleted file mode 100644
index 82224cd..0000000
--- a/tools/gn/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-brettw@chromium.org
-dpranke@chromium.org
-sdefresne@chromium.org
diff --git a/tools/gn/README.md b/tools/gn/README.md
deleted file mode 100644
index fd0d9c5..0000000
--- a/tools/gn/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# What is GN?
-
-GN is a meta-build system that generates [Ninja](https://ninja-build.org)
-build files so that you can build Chromium with Ninja.
-
-## I want more info on GN!
-
-Read these links:
-
-  * [Quick start](docs/quick_start.md)
-  * [FAQ](docs/faq.md)
-  * [Language and operation details](docs/language.md)
-  * [Reference](docs/reference.md): The built-in `gn help` documentation.
-  * [Style guide](docs/style_guide.md)
-  * [Cross compiling and toolchains](docs/cross_compiles.md)
-  * [Hacking on GN itself](docs/hacking.md)
-  * [Standaline GN projects](docs/standalone.md)
-  * [Pushing new binaries](docs/update_binaries.md)
diff --git a/tools/gn/bin/compare_test_lists.py b/tools/gn/bin/compare_test_lists.py
deleted file mode 100644
index 37fb1bf..0000000
--- a/tools/gn/bin/compare_test_lists.py
+++ /dev/null
@@ -1,101 +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 script compares the gtest test list for two different builds.
-#
-# Usage:
-#   compare_test_lists.py <build_dir_1> <build_dir_2> <binary_name>
-#
-# For example, from the "src" directory:
-#   python tools/gn/bin/compare_test_lists.py out/Debug out/gnbuild ipc_tests
-#
-# This will compile the given binary in both output directories, then extracts
-# the test lists and prints missing or extra tests between the first and the
-# second build.
-
-import os
-import subprocess
-import sys
-
-def BuildBinary(build_dir, binary_name):
-  """Builds the given binary in the given directory with Ninja.
-
-  Returns True on success."""
-  return subprocess.call(["ninja", "-C", build_dir, binary_name]) == 0
-
-
-def GetTestList(path_to_binary):
-  """Returns a set of full test names.
-
-  Each test will be of the form "Case.Test". There will be a separate line
-  for each combination of Case/Test (there are often multiple tests in each
-  case).
-
-  Throws an exception on failure."""
-  raw_output = subprocess.check_output([path_to_binary, "--gtest_list_tests"])
-  input_lines = raw_output.split('\n')
-
-  # The format of the gtest_list_tests output is:
-  # "Case1."
-  # "  Test1  # <Optional extra stuff>"
-  # "  Test2"
-  # "Case2."
-  # "  Test1"
-  case_name = ''  # Includes trailing dot.
-  test_set = set()
-  for line in input_lines:
-    if len(line) > 1:
-      if line[0] == ' ':
-        # Indented means a test in previous case.
-        test_set.add(case_name + line[:line.find('#')].strip())
-      else:
-        # New test case.
-        case_name = line.strip()
-
-  return test_set
-
-
-def PrintSetDiff(a_name, a, b_name, b, binary_name):
-  """Prints the test list difference between the given sets a and b.
-
-  a_name and b_name will be used to refer to the directories of the two sets,
-  and the binary name will be shown as the source of the output."""
-
-  a_not_b = list(a - b)
-  if len(a_not_b):
-    print "\n", binary_name, "tests in", a_name, "but not", b_name
-    a_not_b.sort()
-    for cur in a_not_b:
-      print "  ", cur
-
-  b_not_a = list(b - a)
-  if len(b_not_a):
-    print "\n", binary_name, "tests in", b_name, "but not", a_name
-    b_not_a.sort()
-    for cur in b_not_a:
-      print "  ", cur
-
-  if len(a_not_b) == 0 and len(b_not_a) == 0:
-    print "\nTests match!"
-
-
-def Run(a_dir, b_dir, binary_name):
-  if not BuildBinary(a_dir, binary_name):
-    print "Building", binary_name, "in", a_dir, "failed"
-    return 1
-  if not BuildBinary(b_dir, binary_name):
-    print "Building", binary_name, "in", b_dir, "failed"
-    return 1
-
-  a_tests = GetTestList(os.path.join(a_dir, binary_name))
-  b_tests = GetTestList(os.path.join(b_dir, binary_name))
-
-  PrintSetDiff(a_dir, a_tests, b_dir, b_tests, binary_name)
-
-
-if len(sys.argv) != 4:
-  print "Usage: compare_test_lists.py <build_dir_1> <build_dir_2> " \
-      "<test_binary_name>"
-  sys.exit(1)
-sys.exit(Run(sys.argv[1], sys.argv[2], sys.argv[3]))
diff --git a/tools/gn/bin/roll_gn.py b/tools/gn/bin/roll_gn.py
deleted file mode 100755
index cf4c878..0000000
--- a/tools/gn/bin/roll_gn.py
+++ /dev/null
@@ -1,461 +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.
-
-"""An auto-roller for GN binaries into Chromium.
-
-This script is used to update the GN binaries that a Chromium
-checkout uses. In order to update the binaries, one must follow
-four steps in order:
-
-1. Trigger try jobs to build a new GN binary at tip-of-tree and upload
-   the newly-built binaries into the right Google CloudStorage bucket.
-2. Wait for the try jobs to complete.
-3. Update the buildtools repo with the .sha1 hashes of the newly built
-   binaries.
-4. Update Chromium's DEPS file to the new version of the buildtools repo.
-
-The script has four commands that correspond to the four steps above:
-'build', 'wait', 'roll_buildtools', and 'roll_deps'.
-
-The script has a fifth command, 'roll', that runs the four in order.
-
-If given no arguments, the script will run the 'roll' command.
-
-It can only be run on linux in a clean Chromium checkout; it should
-error out in most cases if something bad happens, but the error checking
-isn't yet foolproof.
-
-"""
-
-from __future__ import print_function
-
-import argparse
-import json
-import os
-import re
-import subprocess
-import sys
-import tempfile
-import time
-import urllib2
-
-
-depot_tools_path = os.path.abspath(os.path.normpath(os.path.join(
-    os.path.dirname(__file__), '..', '..', '..', 'third_party', 'depot_tools')))
-if not depot_tools_path in sys.path:
-  sys.path.insert(0, depot_tools_path)
-
-
-CHROMIUM_REPO = 'https://chromium.googlesource.com/chromium/src.git'
-
-COMMITISH_DIGITS = 10
-
-UNKNOWN, PENDING, STARTED, SUCCESS = (
-  'unknown', 'pending', 'started', 'success')
-
-class BuildResult(object):
-  def __init__(self):
-    self.masterName = '-'
-    self.builderName = '-'
-    self.buildNumber = '-'
-    self.state = UNKNOWN
-    self.sha1 = '-'
-    self.url = '-'
-
-
-class GNRoller(object):
-  def __init__(self):
-    self.chromium_src_dir = None
-    self.buildtools_dir = None
-    self.old_gn_commitish = None
-    self.new_gn_commitish = None
-    self.old_gn_version   = None
-    self.new_gn_version = None
-    self.reviewer = 'dpranke@chromium.org'
-    if os.getenv('USER') == 'dpranke':
-      self.reviewer = 'brettw@chromium.org'
-
-  def Roll(self):
-    parser = argparse.ArgumentParser()
-    parser.usage = __doc__
-    parser.add_argument('command', nargs='?', default='roll',
-                        help='build|roll|roll_buildtools|roll_deps|wait'
-                             ' (%(default)s is the default)')
-
-    args = parser.parse_args()
-    command = args.command
-    ret = self.SetUp()
-    if not ret and command in ('roll', 'build'):
-      ret = self.TriggerBuild()
-    if not ret and command in ('roll', 'wait'):
-      ret = self.WaitForBuildToFinish()
-    if not ret and command in ('roll', 'roll_buildtools'):
-      ret = self.RollBuildtools()
-    if not ret and command in ('roll', 'roll_deps'):
-      ret = self.RollDEPS()
-
-    return ret
-
-  def SetUp(self):
-    if sys.platform not in ('darwin', 'linux2'):
-      print('roll_gn is only tested and working on Linux and Mac for now.')
-      return 1
-
-    ret, out, _ = self.Call('git config --get remote.origin.url')
-    origin = out.strip()
-    if ret or origin != CHROMIUM_REPO:
-      print('Not in a Chromium repo? git config --get remote.origin.url '
-            'returned %d: %s' % (ret, origin))
-      return 1
-
-    ret, _, _ = self.Call('git diff -q')
-    if ret:
-      print("Checkout is dirty, exiting")
-      return 1
-
-    _, out, _ = self.Call('git rev-parse --show-toplevel', cwd=os.getcwd())
-    self.chromium_src_dir = out.strip()
-    self.buildtools_dir = os.path.join(self.chromium_src_dir, 'buildtools')
-
-    self.new_gn_commitish, self.new_gn_version = self.GetNewVersions()
-
-    _, out, _ = self.Call('gn --version')
-    self.old_gn_version = out.strip()
-
-    _, out, _ = self.Call('git crrev-parse %s' % self.old_gn_version)
-    self.old_gn_commitish = out.strip()
-    return 0
-
-  def GetNewVersions(self):
-    _, out, _ = self.Call('git log -1 --grep Cr-Commit-Position')
-    commit_msg = out.splitlines()
-    first_line = commit_msg[0]
-    new_gn_commitish = first_line.split()[1]
-
-    last_line = commit_msg[-1]
-    new_gn_version = re.sub('.*master@{#(\d+)}', '\\1', last_line)
-
-    return new_gn_commitish, new_gn_version
-
-  def TriggerBuild(self):
-    ret, _, _ = self.Call('git new-branch build_gn_%s' % self.new_gn_version)
-    if ret:
-      print('Failed to create a new branch for build_gn_%s' %
-            self.new_gn_version)
-      return 1
-
-    self.MakeDummyDepsChange()
-
-    ret, out, err = self.Call('git commit -a -m "Build gn at %s"' %
-                         self.new_gn_version)
-    if ret:
-      print('git commit failed: %s' % out + err)
-      return 1
-
-    print('Uploading CL to build GN at {#%s} - %s' %
-          (self.new_gn_version, self.new_gn_commitish))
-    ret, out, err = self.Call('git cl upload -f')
-    if ret:
-      print('git-cl upload failed: %s' % out + err)
-      return 1
-
-    print('Starting try jobs')
-    self.Call('git-cl try -m tryserver.chromium.linux '
-              '-b linux_chromium_gn_upload -r %s' % self.new_gn_commitish)
-    self.Call('git-cl try -m tryserver.chromium.mac '
-              '-b mac_chromium_gn_upload -r %s' % self.new_gn_commitish)
-    self.Call('git-cl try -m tryserver.chromium.win '
-              '-b win_chromium_gn_upload -r %s' % self.new_gn_commitish)
-
-    return 0
-
-  def MakeDummyDepsChange(self):
-    with open('DEPS') as fp:
-      deps_content = fp.read()
-      new_deps = deps_content.replace("'buildtools_revision':",
-                                      "'buildtools_revision':  ")
-
-    with open('DEPS', 'w') as fp:
-      fp.write(new_deps)
-
-  def WaitForBuildToFinish(self):
-    ret = self.CheckoutBuildBranch()
-    if ret:
-      return ret
-
-    print('Checking build')
-    results = self.CheckBuild()
-    while (any(r.state in (PENDING, STARTED) for r in results.values())):
-      print()
-      print('Sleeping for 30 seconds')
-      time.sleep(30)
-      print('Checking build')
-      results = self.CheckBuild()
-
-    ret = 0 if all(r.state == SUCCESS for r in results.values()) else 1
-    if ret:
-      print('Build failed.')
-    else:
-      print('Builds ready.')
-
-    # Close the build CL and move off of the build branch back to whatever
-    # we were on before.
-    self.Call('git-cl set-close')
-    self.MoveToLastHead()
-
-    return ret
-
-  def CheckoutBuildBranch(self):
-    ret, out, err = self.Call('git checkout build_gn_%s' % self.new_gn_version)
-    if ret:
-      print('Failed to check out build_gn_%s' % self.new_gn_version)
-      if out:
-        print(out)
-      if err:
-        print(err, file=sys.stderr)
-    return ret
-
-  def CheckBuild(self):
-    _, out, _ = self.Call('git-cl try-results')
-
-    builders = {
-        'linux_chromium_gn_upload': 'linux64',
-        'mac_chromium_gn_upload': 'mac',
-        'win_chromium_gn_upload': 'win'
-    }
-
-    results = {}
-    for platform in ('linux64', 'mac', 'win'):
-      results[platform] = BuildResult()
-
-    state = PENDING
-    for line in out.splitlines():
-      fields = line.strip().split()
-      if fields[0] == 'Started:':
-        state = STARTED
-      if fields[0] == 'Successes:':
-        state = SUCCESS
-      elif fields[0] == 'Total':
-        pass
-      elif fields[0] in builders:
-        builder = fields[0]
-        platform = builders[builder]
-        result = results[platform]
-        result.masterName = ('tryserver.chromium.%s' %
-                                platform.replace('linux64', 'linux'))
-        result.builderName = builder
-        result.url = fields[1]
-        if result.url.startswith('id'):
-          result.state = PENDING
-        else:
-          result.state = state
-          result.buildNumber = int(result.url[result.url.rfind('/')+1:])
-
-    for result in results.values():
-      if result.state == SUCCESS:
-        url = 'https://luci-milo.appspot.com/prpc/milo.BuildInfo/Get'
-        data = json.dumps({"buildbot": {
-            'masterName': result.masterName,
-            'builderName': result.builderName,
-            'buildNumber': result.buildNumber,
-            }})
-        headers = {
-            'content-type': 'application/json',
-            'accept': 'application/json',
-        }
-
-        req = urllib2.Request(url, data, headers)
-        resp = urllib2.urlopen(req)
-        data = resp.read()
-        resp.close()
-
-        # The first line of the response is garbage; skip it.
-        js = json.loads(data.splitlines()[1])
-
-        sha1_step_name = 'gn sha1'
-        for step in js['step']['substep']:
-          if step['step']['name'] == sha1_step_name:
-            sha1 = step['step']['text'][-1]
-
-        result.sha1 = sha1
-
-    for platform, r in results.items():
-      print(platform)
-      print('  sha1:  %s' % r.sha1)
-      print('  state: %s' % r.state)
-      print('  build: %s' % r.buildNumber)
-      print('  url:   %s' % r.url)
-      print()
-
-    return results
-
-  def RollBuildtools(self):
-    ret = self.CheckoutBuildBranch()
-    if ret:
-      return ret
-
-    results = self.CheckBuild()
-    if (len(results) < 3 or
-        not all(r.state == SUCCESS for r in results.values()) or
-        not all(r.sha1 != '-' for r in results.values())):
-      print("Roll isn't done or didn't succeed, exiting:")
-      return 1
-
-    desc = self.GetBuildtoolsDesc()
-
-    self.Call('git new-branch roll_buildtools_gn_%s' % self.new_gn_version,
-              cwd=self.buildtools_dir)
-
-    for platform in results:
-      fname = 'gn.exe.sha1' if platform == 'win' else 'gn.sha1'
-      path = os.path.join(self.buildtools_dir, platform, fname)
-      with open(path, 'w') as fp:
-        fp.write('%s\n' % results[platform].sha1)
-
-    desc_file = tempfile.NamedTemporaryFile(delete=False)
-    try:
-      desc_file.write(desc)
-      desc_file.close()
-      self.Call('git commit -a -F %s' % desc_file.name,
-                cwd=self.buildtools_dir)
-      self.Call('git-cl upload -f --send-mail',
-                cwd=self.buildtools_dir)
-    finally:
-      os.remove(desc_file.name)
-
-    ret, out, err = self.Call('git cl land', cwd=self.buildtools_dir)
-    if ret:
-        print("buildtools git cl land failed: %d" % ret)
-        if out:
-            print(out)
-        if err:
-            print(err)
-        return ret
-
-    # Fetch the revision we just committed so that RollDEPS will find it.
-    self.Call('git fetch', cwd=self.buildtools_dir)
-
-    # Reset buildtools to the new commit so that we're not still on the
-    # merged branch.
-    self.Call('git checkout origin/master', cwd=self.buildtools_dir)
-
-    _, out, _ = self.Call('git rev-parse origin/master',
-                          cwd=self.buildtools_dir)
-    new_buildtools_commitish = out.strip()
-    print('Ready to roll buildtools to %s in DEPS' % new_buildtools_commitish)
-
-    return 0
-
-  def RollDEPS(self):
-    ret, _, _ = self.Call('git new-branch roll_gn_%s' % self.new_gn_version)
-    if ret:
-      print('Failed to create a new branch for roll_gn_%s' %
-            self.new_gn_version)
-      return 1
-
-    _, out, _ = self.Call('git rev-parse origin/master',
-                          cwd=self.buildtools_dir)
-    new_buildtools_commitish = out.strip()
-
-    new_deps_lines = []
-    old_buildtools_commitish = ''
-    with open(os.path.join(self.chromium_src_dir, 'DEPS')) as fp:
-      for l in fp.readlines():
-        m = re.match(".*'buildtools_revision':.*'(.+)',", l)
-        if m:
-          old_buildtools_commitish = m.group(1)
-          new_deps_lines.append("  'buildtools_revision': '%s',\n" %
-                                new_buildtools_commitish)
-        else:
-          new_deps_lines.append(l)
-
-    if not old_buildtools_commitish:
-      print('Could not update DEPS properly, exiting')
-      return 1
-
-    with open('DEPS', 'w') as fp:
-      fp.write(''.join(new_deps_lines))
-
-    desc = self.GetDEPSRollDesc(old_buildtools_commitish,
-                                new_buildtools_commitish)
-    desc_file = tempfile.NamedTemporaryFile(delete=False)
-    try:
-      desc_file.write(desc)
-      desc_file.close()
-      self.Call('git commit -a -F %s' % desc_file.name)
-      self.Call('git-cl upload -f --send-mail --use-commit-queue')
-    finally:
-      os.remove(desc_file.name)
-
-    # Move off of the roll branch onto whatever we were on before.
-    # Do not explicitly close the roll CL issue, however; the CQ
-    # will close it when the roll lands, assuming it does so.
-    self.MoveToLastHead()
-
-    return 0
-
-  def MoveToLastHead(self):
-    # When this is called, there will be a commit + a checkout as
-    # the two most recent entries in the reflog, assuming nothing as
-    # modified the repo while this script has been running.
-    _, out, _ = self.Call('git reflog -2')
-    m = re.search('moving from ([^\s]+)', out)
-    last_head = m.group(1)
-    self.Call('git checkout %s' % last_head)
-
-  def GetBuildtoolsDesc(self):
-    gn_changes = self.GetGNChanges()
-    return (
-      'Roll gn %s..%s (r%s:r%s)\n'
-      '\n'
-      '%s'
-      '\n'
-      'TBR=%s\n' % (
-        self.old_gn_commitish[:COMMITISH_DIGITS],
-        self.new_gn_commitish[:COMMITISH_DIGITS],
-        self.old_gn_version,
-        self.new_gn_version,
-        gn_changes,
-        self.reviewer,
-      ))
-
-  def GetDEPSRollDesc(self, old_buildtools_commitish, new_buildtools_commitish):
-    gn_changes = self.GetGNChanges()
-
-    return (
-      'Roll buildtools %s..%s\n'
-      '\n'
-      '  In order to roll GN %s..%s (r%s:r%s) and pick up\n'
-      '  the following changes:\n'
-      '\n'
-      '%s'
-      '\n'
-      'TBR=%s\n' % (
-        old_buildtools_commitish[:COMMITISH_DIGITS],
-        new_buildtools_commitish[:COMMITISH_DIGITS],
-        self.old_gn_commitish[:COMMITISH_DIGITS],
-        self.new_gn_commitish[:COMMITISH_DIGITS],
-        self.old_gn_version,
-        self.new_gn_version,
-        gn_changes,
-        self.reviewer,
-      ))
-
-  def GetGNChanges(self):
-    _, out, _ = self.Call(
-        "git log --pretty='  %h %s' " +
-        "%s..%s tools/gn" % (self.old_gn_commitish, self.new_gn_commitish))
-    return out
-
-  def Call(self, cmd, cwd=None):
-    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True,
-                            cwd=(cwd or self.chromium_src_dir))
-    out, err = proc.communicate()
-    return proc.returncode, out or '', err or ''
-
-
-if __name__ == '__main__':
-  roller = GNRoller()
-  sys.exit(roller.Roll())
diff --git a/tools/gn/bootstrap/OWNERS b/tools/gn/bootstrap/OWNERS
deleted file mode 100644
index 21aeec2..0000000
--- a/tools/gn/bootstrap/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-# It's OK to TBR changes to bootstrap.py that edits the file lists to bring
-# them in line with the Chrome build. For more substantial changes, please
-# send a normal review.
-*
diff --git a/tools/gn/misc/OWNERS b/tools/gn/misc/OWNERS
deleted file mode 100644
index 4d2bd88..0000000
--- a/tools/gn/misc/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-scottmg@chromium.org
-erg@chromium.org
diff --git a/tools/gn/bin/help_as_html.py b/tools/gn/misc/help_as_html.py
similarity index 100%
rename from tools/gn/bin/help_as_html.py
rename to tools/gn/misc/help_as_html.py
diff --git a/tools/gn/bin/gn-format.py b/tools/gn/misc/vim/gn-format.py
similarity index 100%
rename from tools/gn/bin/gn-format.py
rename to tools/gn/misc/vim/gn-format.py
diff --git a/tools/gn/parser_fuzzer.cc b/tools/gn/parser_fuzzer.cc
deleted file mode 100644
index e40da78..0000000
--- a/tools/gn/parser_fuzzer.cc
+++ /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.
-
-#include <stdint.h>
-
-#include "tools/gn/input_file.h"
-#include "tools/gn/parser.h"
-#include "tools/gn/source_file.h"
-#include "tools/gn/tokenizer.h"
-
-namespace {
-
-enum { kMaxContentDepth = 256, kMaxDodgy = 256 };
-
-// Some auto generated input is too unreasonable for fuzzing GN.
-// We see stack overflow when the parser hits really deeply "nested" input.
-// (I.E.: certain input that causes nested parsing function calls).
-//
-// Abstract max limits are undesirable in the release GN code, so some sanity
-// checks in the fuzzer to prevent stack overflow are done here.
-// - 1) Too many opening bracket, paren, or brace in a row.
-// - 2) Too many '!', '<' or '>' operators in a row.
-bool SanityCheckContent(const std::vector<Token>& tokens) {
-  int depth = 0;
-  int dodgy_count = 0;
-  for (const auto& token : tokens) {
-    switch (token.type()) {
-      case Token::LEFT_PAREN:
-      case Token::LEFT_BRACKET:
-      case Token::LEFT_BRACE:
-        ++depth;
-        break;
-      case Token::RIGHT_PAREN:
-      case Token::RIGHT_BRACKET:
-      case Token::RIGHT_BRACE:
-        --depth;
-        break;
-      case Token::BANG:
-      case Token::LESS_THAN:
-      case Token::GREATER_THAN:
-        ++dodgy_count;
-        break;
-      default:
-        break;
-    }
-    // Bail out as soon as a boundary is hit, inside the loop.
-    if (depth >= kMaxContentDepth || dodgy_count >= kMaxDodgy)
-      return false;
-  }
-
-  return true;
-}
-
-}  // namespace
-
-extern "C" int LLVMFuzzerTestOneInput(const unsigned char* data, size_t size) {
-  SourceFile source;
-  InputFile input(source);
-  input.SetContents(std::string(reinterpret_cast<const char*>(data), size));
-
-  Err err;
-  std::vector<Token> tokens = Tokenizer::Tokenize(&input, &err);
-  if (!SanityCheckContent(tokens))
-    return 0;
-
-  if (!err.has_error())
-    Parser::Parse(tokens, &err);
-
-  return 0;
-}
diff --git a/tools/gn/tutorial/hello.cc b/tools/gn/tutorial/hello.cc
deleted file mode 100644
index 8b25cd9..0000000
--- a/tools/gn/tutorial/hello.cc
+++ /dev/null
@@ -1,17 +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 "tools/gn/tutorial/hello.h"
-
-#include <stdio.h>
-
-void Hello(const char* who) {
-  printf("Hello, %s.\n", who);
-}
-
-#if defined(TWO_PEOPLE)
-void Hello(const char* one, const char* two) {
-  printf("Hello, %s and %s.\n", one, two);
-}
-#endif
diff --git a/tools/gn/tutorial/hello.h b/tools/gn/tutorial/hello.h
deleted file mode 100644
index 253fe24..0000000
--- a/tools/gn/tutorial/hello.h
+++ /dev/null
@@ -1,14 +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 TOOLS_GN_TUTORIAL_HELLO_H_
-#define TOOLS_GN_TUTORIAL_HELLO_H_
-
-void Hello(const char* who);
-
-#if defined(TWO_PEOPLE)
-void Hello(const char* one, const char* two);
-#endif
-
-#endif  // TOOLS_GN_TUTORIAL_HELLO_H_
diff --git a/tools/gn/tutorial/hello_world.cc b/tools/gn/tutorial/hello_world.cc
deleted file mode 100644
index 84ffc3f..0000000
--- a/tools/gn/tutorial/hello_world.cc
+++ /dev/null
@@ -1,10 +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 <stdio.h>
-
-int main() {
-  printf("Hello, world.\n");
-  return 0;
-}
diff --git a/tools/gn/tutorial/say_hello.cc b/tools/gn/tutorial/say_hello.cc
deleted file mode 100644
index d8092bd..0000000
--- a/tools/gn/tutorial/say_hello.cc
+++ /dev/null
@@ -1,14 +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 "tools/gn/tutorial/hello.h"
-
-int main() {
-#if defined(TWO_PEOPLE)
-  Hello("Bill", "Joy");
-#else
-  Hello("everyone");
-#endif
-  return 0;
-}
