| Index: client/third_party/cachetools/abc.py
 | 
| diff --git a/client/third_party/cachetools/abc.py b/client/third_party/cachetools/abc.py
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..41ad7369fccf45bcfae9fb5b59227a4b4d8f79f4
 | 
| --- /dev/null
 | 
| +++ b/client/third_party/cachetools/abc.py
 | 
| @@ -0,0 +1,48 @@
 | 
| +from __future__ import absolute_import
 | 
| +
 | 
| +import collections
 | 
| +
 | 
| +from abc import abstractmethod
 | 
| +
 | 
| +
 | 
| +class DefaultMapping(collections.MutableMapping):
 | 
| +
 | 
| +    __slots__ = ()
 | 
| +
 | 
| +    @abstractmethod
 | 
| +    def __contains__(self, key):  # pragma: nocover
 | 
| +        return False
 | 
| +
 | 
| +    @abstractmethod
 | 
| +    def __getitem__(self, key):  # pragma: nocover
 | 
| +        if hasattr(self.__class__, '__missing__'):
 | 
| +            return self.__class__.__missing__(self, key)
 | 
| +        else:
 | 
| +            raise KeyError(key)
 | 
| +
 | 
| +    def get(self, key, default=None):
 | 
| +        if key in self:
 | 
| +            return self[key]
 | 
| +        else:
 | 
| +            return default
 | 
| +
 | 
| +    __marker = object()
 | 
| +
 | 
| +    def pop(self, key, default=__marker):
 | 
| +        if key in self:
 | 
| +            value = self[key]
 | 
| +            del self[key]
 | 
| +        elif default is self.__marker:
 | 
| +            raise KeyError(key)
 | 
| +        else:
 | 
| +            value = default
 | 
| +        return value
 | 
| +
 | 
| +    def setdefault(self, key, default=None):
 | 
| +        if key in self:
 | 
| +            value = self[key]
 | 
| +        else:
 | 
| +            self[key] = value = default
 | 
| +        return value
 | 
| +
 | 
| +DefaultMapping.register(dict)
 | 
| 
 |