diff -urN orig/gsutil/gslib/vendored/boto/boto/plugin.py patched/gsutil/gslib/vendored/boto/boto/plugin.py
--- orig/gsutil/gslib/vendored/boto/boto/plugin.py	2022-10-12 21:40:18.000000000 +0000
+++ patched/gsutil/gslib/vendored/boto/boto/plugin.py	2026-07-27 01:58:12.503399336 +0000
@@ -37,7 +37,12 @@
 """
 
 import glob
-import imp
+try:
+    import importlib.util
+    _use_importlib = True
+except ImportError:
+    import imp
+    _use_importlib = False
 import os.path
 
 
@@ -70,12 +75,22 @@
     (path, name) = os.path.split(filename)
     (name, ext) = os.path.splitext(name)
 
-    (file, filename, data) = imp.find_module(name, [path])
-    try:
-        return imp.load_module(name, file, filename, data)
-    finally:
-        if file:
-            file.close()
+    if _use_importlib:
+        spec = importlib.util.spec_from_file_location(name, filename)
+        if spec is None:
+            raise ImportError("Could not load spec for %s" % filename)
+        module = importlib.util.module_from_spec(spec)
+        import sys
+        sys.modules[name] = module
+        spec.loader.exec_module(module)
+        return module
+    else:
+        (file, filename, data) = imp.find_module(name, [path])
+        try:
+            return imp.load_module(name, file, filename, data)
+        finally:
+            if file:
+                file.close()
 
 _plugin_loaded = False
 
diff -urN orig/gsutil/gslib/vendored/boto/boto/vendored/six.py patched/gsutil/gslib/vendored/boto/boto/vendored/six.py
--- orig/gsutil/gslib/vendored/boto/boto/vendored/six.py	2022-10-12 21:40:18.000000000 +0000
+++ patched/gsutil/gslib/vendored/boto/boto/vendored/six.py	2026-07-27 01:58:12.502977082 +0000
@@ -72,6 +72,12 @@
         del X
 
 
+if PY34:
+    from importlib.util import spec_from_loader
+else:
+    spec_from_loader = None
+
+
 def _add_doc(func, doc):
     """Add documentation to a function."""
     func.__doc__ = doc
@@ -185,6 +191,11 @@
             return self
         return None
 
+    def find_spec(self, fullname, path, target=None):
+        if fullname in self.known_modules:
+            return spec_from_loader(fullname, self)
+        return None
+
     def __get_module(self, fullname):
         try:
             return self.known_modules[fullname]
@@ -220,6 +231,12 @@
         return None
     get_source = get_code  # same as get_code
 
+    def create_module(self, spec):
+        return self.load_module(spec.name)
+
+    def exec_module(self, module):
+        pass
+
 _importer = _SixMetaPathImporter(__name__)
 
 
diff -urN orig/gsutil/third_party/apitools/apitools/base/protorpclite/messages.py patched/gsutil/third_party/apitools/apitools/base/protorpclite/messages.py
--- orig/gsutil/third_party/apitools/apitools/base/protorpclite/messages.py	2021-05-05 21:58:03.000000000 +0000
+++ patched/gsutil/third_party/apitools/apitools/base/protorpclite/messages.py	2026-07-27 01:58:12.503757796 +0000
@@ -311,7 +311,7 @@
             for attribute, value in dct.items():
 
                 # Module will be in every enum class.
-                if attribute in _RESERVED_ATTRIBUTE_NAMES:
+                if attribute in _RESERVED_ATTRIBUTE_NAMES or (attribute.startswith('__') and attribute.endswith('__')):
                     continue
 
                 # Reject anything that is not an int.
@@ -631,7 +631,7 @@
             # dct.
             for key, field in dct.items():
 
-                if key in _RESERVED_ATTRIBUTE_NAMES:
+                if key in _RESERVED_ATTRIBUTE_NAMES or (key.startswith('__') and key.endswith('__')):
                     continue
 
                 if isinstance(field, type) and issubclass(field, Enum):
diff -urN orig/gsutil/third_party/six/six.py patched/gsutil/third_party/six/six.py
--- orig/gsutil/third_party/six/six.py	2018-12-10 00:54:51.000000000 +0000
+++ patched/gsutil/third_party/six/six.py	2026-07-27 01:58:12.502701142 +0000
@@ -72,6 +72,12 @@
         del X
 
 
+if PY34:
+    from importlib.util import spec_from_loader
+else:
+    spec_from_loader = None
+
+
 def _add_doc(func, doc):
     """Add documentation to a function."""
     func.__doc__ = doc
@@ -186,6 +192,11 @@
             return self
         return None
 
+    def find_spec(self, fullname, path, target=None):
+        if fullname in self.known_modules:
+            return spec_from_loader(fullname, self)
+        return None
+
     def __get_module(self, fullname):
         try:
             return self.known_modules[fullname]
@@ -223,6 +234,12 @@
         return None
     get_source = get_code  # same as get_code
 
+    def create_module(self, spec):
+        return self.load_module(spec.name)
+
+    def exec_module(self, module):
+        pass
+
 _importer = _SixMetaPathImporter(__name__)
 
 
diff -urN orig/gsutil/third_party/urllib3/src/urllib3/packages/six.py patched/gsutil/third_party/urllib3/src/urllib3/packages/six.py
--- orig/gsutil/third_party/urllib3/src/urllib3/packages/six.py	2020-11-10 19:50:09.000000000 +0000
+++ patched/gsutil/third_party/urllib3/src/urllib3/packages/six.py	2026-07-27 01:58:12.503213057 +0000
@@ -72,6 +72,12 @@
         del X
 
 
+if PY34:
+    from importlib.util import spec_from_loader
+else:
+    spec_from_loader = None
+
+
 def _add_doc(func, doc):
     """Add documentation to a function."""
     func.__doc__ = doc
@@ -182,6 +188,11 @@
             return self
         return None
 
+    def find_spec(self, fullname, path, target=None):
+        if fullname in self.known_modules:
+            return spec_from_loader(fullname, self)
+        return None
+
     def __get_module(self, fullname):
         try:
             return self.known_modules[fullname]
@@ -221,6 +232,12 @@
     get_source = get_code  # same as get_code
 
 
+    def create_module(self, spec):
+        return self.load_module(spec.name)
+
+    def exec_module(self, module):
+        pass
+
 _importer = _SixMetaPathImporter(__name__)
 
 
