diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
index 09d6696..b3be107 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -5,9 +5,9 @@
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.errors.CompilationError;
-import it.unimi.dsi.fastutil.objects.Reference2IntArrayMap;
 import it.unimi.dsi.fastutil.objects.Reference2IntLinkedOpenHashMap;
 import it.unimi.dsi.fastutil.objects.Reference2IntMap;
+import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -96,35 +96,43 @@
    * superclasses and interfaces is 1.
    */
   private static class ProgramClassDepthsMemoized {
+
+    private final static int UNKNOWN_DEPTH = -1;
+
     private final DexApplication application;
-    private final Reference2IntMap<DexProgramClass> depthOfClasses = new Reference2IntArrayMap<>();
+    private final Reference2IntMap<DexProgramClass> depthOfClasses = new Reference2IntOpenHashMap<>();
 
     ProgramClassDepthsMemoized(DexApplication application) {
       this.application = application;
+      depthOfClasses.defaultReturnValue(UNKNOWN_DEPTH);
     }
 
     int getDepth(DexProgramClass programClass) {
-      return depthOfClasses.computeIfAbsent(
-          programClass,
-          programClassToCompute -> {
-            // Emulating the algorithm of com.android.dx.merge.SortableType.tryAssignDepth().
-            DexType superType = programClassToCompute.superType;
-            int maxDepth;
-            if (superType == null) {
-              maxDepth = 0;
-            } else {
-              maxDepth = 1;
-              DexProgramClass superClass = application.programDefinitionFor(superType);
-              if (superClass != null) {
-                maxDepth = getDepth(superClass);
-              }
-            }
-            for (DexType inf : programClassToCompute.interfaces.values) {
-              DexProgramClass infClass = application.programDefinitionFor(inf);
-              maxDepth = Math.max(maxDepth, infClass == null ? 1 : getDepth(infClass));
-            }
-            return maxDepth + 1;
-          });
+      int depth = depthOfClasses.getInt(programClass);
+
+      // TODO(b/65536002): use "computeIntIfAbsent" after upgrading to fastutils 8.x.
+      if (depth == UNKNOWN_DEPTH) {
+        // Emulating the algorithm of com.android.dx.merge.SortableType.tryAssignDepth().
+        DexType superType = programClass.superType;
+        int maxDepth;
+        if (superType == null) {
+          maxDepth = 0;
+        } else {
+          maxDepth = 1;
+          DexProgramClass superClass = application.programDefinitionFor(superType);
+          if (superClass != null) {
+            maxDepth = getDepth(superClass);
+          }
+        }
+        for (DexType inf : programClass.interfaces.values) {
+          DexProgramClass infClass = application.programDefinitionFor(inf);
+          maxDepth = Math.max(maxDepth, infClass == null ? 1 : getDepth(infClass));
+        }
+        depth = maxDepth + 1;
+        depthOfClasses.put(programClass, depth);
+      }
+
+      return depth;
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 38aa903..9b89374 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -615,7 +615,9 @@
     }
 
     private void parseRuleModifiers(ProguardKeepRule.Builder builder) {
+      skipWhitespace();
       while (acceptChar(',')) {
+        skipWhitespace();
         if (acceptString("allow")) {
           if (acceptString("shrinking")) {
             builder.getModifiersBuilder().setAllowsShrinking(true);
@@ -627,6 +629,7 @@
         } else if (acceptString("includedescriptorclasses")) {
           builder.getModifiersBuilder().setIncludeDescriptorClasses(true);
         }
+        skipWhitespace();
       }
     }
 
diff --git a/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java b/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java
index ec7a22a..7c53ff8 100644
--- a/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java
+++ b/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java
@@ -81,7 +81,7 @@
 
   private FeatureClassMapping() {}
 
-  private void addMapping(String clazz, String feature) throws FeatureMappingException {
+  public void addMapping(String clazz, String feature) throws FeatureMappingException {
     addRule(clazz, feature, 0);
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java b/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
index 7a2123e..9e062b3 100644
--- a/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
+++ b/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
@@ -123,7 +123,7 @@
       // TODO(b/75997473): Enable inlining when supported by CF backend
       ToolHelper.runR8(builder.build(), options -> options.enableInlining = false);
     } else {
-      builder.setMinApiLevel(AndroidApiLevel.O.getLevel());
+      builder.setMinApiLevel(ToolHelper.getMinApiLevelForDexVm().getLevel());
       ToolHelper.runR8(builder.build());
     }
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java b/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
index 4e638df..27f5321 100644
--- a/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
+++ b/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
@@ -116,7 +116,7 @@
       // TODO(b/75997473): Enable inlining when supported by CF backend
       ToolHelper.runR8(builder.build(), options -> options.enableInlining = false);
     } else {
-      builder.setMinApiLevel(AndroidApiLevel.O.getLevel());
+      builder.setMinApiLevel(ToolHelper.getMinApiLevelForDexVm().getLevel());
       ToolHelper.runR8(builder.build());
     }
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index da4d57f..89a7291 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -808,6 +808,33 @@
   }
 
   @Test
+  public void parseKeepModifiers() {
+    List<String> ws = ImmutableList.of("", " ", "   ", "\t", " \t", " \t", " \t ", " \t\t \t ");
+
+    for (String before : ws) {
+      for (String after : ws) {
+        reset();
+        ProguardConfiguration config = parseAndVerifyParserEndsCleanly(ImmutableList.of(
+            "-keep"
+                + before + "," + after + "includedescriptorclasses"
+                + before + "," + after + "allowshrinking"
+                + before + "," + after + "allowobfuscation"
+                + before + "," + after + "allowoptimization "
+                + "class A { *; }"
+        ));
+      }
+    }
+  }
+
+  @Test
+  public void regress78442725() {
+    parseAndVerifyParserEndsCleanly(ImmutableList.of(
+        "-keep, includedescriptorclasses class in.uncod.android.bypass.Document { *; }",
+        "-keep, includedescriptorclasses class in.uncod.android.bypass.Element { *; }"
+    ));
+  }
+
+  @Test
   public void parseSeeds() throws Exception {
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(new DexItemFactory(), reporter);
