From 180b2f579339861eaa718ac46a256c701cf951c0 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Mon, 17 Nov 2025 14:15:01 +0100 Subject: [PATCH 01/24] ref(proguard): Clarify stacktrace order Sentry orders stacktraces from outermost frame to innermost. Symbolicator does it the other way around, from innermost to outermost. For native events, we reverse stacktraces in Sentry before sending them to Symbolicator and then reverse the result again. This means that Symbolicator can just assume the order it wants and never has to reverse anything. I neglected to take this into account when porting proguard processing to Symbolicator, so Sentry sends JVM stacktraces in thge order it wants. Instead, we previously reversed the output of the `map_full_frame` function, which achieved the same result. This PR attempts to clean up the situation by moving the reversing logic as far outward as possible. JVM stacktraces are now reversed (from "Sentry order" to "Symbolicator order" in the `symbolicate-jvm`) endpoint and reversed again when the response is returned. This means that in the "interior" of Symbolicator the order is always the same. The PR also changes a number of tests: it introduces snapshots for some that were previously asserting stuff and reverses some to get the "expected" order. In the future we might switch to reversing stacktraces in Sentry, like it already works for native. --- crates/symbolicator-proguard/src/interface.rs | 3 + .../src/symbolication.rs | 393 +++++++++--------- .../tests/integration/proguard.rs | 234 +++++------ ...ration__proguard__basic_source_lookup.snap | 118 +++--- ...tegration__proguard__resolving_inline.snap | 8 +- ...proguard__source_lookup_with_proguard.snap | 276 ++++++------ .../src/endpoints/symbolicate_jvm.rs | 6 +- crates/symbolicator/src/service.rs | 11 +- 8 files changed, 530 insertions(+), 519 deletions(-) diff --git a/crates/symbolicator-proguard/src/interface.rs b/crates/symbolicator-proguard/src/interface.rs index 9d5f5cd65..079933bb5 100644 --- a/crates/symbolicator-proguard/src/interface.rs +++ b/crates/symbolicator-proguard/src/interface.rs @@ -24,6 +24,9 @@ pub struct SymbolicateJvmStacktraces { /// The exceptions to symbolicate/remap. pub exceptions: Vec, /// The list of stacktraces to symbolicate/remap. + /// + /// Stacktraces are expected in "Symbolicator order", i.e. with the + /// innermost frame being at the start of the trace. pub stacktraces: Vec, /// A list of proguard files to use for remapping. pub modules: Vec, diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 4f044cacb..75c02c0b9 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -143,6 +143,7 @@ impl ProguardService { .into_iter() }) .collect(); + JvmStacktrace { frames: remapped_frames, } @@ -223,9 +224,9 @@ impl ProguardService { /// Remaps a frame using the provided mappers. /// /// This returns a list of frames because remapping may - /// expand a frame into several. The returned list is always + /// expand a frame into a list of inlined frames. The returned list is always /// nonempty; if none of the mappers can remap the frame, the original - /// frame is returned. + /// frame is returned. The returned list is sorted so that inlinees come before their callers. #[tracing::instrument(skip_all)] fn map_frame( mappers: &[&proguard::ProguardCache], @@ -341,6 +342,9 @@ impl ProguardService { /// /// The `buf` parameter is used as a buffer for the frames returned /// by `remap_frame`. + /// + /// This function returns a list of frames because one frame may be expanded into + /// a series of inlined frames. The returned list is sorted so that inlinees come before their callers. #[tracing::instrument(skip_all)] fn map_full_frame<'a>( mapper: &'a proguard::ProguardCache<'a>, @@ -355,10 +359,8 @@ impl ProguardService { return None; } - // sentry expects stack traces in reverse order let res = buf .iter() - .rev() .map(|new_frame| JvmFrame { module: new_frame.class().to_owned(), function: new_frame.method().to_owned(), @@ -593,54 +595,40 @@ io.sentry.sample.MainActivity -> io.sentry.sample.MainActivity: }) .collect(); - assert_eq!(mapped_frames.len(), 7); - - assert_eq!(mapped_frames[0].function, "onClick"); - assert_eq!( - mapped_frames[0].module, - "io.sentry.sample.-$$Lambda$r3Avcbztes2hicEObh02jjhQqd4" - ); - assert_eq!(mapped_frames[0].index, 0); - - assert_eq!( - mapped_frames[1].filename, - Some("MainActivity.java".to_owned()) - ); - assert_eq!(mapped_frames[1].module, "io.sentry.sample.MainActivity"); - assert_eq!(mapped_frames[1].function, "onClickHandler"); - assert_eq!(mapped_frames[1].lineno, Some(40)); - assert_eq!(mapped_frames[1].index, 1); - - assert_eq!(mapped_frames[2].function, "foo"); - assert_eq!(mapped_frames[2].lineno, Some(44)); - assert_eq!(mapped_frames[2].index, 1); - - assert_eq!(mapped_frames[3].function, "bar"); - assert_eq!(mapped_frames[3].lineno, Some(54)); - assert_eq!( - mapped_frames[3].filename, - Some("MainActivity.java".to_owned()) - ); - assert_eq!(mapped_frames[3].module, "io.sentry.sample.MainActivity"); - assert_eq!(mapped_frames[3].index, 1); - - assert_eq!(mapped_frames[4].function, "onClickHandler"); - assert_eq!( - mapped_frames[4].signature.as_ref().unwrap(), - "(android.view.View)" - ); - - assert_eq!(mapped_frames[5].function, "onClickHandler"); - assert_eq!( - mapped_frames[5].signature.as_ref().unwrap(), - "(android.view.View)" - ); - - assert_eq!(mapped_frames[6].function, "onClickHandler"); - assert_eq!( - mapped_frames[6].signature.as_ref().unwrap(), - "(android.view.View)" - ); + insta::assert_yaml_snapshot!(mapped_frames, @r###" + - function: onClick + module: io.sentry.sample.-$$Lambda$r3Avcbztes2hicEObh02jjhQqd4 + lineno: 2 + index: 0 + - function: bar + filename: MainActivity.java + module: io.sentry.sample.MainActivity + lineno: 54 + index: 1 + - function: foo + filename: MainActivity.java + module: io.sentry.sample.MainActivity + lineno: 44 + index: 1 + - function: onClickHandler + filename: MainActivity.java + module: io.sentry.sample.MainActivity + lineno: 40 + index: 1 + - function: onClickHandler + module: io.sentry.sample.MainActivity + lineno: 0 + index: 2 + signature: (android.view.View) + - function: onClickHandler + module: io.sentry.sample.MainActivity + index: 3 + signature: (android.view.View) + - function: onClickHandler + module: io.sentry.sample.ClassDoesNotExist + index: 4 + signature: (android.view.View) + "###); } // based on the Python test `test_sets_inapp_after_resolving`. @@ -781,37 +769,24 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: let mapped_frames = ProguardService::map_frame(&[&cache], &frame, None, &mut Default::default()); - assert_eq!(mapped_frames.len(), 2); - - assert_eq!( - mapped_frames[0], - JvmFrame { - function: "onCreate".into(), - module: "com.example.App".into(), - lineno: Some(0), - abs_path: Some("App.java".into()), - filename: Some("App.java".into()), - index: 0, - ..Default::default() - } - ); - - // Without the "line 0" change, this frame doesn't exist. + // Without the "line 0" change, the second frame doesn't exist. // The `retrace` implementation at // https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip // also returns this, no matter whether you give it line 0 or no line at all. - assert_eq!( - mapped_frames[1], - JvmFrame { - function: "barInternalInject".into(), - module: "com.example.App".into(), - lineno: Some(0), - abs_path: Some("App.java".into()), - filename: Some("App.java".into()), - index: 0, - ..Default::default() - } - ); + insta::assert_yaml_snapshot!(mapped_frames, @r###" + - function: barInternalInject + filename: App.java + module: com.example.App + abs_path: App.java + lineno: 0 + index: 0 + - function: onCreate + filename: App.java + module: com.example.App + abs_path: App.java + lineno: 0 + index: 0 + "###); } #[test] @@ -852,25 +827,19 @@ y.b -> y.b: let mapped_frames = ProguardService::map_frame(&[&cache], &frame, None, &mut Default::default()); - assert_eq!(mapped_frames.len(), 1); - - assert_eq!( - mapped_frames[0], - JvmFrame { - function: "run$bridge".into(), - // Without the "line 0" change, this is "com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0". - // The `retrace` implementation at - // https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip - // also returns this, no matter whether you give it line 0 or no line at all. - module: "com.google.firebase.concurrent.CustomThreadFactory$$InternalSyntheticLambda$1$53203795c28a6fcdb3bac755806c9ee73cb3e8dcd4c9bbf8ca5d25d4d9c378dd$0".into(), - lineno: Some(0), - abs_path: Some("CustomThreadFactory".into()), - filename: Some("CustomThreadFactory".into()), - index: 0, - method_synthesized: true, - ..Default::default() - } - ); + // Without the "line 0" change, the module is "com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0". + // The `retrace` implementation at + // https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip + // also returns this, no matter whether you give it line 0 or no line at all. + insta::assert_yaml_snapshot!(mapped_frames, @r###" + - function: run$bridge + filename: CustomThreadFactory + module: com.google.firebase.concurrent.CustomThreadFactory$$InternalSyntheticLambda$1$53203795c28a6fcdb3bac755806c9ee73cb3e8dcd4c9bbf8ca5d25d4d9c378dd$0 + abs_path: CustomThreadFactory + lineno: 0 + index: 0 + method_synthesized: true + "###); } #[test] @@ -936,25 +905,25 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: let frames: Vec = serde_json::from_str( r#"[{ - "function": "a", - "abs_path": "SourceFile", - "module": "a.a", - "filename": "SourceFile", - "lineno": 12, + "function": "performClickInternal", + "abs_path": "Unknown Source", + "module": "android.view.View.-$$Nest$m", + "filename": "Unknown Source", + "lineno": 0, "index": 0 }, { - "function": "b", - "abs_path": "SourceFile", - "module": "io.wzieba.r8fullmoderenamessources.MainActivity", - "filename": "SourceFile", - "lineno": 6, + "function": "performClickInternal", + "abs_path": "View.java", + "module": "android.view.View", + "filename": "View.java", + "lineno": 7636, "index": 1 }, { - "function": "a", - "abs_path": "SourceFile", - "module": "io.wzieba.r8fullmoderenamessources.MainActivity", - "filename": "SourceFile", - "lineno": 1, + "function": "performClick", + "abs_path": "View.java", + "module": "android.view.View", + "filename": "View.java", + "lineno": 7659, "index": 2 }, { "function": "onClick", @@ -964,64 +933,83 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: "lineno": 1, "index": 3 }, { - "function": "performClick", - "abs_path": "View.java", - "module": "android.view.View", - "filename": "View.java", - "lineno": 7659, + "function": "a", + "abs_path": "SourceFile", + "module": "io.wzieba.r8fullmoderenamessources.MainActivity", + "filename": "SourceFile", + "lineno": 1, "index": 4 }, { - "function": "performClickInternal", - "abs_path": "View.java", - "module": "android.view.View", - "filename": "View.java", - "lineno": 7636, + "function": "b", + "abs_path": "SourceFile", + "module": "io.wzieba.r8fullmoderenamessources.MainActivity", + "filename": "SourceFile", + "lineno": 6, "index": 5 }, { - "function": "performClickInternal", - "abs_path": "Unknown Source", - "module": "android.view.View.-$$Nest$m", - "filename": "Unknown Source", - "lineno": 0, + "function": "a", + "abs_path": "SourceFile", + "module": "a.a", + "filename": "SourceFile", + "lineno": 12, "index": 6 }]"#, ) .unwrap(); - let (remapped_filenames, remapped_abs_paths): (Vec<_>, Vec<_>) = frames + let mapped_frames = frames .iter() .flat_map(|frame| { ProguardService::map_frame(&[&cache], frame, None, &mut Default::default()) .into_iter() }) - .map(|frame| (frame.filename.unwrap(), frame.abs_path.unwrap())) - .unzip(); - - assert_eq!( - remapped_filenames, - [ - "Foobar.kt", - "MainActivity.kt", - "MainActivity.kt", - "MainActivity", - "View.java", - "View.java", - "Unknown Source" - ] - ); - - assert_eq!( - remapped_abs_paths, - [ - "Foobar.kt", - "MainActivity.kt", - "MainActivity.kt", - "MainActivity", - "View.java", - "View.java", - "Unknown Source" - ] - ); + .collect::>(); + insta::assert_yaml_snapshot!(mapped_frames, @r###" + - function: performClickInternal + filename: Unknown Source + module: android.view.View.-$$Nest$m + abs_path: Unknown Source + lineno: 0 + index: 0 + - function: performClickInternal + filename: View.java + module: android.view.View + abs_path: View.java + lineno: 7636 + index: 1 + - function: performClick + filename: View.java + module: android.view.View + abs_path: View.java + lineno: 7659 + index: 2 + - function: onClick + filename: MainActivity + module: io.wzieba.r8fullmoderenamessources.MainActivity$$ExternalSyntheticLambda0 + abs_path: MainActivity + lineno: 0 + index: 3 + method_synthesized: true + - function: $r8$lambda$pOQDVg57r6gG0-DzwbGf17BfNbs + filename: MainActivity.kt + module: io.wzieba.r8fullmoderenamessources.MainActivity + abs_path: MainActivity.kt + lineno: 0 + index: 4 + method_synthesized: true + - function: onCreate$lambda$1$lambda$0 + filename: MainActivity.kt + module: io.wzieba.r8fullmoderenamessources.MainActivity + abs_path: MainActivity.kt + lineno: 14 + index: 5 + - function: foo + filename: Foobar.kt + module: io.wzieba.r8fullmoderenamessources.Foobar + abs_path: Foobar.kt + lineno: 10 + index: 6 + "###); } #[test] @@ -1068,65 +1056,76 @@ com.mycompany.android.Delegate -> b80.h: cache.test(); let frames: Vec = serde_json::from_str( - r#"[ - { - "function": "a", - "module": "b80.f", + r#"[{ + "function": "b", + "module": "ev.h", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 33, + "lineno": 3, "index": 0 - }, - { + }, { "function": "l", "module": "uu0.k", "filename": "SourceFile", "abs_path": "SourceFile", "lineno": 43, "index": 1 - }, - { - "function": "b", - "module": "ev.h", + }, { + "function": "a", + "module": "b80.f", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 3, + "lineno": 33, "index": 2 }]"#, ) .unwrap(); - let (remapped_filenames, remapped_abs_paths): (Vec<_>, Vec<_>) = frames + let mapped_frames = frames .iter() .flat_map(|frame| { ProguardService::map_frame(&[&cache], frame, None, &mut Default::default()) .into_iter() }) - .map(|frame| (frame.filename.unwrap(), frame.abs_path.unwrap())) - .unzip(); - - assert_eq!( - remapped_filenames, - [ - "Renderer.kt", - "Delegate.kt", - "Delegate.kt", - "SourceFile", - "MapAnnotations.kt", - "SourceFile" - ] - ); - - assert_eq!( - remapped_abs_paths, - [ - "Renderer.kt", - "Delegate.kt", - "Delegate.kt", - "SourceFile", - "MapAnnotations.kt", - "SourceFile" - ] - ); + .collect::>(); + insta::assert_yaml_snapshot!(mapped_frames, @r###" + - function: m + filename: SourceFile + module: ev.StuffKt$$ExternalSyntheticOutline0 + abs_path: SourceFile + lineno: 1 + index: 0 + method_synthesized: true + - function: createProjectionMarker + filename: MapAnnotations.kt + module: com.mycompany.android.MapAnnotations + abs_path: MapAnnotations.kt + lineno: 0 + index: 1 + - function: createProjectionMarker + filename: SourceFile + module: uu0.MapAnnotations + abs_path: SourceFile + lineno: 0 + index: 1 + - function: createProjectionMarker + filename: Delegate.kt + module: com.mycompany.android.Delegate + abs_path: Delegate.kt + lineno: 101 + index: 2 + - function: render + filename: Delegate.kt + module: com.mycompany.android.Delegate + abs_path: Delegate.kt + lineno: 34 + index: 2 + - function: render + filename: Renderer.kt + module: com.mycompany.android.Renderer + abs_path: Renderer.kt + lineno: 39 + index: 2 + "###); } } diff --git a/crates/symbolicator-proguard/tests/integration/proguard.rs b/crates/symbolicator-proguard/tests/integration/proguard.rs index d5c254636..180c61aaf 100644 --- a/crates/symbolicator-proguard/tests/integration/proguard.rs +++ b/crates/symbolicator-proguard/tests/integration/proguard.rs @@ -202,23 +202,23 @@ async fn test_basic_source_lookup() { let source = SourceConfig::Sentry(Arc::new(source)); let frames = r#"[{ - "function": "otherMethod", - "abs_path": "OtherActivity.java", - "module": "OtherActivity", - "filename": "OtherActivity.java", - "lineno": 100, + "function": "whoops4", + "abs_path": "SourceFile", + "module": "io.sentry.samples.MainActivity$OneMoreInnerClass", + "filename": "SourceFile", + "lineno": 38, "index": 0 }, { - "function": "differentMethod", - "abs_path": "DifferentActivity", - "module": "DifferentActivity", - "filename": "DifferentActivity", - "lineno": 200, + "function": "whoops3", + "abs_path": "MainActivity.kt", + "module": "io.sentry.samples.MainActivity$AdditionalInnerClass", + "filename": "MainActivity.kt", + "lineno": 32, "index": 1 }, { - "function": "onCreate", - "module": "io.sentry.samples.MainActivity", - "lineno": 11, + "function": "whoops2", + "module": "io.sentry.samples.MainActivity$AnotherInnerClass", + "lineno": 26, "index": 2 }, { "function": "whoops", @@ -228,23 +228,23 @@ async fn test_basic_source_lookup() { "lineno": 20, "index": 3 }, { - "function": "whoops2", - "module": "io.sentry.samples.MainActivity$AnotherInnerClass", - "lineno": 26, + "function": "onCreate", + "module": "io.sentry.samples.MainActivity", + "lineno": 11, "index": 4 }, { - "function": "whoops3", - "abs_path": "MainActivity.kt", - "module": "io.sentry.samples.MainActivity$AdditionalInnerClass", - "filename": "MainActivity.kt", - "lineno": 32, + "function": "differentMethod", + "abs_path": "DifferentActivity", + "module": "DifferentActivity", + "filename": "DifferentActivity", + "lineno": 200, "index": 5 }, { - "function": "whoops4", - "abs_path": "SourceFile", - "module": "io.sentry.samples.MainActivity$OneMoreInnerClass", - "filename": "SourceFile", - "lineno": 38, + "function": "otherMethod", + "abs_path": "OtherActivity.java", + "module": "OtherActivity", + "filename": "OtherActivity.java", + "lineno": 100, "index": 6 }]"#; @@ -334,120 +334,120 @@ async fn test_source_lookup_with_proguard() { let source = SourceConfig::Sentry(Arc::new(source)); let frames = r#"[{ - "filename": "ZygoteInit.java", - "function": "main", - "module": "com.android.internal.os.ZygoteInit", - "lineno": 698, + "filename": "R8$$SyntheticClass", + "function": "onMenuItemClick", + "module": "io.sentry.samples.instrumentation.ui.g", + "lineno": 40, + "in_app": true, "index": 0 - }, { - "filename": "ZygoteInit.java", - "function": "run", - "module": "com.android.internal.os.ZygoteInit$MethodAndArgsCaller", - "lineno": 903, + }, { + "filename": "Toolbar.java", + "function": "onMenuItemClick", + "module": "androidx.appcompat.widget.Toolbar$1", + "lineno": 7, "index": 1 - }, { - "filename": "Method.java", - "function": "invoke", - "module": "java.lang.reflect.Method", - "lineno": 372, + }, { + "filename": "ActionMenuView.java", + "function": "onMenuItemSelected", + "module": "androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback", + "lineno": 7, "index": 2 - }, { - "filename": "Method.java", - "function": "invoke", - "module": "java.lang.reflect.Method", + }, { + "filename": "MenuBuilder.java", + "function": "dispatchMenuItemSelected", + "module": "androidx.appcompat.view.menu.MenuBuilder", + "lineno": 5, "index": 3 - }, { - "filename": "ActivityThread.java", - "function": "main", - "module": "android.app.ActivityThread", - "lineno": 5254, + }, { + "filename": "MenuItemImpl.java", + "function": "invoke", + "module": "androidx.appcompat.view.menu.MenuItemImpl", + "lineno": 15, "index": 4 - }, { - "filename": "Looper.java", - "function": "loop", - "module": "android.os.Looper", - "lineno": 135, + }, { + "filename": "MenuBuilder.java", + "function": "performItemAction", + "module": "androidx.appcompat.view.menu.MenuBuilder", + "lineno": 4, "index": 5 - }, { - "filename": "Handler.java", - "function": "dispatchMessage", - "module": "android.os.Handler", - "lineno": 95, + }, { + "filename": "MenuBuilder.java", + "function": "performItemAction", + "module": "androidx.appcompat.view.menu.MenuBuilder", + "lineno": 1, "index": 6 - }, { - "filename": "Handler.java", - "function": "handleCallback", - "module": "android.os.Handler", - "lineno": 739, + }, { + "filename": "ActionMenuView.java", + "function": "invokeItem", + "module": "androidx.appcompat.widget.ActionMenuView", + "lineno": 4, "index": 7 - }, { - "filename": "View.java", - "function": "run", - "module": "android.view.View$PerformClick", - "lineno": 19866, + }, { + "filename": "ActionMenuItemView.java", + "function": "onClick", + "module": "androidx.appcompat.view.menu.ActionMenuItemView", + "lineno": 7, "index": 8 - }, { + }, { "filename": "View.java", "function": "performClick", "module": "android.view.View", "lineno": 4780, "index": 9 - }, { - "filename": "ActionMenuItemView.java", - "function": "onClick", - "module": "androidx.appcompat.view.menu.ActionMenuItemView", - "lineno": 7, + }, { + "filename": "View.java", + "function": "run", + "module": "android.view.View$PerformClick", + "lineno": 19866, "index": 10 - }, { - "filename": "ActionMenuView.java", - "function": "invokeItem", - "module": "androidx.appcompat.widget.ActionMenuView", - "lineno": 4, + }, { + "filename": "Handler.java", + "function": "handleCallback", + "module": "android.os.Handler", + "lineno": 739, "index": 11 - }, { - "filename": "MenuBuilder.java", - "function": "performItemAction", - "module": "androidx.appcompat.view.menu.MenuBuilder", - "lineno": 1, + }, { + "filename": "Handler.java", + "function": "dispatchMessage", + "module": "android.os.Handler", + "lineno": 95, "index": 12 - }, { - "filename": "MenuBuilder.java", - "function": "performItemAction", - "module": "androidx.appcompat.view.menu.MenuBuilder", - "lineno": 4, + }, { + "filename": "Looper.java", + "function": "loop", + "module": "android.os.Looper", + "lineno": 135, "index": 13 - }, { - "filename": "MenuItemImpl.java", - "function": "invoke", - "module": "androidx.appcompat.view.menu.MenuItemImpl", - "lineno": 15, + }, { + "filename": "ActivityThread.java", + "function": "main", + "module": "android.app.ActivityThread", + "lineno": 5254, "index": 14 - }, { - "filename": "MenuBuilder.java", - "function": "dispatchMenuItemSelected", - "module": "androidx.appcompat.view.menu.MenuBuilder", - "lineno": 5, + }, { + "filename": "Method.java", + "function": "invoke", + "module": "java.lang.reflect.Method", "index": 15 - }, { - "filename": "ActionMenuView.java", - "function": "onMenuItemSelected", - "module": "androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback", - "lineno": 7, + }, { + "filename": "Method.java", + "function": "invoke", + "module": "java.lang.reflect.Method", + "lineno": 372, "index": 16 - }, { - "filename": "Toolbar.java", - "function": "onMenuItemClick", - "module": "androidx.appcompat.widget.Toolbar$1", - "lineno": 7, + }, { + "filename": "ZygoteInit.java", + "function": "run", + "module": "com.android.internal.os.ZygoteInit$MethodAndArgsCaller", + "lineno": 903, "index": 17 - }, { - "filename": "R8$$SyntheticClass", - "function": "onMenuItemClick", - "module": "io.sentry.samples.instrumentation.ui.g", - "lineno": 40, - "in_app": true, + }, { + "filename": "ZygoteInit.java", + "function": "main", + "module": "com.android.internal.os.ZygoteInit", + "lineno": 698, "index": 18 - }]"#; + }]"#; let modules = format!( r#"[{{ diff --git a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__basic_source_lookup.snap b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__basic_source_lookup.snap index 8cfd0b992..1dfd7bbab 100644 --- a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__basic_source_lookup.snap +++ b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__basic_source_lookup.snap @@ -7,54 +7,43 @@ exceptions: module: io.sentry.samples stacktraces: - frames: - - function: otherMethod - filename: OtherActivity.java - module: OtherActivity - abs_path: OtherActivity.java - lineno: 100 - index: 0 - - function: differentMethod - filename: DifferentActivity - module: DifferentActivity - abs_path: DifferentActivity - lineno: 200 - index: 1 - - function: onCreate - module: io.sentry.samples.MainActivity - lineno: 11 + - function: whoops4 + filename: SourceFile + module: io.sentry.samples.MainActivity$OneMoreInnerClass + abs_path: SourceFile + lineno: 38 pre_context: + - " }" + - " }" - "" - - "class MainActivity : ComponentActivity() {" - - " override fun onCreate(savedInstanceState: Bundle?) {" - - " super.onCreate(savedInstanceState)" - - " setContentView(R.layout.activity_main)" - context_line: " InnerClass().whoops()" + - " class OneMoreInnerClass {" + - " fun whoops4() {" + context_line: " throw RuntimeException(\"whoops\")" post_context: - - "" - - " val list = findViewById(R.id.list)" - - " list.layoutManager = LinearLayoutManager(this)" - - " list.adapter = TrackAdapter()" + - " }" - " }" - index: 2 - - function: whoops + - "}" + - "" + index: 0 + - function: whoops3 filename: MainActivity.kt - module: io.sentry.samples.MainActivity$InnerClass + module: io.sentry.samples.MainActivity$AdditionalInnerClass abs_path: MainActivity.kt - lineno: 20 + lineno: 32 pre_context: - - " list.adapter = TrackAdapter()" + - " }" - " }" - "" - - " class InnerClass {" - - " fun whoops() {" - context_line: " AnotherInnerClass().whoops2()" + - " class AdditionalInnerClass {" + - " fun whoops3() {" + context_line: " OneMoreInnerClass().whoops4()" post_context: - " }" - " }" - "" - - " class AnotherInnerClass {" - - " fun whoops2() {" - index: 3 + - " class OneMoreInnerClass {" + - " fun whoops4() {" + index: 1 - function: whoops2 module: io.sentry.samples.MainActivity$AnotherInnerClass lineno: 26 @@ -71,43 +60,54 @@ stacktraces: - "" - " class AdditionalInnerClass {" - " fun whoops3() {" - index: 4 - - function: whoops3 + index: 2 + - function: whoops filename: MainActivity.kt - module: io.sentry.samples.MainActivity$AdditionalInnerClass + module: io.sentry.samples.MainActivity$InnerClass abs_path: MainActivity.kt - lineno: 32 + lineno: 20 pre_context: - - " }" + - " list.adapter = TrackAdapter()" - " }" - "" - - " class AdditionalInnerClass {" - - " fun whoops3() {" - context_line: " OneMoreInnerClass().whoops4()" + - " class InnerClass {" + - " fun whoops() {" + context_line: " AnotherInnerClass().whoops2()" post_context: - " }" - " }" - "" - - " class OneMoreInnerClass {" - - " fun whoops4() {" - index: 5 - - function: whoops4 - filename: SourceFile - module: io.sentry.samples.MainActivity$OneMoreInnerClass - abs_path: SourceFile - lineno: 38 + - " class AnotherInnerClass {" + - " fun whoops2() {" + index: 3 + - function: onCreate + module: io.sentry.samples.MainActivity + lineno: 11 pre_context: - - " }" - - " }" - "" - - " class OneMoreInnerClass {" - - " fun whoops4() {" - context_line: " throw RuntimeException(\"whoops\")" + - "class MainActivity : ComponentActivity() {" + - " override fun onCreate(savedInstanceState: Bundle?) {" + - " super.onCreate(savedInstanceState)" + - " setContentView(R.layout.activity_main)" + context_line: " InnerClass().whoops()" post_context: - - " }" - - " }" - - "}" - "" + - " val list = findViewById(R.id.list)" + - " list.layoutManager = LinearLayoutManager(this)" + - " list.adapter = TrackAdapter()" + - " }" + index: 4 + - function: differentMethod + filename: DifferentActivity + module: DifferentActivity + abs_path: DifferentActivity + lineno: 200 + index: 5 + - function: otherMethod + filename: OtherActivity.java + module: OtherActivity + abs_path: OtherActivity.java + lineno: 100 index: 6 classes: {} errors: [] diff --git a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__resolving_inline.snap b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__resolving_inline.snap index 6d76ef6a2..005eed333 100644 --- a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__resolving_inline.snap +++ b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__resolving_inline.snap @@ -11,20 +11,20 @@ stacktraces: module: io.sentry.sample.-$$Lambda$r3Avcbztes2hicEObh02jjhQqd4 lineno: 2 index: 0 - - function: onClickHandler + - function: bar filename: MainActivity.java module: io.sentry.sample.MainActivity - lineno: 40 + lineno: 54 index: 1 - function: foo filename: MainActivity.java module: io.sentry.sample.MainActivity lineno: 44 index: 1 - - function: bar + - function: onClickHandler filename: MainActivity.java module: io.sentry.sample.MainActivity - lineno: 54 + lineno: 40 index: 1 classes: {} errors: [] diff --git a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__source_lookup_with_proguard.snap b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__source_lookup_with_proguard.snap index b9a41e562..446723357 100644 --- a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__source_lookup_with_proguard.snap +++ b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__source_lookup_with_proguard.snap @@ -7,122 +7,43 @@ exceptions: module: java.lang stacktraces: - frames: - - function: main - filename: ZygoteInit.java - module: com.android.internal.os.ZygoteInit - lineno: 698 + - function: helloOtherInner + filename: R8$$SyntheticClass + module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile$AnotherInnerClass + lineno: 26 + in_app: true index: 0 - - function: run - filename: ZygoteInit.java - module: com.android.internal.os.ZygoteInit$MethodAndArgsCaller - lineno: 903 - index: 1 - - function: invoke - filename: Method.java - module: java.lang.reflect.Method - lineno: 372 - index: 2 - - function: invoke - filename: Method.java - module: java.lang.reflect.Method - index: 3 - - function: main - filename: ActivityThread.java - module: android.app.ActivityThread - lineno: 5254 - index: 4 - - function: loop - filename: Looper.java - module: android.os.Looper - lineno: 135 - index: 5 - - function: dispatchMessage - filename: Handler.java - module: android.os.Handler - lineno: 95 - index: 6 - - function: handleCallback - filename: Handler.java - module: android.os.Handler - lineno: 739 - index: 7 - - function: run - filename: View.java - module: android.view.View$PerformClick - lineno: 19866 - index: 8 - - function: performClick - filename: View.java - module: android.view.View - lineno: 4780 - index: 9 - - function: onClick - filename: ActionMenuItemView.java - module: androidx.appcompat.view.menu.ActionMenuItemView - lineno: 7 - index: 10 - - function: invokeItem - filename: ActionMenuView.java - module: androidx.appcompat.widget.ActionMenuView - lineno: 4 - index: 11 - - function: performItemAction - filename: MenuBuilder.java - module: androidx.appcompat.view.menu.MenuBuilder - lineno: 1 - index: 12 - - function: performItemAction - filename: MenuBuilder.java - module: androidx.appcompat.view.menu.MenuBuilder - lineno: 4 - index: 13 - - function: invoke - filename: MenuItemImpl.java - module: androidx.appcompat.view.menu.MenuItemImpl - lineno: 15 - index: 14 - - function: dispatchMenuItemSelected - filename: MenuBuilder.java - module: androidx.appcompat.view.menu.MenuBuilder - lineno: 5 - index: 15 - - function: onMenuItemSelected - filename: ActionMenuView.java - module: androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback - lineno: 7 - index: 16 - - function: onMenuItemClick - filename: Toolbar.java - module: androidx.appcompat.widget.Toolbar$1 - lineno: 7 - index: 17 - - function: onMenuItemClick + - function: otherFun filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.EditActivity$$InternalSyntheticLambda$1$ebaa538726b99bb77e0f5e7c86443911af17d6e5be2b8771952ae0caa4ff2ac7$0 - lineno: 0 + module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile + lineno: 21 in_app: true - index: 18 - method_synthesized: true - - function: onCreate$lambda-1 - filename: EditActivity.kt - module: io.sentry.samples.instrumentation.ui.EditActivity - abs_path: EditActivity.kt - lineno: 37 + index: 0 + - function: helloOther + filename: R8$$SyntheticClass + module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile + lineno: 17 + in_app: true + index: 0 + - function: helloInner + filename: R8$$SyntheticClass + module: io.sentry.samples.instrumentation.ui.SomeService$InnerClassOfSomeService + lineno: 10 pre_context: - - " }" + - " InnerClassOfSomeService().helloInner()" + - " }" - "" - - " findViewById(R.id.toolbar).setOnMenuItemClickListener {" - - " if (it.itemId == R.id.action_save) {" - - " try {" - context_line: " SomeService().helloThere()" + - " class InnerClassOfSomeService {" + - " fun helloInner() {" + context_line: " AnotherClassInSameFile().helloOther()" post_context: - - " } catch (e: Exception) {" - - " Sentry.captureException(e)" - - " }" + - " }" + - " }" + - "}" - "" - - " val transaction = Sentry.startTransaction(" + - "class AnotherClassInSameFile {" in_app: true - index: 18 + index: 0 - function: helloThere filename: R8$$SyntheticClass module: io.sentry.samples.instrumentation.ui.SomeService @@ -140,43 +61,122 @@ stacktraces: - " fun helloInner() {" - " AnotherClassInSameFile().helloOther()" in_app: true - index: 18 - - function: helloInner - filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.SomeService$InnerClassOfSomeService - lineno: 10 + index: 0 + - function: onCreate$lambda-1 + filename: EditActivity.kt + module: io.sentry.samples.instrumentation.ui.EditActivity + abs_path: EditActivity.kt + lineno: 37 pre_context: - - " InnerClassOfSomeService().helloInner()" - - " }" + - " }" - "" - - " class InnerClassOfSomeService {" - - " fun helloInner() {" - context_line: " AnotherClassInSameFile().helloOther()" + - " findViewById(R.id.toolbar).setOnMenuItemClickListener {" + - " if (it.itemId == R.id.action_save) {" + - " try {" + context_line: " SomeService().helloThere()" post_context: - - " }" - - " }" - - "}" + - " } catch (e: Exception) {" + - " Sentry.captureException(e)" + - " }" - "" - - "class AnotherClassInSameFile {" - in_app: true - index: 18 - - function: helloOther - filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile - lineno: 17 - in_app: true - index: 18 - - function: otherFun - filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile - lineno: 21 + - " val transaction = Sentry.startTransaction(" in_app: true - index: 18 - - function: helloOtherInner + index: 0 + - function: onMenuItemClick filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile$AnotherInnerClass - lineno: 26 + module: io.sentry.samples.instrumentation.ui.EditActivity$$InternalSyntheticLambda$1$ebaa538726b99bb77e0f5e7c86443911af17d6e5be2b8771952ae0caa4ff2ac7$0 + lineno: 0 in_app: true + index: 0 + method_synthesized: true + - function: onMenuItemClick + filename: Toolbar.java + module: androidx.appcompat.widget.Toolbar$1 + lineno: 7 + index: 1 + - function: onMenuItemSelected + filename: ActionMenuView.java + module: androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback + lineno: 7 + index: 2 + - function: dispatchMenuItemSelected + filename: MenuBuilder.java + module: androidx.appcompat.view.menu.MenuBuilder + lineno: 5 + index: 3 + - function: invoke + filename: MenuItemImpl.java + module: androidx.appcompat.view.menu.MenuItemImpl + lineno: 15 + index: 4 + - function: performItemAction + filename: MenuBuilder.java + module: androidx.appcompat.view.menu.MenuBuilder + lineno: 4 + index: 5 + - function: performItemAction + filename: MenuBuilder.java + module: androidx.appcompat.view.menu.MenuBuilder + lineno: 1 + index: 6 + - function: invokeItem + filename: ActionMenuView.java + module: androidx.appcompat.widget.ActionMenuView + lineno: 4 + index: 7 + - function: onClick + filename: ActionMenuItemView.java + module: androidx.appcompat.view.menu.ActionMenuItemView + lineno: 7 + index: 8 + - function: performClick + filename: View.java + module: android.view.View + lineno: 4780 + index: 9 + - function: run + filename: View.java + module: android.view.View$PerformClick + lineno: 19866 + index: 10 + - function: handleCallback + filename: Handler.java + module: android.os.Handler + lineno: 739 + index: 11 + - function: dispatchMessage + filename: Handler.java + module: android.os.Handler + lineno: 95 + index: 12 + - function: loop + filename: Looper.java + module: android.os.Looper + lineno: 135 + index: 13 + - function: main + filename: ActivityThread.java + module: android.app.ActivityThread + lineno: 5254 + index: 14 + - function: invoke + filename: Method.java + module: java.lang.reflect.Method + index: 15 + - function: invoke + filename: Method.java + module: java.lang.reflect.Method + lineno: 372 + index: 16 + - function: run + filename: ZygoteInit.java + module: com.android.internal.os.ZygoteInit$MethodAndArgsCaller + lineno: 903 + index: 17 + - function: main + filename: ZygoteInit.java + module: com.android.internal.os.ZygoteInit + lineno: 698 index: 18 classes: {} errors: diff --git a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs index 59af49432..3352f7ab9 100644 --- a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs +++ b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs @@ -64,13 +64,17 @@ pub async fn handle_symbolication_request( platform, sources, exceptions, - stacktraces, + mut stacktraces, modules, release_package, classes, options, } = body; + // Sentry sends stacktraces in "Sentry order" (innermost frame at the end). We want them + // in "Symbolicator order" (innermost frame at the front). + stacktraces.iter_mut().for_each(|st| st.frames.reverse()); + let request_id = service.symbolicate_jvm_stacktraces(SymbolicateJvmStacktraces { platform, scope: params.scope, diff --git a/crates/symbolicator/src/service.rs b/crates/symbolicator/src/service.rs index 6318c8cd1..f2adc6eb1 100644 --- a/crates/symbolicator/src/service.rs +++ b/crates/symbolicator/src/service.rs @@ -316,9 +316,14 @@ impl RequestService { "symbolicate_jvm", RequestOptions::default(), async move { - Ok(CompletedResponse::Jvm( - slf.jvm.symbolicate_jvm(request).await, - )) + let mut response = slf.jvm.symbolicate_jvm(request).await; + + // Sentry expects stacktraces in "Sentry order" (innermost frame at the end). + response + .stacktraces + .iter_mut() + .for_each(|st| st.frames.reverse()); + Ok(CompletedResponse::Jvm(response)) }, ) } From a8858b62ea59ef4f40007cccff4f88322503b43f Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 11:14:03 +0100 Subject: [PATCH 02/24] Remove for_each --- crates/symbolicator/src/endpoints/symbolicate_jvm.rs | 4 +++- crates/symbolicator/src/service.rs | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs index 3352f7ab9..82e622345 100644 --- a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs +++ b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs @@ -73,7 +73,9 @@ pub async fn handle_symbolication_request( // Sentry sends stacktraces in "Sentry order" (innermost frame at the end). We want them // in "Symbolicator order" (innermost frame at the front). - stacktraces.iter_mut().for_each(|st| st.frames.reverse()); + for st in &mut stacktraces { + st.frames.reverse(); + } let request_id = service.symbolicate_jvm_stacktraces(SymbolicateJvmStacktraces { platform, diff --git a/crates/symbolicator/src/service.rs b/crates/symbolicator/src/service.rs index f2adc6eb1..00fd7d456 100644 --- a/crates/symbolicator/src/service.rs +++ b/crates/symbolicator/src/service.rs @@ -319,10 +319,10 @@ impl RequestService { let mut response = slf.jvm.symbolicate_jvm(request).await; // Sentry expects stacktraces in "Sentry order" (innermost frame at the end). - response - .stacktraces - .iter_mut() - .for_each(|st| st.frames.reverse()); + for st in &mut response.stacktraces { + st.frames.reverse(); + } + Ok(CompletedResponse::Jvm(response)) }, ) From 1364145e1d4250b530bb866e0bed0c6e748702e4 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 12:53:59 +0100 Subject: [PATCH 03/24] Add StacktraceOrder --- crates/symbolicator-proguard/src/interface.rs | 14 +++++++++++++ .../src/symbolication.rs | 20 ++++++++++++++++--- .../tests/integration/proguard.rs | 3 ++- .../src/endpoints/symbolicate_jvm.rs | 14 ++++++------- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/crates/symbolicator-proguard/src/interface.rs b/crates/symbolicator-proguard/src/interface.rs index 079933bb5..08f4b481e 100644 --- a/crates/symbolicator-proguard/src/interface.rs +++ b/crates/symbolicator-proguard/src/interface.rs @@ -38,6 +38,8 @@ pub struct SymbolicateJvmStacktraces { pub release_package: Option, /// An list of additional class names that should be remapped. pub classes: Vec>, + /// The order of frames within stacktraces (innermost frame first or last). + pub stacktrace_order: StacktraceOrder, } /// A stack frame in a JVM stacktrace. @@ -126,6 +128,18 @@ pub struct JvmException { pub module: String, } +/// The order in which stacktraces are received by Symbolicator and returned +/// to the caller. +#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum StacktraceOrder { + /// The innermost frame is at the beginning of the stacktrace. + Symbolicator, + /// The innermost frame is at the end of the stacktrace. + #[default] + Sentry, +} + /// A JVM stacktrace. #[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq)] pub struct JvmStacktrace { diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 75c02c0b9..0c372a449 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use crate::ProguardService; use crate::interface::{ CompletedJvmSymbolicationResponse, JvmException, JvmFrame, JvmModuleType, JvmStacktrace, - ProguardError, ProguardErrorKind, SymbolicateJvmStacktraces, + ProguardError, ProguardErrorKind, StacktraceOrder, SymbolicateJvmStacktraces, }; use crate::metrics::{SymbolicationStats, record_symbolication_metrics}; @@ -33,11 +33,12 @@ impl ProguardService { scope, sources, exceptions, - stacktraces, + mut stacktraces, modules, release_package, apply_source_context, classes, + stacktrace_order, } = request; let mut stats = SymbolicationStats::default(); @@ -132,10 +133,18 @@ impl ProguardService { ) .collect(); + if stacktrace_order == StacktraceOrder::Sentry { + // Sentry sent the stacktraces in "Sentry order" (innermost frame at the end). We want them + // in "Symbolicator order" (innermost frame at the front). + for st in &mut stacktraces { + st.frames.reverse(); + } + } + let mut remapped_stacktraces: Vec<_> = stacktraces .into_iter() .map(|raw_stacktrace| { - let remapped_frames = raw_stacktrace + let mut remapped_frames: Vec<_> = raw_stacktrace .frames .iter() .flat_map(|frame| { @@ -144,6 +153,11 @@ impl ProguardService { }) .collect(); + if stacktrace_order == StacktraceOrder::Sentry { + // Sentry expects the stacktraces back in "Sentry order" (innermost frame at the end). + remapped_frames.reverse(); + } + JvmStacktrace { frames: remapped_frames, } diff --git a/crates/symbolicator-proguard/tests/integration/proguard.rs b/crates/symbolicator-proguard/tests/integration/proguard.rs index 180c61aaf..11219bb59 100644 --- a/crates/symbolicator-proguard/tests/integration/proguard.rs +++ b/crates/symbolicator-proguard/tests/integration/proguard.rs @@ -4,7 +4,7 @@ use std::{collections::HashMap, str::FromStr}; use serde_json::json; use symbolic::common::{DebugId, Uuid}; use symbolicator_proguard::interface::{ - JvmFrame, JvmModule, JvmStacktrace, SymbolicateJvmStacktraces, + JvmFrame, JvmModule, JvmStacktrace, StacktraceOrder, SymbolicateJvmStacktraces, }; use symbolicator_service::types::Scope; use symbolicator_sources::{SentrySourceConfig, SourceConfig}; @@ -35,6 +35,7 @@ fn make_jvm_request( stacktraces, modules, classes: Vec::new(), + stacktrace_order: StacktraceOrder::Symbolicator, } } diff --git a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs index 82e622345..185d7476d 100644 --- a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs +++ b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use axum::{Json, extract}; use serde::{Deserialize, Serialize}; use symbolicator_proguard::interface::{ - JvmException, JvmModule, JvmStacktrace, SymbolicateJvmStacktraces, + JvmException, JvmModule, JvmStacktrace, StacktraceOrder, SymbolicateJvmStacktraces, }; use symbolicator_service::types::Platform; use symbolicator_sources::SourceConfig; @@ -37,6 +37,8 @@ pub struct JvmRequestOptions { /// Whether to apply source context for the stack frames. #[serde(default = "default_apply_source_context")] pub apply_source_context: bool, + #[serde(default)] + pub stacktrace_order: StacktraceOrder, } fn default_apply_source_context() -> bool { @@ -47,6 +49,7 @@ impl Default for JvmRequestOptions { fn default() -> Self { Self { apply_source_context: true, + stacktrace_order: Default::default(), } } } @@ -64,19 +67,13 @@ pub async fn handle_symbolication_request( platform, sources, exceptions, - mut stacktraces, + stacktraces, modules, release_package, classes, options, } = body; - // Sentry sends stacktraces in "Sentry order" (innermost frame at the end). We want them - // in "Symbolicator order" (innermost frame at the front). - for st in &mut stacktraces { - st.frames.reverse(); - } - let request_id = service.symbolicate_jvm_stacktraces(SymbolicateJvmStacktraces { platform, scope: params.scope, @@ -87,6 +84,7 @@ pub async fn handle_symbolication_request( release_package, classes, apply_source_context: options.apply_source_context, + stacktrace_order: options.stacktrace_order, })?; match service.get_response(request_id, params.timeout).await { From df174137a25ced98064af558acebd7c17221179c Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 13:34:17 +0100 Subject: [PATCH 04/24] Rename variants --- crates/symbolicator-proguard/src/interface.rs | 16 +++++++++------- .../symbolicator-proguard/src/symbolication.rs | 10 +++++----- .../tests/integration/proguard.rs | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/crates/symbolicator-proguard/src/interface.rs b/crates/symbolicator-proguard/src/interface.rs index 08f4b481e..e2a2f1896 100644 --- a/crates/symbolicator-proguard/src/interface.rs +++ b/crates/symbolicator-proguard/src/interface.rs @@ -24,9 +24,6 @@ pub struct SymbolicateJvmStacktraces { /// The exceptions to symbolicate/remap. pub exceptions: Vec, /// The list of stacktraces to symbolicate/remap. - /// - /// Stacktraces are expected in "Symbolicator order", i.e. with the - /// innermost frame being at the start of the trace. pub stacktraces: Vec, /// A list of proguard files to use for remapping. pub modules: Vec, @@ -133,11 +130,16 @@ pub struct JvmException { #[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] pub enum StacktraceOrder { - /// The innermost frame is at the beginning of the stacktrace. - Symbolicator, - /// The innermost frame is at the end of the stacktrace. + /// Callee frames come before caller frames. + /// + /// This means that the innermost frame is at the beginning of the stacktrace. + CalleeFirst, + /// Caller frames come before callee frames. + /// + /// This means that the innermost frame is at the end of the stacktrace. This is + /// how stacktraces are stored in Sentry events. #[default] - Sentry, + CallerFirst, } /// A JVM stacktrace. diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 0c372a449..2b17e6edb 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -133,9 +133,9 @@ impl ProguardService { ) .collect(); - if stacktrace_order == StacktraceOrder::Sentry { - // Sentry sent the stacktraces in "Sentry order" (innermost frame at the end). We want them - // in "Symbolicator order" (innermost frame at the front). + if stacktrace_order == StacktraceOrder::CallerFirst { + // Sentry sent the stacktraces in "caller first" order. We want them + // in "callee first" order. for st in &mut stacktraces { st.frames.reverse(); } @@ -153,8 +153,8 @@ impl ProguardService { }) .collect(); - if stacktrace_order == StacktraceOrder::Sentry { - // Sentry expects the stacktraces back in "Sentry order" (innermost frame at the end). + if stacktrace_order == StacktraceOrder::CallerFirst { + // Sentry expects the stacktraces back in "caller first" order. remapped_frames.reverse(); } diff --git a/crates/symbolicator-proguard/tests/integration/proguard.rs b/crates/symbolicator-proguard/tests/integration/proguard.rs index 11219bb59..892526674 100644 --- a/crates/symbolicator-proguard/tests/integration/proguard.rs +++ b/crates/symbolicator-proguard/tests/integration/proguard.rs @@ -35,7 +35,7 @@ fn make_jvm_request( stacktraces, modules, classes: Vec::new(), - stacktrace_order: StacktraceOrder::Symbolicator, + stacktrace_order: StacktraceOrder::CalleeFirst, } } From 5786a5af13006b884313f2d1b55c35df22566b56 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 14:28:34 +0100 Subject: [PATCH 05/24] Rename StacktraceOrder to FrameOrder and move --- crates/symbolicator-proguard/src/interface.rs | 21 ++----------------- .../src/symbolication.rs | 11 +++++----- .../tests/integration/proguard.rs | 6 +++--- crates/symbolicator-service/src/types.rs | 17 +++++++++++++++ .../src/endpoints/symbolicate_jvm.rs | 11 +++++----- docs/api/symbolicate-jvm.md | 6 ++++-- 6 files changed, 38 insertions(+), 34 deletions(-) diff --git a/crates/symbolicator-proguard/src/interface.rs b/crates/symbolicator-proguard/src/interface.rs index e2a2f1896..f9f1b0309 100644 --- a/crates/symbolicator-proguard/src/interface.rs +++ b/crates/symbolicator-proguard/src/interface.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, fmt}; use serde::{Deserialize, Serialize}; use symbolic::common::DebugId; -use symbolicator_service::types::{Platform, Scope}; +use symbolicator_service::types::{FrameOrder, Platform, Scope}; use symbolicator_sources::SourceConfig; /// A request for symbolication/remapping of a JVM event. @@ -36,7 +36,7 @@ pub struct SymbolicateJvmStacktraces { /// An list of additional class names that should be remapped. pub classes: Vec>, /// The order of frames within stacktraces (innermost frame first or last). - pub stacktrace_order: StacktraceOrder, + pub frame_order: FrameOrder, } /// A stack frame in a JVM stacktrace. @@ -125,23 +125,6 @@ pub struct JvmException { pub module: String, } -/// The order in which stacktraces are received by Symbolicator and returned -/// to the caller. -#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum StacktraceOrder { - /// Callee frames come before caller frames. - /// - /// This means that the innermost frame is at the beginning of the stacktrace. - CalleeFirst, - /// Caller frames come before callee frames. - /// - /// This means that the innermost frame is at the end of the stacktrace. This is - /// how stacktraces are stored in Sentry events. - #[default] - CallerFirst, -} - /// A JVM stacktrace. #[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq)] pub struct JvmStacktrace { diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 2b17e6edb..5982689f1 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use crate::ProguardService; use crate::interface::{ CompletedJvmSymbolicationResponse, JvmException, JvmFrame, JvmModuleType, JvmStacktrace, - ProguardError, ProguardErrorKind, StacktraceOrder, SymbolicateJvmStacktraces, + ProguardError, ProguardErrorKind, SymbolicateJvmStacktraces, }; use crate::metrics::{SymbolicationStats, record_symbolication_metrics}; @@ -12,6 +12,7 @@ use symbolic::debuginfo::ObjectDebugSession; use symbolic::debuginfo::sourcebundle::SourceBundleDebugSession; use symbolicator_service::caching::CacheError; use symbolicator_service::source_context::get_context_lines; +use symbolicator_service::types::FrameOrder; impl ProguardService { /// Symbolicates a JVM event. @@ -38,7 +39,7 @@ impl ProguardService { release_package, apply_source_context, classes, - stacktrace_order, + frame_order, } = request; let mut stats = SymbolicationStats::default(); @@ -133,8 +134,8 @@ impl ProguardService { ) .collect(); - if stacktrace_order == StacktraceOrder::CallerFirst { - // Sentry sent the stacktraces in "caller first" order. We want them + if frame_order == FrameOrder::CallerFirst { + // Stacktraces were sent in "caller first" order. We want to process them // in "callee first" order. for st in &mut stacktraces { st.frames.reverse(); @@ -153,7 +154,7 @@ impl ProguardService { }) .collect(); - if stacktrace_order == StacktraceOrder::CallerFirst { + if frame_order == FrameOrder::CallerFirst { // Sentry expects the stacktraces back in "caller first" order. remapped_frames.reverse(); } diff --git a/crates/symbolicator-proguard/tests/integration/proguard.rs b/crates/symbolicator-proguard/tests/integration/proguard.rs index 892526674..55772d095 100644 --- a/crates/symbolicator-proguard/tests/integration/proguard.rs +++ b/crates/symbolicator-proguard/tests/integration/proguard.rs @@ -4,9 +4,9 @@ use std::{collections::HashMap, str::FromStr}; use serde_json::json; use symbolic::common::{DebugId, Uuid}; use symbolicator_proguard::interface::{ - JvmFrame, JvmModule, JvmStacktrace, StacktraceOrder, SymbolicateJvmStacktraces, + JvmFrame, JvmModule, JvmStacktrace, SymbolicateJvmStacktraces, }; -use symbolicator_service::types::Scope; +use symbolicator_service::types::{FrameOrder, Scope}; use symbolicator_sources::{SentrySourceConfig, SourceConfig}; use symbolicator_test::assert_snapshot; @@ -35,7 +35,7 @@ fn make_jvm_request( stacktraces, modules, classes: Vec::new(), - stacktrace_order: StacktraceOrder::CalleeFirst, + frame_order: FrameOrder::CalleeFirst, } } diff --git a/crates/symbolicator-service/src/types.rs b/crates/symbolicator-service/src/types.rs index a540a20a1..64013912c 100644 --- a/crates/symbolicator-service/src/types.rs +++ b/crates/symbolicator-service/src/types.rs @@ -311,3 +311,20 @@ impl fmt::Display for Platform { self.as_ref().fmt(f) } } + +/// The order in which stack frames are received by Symbolicator and returned +/// to the caller. +#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum FrameOrder { + /// Callee frames come before caller frames. + /// + /// This means that the innermost frame is at the beginning of the stacktrace. + CalleeFirst, + /// Caller frames come before callee frames. + /// + /// This means that the innermost frame is at the end of the stacktrace. This is + /// how stacktraces are stored in Sentry events. + #[default] + CallerFirst, +} diff --git a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs index 185d7476d..8f163b86c 100644 --- a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs +++ b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs @@ -3,9 +3,9 @@ use std::sync::Arc; use axum::{Json, extract}; use serde::{Deserialize, Serialize}; use symbolicator_proguard::interface::{ - JvmException, JvmModule, JvmStacktrace, StacktraceOrder, SymbolicateJvmStacktraces, + JvmException, JvmModule, JvmStacktrace, SymbolicateJvmStacktraces, }; -use symbolicator_service::types::Platform; +use symbolicator_service::types::{FrameOrder, Platform}; use symbolicator_sources::SourceConfig; use crate::service::{RequestService, SymbolicationResponse}; @@ -37,8 +37,9 @@ pub struct JvmRequestOptions { /// Whether to apply source context for the stack frames. #[serde(default = "default_apply_source_context")] pub apply_source_context: bool, + /// The order in which stack frames are received by Symbolicator and returned to the caller. #[serde(default)] - pub stacktrace_order: StacktraceOrder, + pub frame_order: FrameOrder, } fn default_apply_source_context() -> bool { @@ -49,7 +50,7 @@ impl Default for JvmRequestOptions { fn default() -> Self { Self { apply_source_context: true, - stacktrace_order: Default::default(), + frame_order: Default::default(), } } } @@ -84,7 +85,7 @@ pub async fn handle_symbolication_request( release_package, classes, apply_source_context: options.apply_source_context, - stacktrace_order: options.stacktrace_order, + frame_order: options.frame_order, })?; match service.get_response(request_id, params.timeout).await { diff --git a/docs/api/symbolicate-jvm.md b/docs/api/symbolicate-jvm.md index 2eb743255..2cc0baac6 100644 --- a/docs/api/symbolicate-jvm.md +++ b/docs/api/symbolicate-jvm.md @@ -52,7 +52,8 @@ Content-Type: application/json "release_package": "some_release", "classes": [], "options": { - "apply_source_context": true + "apply_source_context": true, + "frame_order": "callee_first" } } @@ -76,11 +77,12 @@ Content-Type: application/json were loaded during JVM code execution. The list is handled by the Sentry source. - `stacktrace`: A list of stacktraces to symbolicate. - `frames`: A list of frames with corresponding `abs_path`, `lineno`, - and other optional fields like `colno` or minified `function` name. + and other optional fields like `colno` or minified `function` name. This list is assumed to be ordered according to the `frame_order` option (see below). - `release_package`: Name of Sentry `release` for the processed request. - `classes`: A list of classes which will have their names remapped and returned in the form of a map. Allows for deobfuscation of view hierarchies. - `options`: Symbolication-specific options which control the endpoint's behavior. - `apply_source_context`: Whether to apply source context for the stack frames. + - `frame_order`: How stack frames are ordered. The possible values are `"callee_first"` and `"caller_first"`. The default is `"caller_first"`. Frames in the response will be ordered the same way. ## Response From 8a066672524fe036d193480929a73f72a7dc3d2d Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 14:53:18 +0100 Subject: [PATCH 06/24] Use FrameOrder in native symbolication --- crates/symbolicator-native/src/interface.rs | 4 +++- .../src/symbolication/apple.rs | 3 ++- .../src/symbolication/process_minidump.rs | 3 ++- .../src/symbolication/symbolicate.rs | 20 +++++++++++++++++-- .../tests/integration/utils.rs | 3 ++- crates/symbolicator-stress/src/workloads.rs | 3 ++- .../symbolicator/src/endpoints/symbolicate.rs | 1 + crates/symbolicator/src/service.rs | 11 ++++++++-- crates/symbolicli/src/main.rs | 5 ++++- docs/api/symbolication.md | 15 +++++++++++++- 10 files changed, 57 insertions(+), 11 deletions(-) diff --git a/crates/symbolicator-native/src/interface.rs b/crates/symbolicator-native/src/interface.rs index 4883ba604..3bbbb7fe4 100644 --- a/crates/symbolicator-native/src/interface.rs +++ b/crates/symbolicator-native/src/interface.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; use symbolic::common::{Arch, CodeId, DebugId, Language}; use symbolicator_service::objects::{AllObjectCandidates, ObjectFeatures}; use symbolicator_service::types::{ - ObjectFileStatus, Platform, RawObjectInfo, Scope, ScrapingConfig, + FrameOrder, ObjectFileStatus, Platform, RawObjectInfo, Scope, ScrapingConfig, }; use symbolicator_service::utils::hex::HexValue; use symbolicator_sources::SourceConfig; @@ -64,6 +64,8 @@ pub struct SymbolicateStacktraces { /// Rules for rewriting the debug file of the first (lowest-address) module /// in the request. pub rewrite_first_module: RewriteRules, + /// The order of frames within stacktraces (innermost frame first or last). + pub frame_order: FrameOrder, } /// Location of an attachment file, such as a minidump. diff --git a/crates/symbolicator-native/src/symbolication/apple.rs b/crates/symbolicator-native/src/symbolication/apple.rs index 3ae998e61..afe51d8e3 100644 --- a/crates/symbolicator-native/src/symbolication/apple.rs +++ b/crates/symbolicator-native/src/symbolication/apple.rs @@ -6,7 +6,7 @@ use apple_crash_report_parser::AppleCrashReport; use chrono::{DateTime, Utc}; use regex::Regex; use symbolic::common::{Arch, CodeId, DebugId}; -use symbolicator_service::types::{Platform, RawObjectInfo, Scope, ScrapingConfig}; +use symbolicator_service::types::{FrameOrder, Platform, RawObjectInfo, Scope, ScrapingConfig}; use symbolicator_service::utils::hex::HexValue; use symbolicator_sources::{ObjectType, SourceConfig}; @@ -86,6 +86,7 @@ impl SymbolicationActor { apply_source_context: true, scraping, rewrite_first_module: Default::default(), + frame_order: FrameOrder::CalleeFirst, }; let mut system_info = SystemInfo { diff --git a/crates/symbolicator-native/src/symbolication/process_minidump.rs b/crates/symbolicator-native/src/symbolication/process_minidump.rs index ec3976cad..82ad9c515 100644 --- a/crates/symbolicator-native/src/symbolication/process_minidump.rs +++ b/crates/symbolicator-native/src/symbolication/process_minidump.rs @@ -18,7 +18,7 @@ use sentry::{Hub, SentryFutureExt}; use serde::{Deserialize, Serialize}; use symbolic::common::{Arch, ByteView}; use symbolicator_service::metric; -use symbolicator_service::types::{ObjectFileStatus, RawObjectInfo, Scope}; +use symbolicator_service::types::{FrameOrder, ObjectFileStatus, RawObjectInfo, Scope}; use symbolicator_service::utils::hex::HexValue; use symbolicator_sources::{ObjectId, ObjectType, SourceConfig}; use tokio::sync::Notify; @@ -568,6 +568,7 @@ impl SymbolicationActor { apply_source_context: true, scraping, rewrite_first_module, + frame_order: FrameOrder::CalleeFirst, }; Ok((request, minidump_state)) diff --git a/crates/symbolicator-native/src/symbolication/symbolicate.rs b/crates/symbolicator-native/src/symbolication/symbolicate.rs index 4980d5f44..106ab9ee7 100644 --- a/crates/symbolicator-native/src/symbolication/symbolicate.rs +++ b/crates/symbolicator-native/src/symbolication/symbolicate.rs @@ -7,6 +7,7 @@ use symbolicator_service::caching::CacheError; use symbolicator_service::download::DownloadService; use symbolicator_service::objects::ObjectsActor; use symbolicator_service::services::SharedServices; +use symbolicator_service::types::FrameOrder; use crate::caches::bitcode::BitcodeService; use crate::caches::cficaches::CfiCacheActor; @@ -101,7 +102,7 @@ impl SymbolicationActor { ) -> anyhow::Result { let SymbolicateStacktraces { platform, - stacktraces, + mut stacktraces, sources, scope, signal, @@ -110,9 +111,17 @@ impl SymbolicationActor { apply_source_context, scraping, rewrite_first_module, - .. + frame_order, } = request; + if frame_order == FrameOrder::CallerFirst { + // Stacktraces were sent in "caller first" order. We want to process them + // in "callee first" order. + for st in &mut stacktraces { + st.frames.reverse(); + } + } + let mut module_lookup = ModuleLookup::new(scope.clone(), sources, rewrite_first_module, modules); @@ -147,6 +156,13 @@ impl SymbolicationActor { let modules = module_lookup.into_inner(); record_symbolication_metrics(platform, origin, metrics, &modules, &stacktraces); + if frame_order == FrameOrder::CallerFirst { + // The symbolicated stacktraces are expected in "caller first" order. + for st in &mut stacktraces { + st.frames.reverse(); + } + } + Ok(CompletedSymbolicationResponse { signal, stacktraces, diff --git a/crates/symbolicator-native/tests/integration/utils.rs b/crates/symbolicator-native/tests/integration/utils.rs index 577c524fb..c63ae6fcc 100644 --- a/crates/symbolicator-native/tests/integration/utils.rs +++ b/crates/symbolicator-native/tests/integration/utils.rs @@ -4,7 +4,7 @@ use symbolicator_native::SymbolicationActor; use symbolicator_native::interface::{StacktraceOrigin, SymbolicateStacktraces}; use symbolicator_service::config::Config; use symbolicator_service::services::SharedServices; -use symbolicator_service::types::RawObjectInfo; +use symbolicator_service::types::{FrameOrder, RawObjectInfo}; use symbolicator_sources::SourceConfig; use symbolicator_test as test; @@ -62,6 +62,7 @@ pub fn make_symbolication_request( apply_source_context: true, scraping: Default::default(), rewrite_first_module: Default::default(), + frame_order: FrameOrder::CalleeFirst, } } diff --git a/crates/symbolicator-stress/src/workloads.rs b/crates/symbolicator-stress/src/workloads.rs index 0fd42d5c4..bc83881e0 100644 --- a/crates/symbolicator-stress/src/workloads.rs +++ b/crates/symbolicator-stress/src/workloads.rs @@ -12,7 +12,7 @@ use symbolicator_native::interface::{ AttachmentFile, ProcessMinidump, RawStacktrace, StacktraceOrigin, SymbolicateStacktraces, }; use symbolicator_service::download::SourceConfig; -use symbolicator_service::types::{RawObjectInfo, Scope}; +use symbolicator_service::types::{FrameOrder, RawObjectInfo, Scope}; #[derive(Debug, Deserialize, Serialize)] pub struct WorkloadsConfig { @@ -89,6 +89,7 @@ pub fn prepare_payload( stacktraces, modules, rewrite_first_module: Default::default(), + frame_order: FrameOrder::CallerFirst, }) } Payload::Js { source, event } => { diff --git a/crates/symbolicator/src/endpoints/symbolicate.rs b/crates/symbolicator/src/endpoints/symbolicate.rs index 304916f57..d30185609 100644 --- a/crates/symbolicator/src/endpoints/symbolicate.rs +++ b/crates/symbolicator/src/endpoints/symbolicate.rs @@ -79,6 +79,7 @@ pub async fn symbolicate_frames( apply_source_context: body.options.apply_source_context, scraping: body.scraping, rewrite_first_module: Default::default(), + frame_order: body.options.frame_order, }, body.options, )?; diff --git a/crates/symbolicator/src/service.rs b/crates/symbolicator/src/service.rs index 00fd7d456..be0df1104 100644 --- a/crates/symbolicator/src/service.rs +++ b/crates/symbolicator/src/service.rs @@ -37,7 +37,7 @@ use symbolicator_service::config::Config; use symbolicator_service::metric; use symbolicator_service::objects::ObjectsActor; use symbolicator_service::services::SharedServices; -use symbolicator_service::types::Platform; +use symbolicator_service::types::{FrameOrder, Platform}; use symbolicator_service::utils::futures::CallOnDrop; use symbolicator_service::utils::futures::{m, measure}; use symbolicator_service::utils::sentry::ConfigureScope; @@ -136,6 +136,10 @@ pub struct RequestOptions { /// Whether to apply source context for the stack frames. #[serde(default = "default_apply_source_context")] pub apply_source_context: bool, + + /// The order in which stack frames are received by Symbolicator and returned to the caller. + #[serde(default)] + pub frame_order: FrameOrder, } fn default_apply_source_context() -> bool { @@ -147,6 +151,7 @@ impl Default for RequestOptions { Self { dif_candidates: false, apply_source_context: true, + frame_order: Default::default(), } } } @@ -599,7 +604,7 @@ mod tests { use symbolicator_native::interface::{ CompleteObjectInfo, RawFrame, RawStacktrace, StacktraceOrigin, }; - use symbolicator_service::types::RawObjectInfo; + use symbolicator_service::types::{FrameOrder, RawObjectInfo}; use symbolicator_service::utils::hex::HexValue; use symbolicator_sources::ObjectType; @@ -639,6 +644,7 @@ mod tests { apply_source_context: true, scraping: Default::default(), rewrite_first_module: Default::default(), + frame_order: FrameOrder::CalleeFirst, }; let request_id = service @@ -682,6 +688,7 @@ mod tests { apply_source_context: true, scraping: Default::default(), rewrite_first_module: Default::default(), + frame_order: FrameOrder::CalleeFirst, } } diff --git a/crates/symbolicli/src/main.rs b/crates/symbolicli/src/main.rs index 343d68619..2a36a8c87 100644 --- a/crates/symbolicli/src/main.rs +++ b/crates/symbolicli/src/main.rs @@ -439,7 +439,7 @@ mod event { AddrMode, CompleteObjectInfo, FrameTrust, RawFrame, RawStacktrace, Signal, StacktraceOrigin, SymbolicateStacktraces, }; - use symbolicator_service::types::{Platform, RawObjectInfo, Scope, ScrapingConfig}; + use symbolicator_service::types::{FrameOrder, Platform, RawObjectInfo, Scope, ScrapingConfig}; use symbolicator_service::utils::hex::HexValue; use symbolicator_sources::{SentrySourceConfig, SourceConfig}; @@ -574,6 +574,9 @@ mod event { apply_source_context: true, scraping: Default::default(), rewrite_first_module: Default::default(), + // we manually reversed the frames when we created the stacktraces, so this is + // "callee first" + frame_order: FrameOrder::CalleeFirst, }) } diff --git a/docs/api/symbolication.md b/docs/api/symbolication.md index 3d1df22ce..b78d4b418 100644 --- a/docs/api/symbolication.md +++ b/docs/api/symbolication.md @@ -45,6 +45,11 @@ Content-Type: application/json }, ... ] + "options": { + "dif_candidates": true, + "apply_source_context": true, + "frame_order": "callee_first" + } } ``` @@ -75,7 +80,8 @@ as well as external sources to pull symbols from: instruction address of the top frame. - `frames`: A list of frames with addresses. Arbitrary additional properties may be passed with frames, but are discarded. The `addr_mode` property - defines the beahvior of `instruction_addr`. + defines the behavior of `instruction_addr`. This list is assumed to be ordered + according to the `frame_order` option (see below). - `scraping`: Configuration for authenticating scraping requests via http headers. - `enabled`: Whether authentication should happen at all. - `allowed_origins`: A list of "allowed origin patterns" that control what @@ -86,6 +92,13 @@ as well as external sources to pull symbols from: - `domain.com`: Matches domain.com on any port. - `*:port`: Wildcard on hostname, but explicit match on port. - `headers`: A map of headers to send with every HTTP request while scraping. +- `options`: Symbolication-specific options which control the endpoint's behavior. + - `dif_candidates`: Whether to return detailed information on DIF object candidates. + - `apply_source_context`: Whether to apply source context for the stack frames. + - `frame_order`: How stack frames are ordered. The possible values are + `"callee_first"` and `"caller_first"`. The default is `"caller_first"`. + Frames in the response will be ordered the same way. + ## Response From 33d45735ad6d6a86153d1661eb8367af140534a5 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 15:20:22 +0100 Subject: [PATCH 07/24] Use FrameOrder in JS symbolication --- crates/symbolicator-js/src/interface.rs | 4 +++- crates/symbolicator-js/src/symbolication.rs | 16 ++++++++++++++++ .../integration__sourcemap__fetch_error.snap | 5 ++--- ...emap__indexed_sourcemap_source_expansion.snap | 5 ++--- ...tegration__sourcemap__no_source_contents.snap | 7 +++---- ...map__sourcemap_embedded_source_expansion.snap | 7 +++---- ...egration__sourcemap__sourcemap_expansion.snap | 7 +++---- ...n__sourcemap__sourcemap_source_expansion.snap | 7 +++---- .../integration__sourcemap__webpack.snap | 9 ++++----- .../tests/integration/sourcemap.rs | 4 +++- .../src/symbolication/symbolicate.rs | 4 ++-- .../symbolicator-proguard/src/symbolication.rs | 4 ++-- crates/symbolicator-stress/src/workloads.rs | 1 + .../symbolicator/src/endpoints/symbolicate_js.rs | 8 +++++++- crates/symbolicli/src/main.rs | 3 +++ 15 files changed, 57 insertions(+), 34 deletions(-) diff --git a/crates/symbolicator-js/src/interface.rs b/crates/symbolicator-js/src/interface.rs index 2e29364e3..e968c481e 100644 --- a/crates/symbolicator-js/src/interface.rs +++ b/crates/symbolicator-js/src/interface.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use serde::{Deserialize, Serialize}; use symbolicator_service::caching::CacheError; -use symbolicator_service::types::{Platform, Scope, ScrapingConfig}; +use symbolicator_service::types::{FrameOrder, Platform, Scope, ScrapingConfig}; use symbolicator_sources::{SentryFileId, SentrySourceConfig}; use crate::lookup::CachedFileUri; @@ -30,6 +30,8 @@ pub struct SymbolicateJsStacktraces { pub scraping: ScrapingConfig, /// Whether to apply source context for the stack frames. pub apply_source_context: bool, + /// The order of frames within stacktraces (innermost frame first or last). + pub frame_order: FrameOrder, } // Some of the renames are there only to make it synchronized diff --git a/crates/symbolicator-js/src/symbolication.rs b/crates/symbolicator-js/src/symbolication.rs index 78129bbad..93fe7ed0d 100644 --- a/crates/symbolicator-js/src/symbolication.rs +++ b/crates/symbolicator-js/src/symbolication.rs @@ -3,6 +3,7 @@ use std::collections::BTreeSet; use symbolic::sourcemapcache::{ScopeLookupResult, SourcePosition}; use symbolicator_service::caching::CacheError; use symbolicator_service::source_context::get_context_lines; +use symbolicator_service::types::FrameOrder; use crate::SourceMapService; use crate::interface::{ @@ -22,6 +23,8 @@ impl SourceMapService { mut request: SymbolicateJsStacktraces, ) -> CompletedJsSymbolicationResponse { let mut raw_stacktraces = std::mem::take(&mut request.stacktraces); + let frame_order = request.frame_order; + let apply_source_context = request.apply_source_context; let platform = request.platform.clone(); let mut lookup = SourceMapLookup::new(self.clone(), request).await; @@ -34,6 +37,13 @@ impl SourceMapService { let mut errors = BTreeSet::new(); for raw_stacktrace in &mut raw_stacktraces { + if frame_order == FrameOrder::CalleeFirst { + // Stack frames were sent in "callee first" order. We want to process them + // in "caller first" order. That way we can use callsite function name + // information to get a better function name in the callee. + raw_stacktrace.frames.reverse(); + } + let num_frames = raw_stacktrace.frames.len(); let mut symbolicated_frames = Vec::with_capacity(num_frames); let mut callsite_fn_name = None; @@ -71,6 +81,12 @@ impl SourceMapService { } } + if frame_order == FrameOrder::CalleeFirst { + // The symbolicated frames are expected in "callee first" order. + symbolicated_frames.reverse(); + raw_stacktrace.frames.reverse(); + } + stacktraces.push(JsStacktrace { frames: symbolicated_frames, }); diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__fetch_error.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__fetch_error.snap index 851a7b5fc..4e8e1a47c 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__fetch_error.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__fetch_error.snap @@ -1,6 +1,5 @@ --- source: crates/symbolicator-js/tests/integration/sourcemap.rs -assertion_line: 391 expression: response --- stacktraces: @@ -37,9 +36,9 @@ errors: - abs_path: "http://localhost:/assets/missing_foo.js" type: missing_source scraping_attempts: - - url: "http://localhost:/assets/missing_foo.js" + - url: "http://localhost:/assets/missing_bar.js" status: failure reason: not_found - - url: "http://localhost:/assets/missing_bar.js" + - url: "http://localhost:/assets/missing_foo.js" status: failure reason: not_found diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__indexed_sourcemap_source_expansion.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__indexed_sourcemap_source_expansion.snap index ad9e563f8..785c48a9a 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__indexed_sourcemap_source_expansion.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__indexed_sourcemap_source_expansion.snap @@ -1,6 +1,5 @@ --- source: crates/symbolicator-js/tests/integration/sourcemap.rs -assertion_line: 343 expression: response --- stacktraces: @@ -71,7 +70,7 @@ scraping_attempts: status: not_attempted - url: "http://example.com/indexed.min.js.map" status: not_attempted - - url: "http://example.com/file1.js" - status: not_attempted - url: "http://example.com/file2.js" status: not_attempted + - url: "http://example.com/file1.js" + status: not_attempted diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__no_source_contents.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__no_source_contents.snap index 6d0f71fb1..a39e8d3f1 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__no_source_contents.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__no_source_contents.snap @@ -1,7 +1,6 @@ --- source: crates/symbolicator-js/tests/integration/sourcemap.rs expression: response -snapshot_kind: text --- stacktraces: - frames: @@ -49,9 +48,6 @@ errors: - abs_path: "http://example.com/index.html" type: scraping_disabled scraping_attempts: - - url: "http://example.com/index.html" - status: failure - reason: disabled - url: "http://example.com/embedded.js" status: not_attempted - url: "http://example.com/embedded.js.map" @@ -59,3 +55,6 @@ scraping_attempts: - url: "http://example.com/file1.js" status: failure reason: disabled + - url: "http://example.com/index.html" + status: failure + reason: disabled diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_embedded_source_expansion.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_embedded_source_expansion.snap index 265b615bf..b2a1b1bac 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_embedded_source_expansion.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_embedded_source_expansion.snap @@ -1,7 +1,6 @@ --- source: crates/symbolicator-js/tests/integration/sourcemap.rs expression: response -snapshot_kind: text --- stacktraces: - frames: @@ -51,10 +50,10 @@ errors: - abs_path: "http://example.com/index.html" type: scraping_disabled scraping_attempts: - - url: "http://example.com/index.html" - status: failure - reason: disabled - url: "http://example.com/embedded.js" status: not_attempted - url: "http://example.com/embedded.js.map" status: not_attempted + - url: "http://example.com/index.html" + status: failure + reason: disabled diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_expansion.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_expansion.snap index b08bc91b0..7350acdd5 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_expansion.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_expansion.snap @@ -1,6 +1,5 @@ --- source: crates/symbolicator-js/tests/integration/sourcemap.rs -assertion_line: 113 expression: response --- stacktraces: @@ -125,10 +124,10 @@ errors: - abs_path: "http://example.com/index.html" type: scraping_disabled scraping_attempts: - - url: "http://example.com/index.html" - status: failure - reason: disabled - url: "http://example.com/test.min.js" status: not_attempted - url: "http://example.com/test.min.js.map" status: not_attempted + - url: "http://example.com/index.html" + status: failure + reason: disabled diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_source_expansion.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_source_expansion.snap index 1145f3b1e..9410f1a70 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_source_expansion.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_source_expansion.snap @@ -1,7 +1,6 @@ --- source: crates/symbolicator-js/tests/integration/sourcemap.rs expression: response -snapshot_kind: text --- stacktraces: - frames: @@ -51,12 +50,12 @@ errors: - abs_path: "http://example.com/index.html" type: scraping_disabled scraping_attempts: - - url: "http://example.com/index.html" - status: failure - reason: disabled - url: "http://example.com/file.min.js" status: not_attempted - url: "http://example.com/file.min.js.map" status: not_attempted - url: "http://example.com/file1.js" status: not_attempted + - url: "http://example.com/index.html" + status: failure + reason: disabled diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__webpack.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__webpack.snap index ca6ecdf0e..a79463b9f 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__webpack.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__webpack.snap @@ -1,7 +1,6 @@ --- source: crates/symbolicator-js/tests/integration/sourcemap.rs expression: response -snapshot_kind: text --- stacktraces: - frames: @@ -74,11 +73,11 @@ raw_stacktraces: data: symbolicated: false scraping_attempts: - - url: "http://example.com/test1.min.js" - status: not_attempted - - url: "http://example.com/test1.min.js.map" - status: not_attempted - url: "http://example.com/test2.min.js" status: not_attempted - url: "http://example.com/test2.min.js.map" status: not_attempted + - url: "http://example.com/test1.min.js" + status: not_attempted + - url: "http://example.com/test1.min.js.map" + status: not_attempted diff --git a/crates/symbolicator-js/tests/integration/sourcemap.rs b/crates/symbolicator-js/tests/integration/sourcemap.rs index d59511aa7..f789b687e 100644 --- a/crates/symbolicator-js/tests/integration/sourcemap.rs +++ b/crates/symbolicator-js/tests/integration/sourcemap.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use reqwest::Url; use serde_json::json; use symbolicator_js::interface::{JsFrame, JsModule, JsStacktrace, SymbolicateJsStacktraces}; -use symbolicator_service::types::{Scope, ScrapingConfig}; +use symbolicator_service::types::{FrameOrder, Scope, ScrapingConfig}; use symbolicator_sources::{SentrySourceConfig, SentryToken, SourceId}; use crate::{assert_snapshot, setup_service}; @@ -46,6 +46,8 @@ fn make_js_request( ..Default::default() }, apply_source_context: true, + // according to the notes above, frames should be "callee-first" + frame_order: FrameOrder::CalleeFirst, stacktraces, modules, diff --git a/crates/symbolicator-native/src/symbolication/symbolicate.rs b/crates/symbolicator-native/src/symbolication/symbolicate.rs index 106ab9ee7..7b3b35a2f 100644 --- a/crates/symbolicator-native/src/symbolication/symbolicate.rs +++ b/crates/symbolicator-native/src/symbolication/symbolicate.rs @@ -115,7 +115,7 @@ impl SymbolicationActor { } = request; if frame_order == FrameOrder::CallerFirst { - // Stacktraces were sent in "caller first" order. We want to process them + // Stack frames were sent in "caller first" order. We want to process them // in "callee first" order. for st in &mut stacktraces { st.frames.reverse(); @@ -157,7 +157,7 @@ impl SymbolicationActor { record_symbolication_metrics(platform, origin, metrics, &modules, &stacktraces); if frame_order == FrameOrder::CallerFirst { - // The symbolicated stacktraces are expected in "caller first" order. + // The symbolicated frames are expected in "caller first" order. for st in &mut stacktraces { st.frames.reverse(); } diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 5982689f1..456467c14 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -135,7 +135,7 @@ impl ProguardService { .collect(); if frame_order == FrameOrder::CallerFirst { - // Stacktraces were sent in "caller first" order. We want to process them + // Stack frames were sent in "caller first" order. We want to process them // in "callee first" order. for st in &mut stacktraces { st.frames.reverse(); @@ -155,7 +155,7 @@ impl ProguardService { .collect(); if frame_order == FrameOrder::CallerFirst { - // Sentry expects the stacktraces back in "caller first" order. + // The symbolicated frames are expected in "caller first" order. remapped_frames.reverse(); } diff --git a/crates/symbolicator-stress/src/workloads.rs b/crates/symbolicator-stress/src/workloads.rs index bc83881e0..12c310788 100644 --- a/crates/symbolicator-stress/src/workloads.rs +++ b/crates/symbolicator-stress/src/workloads.rs @@ -128,6 +128,7 @@ pub fn prepare_payload( apply_source_context: true, stacktraces, modules, + frame_order: FrameOrder::CallerFirst, }, ) } diff --git a/crates/symbolicator/src/endpoints/symbolicate_js.rs b/crates/symbolicator/src/endpoints/symbolicate_js.rs index 4c058c3eb..7bfb90685 100644 --- a/crates/symbolicator/src/endpoints/symbolicate_js.rs +++ b/crates/symbolicator/src/endpoints/symbolicate_js.rs @@ -4,7 +4,7 @@ use axum::extract; use axum::response::Json; use serde::{Deserialize, Serialize}; use symbolicator_js::interface::{JsModule, JsStacktrace, SymbolicateJsStacktraces}; -use symbolicator_service::types::Platform; +use symbolicator_service::types::{FrameOrder, Platform}; use symbolicator_sources::SentrySourceConfig; use crate::endpoints::symbolicate::SymbolicationRequestQueryParams; @@ -44,6 +44,10 @@ pub struct JsRequestOptions { /// Whether to apply source context for the stack frames. #[serde(default = "default_apply_source_context")] pub apply_source_context: bool, + + /// The order in which stack frames are received by Symbolicator and returned to the caller. + #[serde(default)] + pub frame_order: FrameOrder, } fn default_apply_source_context() -> bool { @@ -54,6 +58,7 @@ impl Default for JsRequestOptions { fn default() -> Self { Self { apply_source_context: true, + frame_order: Default::default(), } } } @@ -92,6 +97,7 @@ pub async fn handle_symbolication_request( dist, scraping, apply_source_context: options.apply_source_context, + frame_order: options.frame_order, })?; match service.get_response(request_id, params.timeout).await { diff --git a/crates/symbolicli/src/main.rs b/crates/symbolicli/src/main.rs index 2a36a8c87..5e8d26f01 100644 --- a/crates/symbolicli/src/main.rs +++ b/crates/symbolicli/src/main.rs @@ -505,6 +505,9 @@ mod event { ..Default::default() }, apply_source_context: true, + // we manually reversed the frames when we created the stacktraces, so this is + // "callee first" + frame_order: FrameOrder::CalleeFirst, stacktraces, modules, From a037a263009e9368b10f7f21830013d3a629c2e0 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 15:42:30 +0100 Subject: [PATCH 08/24] Sort scraping_attempts --- crates/symbolicator-js/src/lookup.rs | 6 +++++- ...on__sourcemap__indexed_sourcemap_source_expansion.snap | 8 ++++---- .../integration__sourcemap__sourcemap_expansion.snap | 6 +++--- .../snapshots/integration__sourcemap__webpack.snap | 8 ++++---- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/crates/symbolicator-js/src/lookup.rs b/crates/symbolicator-js/src/lookup.rs index 20c7763f7..4546d8487 100644 --- a/crates/symbolicator-js/src/lookup.rs +++ b/crates/symbolicator-js/src/lookup.rs @@ -265,7 +265,11 @@ impl SourceMapLookup { /// Consumes `self` and returns the artifact bundles that were used and /// the scraping attempts that were made. - pub fn into_records(self) -> (HashSet, Vec) { + pub fn into_records(mut self) -> (HashSet, Vec) { + self.fetcher + .scraping_attempts + .sort_by(|l, r| l.url.cmp(&r.url)); + ( self.fetcher.used_artifact_bundles, self.fetcher.scraping_attempts, diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__indexed_sourcemap_source_expansion.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__indexed_sourcemap_source_expansion.snap index 785c48a9a..b45b1d169 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__indexed_sourcemap_source_expansion.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__indexed_sourcemap_source_expansion.snap @@ -66,11 +66,11 @@ raw_stacktraces: data: symbolicated: false scraping_attempts: - - url: "http://example.com/indexed.min.js" - status: not_attempted - - url: "http://example.com/indexed.min.js.map" + - url: "http://example.com/file1.js" status: not_attempted - url: "http://example.com/file2.js" status: not_attempted - - url: "http://example.com/file1.js" + - url: "http://example.com/indexed.min.js" + status: not_attempted + - url: "http://example.com/indexed.min.js.map" status: not_attempted diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_expansion.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_expansion.snap index 7350acdd5..7e8fa47e8 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_expansion.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__sourcemap_expansion.snap @@ -124,10 +124,10 @@ errors: - abs_path: "http://example.com/index.html" type: scraping_disabled scraping_attempts: + - url: "http://example.com/index.html" + status: failure + reason: disabled - url: "http://example.com/test.min.js" status: not_attempted - url: "http://example.com/test.min.js.map" status: not_attempted - - url: "http://example.com/index.html" - status: failure - reason: disabled diff --git a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__webpack.snap b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__webpack.snap index a79463b9f..962465ffe 100644 --- a/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__webpack.snap +++ b/crates/symbolicator-js/tests/integration/snapshots/integration__sourcemap__webpack.snap @@ -73,11 +73,11 @@ raw_stacktraces: data: symbolicated: false scraping_attempts: - - url: "http://example.com/test2.min.js" - status: not_attempted - - url: "http://example.com/test2.min.js.map" - status: not_attempted - url: "http://example.com/test1.min.js" status: not_attempted - url: "http://example.com/test1.min.js.map" status: not_attempted + - url: "http://example.com/test2.min.js" + status: not_attempted + - url: "http://example.com/test2.min.js.map" + status: not_attempted From 4ec71be0516f21554acd5ca681bd068619fe0c98 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 15:44:56 +0100 Subject: [PATCH 09/24] Fix sourcemap endpoint docs --- docs/api/sourcemaps.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/api/sourcemaps.md b/docs/api/sourcemaps.md index 4f58e0466..ae9f30589 100644 --- a/docs/api/sourcemaps.md +++ b/docs/api/sourcemaps.md @@ -43,6 +43,10 @@ Content-Type: application/json "enabled": true, "allowed_origins": ["*.domain.com"] } + "options": { + "apply_source_context": true, + "frame_order": "callee_first" + } } ``` @@ -65,7 +69,7 @@ as well as configuration for scraping sources from external servers: were loaded during JS code execution. The list is handled by the Sentry source. - `stacktrace`: A list of stacktraces to symbolicate. - `frames`: A list of frames with corresponding `abs_path`, `lineno`, - and other optional fields like `colno` or minified `function` name. + and other optional fields like `colno` or minified `function` name. This list is assumed to be ordered according to the `frame_order` option (see below). - `release`: Name of Sentry `release` for the processed request. - `dist`: Name of Sentry `dist` for the processed request. - `scraping`: Configuration for scraping of JS sources and sourcemaps from the web. @@ -80,6 +84,7 @@ as well as configuration for scraping sources from external servers: - `headers`: A map of headers to send with every HTTP request while scraping. - `options`: Symbolication-specific options which control the endpoint's behavior. - `apply_source_context`: Whether to apply source context for the stack frames. + - `frame_order`: How stack frames are ordered. The possible values are `"callee_first"` and `"caller_first"`. The default is `"caller_first"`. Frames in the response will be ordered the same way. ## Response From bfe3bbdb0b110d19b1afbdd5f4ea83d0b96468f0 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 15:49:29 +0100 Subject: [PATCH 10/24] Remove leftover reverse() --- crates/symbolicator/src/service.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/crates/symbolicator/src/service.rs b/crates/symbolicator/src/service.rs index be0df1104..0be42a608 100644 --- a/crates/symbolicator/src/service.rs +++ b/crates/symbolicator/src/service.rs @@ -321,12 +321,7 @@ impl RequestService { "symbolicate_jvm", RequestOptions::default(), async move { - let mut response = slf.jvm.symbolicate_jvm(request).await; - - // Sentry expects stacktraces in "Sentry order" (innermost frame at the end). - for st in &mut response.stacktraces { - st.frames.reverse(); - } + let response = slf.jvm.symbolicate_jvm(request).await; Ok(CompletedResponse::Jvm(response)) }, From f361553c9f89957937add4a371f4704eee502568 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 15:54:31 +0100 Subject: [PATCH 11/24] Revert unnecessary changes to proguard tests --- .../src/symbolication.rs | 288 ++++++++---------- .../tests/integration/proguard.rs | 236 +++++++------- ...ration__proguard__basic_source_lookup.snap | 118 +++---- ...tegration__proguard__resolving_inline.snap | 8 +- ...proguard__source_lookup_with_proguard.snap | 276 ++++++++--------- 5 files changed, 446 insertions(+), 480 deletions(-) diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 456467c14..7fcee238b 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -496,6 +496,24 @@ mod tests { use super::*; use proguard::{ProguardCache, ProguardMapping}; + fn remap_stacktrace_caller_first(proguard_source: &[u8], frames: &[JvmFrame]) -> Vec { + let mapping = ProguardMapping::new(proguard_source); + let mut cache = Vec::new(); + ProguardCache::write(&mapping, &mut cache).unwrap(); + let cache = ProguardCache::parse(&cache).unwrap(); + cache.test(); + + frames + .iter() + .rev() + .flat_map(|frame| { + ProguardService::map_frame(&[&cache], frame, None, &mut Default::default()) + .into_iter() + }) + .rev() + .collect() + } + #[test] fn remap_exception_simple() { let proguard_source = b"org.slf4j.helpers.Util$ClassContextSecurityManager -> org.a.b.g$a: @@ -596,39 +614,27 @@ io.sentry.sample.MainActivity -> io.sentry.sample.MainActivity: }, ]; - let mapping = ProguardMapping::new(proguard_source); - let mut cache = Vec::new(); - ProguardCache::write(&mapping, &mut cache).unwrap(); - let cache = ProguardCache::parse(&cache).unwrap(); - cache.test(); - - let mapped_frames: Vec<_> = frames - .iter() - .flat_map(|frame| { - ProguardService::map_frame(&[&cache], frame, None, &mut Default::default()) - .into_iter() - }) - .collect(); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, &frames); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: onClick module: io.sentry.sample.-$$Lambda$r3Avcbztes2hicEObh02jjhQqd4 lineno: 2 index: 0 - - function: bar + - function: onClickHandler filename: MainActivity.java module: io.sentry.sample.MainActivity - lineno: 54 + lineno: 40 index: 1 - function: foo filename: MainActivity.java module: io.sentry.sample.MainActivity lineno: 44 index: 1 - - function: onClickHandler + - function: bar filename: MainActivity.java module: io.sentry.sample.MainActivity - lineno: 40 + lineno: 54 index: 1 - function: onClickHandler module: io.sentry.sample.MainActivity @@ -659,12 +665,6 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: 65:65:void () -> "; - let mapping = ProguardMapping::new(proguard_source); - let mut cache = Vec::new(); - ProguardCache::write(&mapping, &mut cache).unwrap(); - let cache = ProguardCache::parse(&cache).unwrap(); - cache.test(); - let frames = [ JvmFrame { function: "a".to_owned(), @@ -700,18 +700,7 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: }, ]; - let mapped_frames: Vec<_> = frames - .iter() - .flat_map(|frame| { - ProguardService::map_frame( - &[&cache], - frame, - Some("org.slf4j"), - &mut Default::default(), - ) - .into_iter() - }) - .collect(); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, &frames); assert_eq!(mapped_frames[0].in_app, Some(true)); assert_eq!(mapped_frames[1].in_app, Some(false)); @@ -910,35 +899,27 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: void () -> # {"id":"com.android.tools.r8.synthesized"}"#; - let mapping = ProguardMapping::new(proguard_source); - assert!(mapping.is_valid()); - assert!(mapping.has_line_info()); - let mut cache = Vec::new(); - ProguardCache::write(&mapping, &mut cache).unwrap(); - let cache = ProguardCache::parse(&cache).unwrap(); - cache.test(); - let frames: Vec = serde_json::from_str( r#"[{ - "function": "performClickInternal", - "abs_path": "Unknown Source", - "module": "android.view.View.-$$Nest$m", - "filename": "Unknown Source", - "lineno": 0, + "function": "a", + "abs_path": "SourceFile", + "module": "a.a", + "filename": "SourceFile", + "lineno": 12, "index": 0 }, { - "function": "performClickInternal", - "abs_path": "View.java", - "module": "android.view.View", - "filename": "View.java", - "lineno": 7636, + "function": "b", + "abs_path": "SourceFile", + "module": "io.wzieba.r8fullmoderenamessources.MainActivity", + "filename": "SourceFile", + "lineno": 6, "index": 1 }, { - "function": "performClick", - "abs_path": "View.java", - "module": "android.view.View", - "filename": "View.java", - "lineno": 7659, + "function": "a", + "abs_path": "SourceFile", + "module": "io.wzieba.r8fullmoderenamessources.MainActivity", + "filename": "SourceFile", + "lineno": 1, "index": 2 }, { "function": "onClick", @@ -948,56 +929,52 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: "lineno": 1, "index": 3 }, { - "function": "a", - "abs_path": "SourceFile", - "module": "io.wzieba.r8fullmoderenamessources.MainActivity", - "filename": "SourceFile", - "lineno": 1, + "function": "performClick", + "abs_path": "View.java", + "module": "android.view.View", + "filename": "View.java", + "lineno": 7659, "index": 4 }, { - "function": "b", - "abs_path": "SourceFile", - "module": "io.wzieba.r8fullmoderenamessources.MainActivity", - "filename": "SourceFile", - "lineno": 6, + "function": "performClickInternal", + "abs_path": "View.java", + "module": "android.view.View", + "filename": "View.java", + "lineno": 7636, "index": 5 }, { - "function": "a", - "abs_path": "SourceFile", - "module": "a.a", - "filename": "SourceFile", - "lineno": 12, + "function": "performClickInternal", + "abs_path": "Unknown Source", + "module": "android.view.View.-$$Nest$m", + "filename": "Unknown Source", + "lineno": 0, "index": 6 }]"#, ) .unwrap(); - let mapped_frames = frames - .iter() - .flat_map(|frame| { - ProguardService::map_frame(&[&cache], frame, None, &mut Default::default()) - .into_iter() - }) - .collect::>(); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, &frames); + insta::assert_yaml_snapshot!(mapped_frames, @r###" - - function: performClickInternal - filename: Unknown Source - module: android.view.View.-$$Nest$m - abs_path: Unknown Source - lineno: 0 + - function: foo + filename: Foobar.kt + module: io.wzieba.r8fullmoderenamessources.Foobar + abs_path: Foobar.kt + lineno: 10 index: 0 - - function: performClickInternal - filename: View.java - module: android.view.View - abs_path: View.java - lineno: 7636 + - function: onCreate$lambda$1$lambda$0 + filename: MainActivity.kt + module: io.wzieba.r8fullmoderenamessources.MainActivity + abs_path: MainActivity.kt + lineno: 14 index: 1 - - function: performClick - filename: View.java - module: android.view.View - abs_path: View.java - lineno: 7659 + - function: $r8$lambda$pOQDVg57r6gG0-DzwbGf17BfNbs + filename: MainActivity.kt + module: io.wzieba.r8fullmoderenamessources.MainActivity + abs_path: MainActivity.kt + lineno: 0 index: 2 + method_synthesized: true - function: onClick filename: MainActivity module: io.wzieba.r8fullmoderenamessources.MainActivity$$ExternalSyntheticLambda0 @@ -1005,24 +982,23 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: lineno: 0 index: 3 method_synthesized: true - - function: $r8$lambda$pOQDVg57r6gG0-DzwbGf17BfNbs - filename: MainActivity.kt - module: io.wzieba.r8fullmoderenamessources.MainActivity - abs_path: MainActivity.kt - lineno: 0 + - function: performClick + filename: View.java + module: android.view.View + abs_path: View.java + lineno: 7659 index: 4 - method_synthesized: true - - function: onCreate$lambda$1$lambda$0 - filename: MainActivity.kt - module: io.wzieba.r8fullmoderenamessources.MainActivity - abs_path: MainActivity.kt - lineno: 14 + - function: performClickInternal + filename: View.java + module: android.view.View + abs_path: View.java + lineno: 7636 index: 5 - - function: foo - filename: Foobar.kt - module: io.wzieba.r8fullmoderenamessources.Foobar - abs_path: Foobar.kt - lineno: 10 + - function: performClickInternal + filename: Unknown Source + module: android.view.View.-$$Nest$m + abs_path: Unknown Source + lineno: 0 index: 6 "###); } @@ -1062,85 +1038,75 @@ com.mycompany.android.Delegate -> b80.h: com.mycompany.android.IMapAnnotations mapAnnotations -> a # {"id":"com.android.tools.r8.residualsignature","signature":"Lbv0/b;"}"#; - let mapping = ProguardMapping::new(proguard_source); - assert!(mapping.is_valid()); - assert!(mapping.has_line_info()); - let mut cache = Vec::new(); - ProguardCache::write(&mapping, &mut cache).unwrap(); - let cache = ProguardCache::parse(&cache).unwrap(); - cache.test(); - let frames: Vec = serde_json::from_str( - r#"[{ - "function": "b", - "module": "ev.h", + r#"[ + { + "function": "a", + "module": "b80.f", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 3, + "lineno": 33, "index": 0 - }, { + }, + { "function": "l", "module": "uu0.k", "filename": "SourceFile", "abs_path": "SourceFile", "lineno": 43, "index": 1 - }, { - "function": "a", - "module": "b80.f", + }, + { + "function": "b", + "module": "ev.h", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 33, + "lineno": 3, "index": 2 }]"#, ) .unwrap(); - let mapped_frames = frames - .iter() - .flat_map(|frame| { - ProguardService::map_frame(&[&cache], frame, None, &mut Default::default()) - .into_iter() - }) - .collect::>(); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, &frames); + insta::assert_yaml_snapshot!(mapped_frames, @r###" - - function: m + - function: render + filename: Renderer.kt + module: com.mycompany.android.Renderer + abs_path: Renderer.kt + lineno: 39 + index: 0 + - function: render + filename: Delegate.kt + module: com.mycompany.android.Delegate + abs_path: Delegate.kt + lineno: 34 + index: 0 + - function: createProjectionMarker + filename: Delegate.kt + module: com.mycompany.android.Delegate + abs_path: Delegate.kt + lineno: 101 + index: 0 + - function: createProjectionMarker filename: SourceFile - module: ev.StuffKt$$ExternalSyntheticOutline0 + module: uu0.MapAnnotations abs_path: SourceFile - lineno: 1 - index: 0 - method_synthesized: true + lineno: 0 + index: 1 - function: createProjectionMarker filename: MapAnnotations.kt module: com.mycompany.android.MapAnnotations abs_path: MapAnnotations.kt lineno: 0 index: 1 - - function: createProjectionMarker + - function: m filename: SourceFile - module: uu0.MapAnnotations + module: ev.StuffKt$$ExternalSyntheticOutline0 abs_path: SourceFile - lineno: 0 - index: 1 - - function: createProjectionMarker - filename: Delegate.kt - module: com.mycompany.android.Delegate - abs_path: Delegate.kt - lineno: 101 - index: 2 - - function: render - filename: Delegate.kt - module: com.mycompany.android.Delegate - abs_path: Delegate.kt - lineno: 34 - index: 2 - - function: render - filename: Renderer.kt - module: com.mycompany.android.Renderer - abs_path: Renderer.kt - lineno: 39 + lineno: 1 index: 2 + method_synthesized: true "###); } } diff --git a/crates/symbolicator-proguard/tests/integration/proguard.rs b/crates/symbolicator-proguard/tests/integration/proguard.rs index 55772d095..266ab9f1b 100644 --- a/crates/symbolicator-proguard/tests/integration/proguard.rs +++ b/crates/symbolicator-proguard/tests/integration/proguard.rs @@ -35,7 +35,7 @@ fn make_jvm_request( stacktraces, modules, classes: Vec::new(), - frame_order: FrameOrder::CalleeFirst, + frame_order: FrameOrder::CallerFirst, } } @@ -203,23 +203,23 @@ async fn test_basic_source_lookup() { let source = SourceConfig::Sentry(Arc::new(source)); let frames = r#"[{ - "function": "whoops4", - "abs_path": "SourceFile", - "module": "io.sentry.samples.MainActivity$OneMoreInnerClass", - "filename": "SourceFile", - "lineno": 38, + "function": "otherMethod", + "abs_path": "OtherActivity.java", + "module": "OtherActivity", + "filename": "OtherActivity.java", + "lineno": 100, "index": 0 }, { - "function": "whoops3", - "abs_path": "MainActivity.kt", - "module": "io.sentry.samples.MainActivity$AdditionalInnerClass", - "filename": "MainActivity.kt", - "lineno": 32, + "function": "differentMethod", + "abs_path": "DifferentActivity", + "module": "DifferentActivity", + "filename": "DifferentActivity", + "lineno": 200, "index": 1 }, { - "function": "whoops2", - "module": "io.sentry.samples.MainActivity$AnotherInnerClass", - "lineno": 26, + "function": "onCreate", + "module": "io.sentry.samples.MainActivity", + "lineno": 11, "index": 2 }, { "function": "whoops", @@ -229,23 +229,23 @@ async fn test_basic_source_lookup() { "lineno": 20, "index": 3 }, { - "function": "onCreate", - "module": "io.sentry.samples.MainActivity", - "lineno": 11, + "function": "whoops2", + "module": "io.sentry.samples.MainActivity$AnotherInnerClass", + "lineno": 26, "index": 4 }, { - "function": "differentMethod", - "abs_path": "DifferentActivity", - "module": "DifferentActivity", - "filename": "DifferentActivity", - "lineno": 200, + "function": "whoops3", + "abs_path": "MainActivity.kt", + "module": "io.sentry.samples.MainActivity$AdditionalInnerClass", + "filename": "MainActivity.kt", + "lineno": 32, "index": 5 }, { - "function": "otherMethod", - "abs_path": "OtherActivity.java", - "module": "OtherActivity", - "filename": "OtherActivity.java", - "lineno": 100, + "function": "whoops4", + "abs_path": "SourceFile", + "module": "io.sentry.samples.MainActivity$OneMoreInnerClass", + "filename": "SourceFile", + "lineno": 38, "index": 6 }]"#; @@ -335,120 +335,120 @@ async fn test_source_lookup_with_proguard() { let source = SourceConfig::Sentry(Arc::new(source)); let frames = r#"[{ - "filename": "R8$$SyntheticClass", - "function": "onMenuItemClick", - "module": "io.sentry.samples.instrumentation.ui.g", - "lineno": 40, - "in_app": true, + "filename": "ZygoteInit.java", + "function": "main", + "module": "com.android.internal.os.ZygoteInit", + "lineno": 698, "index": 0 - }, { - "filename": "Toolbar.java", - "function": "onMenuItemClick", - "module": "androidx.appcompat.widget.Toolbar$1", - "lineno": 7, + }, { + "filename": "ZygoteInit.java", + "function": "run", + "module": "com.android.internal.os.ZygoteInit$MethodAndArgsCaller", + "lineno": 903, "index": 1 - }, { - "filename": "ActionMenuView.java", - "function": "onMenuItemSelected", - "module": "androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback", - "lineno": 7, + }, { + "filename": "Method.java", + "function": "invoke", + "module": "java.lang.reflect.Method", + "lineno": 372, "index": 2 - }, { - "filename": "MenuBuilder.java", - "function": "dispatchMenuItemSelected", - "module": "androidx.appcompat.view.menu.MenuBuilder", - "lineno": 5, - "index": 3 - }, { - "filename": "MenuItemImpl.java", + }, { + "filename": "Method.java", "function": "invoke", - "module": "androidx.appcompat.view.menu.MenuItemImpl", - "lineno": 15, + "module": "java.lang.reflect.Method", + "index": 3 + }, { + "filename": "ActivityThread.java", + "function": "main", + "module": "android.app.ActivityThread", + "lineno": 5254, "index": 4 - }, { - "filename": "MenuBuilder.java", - "function": "performItemAction", - "module": "androidx.appcompat.view.menu.MenuBuilder", - "lineno": 4, + }, { + "filename": "Looper.java", + "function": "loop", + "module": "android.os.Looper", + "lineno": 135, "index": 5 - }, { - "filename": "MenuBuilder.java", - "function": "performItemAction", - "module": "androidx.appcompat.view.menu.MenuBuilder", - "lineno": 1, + }, { + "filename": "Handler.java", + "function": "dispatchMessage", + "module": "android.os.Handler", + "lineno": 95, "index": 6 - }, { - "filename": "ActionMenuView.java", - "function": "invokeItem", - "module": "androidx.appcompat.widget.ActionMenuView", - "lineno": 4, + }, { + "filename": "Handler.java", + "function": "handleCallback", + "module": "android.os.Handler", + "lineno": 739, "index": 7 - }, { - "filename": "ActionMenuItemView.java", - "function": "onClick", - "module": "androidx.appcompat.view.menu.ActionMenuItemView", - "lineno": 7, + }, { + "filename": "View.java", + "function": "run", + "module": "android.view.View$PerformClick", + "lineno": 19866, "index": 8 - }, { + }, { "filename": "View.java", "function": "performClick", "module": "android.view.View", "lineno": 4780, "index": 9 - }, { - "filename": "View.java", - "function": "run", - "module": "android.view.View$PerformClick", - "lineno": 19866, + }, { + "filename": "ActionMenuItemView.java", + "function": "onClick", + "module": "androidx.appcompat.view.menu.ActionMenuItemView", + "lineno": 7, "index": 10 - }, { - "filename": "Handler.java", - "function": "handleCallback", - "module": "android.os.Handler", - "lineno": 739, + }, { + "filename": "ActionMenuView.java", + "function": "invokeItem", + "module": "androidx.appcompat.widget.ActionMenuView", + "lineno": 4, "index": 11 - }, { - "filename": "Handler.java", - "function": "dispatchMessage", - "module": "android.os.Handler", - "lineno": 95, + }, { + "filename": "MenuBuilder.java", + "function": "performItemAction", + "module": "androidx.appcompat.view.menu.MenuBuilder", + "lineno": 1, "index": 12 - }, { - "filename": "Looper.java", - "function": "loop", - "module": "android.os.Looper", - "lineno": 135, + }, { + "filename": "MenuBuilder.java", + "function": "performItemAction", + "module": "androidx.appcompat.view.menu.MenuBuilder", + "lineno": 4, "index": 13 - }, { - "filename": "ActivityThread.java", - "function": "main", - "module": "android.app.ActivityThread", - "lineno": 5254, - "index": 14 - }, { - "filename": "Method.java", + }, { + "filename": "MenuItemImpl.java", "function": "invoke", - "module": "java.lang.reflect.Method", + "module": "androidx.appcompat.view.menu.MenuItemImpl", + "lineno": 15, + "index": 14 + }, { + "filename": "MenuBuilder.java", + "function": "dispatchMenuItemSelected", + "module": "androidx.appcompat.view.menu.MenuBuilder", + "lineno": 5, "index": 15 - }, { - "filename": "Method.java", - "function": "invoke", - "module": "java.lang.reflect.Method", - "lineno": 372, + }, { + "filename": "ActionMenuView.java", + "function": "onMenuItemSelected", + "module": "androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback", + "lineno": 7, "index": 16 - }, { - "filename": "ZygoteInit.java", - "function": "run", - "module": "com.android.internal.os.ZygoteInit$MethodAndArgsCaller", - "lineno": 903, + }, { + "filename": "Toolbar.java", + "function": "onMenuItemClick", + "module": "androidx.appcompat.widget.Toolbar$1", + "lineno": 7, "index": 17 - }, { - "filename": "ZygoteInit.java", - "function": "main", - "module": "com.android.internal.os.ZygoteInit", - "lineno": 698, + }, { + "filename": "R8$$SyntheticClass", + "function": "onMenuItemClick", + "module": "io.sentry.samples.instrumentation.ui.g", + "lineno": 40, + "in_app": true, "index": 18 - }]"#; + }]"#; let modules = format!( r#"[{{ diff --git a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__basic_source_lookup.snap b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__basic_source_lookup.snap index 1dfd7bbab..8cfd0b992 100644 --- a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__basic_source_lookup.snap +++ b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__basic_source_lookup.snap @@ -7,43 +7,54 @@ exceptions: module: io.sentry.samples stacktraces: - frames: - - function: whoops4 - filename: SourceFile - module: io.sentry.samples.MainActivity$OneMoreInnerClass - abs_path: SourceFile - lineno: 38 + - function: otherMethod + filename: OtherActivity.java + module: OtherActivity + abs_path: OtherActivity.java + lineno: 100 + index: 0 + - function: differentMethod + filename: DifferentActivity + module: DifferentActivity + abs_path: DifferentActivity + lineno: 200 + index: 1 + - function: onCreate + module: io.sentry.samples.MainActivity + lineno: 11 pre_context: - - " }" - - " }" - "" - - " class OneMoreInnerClass {" - - " fun whoops4() {" - context_line: " throw RuntimeException(\"whoops\")" + - "class MainActivity : ComponentActivity() {" + - " override fun onCreate(savedInstanceState: Bundle?) {" + - " super.onCreate(savedInstanceState)" + - " setContentView(R.layout.activity_main)" + context_line: " InnerClass().whoops()" post_context: - - " }" - - " }" - - "}" - "" - index: 0 - - function: whoops3 + - " val list = findViewById(R.id.list)" + - " list.layoutManager = LinearLayoutManager(this)" + - " list.adapter = TrackAdapter()" + - " }" + index: 2 + - function: whoops filename: MainActivity.kt - module: io.sentry.samples.MainActivity$AdditionalInnerClass + module: io.sentry.samples.MainActivity$InnerClass abs_path: MainActivity.kt - lineno: 32 + lineno: 20 pre_context: - - " }" + - " list.adapter = TrackAdapter()" - " }" - "" - - " class AdditionalInnerClass {" - - " fun whoops3() {" - context_line: " OneMoreInnerClass().whoops4()" + - " class InnerClass {" + - " fun whoops() {" + context_line: " AnotherInnerClass().whoops2()" post_context: - " }" - " }" - "" - - " class OneMoreInnerClass {" - - " fun whoops4() {" - index: 1 + - " class AnotherInnerClass {" + - " fun whoops2() {" + index: 3 - function: whoops2 module: io.sentry.samples.MainActivity$AnotherInnerClass lineno: 26 @@ -60,54 +71,43 @@ stacktraces: - "" - " class AdditionalInnerClass {" - " fun whoops3() {" - index: 2 - - function: whoops + index: 4 + - function: whoops3 filename: MainActivity.kt - module: io.sentry.samples.MainActivity$InnerClass + module: io.sentry.samples.MainActivity$AdditionalInnerClass abs_path: MainActivity.kt - lineno: 20 + lineno: 32 pre_context: - - " list.adapter = TrackAdapter()" + - " }" - " }" - "" - - " class InnerClass {" - - " fun whoops() {" - context_line: " AnotherInnerClass().whoops2()" + - " class AdditionalInnerClass {" + - " fun whoops3() {" + context_line: " OneMoreInnerClass().whoops4()" post_context: - " }" - " }" - "" - - " class AnotherInnerClass {" - - " fun whoops2() {" - index: 3 - - function: onCreate - module: io.sentry.samples.MainActivity - lineno: 11 + - " class OneMoreInnerClass {" + - " fun whoops4() {" + index: 5 + - function: whoops4 + filename: SourceFile + module: io.sentry.samples.MainActivity$OneMoreInnerClass + abs_path: SourceFile + lineno: 38 pre_context: + - " }" + - " }" - "" - - "class MainActivity : ComponentActivity() {" - - " override fun onCreate(savedInstanceState: Bundle?) {" - - " super.onCreate(savedInstanceState)" - - " setContentView(R.layout.activity_main)" - context_line: " InnerClass().whoops()" + - " class OneMoreInnerClass {" + - " fun whoops4() {" + context_line: " throw RuntimeException(\"whoops\")" post_context: - - "" - - " val list = findViewById(R.id.list)" - - " list.layoutManager = LinearLayoutManager(this)" - - " list.adapter = TrackAdapter()" + - " }" - " }" - index: 4 - - function: differentMethod - filename: DifferentActivity - module: DifferentActivity - abs_path: DifferentActivity - lineno: 200 - index: 5 - - function: otherMethod - filename: OtherActivity.java - module: OtherActivity - abs_path: OtherActivity.java - lineno: 100 + - "}" + - "" index: 6 classes: {} errors: [] diff --git a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__resolving_inline.snap b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__resolving_inline.snap index 005eed333..6d76ef6a2 100644 --- a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__resolving_inline.snap +++ b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__resolving_inline.snap @@ -11,20 +11,20 @@ stacktraces: module: io.sentry.sample.-$$Lambda$r3Avcbztes2hicEObh02jjhQqd4 lineno: 2 index: 0 - - function: bar + - function: onClickHandler filename: MainActivity.java module: io.sentry.sample.MainActivity - lineno: 54 + lineno: 40 index: 1 - function: foo filename: MainActivity.java module: io.sentry.sample.MainActivity lineno: 44 index: 1 - - function: onClickHandler + - function: bar filename: MainActivity.java module: io.sentry.sample.MainActivity - lineno: 40 + lineno: 54 index: 1 classes: {} errors: [] diff --git a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__source_lookup_with_proguard.snap b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__source_lookup_with_proguard.snap index 446723357..b9a41e562 100644 --- a/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__source_lookup_with_proguard.snap +++ b/crates/symbolicator-proguard/tests/integration/snapshots/integration__proguard__source_lookup_with_proguard.snap @@ -7,43 +7,122 @@ exceptions: module: java.lang stacktraces: - frames: - - function: helloOtherInner - filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile$AnotherInnerClass - lineno: 26 - in_app: true - index: 0 - - function: otherFun - filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile - lineno: 21 - in_app: true + - function: main + filename: ZygoteInit.java + module: com.android.internal.os.ZygoteInit + lineno: 698 index: 0 - - function: helloOther + - function: run + filename: ZygoteInit.java + module: com.android.internal.os.ZygoteInit$MethodAndArgsCaller + lineno: 903 + index: 1 + - function: invoke + filename: Method.java + module: java.lang.reflect.Method + lineno: 372 + index: 2 + - function: invoke + filename: Method.java + module: java.lang.reflect.Method + index: 3 + - function: main + filename: ActivityThread.java + module: android.app.ActivityThread + lineno: 5254 + index: 4 + - function: loop + filename: Looper.java + module: android.os.Looper + lineno: 135 + index: 5 + - function: dispatchMessage + filename: Handler.java + module: android.os.Handler + lineno: 95 + index: 6 + - function: handleCallback + filename: Handler.java + module: android.os.Handler + lineno: 739 + index: 7 + - function: run + filename: View.java + module: android.view.View$PerformClick + lineno: 19866 + index: 8 + - function: performClick + filename: View.java + module: android.view.View + lineno: 4780 + index: 9 + - function: onClick + filename: ActionMenuItemView.java + module: androidx.appcompat.view.menu.ActionMenuItemView + lineno: 7 + index: 10 + - function: invokeItem + filename: ActionMenuView.java + module: androidx.appcompat.widget.ActionMenuView + lineno: 4 + index: 11 + - function: performItemAction + filename: MenuBuilder.java + module: androidx.appcompat.view.menu.MenuBuilder + lineno: 1 + index: 12 + - function: performItemAction + filename: MenuBuilder.java + module: androidx.appcompat.view.menu.MenuBuilder + lineno: 4 + index: 13 + - function: invoke + filename: MenuItemImpl.java + module: androidx.appcompat.view.menu.MenuItemImpl + lineno: 15 + index: 14 + - function: dispatchMenuItemSelected + filename: MenuBuilder.java + module: androidx.appcompat.view.menu.MenuBuilder + lineno: 5 + index: 15 + - function: onMenuItemSelected + filename: ActionMenuView.java + module: androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback + lineno: 7 + index: 16 + - function: onMenuItemClick + filename: Toolbar.java + module: androidx.appcompat.widget.Toolbar$1 + lineno: 7 + index: 17 + - function: onMenuItemClick filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile - lineno: 17 + module: io.sentry.samples.instrumentation.ui.EditActivity$$InternalSyntheticLambda$1$ebaa538726b99bb77e0f5e7c86443911af17d6e5be2b8771952ae0caa4ff2ac7$0 + lineno: 0 in_app: true - index: 0 - - function: helloInner - filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.SomeService$InnerClassOfSomeService - lineno: 10 + index: 18 + method_synthesized: true + - function: onCreate$lambda-1 + filename: EditActivity.kt + module: io.sentry.samples.instrumentation.ui.EditActivity + abs_path: EditActivity.kt + lineno: 37 pre_context: - - " InnerClassOfSomeService().helloInner()" - - " }" + - " }" - "" - - " class InnerClassOfSomeService {" - - " fun helloInner() {" - context_line: " AnotherClassInSameFile().helloOther()" + - " findViewById(R.id.toolbar).setOnMenuItemClickListener {" + - " if (it.itemId == R.id.action_save) {" + - " try {" + context_line: " SomeService().helloThere()" post_context: - - " }" - - " }" - - "}" + - " } catch (e: Exception) {" + - " Sentry.captureException(e)" + - " }" - "" - - "class AnotherClassInSameFile {" + - " val transaction = Sentry.startTransaction(" in_app: true - index: 0 + index: 18 - function: helloThere filename: R8$$SyntheticClass module: io.sentry.samples.instrumentation.ui.SomeService @@ -61,122 +140,43 @@ stacktraces: - " fun helloInner() {" - " AnotherClassInSameFile().helloOther()" in_app: true - index: 0 - - function: onCreate$lambda-1 - filename: EditActivity.kt - module: io.sentry.samples.instrumentation.ui.EditActivity - abs_path: EditActivity.kt - lineno: 37 + index: 18 + - function: helloInner + filename: R8$$SyntheticClass + module: io.sentry.samples.instrumentation.ui.SomeService$InnerClassOfSomeService + lineno: 10 pre_context: - - " }" + - " InnerClassOfSomeService().helloInner()" + - " }" - "" - - " findViewById(R.id.toolbar).setOnMenuItemClickListener {" - - " if (it.itemId == R.id.action_save) {" - - " try {" - context_line: " SomeService().helloThere()" + - " class InnerClassOfSomeService {" + - " fun helloInner() {" + context_line: " AnotherClassInSameFile().helloOther()" post_context: - - " } catch (e: Exception) {" - - " Sentry.captureException(e)" - - " }" + - " }" + - " }" + - "}" - "" - - " val transaction = Sentry.startTransaction(" + - "class AnotherClassInSameFile {" in_app: true - index: 0 - - function: onMenuItemClick + index: 18 + - function: helloOther filename: R8$$SyntheticClass - module: io.sentry.samples.instrumentation.ui.EditActivity$$InternalSyntheticLambda$1$ebaa538726b99bb77e0f5e7c86443911af17d6e5be2b8771952ae0caa4ff2ac7$0 - lineno: 0 + module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile + lineno: 17 + in_app: true + index: 18 + - function: otherFun + filename: R8$$SyntheticClass + module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile + lineno: 21 + in_app: true + index: 18 + - function: helloOtherInner + filename: R8$$SyntheticClass + module: io.sentry.samples.instrumentation.ui.AnotherClassInSameFile$AnotherInnerClass + lineno: 26 in_app: true - index: 0 - method_synthesized: true - - function: onMenuItemClick - filename: Toolbar.java - module: androidx.appcompat.widget.Toolbar$1 - lineno: 7 - index: 1 - - function: onMenuItemSelected - filename: ActionMenuView.java - module: androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback - lineno: 7 - index: 2 - - function: dispatchMenuItemSelected - filename: MenuBuilder.java - module: androidx.appcompat.view.menu.MenuBuilder - lineno: 5 - index: 3 - - function: invoke - filename: MenuItemImpl.java - module: androidx.appcompat.view.menu.MenuItemImpl - lineno: 15 - index: 4 - - function: performItemAction - filename: MenuBuilder.java - module: androidx.appcompat.view.menu.MenuBuilder - lineno: 4 - index: 5 - - function: performItemAction - filename: MenuBuilder.java - module: androidx.appcompat.view.menu.MenuBuilder - lineno: 1 - index: 6 - - function: invokeItem - filename: ActionMenuView.java - module: androidx.appcompat.widget.ActionMenuView - lineno: 4 - index: 7 - - function: onClick - filename: ActionMenuItemView.java - module: androidx.appcompat.view.menu.ActionMenuItemView - lineno: 7 - index: 8 - - function: performClick - filename: View.java - module: android.view.View - lineno: 4780 - index: 9 - - function: run - filename: View.java - module: android.view.View$PerformClick - lineno: 19866 - index: 10 - - function: handleCallback - filename: Handler.java - module: android.os.Handler - lineno: 739 - index: 11 - - function: dispatchMessage - filename: Handler.java - module: android.os.Handler - lineno: 95 - index: 12 - - function: loop - filename: Looper.java - module: android.os.Looper - lineno: 135 - index: 13 - - function: main - filename: ActivityThread.java - module: android.app.ActivityThread - lineno: 5254 - index: 14 - - function: invoke - filename: Method.java - module: java.lang.reflect.Method - index: 15 - - function: invoke - filename: Method.java - module: java.lang.reflect.Method - lineno: 372 - index: 16 - - function: run - filename: ZygoteInit.java - module: com.android.internal.os.ZygoteInit$MethodAndArgsCaller - lineno: 903 - index: 17 - - function: main - filename: ZygoteInit.java - module: com.android.internal.os.ZygoteInit - lineno: 698 index: 18 classes: {} errors: From 1d92416d530d47edd537fbd09415cabcdfd439f6 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 16:18:58 +0100 Subject: [PATCH 12/24] Revert unnecessary change & add comment --- crates/symbolicator-js/src/lookup.rs | 2 ++ crates/symbolicator/src/service.rs | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/symbolicator-js/src/lookup.rs b/crates/symbolicator-js/src/lookup.rs index 4546d8487..1f9976ddd 100644 --- a/crates/symbolicator-js/src/lookup.rs +++ b/crates/symbolicator-js/src/lookup.rs @@ -266,6 +266,8 @@ impl SourceMapLookup { /// Consumes `self` and returns the artifact bundles that were used and /// the scraping attempts that were made. pub fn into_records(mut self) -> (HashSet, Vec) { + // There is no guaranteed order on `scraping_attempts` in the response. We might + // as well sort them here for consistency. self.fetcher .scraping_attempts .sort_by(|l, r| l.url.cmp(&r.url)); diff --git a/crates/symbolicator/src/service.rs b/crates/symbolicator/src/service.rs index 0be42a608..45e4dbfc6 100644 --- a/crates/symbolicator/src/service.rs +++ b/crates/symbolicator/src/service.rs @@ -321,9 +321,9 @@ impl RequestService { "symbolicate_jvm", RequestOptions::default(), async move { - let response = slf.jvm.symbolicate_jvm(request).await; - - Ok(CompletedResponse::Jvm(response)) + Ok(CompletedResponse::Jvm( + slf.jvm.symbolicate_jvm(request).await, + )) }, ) } From 27dad8e628386c07aeeb04f7ad626497486339eb Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 16:40:29 +0100 Subject: [PATCH 13/24] Fix formatting --- docs/api/sourcemaps.md | 2 +- docs/api/symbolicate-jvm.md | 3 +-- docs/api/symbolication.md | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/api/sourcemaps.md b/docs/api/sourcemaps.md index ae9f30589..1fb846133 100644 --- a/docs/api/sourcemaps.md +++ b/docs/api/sourcemaps.md @@ -44,7 +44,7 @@ Content-Type: application/json "allowed_origins": ["*.domain.com"] } "options": { - "apply_source_context": true, + "apply_source_context": true, "frame_order": "callee_first" } } diff --git a/docs/api/symbolicate-jvm.md b/docs/api/symbolicate-jvm.md index 2cc0baac6..83401508a 100644 --- a/docs/api/symbolicate-jvm.md +++ b/docs/api/symbolicate-jvm.md @@ -52,11 +52,10 @@ Content-Type: application/json "release_package": "some_release", "classes": [], "options": { - "apply_source_context": true, + "apply_source_context": true, "frame_order": "callee_first" } } - ``` ## Query Parameters diff --git a/docs/api/symbolication.md b/docs/api/symbolication.md index b78d4b418..e0347b3fe 100644 --- a/docs/api/symbolication.md +++ b/docs/api/symbolication.md @@ -47,7 +47,7 @@ Content-Type: application/json ] "options": { "dif_candidates": true, - "apply_source_context": true, + "apply_source_context": true, "frame_order": "callee_first" } } From 08e3e2350b0233d1ce085beccbd806af0906b33c Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 18 Nov 2025 16:45:39 +0100 Subject: [PATCH 14/24] Fix test --- .../src/symbolication.rs | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 7fcee238b..bcf33ed30 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -496,7 +496,11 @@ mod tests { use super::*; use proguard::{ProguardCache, ProguardMapping}; - fn remap_stacktrace_caller_first(proguard_source: &[u8], frames: &[JvmFrame]) -> Vec { + fn remap_stacktrace_caller_first( + proguard_source: &[u8], + release_package: Option<&str>, + frames: &[JvmFrame], + ) -> Vec { let mapping = ProguardMapping::new(proguard_source); let mut cache = Vec::new(); ProguardCache::write(&mapping, &mut cache).unwrap(); @@ -507,8 +511,13 @@ mod tests { .iter() .rev() .flat_map(|frame| { - ProguardService::map_frame(&[&cache], frame, None, &mut Default::default()) - .into_iter() + ProguardService::map_frame( + &[&cache], + frame, + release_package, + &mut Default::default(), + ) + .into_iter() }) .rev() .collect() @@ -614,7 +623,7 @@ io.sentry.sample.MainActivity -> io.sentry.sample.MainActivity: }, ]; - let mapped_frames = remap_stacktrace_caller_first(proguard_source, &frames); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: onClick @@ -700,7 +709,8 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: }, ]; - let mapped_frames = remap_stacktrace_caller_first(proguard_source, &frames); + let mapped_frames = + remap_stacktrace_caller_first(proguard_source, Some("org.slf4j"), &frames); assert_eq!(mapped_frames[0].in_app, Some(true)); assert_eq!(mapped_frames[1].in_app, Some(false)); @@ -953,7 +963,7 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: ) .unwrap(); - let mapped_frames = remap_stacktrace_caller_first(proguard_source, &frames); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: foo @@ -1067,7 +1077,7 @@ com.mycompany.android.Delegate -> b80.h: ) .unwrap(); - let mapped_frames = remap_stacktrace_caller_first(proguard_source, &frames); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: render From 1e75759ba84baa7ed40a381a53a52642da20717e Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 13 Nov 2025 15:23:14 +0100 Subject: [PATCH 15/24] feat(proguard): Support outline and outlineCallsite annotations --- .../src/res/mapping-outline-complex.txt | 2076 +++++++++++++++++ .../src/symbolication.rs | 594 +++-- 2 files changed, 2503 insertions(+), 167 deletions(-) create mode 100644 crates/symbolicator-proguard/src/res/mapping-outline-complex.txt diff --git a/crates/symbolicator-proguard/src/res/mapping-outline-complex.txt b/crates/symbolicator-proguard/src/res/mapping-outline-complex.txt new file mode 100644 index 000000000..9e62fb267 --- /dev/null +++ b/crates/symbolicator-proguard/src/res/mapping-outline-complex.txt @@ -0,0 +1,2076 @@ +# compiler: R8 +# compiler_version: 2.0 +# min_api: 15 +com.example.compose.component.CanvasAttributeLayoutKt$$ExternalSyntheticOutline0 -> ev.h: +# {"id":"sourceFile","fileName":"R8$$SyntheticClass"} +# {"id":"com.android.tools.r8.synthesized"} + 1:1:void ev.CanvasAttributeLayoutKt$$ExternalSyntheticOutline0.m(android.media.MediaMetadataRetriever):0:0 -> a + # {"id":"com.android.tools.r8.synthesized"} + 1:2:void ev.CanvasAttributeLayoutKt$$ExternalSyntheticOutline0.m(java.lang.String,me.example.logging.L):0:0 -> b + # {"id":"com.android.tools.r8.synthesized"} + # {"id":"com.android.tools.r8.outline"} + 3:5:void ev.CanvasAttributeLayoutKt$$ExternalSyntheticOutline0.m(java.lang.String,me.example.logging.L):1:1 -> b + 6:9:void ev.CanvasAttributeLayoutKt$$ExternalSyntheticOutline0.m(java.lang.String,me.example.logging.L):2:2 -> b +com.example.compose.component.CanvasAttributeLayoutKt$CanvasAttributeLayout$1 -> ev.i: +# {"id":"sourceFile","fileName":"CanvasAttributeLayout.kt"} + com.example.models.CanvasAttributeLayout $this_CanvasAttributeLayout -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lpw/o;"} + com.example.compose.component.CanvasNodeCommonRenderState $state -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lev/r5;"} + kotlin.jvm.functions.Function1 $onEvent -> c + kotlin.jvm.functions.Function4 $childContent -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lp1/e;"} + androidx.compose.ui.Modifier $modifier -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Landroidx/compose/ui/d;"} + int $$changed -> f + 1:17:void (com.example.models.CanvasAttributeLayout,com.example.compose.component.CanvasNodeCommonRenderState,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function4,androidx.compose.ui.Modifier,int,int):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lpw/o;Lev/r5;Lkotlin/jvm/functions/Function1;Lp1/e;Landroidx/compose/ui/d;I)V"} + 9:29:void invoke(androidx.compose.runtime.Composer,int):0:0 -> invoke + 9:29:java.lang.Object invoke(java.lang.Object,java.lang.Object):0 -> invoke + 30:32:java.lang.Object invoke(java.lang.Object,java.lang.Object):0:0 -> invoke +com.example.MapAnnotations -> uu0.k: +# {"id":"sourceFile","fileName":"MapAnnotations.kt"} + com.example.core.IMapView mapView -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lbv0/i;"} + com.example.core.projection.overlay.IMapOverlayViewController mapOverlayViewController -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"La14/j;"} + com.example.projection.MapProjectionViewController mapProjectionViewController -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lmw0/f;"} + com.example.core.polygon.PolygonManager polygonManager -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Liv0/j;"} + com.example.dynamic.IKillSwitchProvider killSwitchProvider -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/example/o;"} + me.example.rx.RxUIBinder binder -> f + android.content.Context mapContext -> g + 1:3:void (com.example.core.IMapView,com.example.core.projection.overlay.IMapOverlayViewController,com.example.projection.MapProjectionViewController,com.example.core.polygon.PolygonManager,com.example.dynamic.IKillSwitchProvider):36:36 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lbv0/i;La14/j;Lmw0/f;Liv0/j;Lcom/example/o;)V"} + 4:5:void (com.example.core.IMapView,com.example.core.projection.overlay.IMapOverlayViewController,com.example.projection.MapProjectionViewController,com.example.core.polygon.PolygonManager,com.example.dynamic.IKillSwitchProvider):37:37 -> + 6:7:void (com.example.core.IMapView,com.example.core.projection.overlay.IMapOverlayViewController,com.example.projection.MapProjectionViewController,com.example.core.polygon.PolygonManager,com.example.dynamic.IKillSwitchProvider):38:38 -> + 8:9:void (com.example.core.IMapView,com.example.core.projection.overlay.IMapOverlayViewController,com.example.projection.MapProjectionViewController,com.example.core.polygon.PolygonManager,com.example.dynamic.IKillSwitchProvider):39:39 -> + 10:11:void (com.example.core.IMapView,com.example.core.projection.overlay.IMapOverlayViewController,com.example.projection.MapProjectionViewController,com.example.core.polygon.PolygonManager,com.example.dynamic.IKillSwitchProvider):40:40 -> + 12:13:void (com.example.core.IMapView,com.example.core.projection.overlay.IMapOverlayViewController,com.example.projection.MapProjectionViewController,com.example.core.polygon.PolygonManager,com.example.dynamic.IKillSwitchProvider):41:41 -> + 14:22:void (com.example.core.IMapView,com.example.core.projection.overlay.IMapOverlayViewController,com.example.projection.MapProjectionViewController,com.example.core.polygon.PolygonManager,com.example.dynamic.IKillSwitchProvider):44:44 -> + 23:29:void (com.example.core.IMapView,com.example.core.projection.overlay.IMapOverlayViewController,com.example.projection.MapProjectionViewController,com.example.core.polygon.PolygonManager,com.example.dynamic.IKillSwitchProvider):46:46 -> + 6:11:void setGeoJson(java.lang.String,java.lang.String):130:130 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)V"} + 1:8:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):106:106 -> f + 1:8:com.example.core.projection.polyline.IProjectionPolyline createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):71 -> f + 1:8:nv0.IProjectionPolyline uu0.MapAnnotations.createProjectionPolyline(pw0.ProjectionPolylineOptions):0 -> f + # {"id":"com.android.tools.r8.synthesized"} + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lpw0/c;)Lnv0/a;"} + 9:12:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):107:107 -> f + 9:12:com.example.core.projection.polyline.IProjectionPolyline createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):71 -> f + 9:12:nv0.IProjectionPolyline uu0.MapAnnotations.createProjectionPolyline(pw0.ProjectionPolylineOptions):0 -> f + 13:17:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolylineInternal(com.example.core.projection.polyline.IProjectionPolylineOptions,com.example.core.projection.IProjection,com.example.core.latlng.IBoundsFactory):146:146 -> f + 13:17:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):108 -> f + 13:17:com.example.core.projection.polyline.IProjectionPolyline createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):71 -> f + 13:17:nv0.IProjectionPolyline uu0.MapAnnotations.createProjectionPolyline(pw0.ProjectionPolylineOptions):0 -> f + 18:26:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):158:158 -> f + 18:26:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolylineInternal(com.example.core.projection.polyline.IProjectionPolylineOptions,com.example.core.projection.IProjection,com.example.core.latlng.IBoundsFactory):146 -> f + 18:26:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):108 -> f + 18:26:com.example.core.projection.polyline.IProjectionPolyline createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):71 -> f + 18:26:nv0.IProjectionPolyline uu0.MapAnnotations.createProjectionPolyline(pw0.ProjectionPolylineOptions):0 -> f + 27:28:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):159:159 -> f + 27:28:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolylineInternal(com.example.core.projection.polyline.IProjectionPolylineOptions,com.example.core.projection.IProjection,com.example.core.latlng.IBoundsFactory):146 -> f + 27:28:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):108 -> f + 27:28:com.example.core.projection.polyline.IProjectionPolyline createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):71 -> f + 27:28:nv0.IProjectionPolyline uu0.MapAnnotations.createProjectionPolyline(pw0.ProjectionPolylineOptions):0 -> f + 29:30:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):160:160 -> f + 29:30:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolylineInternal(com.example.core.projection.polyline.IProjectionPolylineOptions,com.example.core.projection.IProjection,com.example.core.latlng.IBoundsFactory):146 -> f + 29:30:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):108 -> f + 29:30:com.example.core.projection.polyline.IProjectionPolyline createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):71 -> f + 29:30:nv0.IProjectionPolyline uu0.MapAnnotations.createProjectionPolyline(pw0.ProjectionPolylineOptions):0 -> f + 31:34:nv0.IProjectionPolyline uu0.MapAnnotations.createProjectionPolyline(pw0.ProjectionPolylineOptions):0:0 -> f + 35:37:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolylineInternal(com.example.core.projection.polyline.IProjectionPolylineOptions,com.example.core.projection.IProjection,com.example.core.latlng.IBoundsFactory):146:146 -> f + 35:37:com.example.core.projection.polyline.IProjectionPolyline com.example.projection.MapProjectionViewController.createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):108 -> f + 35:37:com.example.core.projection.polyline.IProjectionPolyline createProjectionPolyline(com.example.core.projection.polyline.IProjectionPolylineOptions):71 -> f + 35:37:nv0.IProjectionPolyline uu0.MapAnnotations.createProjectionPolyline(pw0.ProjectionPolylineOptions):0 -> f + 1:7:com.example.core.circle.ICircle createCircle(com.example.core.circle.ICircleOptions):112:112 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ldv0/c;)Ldv0/b;"} + 1:3:android.content.Context getMapContext():46:46 -> getMapContext + 1:16:void showMapAttribution(boolean):124:124 -> h + 17:22:void showMapAttribution(boolean):125:125 -> h + 6:7:void removeOverlay(com.example.core.projection.overlay.IMapOverlay):91:91 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lmv0/a;)V"} + 8:22:void com.example.projection.overlays.MapOverlayViewController.removeOverlay(com.example.core.projection.overlay.IMapOverlay):36:36 -> i + 8:22:void removeOverlay(com.example.core.projection.overlay.IMapOverlay):91 -> i + 1:8:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):84:84 -> j + 1:8:java.util.List createProjectionMarkers(java.util.List):67 -> j + 1:8:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + # {"id":"com.android.tools.r8.synthesized"} + 9:14:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):85:85 -> j + 9:14:java.util.List createProjectionMarkers(java.util.List):67 -> j + 9:14:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 15:18:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):86:86 -> j + 15:18:java.util.List createProjectionMarkers(java.util.List):67 -> j + 15:18:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 19:20:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):87:87 -> j + 19:20:java.util.List createProjectionMarkers(java.util.List):67 -> j + 19:20:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 21:25:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):170:170 -> j + 21:25:java.util.List createProjectionMarkers(java.util.List):67 -> j + 21:25:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 26:39:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):179:179 -> j + 26:39:java.util.List createProjectionMarkers(java.util.List):67 -> j + 26:39:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 40:42:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):178:178 -> j + 40:42:java.util.List createProjectionMarkers(java.util.List):67 -> j + 40:42:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 43:47:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133:133 -> j + 43:47:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):88 -> j + 43:47:java.util.List createProjectionMarkers(java.util.List):67 -> j + 43:47:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 48:56:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):158:158 -> j + 48:56:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> j + 48:56:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):88 -> j + 48:56:java.util.List createProjectionMarkers(java.util.List):67 -> j + 48:56:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 57:58:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):159:159 -> j + 57:58:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> j + 57:58:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):88 -> j + 57:58:java.util.List createProjectionMarkers(java.util.List):67 -> j + 57:58:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 59:60:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):160:160 -> j + 59:60:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> j + 59:60:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):88 -> j + 59:60:java.util.List createProjectionMarkers(java.util.List):67 -> j + 59:60:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 61:64:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0:0 -> j + 65:68:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133:133 -> j + 65:68:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):88 -> j + 65:68:java.util.List createProjectionMarkers(java.util.List):67 -> j + 65:68:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 69:73:java.util.List com.example.projection.MapProjectionViewController.createProjectionMarkers(java.util.List):178:178 -> j + 69:73:java.util.List createProjectionMarkers(java.util.List):67 -> j + 69:73:java.util.ArrayList uu0.MapAnnotations.createProjectionMarkers(java.util.List):0 -> j + 6:18:void com.example.projection.MapProjectionViewController.removeProjectionMarker(com.example.core.projection.marker.IProjectionMarker):100:100 -> k + 6:18:void removeProjectionMarker(com.example.core.projection.marker.IProjectionMarker):83 -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"(Llv0/c;)V"} + 19:20:void com.example.projection.MapProjectionViewController.removeProjectionMarker(com.example.core.projection.marker.IProjectionMarker):101:101 -> k + 19:20:void removeProjectionMarker(com.example.core.projection.marker.IProjectionMarker):83 -> k + 21:28:void com.example.projection.markers.ProjectionMarkerRepository.remove(com.example.core.projection.marker.IProjectionMarker):19:19 -> k + 21:28:void com.example.projection.MapProjectionViewController.removeProjectionMarker(com.example.core.projection.marker.IProjectionMarker):101 -> k + 21:28:void removeProjectionMarker(com.example.core.projection.marker.IProjectionMarker):83 -> k + 6:23:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79:79 -> l + 6:23:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 6:23:lv0.IProjectionMarker uu0.MapAnnotations.createProjectionMarker(lv0.IProjectionMarkerOptions):0 -> l + # {"id":"com.android.tools.r8.synthesized"} + # {"id":"com.android.tools.r8.residualsignature","signature":"(Llv0/d;)Llv0/c;"} + 24:29:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133:133 -> l + 24:29:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79 -> l + 24:29:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 24:29:lv0.IProjectionMarker uu0.MapAnnotations.createProjectionMarker(lv0.IProjectionMarkerOptions):0 -> l + 30:38:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):158:158 -> l + 30:38:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> l + 30:38:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79 -> l + 30:38:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 30:38:lv0.IProjectionMarker uu0.MapAnnotations.createProjectionMarker(lv0.IProjectionMarkerOptions):0 -> l + 39:40:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):159:159 -> l + 39:40:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> l + 39:40:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79 -> l + 39:40:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 39:40:lv0.IProjectionMarker uu0.MapAnnotations.createProjectionMarker(lv0.IProjectionMarkerOptions):0 -> l + 41:42:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):160:160 -> l + 41:42:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> l + 41:42:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79 -> l + 41:42:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 41:42:lv0.IProjectionMarker uu0.MapAnnotations.createProjectionMarker(lv0.IProjectionMarkerOptions):0 -> l + 43:46:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):0:0 -> l + 43:46:lv0.IProjectionMarker uu0.MapAnnotations.createProjectionMarker(lv0.IProjectionMarkerOptions):0 -> l + # {"id":"com.android.tools.r8.outlineCallsite","positions":{"1":50,"3":52,"6":55},"outline":"Lev/h;b(Ljava/lang/String;Lcom/example/L;)V"} + 47:49:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133:133 -> l + # {"id":"com.android.tools.r8.outlineCallsite","positions":{"2":51,"4":50,"5":40},"outline":"Lev/h;b(Ljava/lang/String;Lcom/example/L;)V"} + 47:49:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79 -> l + 47:49:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 47:49:lv0.IProjectionMarker uu0.MapAnnotations.createProjectionMarker(lv0.IProjectionMarkerOptions):0 -> l + 50:50:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):160:160 -> l + 50:50:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> l + 50:50:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79 -> l + 50:50:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 52:52:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):160:160 -> l + 52:52:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> l + 52:52:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79 -> l + 52:52:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 55:55:java.lang.Object com.example.projection.MapProjectionViewController.onProjectionView(kotlin.jvm.functions.Function1):160:160 -> l + 55:55:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(com.example.core.projection.marker.IProjectionMarkerOptions,com.example.core.projection.IProjection,float,com.example.core.latlng.IBoundsFactory):133 -> l + 55:55:com.example.core.projection.marker.IProjectionMarker com.example.projection.MapProjectionViewController.createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):79 -> l + 55:55:com.example.core.projection.marker.IProjectionMarker createProjectionMarker(com.example.core.projection.marker.IProjectionMarkerOptions):63 -> l + 1:8:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):31:31 -> m + 1:8:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"(Liv0/k;)Liv0/j$b;"} + 9:10:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):32:32 -> m + 9:10:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + 11:18:com.jakewharton.rxrelay2.PublishRelay com.jakewharton.rxrelay2.PublishRelay.create():59:59 -> m + 11:18:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):33 -> m + 11:18:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + 19:22:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):34:34 -> m + 19:22:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + 23:25:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):32:32 -> m + 23:25:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + 26:27:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):36:36 -> m + 26:27:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + 28:33:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):39:39 -> m + 28:33:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + 34:36:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):36:36 -> m + 34:36:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + 37:46:com.example.core.polygon.IClickablePolygon com.example.core.polygon.PolygonManager.addPolygon(com.example.core.polygon.IPolygonOptions):45:45 -> m + 37:46:com.example.core.polygon.IClickablePolygon createPolygon(com.example.core.polygon.IPolygonOptions):103 -> m + 6:18:void com.example.projection.MapProjectionViewController.removeProjectionPolyline(com.example.core.projection.polyline.IProjectionPolyline):124:124 -> n + 6:18:void removeProjectionPolyline(com.example.core.projection.polyline.IProjectionPolyline):87 -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lnv0/a;)V"} + 19:20:void com.example.projection.MapProjectionViewController.removeProjectionPolyline(com.example.core.projection.polyline.IProjectionPolyline):125:125 -> n + 19:20:void removeProjectionPolyline(com.example.core.projection.polyline.IProjectionPolyline):87 -> n + 21:28:void com.example.projection.polyline.ProjectionPolylineRepository.remove(com.example.core.projection.polyline.IProjectionPolyline):20:20 -> n + 21:28:void com.example.projection.MapProjectionViewController.removeProjectionPolyline(com.example.core.projection.polyline.IProjectionPolyline):125 -> n + 21:28:void removeProjectionPolyline(com.example.core.projection.polyline.IProjectionPolyline):87 -> n + 1:8:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):51:51 -> o + 1:8:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + # {"id":"com.android.tools.r8.residualsignature","signature":"(Liv0/i;)Liv0/j$c;"} + 9:10:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):52:52 -> o + 9:10:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + 11:18:com.jakewharton.rxrelay2.PublishRelay com.jakewharton.rxrelay2.PublishRelay.create():59:59 -> o + 11:18:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):53 -> o + 11:18:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + 19:22:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):54:54 -> o + 19:22:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + 23:25:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):52:52 -> o + 23:25:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + 26:27:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):56:56 -> o + 26:27:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + 28:33:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):59:59 -> o + 28:33:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + 34:36:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):56:56 -> o + 34:36:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + 37:46:com.example.core.polygon.IClickablePolygonGroup com.example.core.polygon.PolygonManager.addPolygonGroup(com.example.core.polygon.PolygonGroupOptions):65:65 -> o + 37:46:com.example.core.polygon.IClickablePolygonGroup createPolygonGroup(com.example.core.polygon.PolygonGroupOptions):108 -> o + 1:7:com.example.core.polyline.IPolyline createPolyline(com.example.core.polyline.PolylineOptions):95:95 -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljv0/d;)Ljv0/a;"} + 1:9:com.example.core.projection.overlay.IMapOverlay com.example.projection.overlays.MapOverlayViewController.createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):30:30 -> q + 1:9:com.example.core.projection.overlay.IMapOverlay createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):79 -> q + 1:9:mv0.IMapOverlay uu0.MapAnnotations.createOverlay(ow0.LayoutMapOverlayOptions):0 -> q + # {"id":"com.android.tools.r8.synthesized"} + # {"id":"com.android.tools.r8.residualsignature","signature":"(Low0/a;)Lmv0/a;"} + 10:18:android.view.View com.example.projection.overlays.LayoutMapOverlayOptions.inflate(android.widget.FrameLayout):12:12 -> q + 10:18:com.example.core.projection.overlay.IMapOverlay com.example.projection.overlays.MapOverlayViewController.createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):30 -> q + 10:18:com.example.core.projection.overlay.IMapOverlay createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):79 -> q + 10:18:mv0.IMapOverlay uu0.MapAnnotations.createOverlay(ow0.LayoutMapOverlayOptions):0 -> q + 19:29:android.view.LayoutInflater com.example.wrappers.DynamicLayoutInflater.from(android.content.Context):24:24 -> q + 19:29:android.view.View com.example.projection.overlays.LayoutMapOverlayOptions.inflate(android.widget.FrameLayout):12 -> q + 19:29:com.example.core.projection.overlay.IMapOverlay com.example.projection.overlays.MapOverlayViewController.createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):30 -> q + 19:29:com.example.core.projection.overlay.IMapOverlay createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):79 -> q + 19:29:mv0.IMapOverlay uu0.MapAnnotations.createOverlay(ow0.LayoutMapOverlayOptions):0 -> q + 30:31:android.view.LayoutInflater com.example.wrappers.DynamicLayoutInflater.from(android.content.Context):25:25 -> q + 30:31:android.view.View com.example.projection.overlays.LayoutMapOverlayOptions.inflate(android.widget.FrameLayout):12 -> q + 30:31:com.example.core.projection.overlay.IMapOverlay com.example.projection.overlays.MapOverlayViewController.createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):30 -> q + 30:31:com.example.core.projection.overlay.IMapOverlay createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):79 -> q + 30:31:mv0.IMapOverlay uu0.MapAnnotations.createOverlay(ow0.LayoutMapOverlayOptions):0 -> q + 32:35:mv0.IMapOverlay uu0.MapAnnotations.createOverlay(ow0.LayoutMapOverlayOptions):0:0 -> q + 36:47:android.view.View com.example.projection.overlays.LayoutMapOverlayOptions.inflate(android.widget.FrameLayout):12:12 -> q + 36:47:com.example.core.projection.overlay.IMapOverlay com.example.projection.overlays.MapOverlayViewController.createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):30 -> q + 36:47:com.example.core.projection.overlay.IMapOverlay createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):79 -> q + 36:47:mv0.IMapOverlay uu0.MapAnnotations.createOverlay(ow0.LayoutMapOverlayOptions):0 -> q + 48:57:com.example.core.projection.overlay.IMapOverlay com.example.projection.overlays.MapOverlayViewController.createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):31:31 -> q + 48:57:com.example.core.projection.overlay.IMapOverlay createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):79 -> q + 48:57:mv0.IMapOverlay uu0.MapAnnotations.createOverlay(ow0.LayoutMapOverlayOptions):0 -> q + 58:63:com.example.core.projection.overlay.IMapOverlay com.example.projection.overlays.MapOverlayViewController.createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):32:32 -> q + 58:63:com.example.core.projection.overlay.IMapOverlay createOverlay(com.example.core.projection.overlay.IMapOverlayOptions):79 -> q + 58:63:mv0.IMapOverlay uu0.MapAnnotations.createOverlay(ow0.LayoutMapOverlayOptions):0 -> q +com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer -> b80.f: +# {"id":"sourceFile","fileName":"CurrentLocationRenderer.kt"} + me.example.locationproviders.ILocationService locationServices -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/example/PassiveLocationService;"} + com.example.AppForegroundDetector appForegroundDetector -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lti0/f;"} + com.example.mapcomponents.marker.currentlocation.ICurrentLocationRendererDelegate currentLocationRendererDelegate -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lb80/h;"} + me.example.rx.RxUIBinder binder -> d + 6:8:void (me.example.locationproviders.ILocationService,com.example.AppForegroundDetector,com.example.core.api.IAnimatedLocationProvider,com.example.core.feature.puck.IPuckStateProvider,com.example.mapcomponents.marker.currentlocation.ICurrentLocationRendererDelegate):19:19 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/example/PassiveLocationService;Lti0/f;Ldm1/g;Lcy0/b;Lb80/h;)V"} + 9:10:void (me.example.locationproviders.ILocationService,com.example.AppForegroundDetector,com.example.core.api.IAnimatedLocationProvider,com.example.core.feature.puck.IPuckStateProvider,com.example.mapcomponents.marker.currentlocation.ICurrentLocationRendererDelegate):20:20 -> + 11:12:void (me.example.locationproviders.ILocationService,com.example.AppForegroundDetector,com.example.core.api.IAnimatedLocationProvider,com.example.core.feature.puck.IPuckStateProvider,com.example.mapcomponents.marker.currentlocation.ICurrentLocationRendererDelegate):21:21 -> + 13:14:void (me.example.locationproviders.ILocationService,com.example.AppForegroundDetector,com.example.core.api.IAnimatedLocationProvider,com.example.core.feature.puck.IPuckStateProvider,com.example.mapcomponents.marker.currentlocation.ICurrentLocationRendererDelegate):24:24 -> + 15:24:void (me.example.locationproviders.ILocationService,com.example.AppForegroundDetector,com.example.core.api.IAnimatedLocationProvider,com.example.core.feature.puck.IPuckStateProvider,com.example.mapcomponents.marker.currentlocation.ICurrentLocationRendererDelegate):26:26 -> + 1:9:void render():33:33 -> a + 10:13:void render():37:37 -> a + 14:17:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():33:33 -> a + 14:17:void render():39 -> a + 18:19:com.example.core.projection.marker.ViewProjectionMarker com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createCurrentLocationProjectionMarker():101:101 -> a + 18:19:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():34 -> a + 18:19:void render():39 -> a + 20:21:com.example.core.projection.marker.ViewProjectionMarker com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createCurrentLocationProjectionMarker():102:102 -> a + 20:21:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():34 -> a + 20:21:void render():39 -> a + 22:23:com.example.core.projection.marker.ViewProjectionMarker com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createCurrentLocationProjectionMarker():103:103 -> a + 22:23:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():34 -> a + 22:23:void render():39 -> a + 24:29:com.example.core.projection.marker.ViewProjectionMarker com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createCurrentLocationProjectionMarker():105:105 -> a + 24:29:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():34 -> a + 24:29:void render():39 -> a + 30:32:com.example.core.projection.marker.ViewProjectionMarker com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createCurrentLocationProjectionMarker():102:102 -> a + 30:32:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():34 -> a + 30:32:void render():39 -> a + 33:40:com.example.core.projection.marker.ViewProjectionMarker com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createCurrentLocationProjectionMarker():101:101 -> a + 33:40:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():34 -> a + 33:40:void render():39 -> a + 41:42:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():34:34 -> a + 41:42:void render():39 -> a + 43:52:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():35:35 -> a + 43:52:void render():39 -> a + 53:55:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():36:36 -> a + 53:55:void render():39 -> a + 56:57:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():35:35 -> a + 56:57:void render():39 -> a + 58:67:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():38:38 -> a + 58:67:void render():39 -> a + 68:71:com.example.core.circle.ICircle com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createAccuracyCircle():111:111 -> a + 68:71:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():39 -> a + 68:71:void render():39 -> a + 72:73:com.example.core.circle.ICircle com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createAccuracyCircle():113:113 -> a + 72:73:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():39 -> a + 72:73:void render():39 -> a + 74:79:int androidx.core.content.ContextCompat$Api23Impl.getColor(android.content.Context,int):1074:1074 -> a + 74:79:int androidx.core.content.ContextCompat.getColor(android.content.Context,int):537 -> a + 74:79:com.example.core.circle.ICircle com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createAccuracyCircle():113 -> a + 74:79:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():39 -> a + 74:79:void render():39 -> a + 80:83:com.example.core.circle.ICircle com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createAccuracyCircle():114:114 -> a + 80:83:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():39 -> a + 80:83:void render():39 -> a + 84:87:com.example.core.circle.ICircle com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createAccuracyCircle():112:112 -> a + 84:87:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():39 -> a + 84:87:void render():39 -> a + 88:92:com.example.core.circle.ICircle com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createAccuracyCircle():117:117 -> a + 88:92:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():39 -> a + 88:92:void render():39 -> a + 93:96:com.example.core.circle.ICircle com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createAccuracyCircle():116:116 -> a + 93:96:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():39 -> a + 93:96:void render():39 -> a + 97:100:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():39:39 -> a + 97:100:void render():39 -> a + 101:102:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render():34:34 -> a + 101:102:void render():39 -> a + 103:113:io.reactivex.Observable com.example.development.noop.NoOpPuckStateProvider.observe():11:11 -> a + 103:113:void render():40 -> a + 114:115:void render():105:105 -> a + 116:118:void com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer$render$$inlined$bindStream$1.(com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer):0:0 -> a + 116:118:void render():105 -> a + 119:121:void render():105:105 -> a + 122:127:void bindLocationStream():73:73 -> a + 122:127:void render():47 -> a + 128:131:void bindLocationStream():74:74 -> a + 128:131:void render():47 -> a + 132:137:void bindLocationStream():75:75 -> a + 132:137:void render():47 -> a + 138:146:void bindLocationStream():107:107 -> a + 138:146:void render():47 -> a + 147:152:void bindLocationStream():97:97 -> a + 147:152:void render():47 -> a + 153:158:io.reactivex.Observable io.reactivex.Observable.distinctUntilChanged():7916:7916 -> a + 153:158:void bindLocationStream():98 -> a + 153:158:void render():47 -> a + 159:167:void bindLocationStream():108:108 -> a + 159:167:void render():47 -> a + 1:5:void clear():55:55 -> clear + 6:14:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.remove():90:90 -> clear + 6:14:void clear():56 -> clear + 15:18:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.remove():91:91 -> clear + 15:18:void clear():56 -> clear + 19:24:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.remove():92:92 -> clear + 19:24:void clear():56 -> clear + 25:26:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.remove():94:94 -> clear + 25:26:void clear():56 -> clear + 27:29:void com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.remove():95:95 -> clear + 27:29:void clear():56 -> clear +com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1 -> er3.f: +# {"id":"sourceFile","fileName":"CurrentLocationMarkerMapCollection.kt"} + com.example.mapcomponents.marker.currentlocation.ICurrentLocationRenderer $renderer -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lb80/i;"} + 1:7:void (com.example.mapcomponents.marker.currentlocation.ICurrentLocationRenderer):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lb80/i;)V"} + 1:5:void invoke():36:36 -> invoke + 1:5:java.lang.Object invoke():36 -> invoke + 6:8:java.lang.Object invoke():36:36 -> invoke +com.example.mapbox.MapboxMapView -> yv0.g: +# {"id":"sourceFile","fileName":"MapboxMapView.kt"} + 6:7:void addMapReadyCallback(kotlin.jvm.functions.Function0):366:366 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lkz3/a;)V"} + 8:9:java.util.concurrent.CopyOnWriteArrayList com.example.mapbox.MapboxCallbacks.getMapReadyCallbacks():31:31 -> d + 8:9:void addMapReadyCallback(kotlin.jvm.functions.Function0):366 -> d + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 10:12:void addMapReadyCallback(kotlin.jvm.functions.Function0):366:366 -> d + 13:16:void addMapReadyCallback(kotlin.jvm.functions.Function0):367:367 -> d + 17:20:void addMapReadyCallback(kotlin.jvm.functions.Function0):368:368 -> d + 6:7:void addFpsChangedCallback(kotlin.jvm.functions.Function1):441:441 -> d0 +com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1 -> er3.g$a: +# {"id":"sourceFile","fileName":"CurrentLocationMarkerMapCollection.kt"} + androidx.compose.runtime.State $locationEnabled -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/q1;"} + com.example.core.IMapView $mapView -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lbv0/i;"} + com.example.mapcomponents.marker.currentlocation.ICurrentLocationRenderer $renderer -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lb80/i;"} + 1:11:void (androidx.compose.runtime.State,com.example.core.IMapView,com.example.mapcomponents.marker.currentlocation.ICurrentLocationRenderer):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/q1;Lbv0/i;Lb80/i;)V"} + 1:2:java.lang.Object invoke(java.lang.Object):35:35 -> invoke + 3:7:androidx.compose.runtime.DisposableEffectResult invoke(androidx.compose.runtime.DisposableEffectScope):0:0 -> invoke + 3:7:java.lang.Object invoke(java.lang.Object):35 -> invoke + 8:14:androidx.compose.runtime.DisposableEffectResult invoke(androidx.compose.runtime.DisposableEffectScope):36:36 -> invoke + 8:14:java.lang.Object invoke(java.lang.Object):35 -> invoke + 15:19:androidx.compose.runtime.DisposableEffectResult invoke(androidx.compose.runtime.DisposableEffectScope):37:37 -> invoke + 15:19:java.lang.Object invoke(java.lang.Object):35 -> invoke + 20:35:androidx.compose.runtime.DisposableEffectResult invoke(androidx.compose.runtime.DisposableEffectScope):39:39 -> invoke + 20:35:java.lang.Object invoke(java.lang.Object):35 -> invoke + 36:38:androidx.compose.runtime.DisposableEffectResult invoke(androidx.compose.runtime.DisposableEffectScope):40:40 -> invoke + 36:38:java.lang.Object invoke(java.lang.Object):35 -> invoke + 39:41:androidx.compose.runtime.DisposableEffectResult invoke(androidx.compose.runtime.DisposableEffectScope):41:41 -> invoke + 39:41:java.lang.Object invoke(java.lang.Object):35 -> invoke + 42:47:androidx.compose.runtime.DisposableEffectResult invoke(androidx.compose.runtime.DisposableEffectScope):66:66 -> invoke + 42:47:java.lang.Object invoke(java.lang.Object):35 -> invoke +androidx.compose.runtime.DisposableEffectImpl -> h1.p0: +# {"id":"sourceFile","fileName":"Effects.kt"} + kotlin.jvm.functions.Function1 effect -> a + androidx.compose.runtime.DisposableEffectResult onDispose -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/q0;"} + 1:3:void (kotlin.jvm.functions.Function1):79:79 -> + 4:6:void (kotlin.jvm.functions.Function1):80:80 -> + 1:2:void onRemembered():85:85 -> d + 3:4:androidx.compose.runtime.DisposableEffectScope androidx.compose.runtime.EffectsKt.access$getInternalDisposableEffectScope$p():1:1 -> d + 3:4:void onRemembered():85 -> d + 5:13:void onRemembered():85:85 -> d + 1:1:void onAbandoned():95:95 -> f + 1:8:void onForgotten():89:89 -> g + 9:11:void onForgotten():90:90 -> g +androidx.compose.runtime.internal.RememberEventDispatcher -> p1.k: +# {"id":"sourceFile","fileName":"RememberEventDispatcher.kt"} + java.util.Set abandoning -> a + androidx.compose.runtime.tooling.CompositionErrorContext traceContext -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lt1/d;"} + androidx.compose.runtime.collection.MutableVector remembering -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lj1/c;"} + androidx.collection.MutableScatterSet rememberSet -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/l0;"} + androidx.compose.runtime.collection.MutableVector currentRememberingList -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lj1/c;"} + androidx.compose.runtime.collection.MutableVector leaving -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lj1/c;"} + androidx.compose.runtime.collection.MutableVector sideEffects -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lj1/c;"} + androidx.collection.MutableScatterSet releasing -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/l0;"} + androidx.collection.MutableScatterMap pausedPlaceholders -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/k0;"} + java.util.ArrayList nestedRemembersLists -> j + androidx.collection.ScatterSet ignoreLeavingSet -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/w0;"} + 1:3:void ():61:61 -> + 4:12:void ():296:296 -> + 13:14:void ():64:64 -> + 15:20:void ():65:65 -> + 21:22:void ():66:66 -> + 23:29:void ():299:299 -> + 30:31:void ():67:67 -> + 32:38:void ():302:302 -> + 39:41:void ():68:68 -> + 2:3:void clear():96:96 -> a + 4:5:void clear():97:97 -> a + 6:10:void clear():98:98 -> a + 11:15:void clear():99:99 -> a + 16:17:void clear():100:100 -> a + 18:22:void clear():101:101 -> a + 23:27:void clear():102:102 -> a + 28:29:void clear():103:103 -> a + 30:31:void clear():104:104 -> a + 32:34:void clear():105:105 -> a + 1:5:void dispatchAbandons():267:267 -> b + 6:14:void dispatchAbandons():268:268 -> b + 15:16:void dispatchAbandons():269:269 -> b + 17:19:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> b + 17:19:void dispatchAbandons():355 -> b + 20:23:void dispatchAbandons():270:270 -> b + 24:29:void dispatchAbandons():273:273 -> b + 30:35:void dispatchAbandons():274:274 -> b + 36:38:void dispatchAbandons():275:275 -> b + 39:44:void dispatchAbandons():276:276 -> b + 45:46:void dispatchAbandons():278:278 -> b + 47:53:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> b + 47:53:void dispatchAbandons():359 -> b + 54:55:void dispatchAbandons():359:359 -> b + 1:7:void dispatchRememberObservers():195:195 -> c + 8:9:void dispatchRememberObservers():196:196 -> c + 10:15:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> c + 10:15:void dispatchRememberObservers():310 -> c + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 16:17:void dispatchRememberObservers():200:200 -> c + 18:20:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> c + 18:20:void dispatchRememberObservers():311 -> c + 21:22:void dispatchRememberObservers():201:201 -> c + 23:29:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> c + 23:29:void dispatchRememberObservers():202 -> c + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 30:33:void dispatchRememberObservers():314:314 -> c + 34:37:void dispatchRememberObservers():205:205 -> c + 38:40:void dispatchRememberObservers():206:206 -> c + 41:42:androidx.compose.runtime.RememberObserver androidx.compose.runtime.RememberObserverHolder.getWrapped():4736:4736 -> c + 41:42:void dispatchRememberObservers():206 -> c + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 43:45:void dispatchRememberObservers():207:207 -> c + 46:51:void dispatchRememberObservers():208:208 -> c + 52:57:void dispatchRememberObservers():210:210 -> c + 58:63:void dispatchRememberObservers():212:212 -> c + 64:70:void dispatchRememberObservers():213:213 -> c + 71:76:void dispatchRememberObservers():215:215 -> c + 77:81:void dispatchRememberObservers():218:218 -> c + 82:92:void dispatchRememberObservers():318:318 -> c + 93:94:void dispatchRememberObservers():220:220 -> c + 95:101:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> c + 95:101:void dispatchRememberObservers():321 -> c + 102:102:void dispatchRememberObservers():321:321 -> c + 103:108:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> c + 103:108:void dispatchRememberObservers():322 -> c + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 109:110:void dispatchRememberObservers():225:225 -> c + 111:113:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> c + 111:113:void dispatchRememberObservers():323 -> c + 114:118:void dispatchRememberList(androidx.compose.runtime.collection.MutableVector):249:249 -> c + 114:118:void dispatchRememberObservers():225 -> c + 119:120:void dispatchRememberList(androidx.compose.runtime.collection.MutableVector):329:329 -> c + 119:120:void dispatchRememberObservers():225 -> c + 121:125:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> c + 121:125:void dispatchRememberList(androidx.compose.runtime.collection.MutableVector):330 -> c + 121:125:void dispatchRememberObservers():225 -> c + 126:129:void dispatchRememberList(androidx.compose.runtime.collection.MutableVector):332:332 -> c + 126:129:void dispatchRememberObservers():225 -> c + 130:131:androidx.compose.runtime.RememberObserver androidx.compose.runtime.RememberObserverHolder.getWrapped():4736:4736 -> c + 130:131:void dispatchRememberList(androidx.compose.runtime.collection.MutableVector):251 -> c + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 130:131:void dispatchRememberObservers():225 -> c + 132:134:void dispatchRememberList(androidx.compose.runtime.collection.MutableVector):252:252 -> c + 132:134:void dispatchRememberObservers():225 -> c + 135:143:void dispatchRememberList(androidx.compose.runtime.collection.MutableVector):253:253 -> c + 135:143:void dispatchRememberObservers():225 -> c + 144:151:void dispatchRememberList(androidx.compose.runtime.collection.MutableVector):336:336 -> c + 144:151:void dispatchRememberObservers():225 -> c + 152:153:void dispatchRememberObservers():225:225 -> c + 154:161:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> c + 154:161:void dispatchRememberObservers():327 -> c + 162:163:void dispatchRememberObservers():327:327 -> c + 1:6:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> d + 1:6:void dispatchSideEffects():342 -> d + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 7:8:void dispatchSideEffects():259:259 -> d + 9:11:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> d + 9:11:void dispatchSideEffects():343 -> d + 12:13:void dispatchSideEffects():347:347 -> d + 14:18:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> d + 14:18:void dispatchSideEffects():348 -> d + 19:22:void dispatchSideEffects():350:350 -> d + 23:30:void dispatchSideEffects():260:260 -> d + 31:33:void dispatchSideEffects():261:261 -> d + 34:35:void dispatchSideEffects():262:262 -> d + 36:42:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> d + 36:42:void dispatchSideEffects():354 -> d + 43:44:void dispatchSideEffects():354:354 -> d + 1:8:void forgetting(androidx.compose.runtime.RememberObserverHolder):114:114 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/j3;)V"} + 9:13:void forgetting(androidx.compose.runtime.RememberObserverHolder):115:115 -> e + 14:30:void forgetting(androidx.compose.runtime.RememberObserverHolder):116:116 -> e + 31:33:void forgetting(androidx.compose.runtime.RememberObserverHolder):130:130 -> e + 34:38:void forgetting(androidx.compose.runtime.RememberObserverHolder):136:136 -> e + 39:40:androidx.compose.runtime.RememberObserver androidx.compose.runtime.RememberObserverHolder.getWrapped():4736:4736 -> e + 39:40:void forgetting(androidx.compose.runtime.RememberObserverHolder):137 -> e + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 41:43:void forgetting(androidx.compose.runtime.RememberObserverHolder):137:137 -> e + 44:47:void forgetting(androidx.compose.runtime.RememberObserverHolder):139:139 -> e + 48:55:void forgetting(androidx.compose.runtime.RememberObserverHolder):140:140 -> e + 56:61:void recordLeaving(java.lang.Object):283:283 -> e + 56:61:void forgetting(androidx.compose.runtime.RememberObserverHolder):141 -> e + 1:2:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):361:361 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/j3;Lj1/c;)Z"} + 3:8:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> f + 3:8:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):362 -> f + 9:12:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):364:364 -> f + 13:14:androidx.compose.runtime.RememberObserver androidx.compose.runtime.RememberObserverHolder.getWrapped():4736:4736 -> f + 13:14:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):121 -> f + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 15:18:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):122:122 -> f + 19:20:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):123:123 -> f + 21:22:androidx.compose.runtime.collection.MutableVector androidx.compose.runtime.internal.PausedCompositionRemembers.getPausedRemembers():44:44 -> f + 21:22:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):123 -> f + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 23:29:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):124:124 -> f + 30:41:boolean forgetting$removeFrom(androidx.compose.runtime.RememberObserverHolder,androidx.compose.runtime.collection.MutableVector):125:125 -> f + 1:3:void prepare(java.util.Set,androidx.compose.runtime.tooling.CompositionErrorContext):77:77 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/Set;Lt1/f;)V"} + 4:5:void prepare(java.util.Set,androidx.compose.runtime.tooling.CompositionErrorContext):78:78 -> g + 6:8:void prepare(java.util.Set,androidx.compose.runtime.tooling.CompositionErrorContext):79:79 -> g + 1:5:void remembering(androidx.compose.runtime.RememberObserverHolder):109:109 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/j3;)V"} + 6:11:void remembering(androidx.compose.runtime.RememberObserverHolder):110:110 -> h +androidx.compose.runtime.CompositionImpl -> h1.y: +# {"id":"sourceFile","fileName":"Composition.kt"} + androidx.compose.runtime.CompositionContext parent -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/v;"} + androidx.compose.runtime.Applier applier -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/a;"} + java.util.concurrent.atomic.AtomicReference pendingModifications -> c + java.lang.Object lock -> d + java.util.Set abandonSet -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/m0;"} + androidx.compose.runtime.SlotTable slotTable -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/o3;"} + androidx.collection.MutableScatterMap observations -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/k0;"} + androidx.collection.MutableScatterSet invalidatedScopes -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/l0;"} + androidx.collection.MutableScatterSet conditionallyInvalidatedScopes -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/l0;"} + androidx.collection.MutableScatterMap derivedStates -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/k0;"} + androidx.compose.runtime.changelist.ChangeList changes -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Li1/a;"} + androidx.compose.runtime.changelist.ChangeList lateChanges -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Li1/a;"} + androidx.collection.MutableScatterMap observationsProcessed -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/k0;"} + androidx.collection.MutableScatterMap invalidations -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/k0;"} + boolean pendingInvalidScopes -> o + androidx.compose.runtime.ShouldPauseCallback shouldPause -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"Lc5/c;"} + androidx.compose.runtime.PausedCompositionImpl pendingPausedComposition -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/g2;"} + androidx.compose.runtime.CompositionImpl invalidationDelegate -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/y;"} + int invalidationDelegateGroup -> s + androidx.compose.runtime.CompositionObserverHolder observerHolder -> t + # {"id":"com.android.tools.r8.residualsignature","signature":"Lbv3/n;"} + androidx.compose.runtime.internal.RememberEventDispatcher rememberManager -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"Lp1/k;"} + androidx.compose.runtime.ComposerImpl composer -> v + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/n;"} + int state -> w + kotlin.jvm.functions.Function2 composable -> x + # {"id":"com.android.tools.r8.residualsignature","signature":"Lkz3/o;"} + void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext) -> + # {"id":"com.android.tools.r8.residualsignature","signature":"()V"} + 1:1:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):442:442 -> + 1:1:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/v;Lh1/a;)V"} + 2:2:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):447:447 -> + 2:2:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 3:3:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):450:450 -> + 3:3:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 4:4:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):466:466 -> + 4:4:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 5:5:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):1449:1449 -> + 5:5:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 6:6:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):469:469 -> + 6:6:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 7:7:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):479:479 -> + 7:7:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 8:8:java.util.Set androidx.collection.MutableScatterSet.asMutableSet():1129:1129 -> + 8:8:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):479 -> + 8:8:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 9:9:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):479:479 -> + 9:9:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 10:11:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):484:485 -> + 10:11:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 12:12:void androidx.compose.runtime.SlotTable.collectCalledByInformation():550:550 -> + 12:12:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):485 -> + 12:12:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 13:13:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):486:486 -> + 13:13:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 14:14:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):484:484 -> + 14:14:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 15:15:androidx.collection.MutableScatterMap androidx.compose.runtime.collection.ScopeMap.constructor-impl$default(androidx.collection.MutableScatterMap,int,kotlin.jvm.internal.DefaultConstructorMarker):27:27 -> + 15:15:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):493 -> + 15:15:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 16:16:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):493:493 -> + 16:16:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 17:17:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):503:503 -> + 17:17:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 18:18:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):511:511 -> + 18:18:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 19:19:androidx.collection.MutableScatterMap androidx.compose.runtime.collection.ScopeMap.constructor-impl$default(androidx.collection.MutableScatterMap,int,kotlin.jvm.internal.DefaultConstructorMarker):27:27 -> + 19:19:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):514 -> + 19:19:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 20:20:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):514:514 -> + 20:20:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 21:21:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):531:531 -> + 21:21:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 22:22:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):541:541 -> + 22:22:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 23:23:androidx.collection.MutableScatterMap androidx.compose.runtime.collection.ScopeMap.constructor-impl$default(androidx.collection.MutableScatterMap,int,kotlin.jvm.internal.DefaultConstructorMarker):27:27 -> + 23:23:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):550 -> + 23:23:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 24:24:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):550:550 -> + 24:24:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 25:25:androidx.collection.MutableScatterMap androidx.compose.runtime.collection.ScopeMap.constructor-impl$default(androidx.collection.MutableScatterMap,int,kotlin.jvm.internal.DefaultConstructorMarker):27:27 -> + 25:25:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):559 -> + 25:25:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 26:26:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):559:559 -> + 26:26:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 27:27:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):582:582 -> + 27:27:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 28:28:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):584:584 -> + 28:28:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 29:29:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):588:588 -> + 29:29:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 30:30:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):598:598 -> + 30:30:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 31:31:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext):621:621 -> + 31:31:void (androidx.compose.runtime.CompositionContext,androidx.compose.runtime.Applier,kotlin.coroutines.CoroutineContext,int,kotlin.jvm.internal.DefaultConstructorMarker):442 -> + 5:19:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1099:1099 -> A + # {"id":"com.android.tools.r8.residualsignature","signature":"(Li1/a;)V"} + 20:21:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> A + 20:21:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1101 -> A + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 22:27:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> A + 22:27:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1101 -> A + 28:29:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> A + 28:29:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137 -> A + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 30:35:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> A + 30:35:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137 -> A + 36:39:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137:1137 -> A + 40:45:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1138:1138 -> A + 46:53:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1141:1141 -> A + 54:55:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1102:1102 -> A + 56:58:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> A + 56:58:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2147 -> A + 59:62:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1103:1103 -> A + 63:72:androidx.compose.runtime.RecordingApplier androidx.compose.runtime.PausedCompositionImpl.getPausableApplier$runtime():216:216 -> A + 63:72:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1103 -> A + 73:76:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1103:1103 -> A + 77:81:androidx.compose.runtime.internal.RememberEventDispatcher androidx.compose.runtime.PausedCompositionImpl.getRememberManager$runtime():214:214 -> A + 77:81:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1104 -> A + 82:84:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1105:1105 -> A + 85:86:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1108:1108 -> A + 87:91:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2150:2150 -> A + 92:95:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1113:1113 -> A + 96:98:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1109:1109 -> A + 99:101:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1115:1115 -> A + 102:104:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2155:2155 -> A + 105:107:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1116:1116 -> A + 108:110:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> A + 108:110:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2158 -> A + 111:113:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1122:1122 -> A + 114:116:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1123:1123 -> A + 117:120:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1125:1125 -> A + 121:122:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1126:1126 -> A + 123:125:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> A + 123:125:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2159 -> A + 126:127:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1127:1127 -> A + 128:129:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1128:1128 -> A + 130:131:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2164:2164 -> A + 132:137:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2165:2165 -> A + 138:183:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2168:2168 -> A + 184:191:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2177:2177 -> A + 192:195:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2179:2179 -> A + 196:202:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2180:2180 -> A + 203:204:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2182:2182 -> A + 205:208:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2185:2185 -> A + 209:220:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2186:2186 -> A + 221:257:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2189:2189 -> A + 258:261:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2200:2200 -> A + 262:267:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1128:1128 -> A + 268:297:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2201:2201 -> A + 298:315:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2211:2211 -> A + 316:322:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2214:2214 -> A + 323:333:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1128:1128 -> A + 334:394:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2217:2217 -> A + 395:397:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1129:1129 -> A + 398:399:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1130:1130 -> A + 400:408:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> A + 400:408:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2228 -> A + 409:415:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2228:2228 -> A + 416:417:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> A + 416:417:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137 -> A + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 418:423:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> A + 418:423:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137 -> A + 424:427:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137:1137 -> A + 428:433:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1138:1138 -> A + 434:445:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1141:1141 -> A + 446:450:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2155:2155 -> A + 451:453:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> A + 451:453:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2158 -> A + 454:454:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):2158:2158 -> A + 455:456:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> A + 455:456:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137 -> A + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 457:462:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> A + 457:462:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137 -> A + 463:466:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1137:1137 -> A + 467:472:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1138:1138 -> A + 473:480:void applyChangesInLocked(androidx.compose.runtime.changelist.ChangeList):1141:1141 -> A + 3:6:void cleanUpDerivedStateObservations():1887:1887 -> B + 7:22:void cleanUpDerivedStateObservations():1888:1888 -> B + 23:58:void cleanUpDerivedStateObservations():1891:1891 -> B + 59:66:void cleanUpDerivedStateObservations():1900:1900 -> B + 67:72:void cleanUpDerivedStateObservations():1902:1902 -> B + 73:79:void cleanUpDerivedStateObservations():1903:1903 -> B + 80:81:void cleanUpDerivedStateObservations():1905:1905 -> B + 82:85:void cleanUpDerivedStateObservations():1908:1908 -> B + 86:95:void cleanUpDerivedStateObservations():1909:1909 -> B + 96:133:void cleanUpDerivedStateObservations():1912:1912 -> B + 134:141:void cleanUpDerivedStateObservations():1923:1923 -> B + 142:147:boolean androidx.compose.runtime.collection.ScopeMap.contains-impl(androidx.collection.MutableScatterMap,java.lang.Object):63:63 -> B + 142:147:void cleanUpDerivedStateObservations():1001 -> B + 148:181:void cleanUpDerivedStateObservations():1924:1924 -> B + 182:194:void cleanUpDerivedStateObservations():1934:1934 -> B + 195:201:void cleanUpDerivedStateObservations():1937:1937 -> B + 202:212:boolean androidx.compose.runtime.collection.ScopeMap.contains-impl(androidx.collection.MutableScatterMap,java.lang.Object):63:63 -> B + 202:212:void cleanUpDerivedStateObservations():1001 -> B + 213:296:void cleanUpDerivedStateObservations():1940:1940 -> B + 297:304:void cleanUpDerivedStateObservations():1002:1002 -> B + 305:306:void cleanUpDerivedStateObservations():1951:1951 -> B + 307:308:void cleanUpDerivedStateObservations():1954:1954 -> B + 309:314:void cleanUpDerivedStateObservations():1955:1955 -> B + 315:352:void cleanUpDerivedStateObservations():1958:1958 -> B + 353:356:void cleanUpDerivedStateObservations():1967:1967 -> B + 357:365:boolean androidx.compose.runtime.RecomposeScopeImpl.isConditional():319:319 -> B + 357:365:void cleanUpDerivedStateObservations():1003 -> B + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 366:387:void cleanUpDerivedStateObservations():1968:1968 -> B + 1:2:boolean clearDeactivated():720:720 -> C + 3:3:boolean clearDeactivated():1467:1467 -> C + 4:13:boolean clearDeactivated():721:721 -> C + 14:18:boolean clearDeactivated():723:723 -> C + 19:22:boolean clearDeactivated():1467:1467 -> C + 1:5:androidx.compose.runtime.PausedComposition composeInitialPaused(boolean,kotlin.jvm.functions.Function2):679:679 -> D + # {"id":"com.android.tools.r8.residualsignature","signature":"(ZLkz3/o;)Lh1/g2;"} + 6:7:androidx.compose.runtime.PausedComposition composeInitialPaused(boolean,kotlin.jvm.functions.Function2):680:680 -> D + 8:10:androidx.compose.runtime.PausedComposition composeInitialPaused(boolean,kotlin.jvm.functions.Function2):1456:1456 -> D + 11:28:androidx.compose.runtime.PausedComposition composeInitialPaused(boolean,kotlin.jvm.functions.Function2):683:683 -> D + 29:31:androidx.compose.runtime.PausedComposition composeInitialPaused(boolean,kotlin.jvm.functions.Function2):693:693 -> D + 1:10:void drainPendingModificationsForCompositionLocked():766:766 -> E + 11:16:boolean kotlin.jvm.internal.Intrinsics.areEqual(java.lang.Object,java.lang.Object):169:169 -> E + 11:16:void drainPendingModificationsForCompositionLocked():770 -> E + 17:21:void drainPendingModificationsForCompositionLocked():773:773 -> E + 22:27:void drainPendingModificationsForCompositionLocked():774:774 -> E + 28:31:void drainPendingModificationsForCompositionLocked():776:776 -> E + 32:39:void drainPendingModificationsForCompositionLocked():777:777 -> E + 40:45:void drainPendingModificationsForCompositionLocked():778:778 -> E + 46:68:void drainPendingModificationsForCompositionLocked():780:780 -> E + 69:80:void drainPendingModificationsForCompositionLocked():771:771 -> E + 2:7:void drainPendingModificationsLocked():786:786 -> F + 8:15:void drainPendingModificationsLocked():787:787 -> F + 16:20:void drainPendingModificationsLocked():790:790 -> F + 21:26:void drainPendingModificationsLocked():791:791 -> F + 27:30:void drainPendingModificationsLocked():793:793 -> F + 31:38:void drainPendingModificationsLocked():794:794 -> F + 39:46:void drainPendingModificationsLocked():795:795 -> F + 47:48:void drainPendingModificationsLocked():799:799 -> F + 49:57:void drainPendingModificationsLocked():798:798 -> F + 58:81:void drainPendingModificationsLocked():801:801 -> F + 1:8:void drainPendingModificationsOutOfBandLocked():809:809 -> G + 9:19:void drainPendingModificationsOutOfBandLocked():810:810 -> G + 20:24:void drainPendingModificationsOutOfBandLocked():814:814 -> G + 25:30:void drainPendingModificationsOutOfBandLocked():815:815 -> G + 31:34:void drainPendingModificationsOutOfBandLocked():817:817 -> G + 35:42:void drainPendingModificationsOutOfBandLocked():818:818 -> G + 43:48:void drainPendingModificationsOutOfBandLocked():819:819 -> G + 49:72:void drainPendingModificationsOutOfBandLocked():821:821 -> G + 1:14:void ensureRunning():704:704 -> H + 15:17:void ensureRunning():711:711 -> H + 18:20:void ensureRunning():709:709 -> H + 21:23:void ensureRunning():707:707 -> H + 24:25:void ensureRunning():710:710 -> H + 26:28:void ensureRunning():1460:1460 -> H + 29:33:void ensureRunning():714:714 -> H + 34:35:void ensureRunning():715:715 -> H + 36:39:void ensureRunning():1464:1464 -> H + 9:10:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1293:1293 -> I + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/t2;Lh1/c;Ljava/lang/Object;)Lh1/a1;"} + 11:11:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2325:2325 -> I + 12:16:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1295:1295 -> I + 17:20:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302:1302 -> I + 21:24:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):261:261 -> I + 21:24:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 25:26:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):261:261 -> I + 25:26:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + 27:31:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):4103:4103 -> I + 27:31:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + 32:38:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):262:262 -> I + 32:38:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + 39:41:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):4107:4107 -> I + 39:41:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + 42:47:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):263:263 -> I + 42:47:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + 48:53:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):264:264 -> I + 48:53:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + 54:56:int androidx.compose.runtime.SlotTableKt.groupSize(int[],int):3857:3857 -> I + 54:56:int androidx.compose.runtime.SlotTableKt.access$groupSize(int[],int):1 -> I + 54:56:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):264 -> I + 54:56:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + 57:71:int androidx.compose.runtime.Anchor.getLocation$runtime():696:696 -> I + 57:71:boolean androidx.compose.runtime.SlotTable.groupContainsAnchor(int,androidx.compose.runtime.Anchor):264 -> I + 57:71:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1302 -> I + 72:73:boolean isComposing():624:624 -> I + 72:73:boolean tryImminentInvalidation(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1285 -> I + 72:73:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1307 -> I + 74:77:boolean androidx.compose.runtime.ComposerImpl.isComposing$runtime():1460:1460 -> I + 74:77:boolean isComposing():624 -> I + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 74:77:boolean tryImminentInvalidation(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1285 -> I + 74:77:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1307 -> I + 78:88:boolean tryImminentInvalidation(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1285:1285 -> I + 78:88:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1307 -> I + 89:94:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1309:1309 -> I + 95:98:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1317:1317 -> I + 99:103:void androidx.compose.runtime.collection.ScopeMap.set-impl(androidx.collection.MutableScatterMap,java.lang.Object,java.lang.Object):59:59 -> I + 99:103:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1317 -> I + 104:107:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1318:1318 -> I + 108:111:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1321:1321 -> I + 112:116:void androidx.compose.runtime.collection.ScopeMap.set-impl(androidx.collection.MutableScatterMap,java.lang.Object,java.lang.Object):59:59 -> I + 112:116:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1321 -> I + 117:118:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1323:1323 -> I + 119:124:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2327:2327 -> I + 125:128:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2331:2331 -> I + 129:130:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2332:2332 -> I + 131:132:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2334:2334 -> I + 133:134:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2337:2337 -> I + 135:140:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2338:2338 -> I + 141:182:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2341:2341 -> I + 183:186:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2335:2335 -> I + 187:213:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1323:1323 -> I + 214:218:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1324:1324 -> I + 219:221:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2325:2325 -> I + 222:226:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1333:1333 -> I + 227:231:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1335:1335 -> I + 232:233:boolean isComposing():624:624 -> I + 232:233:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1336 -> I + 234:237:boolean androidx.compose.runtime.ComposerImpl.isComposing$runtime():1460:1460 -> I + 234:237:boolean isComposing():624 -> I + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 234:237:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1336 -> I + 238:243:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):1336:1336 -> I + 244:245:androidx.compose.runtime.InvalidationResult invalidateChecked(androidx.compose.runtime.RecomposeScopeImpl,androidx.compose.runtime.Anchor,java.lang.Object):2325:2325 -> I + 5:6:void invalidateScopeOfLocked(java.lang.Object):1043:1043 -> J + 7:12:void invalidateScopeOfLocked(java.lang.Object):2003:2003 -> J + 13:18:void invalidateScopeOfLocked(java.lang.Object):2007:2007 -> J + 19:20:void invalidateScopeOfLocked(java.lang.Object):2008:2008 -> J + 21:22:void invalidateScopeOfLocked(java.lang.Object):2010:2010 -> J + 23:24:void invalidateScopeOfLocked(java.lang.Object):2013:2013 -> J + 25:31:void invalidateScopeOfLocked(java.lang.Object):2014:2014 -> J + 32:71:void invalidateScopeOfLocked(java.lang.Object):2017:2017 -> J + 72:75:void invalidateScopeOfLocked(java.lang.Object):2011:2011 -> J + 76:83:void invalidateScopeOfLocked(java.lang.Object):1044:1044 -> J + 84:97:void invalidateScopeOfLocked(java.lang.Object):1046:1046 -> J + 98:99:void invalidateScopeOfLocked(java.lang.Object):2034:2034 -> J + 100:107:void invalidateScopeOfLocked(java.lang.Object):1044:1044 -> J + 108:111:void invalidateScopeOfLocked(java.lang.Object):1046:1046 -> J + 5:12:boolean androidx.compose.runtime.ComposerImpl.getAreChildrenComposing$runtime():1467:1467 -> a + 5:12:boolean getAreChildrenComposing():615 -> a + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 5:12:void recordReadOf(java.lang.Object):1009 -> a + 13:18:void recordReadOf(java.lang.Object):1010:1010 -> a + 19:22:void androidx.compose.runtime.RecomposeScopeImpl.setUsed(boolean):444:444 -> a + 19:22:void recordReadOf(java.lang.Object):1011 -> a + 23:31:void androidx.compose.runtime.RecomposeScopeImpl.setUsed(boolean):445:445 -> a + 23:31:void recordReadOf(java.lang.Object):1011 -> a + 32:42:boolean androidx.compose.runtime.RecomposeScopeImpl.recordRead(java.lang.Object):296:296 -> a + 32:42:void recordReadOf(java.lang.Object):1013 -> a + 43:44:boolean androidx.compose.runtime.RecomposeScopeImpl.recordRead(java.lang.Object):298:298 -> a + 43:44:void recordReadOf(java.lang.Object):1013 -> a + 45:53:int androidx.collection.MutableObjectIntMap.put(java.lang.Object,int,int):729:729 -> a + 45:53:boolean androidx.compose.runtime.RecomposeScopeImpl.recordRead(java.lang.Object):298 -> a + 45:53:void recordReadOf(java.lang.Object):1013 -> a + 54:57:int androidx.collection.MutableObjectIntMap.put(java.lang.Object,int,int):734:734 -> a + 54:57:boolean androidx.compose.runtime.RecomposeScopeImpl.recordRead(java.lang.Object):298 -> a + 54:57:void recordReadOf(java.lang.Object):1013 -> a + 58:61:int androidx.collection.MutableObjectIntMap.put(java.lang.Object,int,int):736:736 -> a + 58:61:boolean androidx.compose.runtime.RecomposeScopeImpl.recordRead(java.lang.Object):298 -> a + 58:61:void recordReadOf(java.lang.Object):1013 -> a + 62:65:int androidx.collection.MutableObjectIntMap.put(java.lang.Object,int,int):737:737 -> a + 62:65:boolean androidx.compose.runtime.RecomposeScopeImpl.recordRead(java.lang.Object):298 -> a + 62:65:void recordReadOf(java.lang.Object):1013 -> a + 66:70:boolean androidx.compose.runtime.RecomposeScopeImpl.recordRead(java.lang.Object):299:299 -> a + 66:70:void recordReadOf(java.lang.Object):1013 -> a + 71:77:androidx.compose.runtime.tooling.CompositionObserver observer():1388:1388 -> a + 71:77:void recordReadOf(java.lang.Object):1015 -> a + 78:81:void recordReadOf(java.lang.Object):1018:1018 -> a + 82:87:void recordReadOf(java.lang.Object):1019:1019 -> a + 88:92:void recordReadOf(java.lang.Object):1022:1022 -> a + 93:96:void recordReadOf(java.lang.Object):1025:1025 -> a + 97:103:void recordReadOf(java.lang.Object):1026:1026 -> a + 104:108:void recordReadOf(java.lang.Object):1027:1027 -> a + 109:110:androidx.collection.ObjectIntMap androidx.compose.runtime.DerivedSnapshotState$ResultRecord.getDependencies():101:101 -> a + 109:110:void recordReadOf(java.lang.Object):1028 -> a + 111:112:void recordReadOf(java.lang.Object):1979:1979 -> a + 113:114:void recordReadOf(java.lang.Object):1982:1982 -> a + 115:120:void recordReadOf(java.lang.Object):1983:1983 -> a + 121:165:void recordReadOf(java.lang.Object):1986:1986 -> a + 166:173:void recordReadOf(java.lang.Object):1981:1981 -> a + 174:177:void recordReadOf(java.lang.Object):1029:1029 -> a + 178:186:void recordReadOf(java.lang.Object):1030:1030 -> a + 187:218:void recordReadOf(java.lang.Object):1032:1032 -> a + 219:220:java.lang.Object androidx.compose.runtime.DerivedSnapshotState$ResultRecord.getCurrentValue():166:166 -> a + 219:220:void recordReadOf(java.lang.Object):1034 -> a + 221:224:void androidx.compose.runtime.RecomposeScopeImpl.recordDerivedStateValue(androidx.compose.runtime.DerivedState,java.lang.Object):308:308 -> a + 221:224:void recordReadOf(java.lang.Object):1034 -> a + 225:232:void androidx.compose.runtime.RecomposeScopeImpl.recordDerivedStateValue(androidx.compose.runtime.DerivedState,java.lang.Object):309:309 -> a + 225:232:void recordReadOf(java.lang.Object):1034 -> a + 233:236:void androidx.compose.runtime.RecomposeScopeImpl.recordDerivedStateValue(androidx.compose.runtime.DerivedState,java.lang.Object):311:311 -> a + 233:236:void recordReadOf(java.lang.Object):1034 -> a + 2:3:void recomposeScopeReleased(androidx.compose.runtime.RecomposeScopeImpl):1275:1275 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()V"} + 4:9:androidx.compose.runtime.tooling.CompositionObserver observer():1388:1388 -> b + 4:9:void recomposeScopeReleased(androidx.compose.runtime.RecomposeScopeImpl):1277 -> b + 1:2:void applyLateChanges():1156:1156 -> c + 3:3:void applyLateChanges():2250:2250 -> c + 4:5:void applyLateChanges():1158:1158 -> c + 6:7:boolean androidx.compose.runtime.changelist.ChangeList.isNotEmpty():78:78 -> c + 6:7:void applyLateChanges():1158 -> c + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 8:13:boolean androidx.compose.runtime.changelist.ChangeList.isNotEmpty():78:78 -> c + 8:13:void applyLateChanges():1158 -> c + 14:21:void applyLateChanges():1159:1159 -> c + 22:23:void applyLateChanges():1161:1161 -> c + 24:25:void applyLateChanges():2250:2250 -> c + 26:27:void applyLateChanges():2257:2257 -> c + 28:29:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> c + 28:29:void applyLateChanges():2257 -> c + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 30:35:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> c + 30:35:void applyLateChanges():2257 -> c + 36:45:void applyLateChanges():2258:2258 -> c + 46:48:void applyLateChanges():2260:2260 -> c + 49:51:void applyLateChanges():2258:2258 -> c + 52:62:void applyLateChanges():2263:2263 -> c + 63:63:void applyLateChanges():2265:2265 -> c + 64:66:void applyLateChanges():2268:2268 -> c + 67:68:void applyLateChanges():2269:2269 -> c + 69:70:void applyLateChanges():2250:2250 -> c + 3:10:boolean kotlin.jvm.internal.Intrinsics.areEqual(java.lang.Object,java.lang.Object):169:169 -> d + 3:10:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1230 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/k0;ILkz3/a;)Ljava/lang/Object;"} + 11:14:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1231:1231 -> d + 15:18:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1232:1232 -> d + 19:22:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1234:1234 -> d + 23:24:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1236:1236 -> d + 25:28:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1237:1237 -> d + 29:30:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1236:1236 -> d + 31:33:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1237:1237 -> d + 34:38:java.lang.Object delegateInvalidations(androidx.compose.runtime.ControlledComposition,int,kotlin.jvm.functions.Function0):1239:1239 -> d + 1:2:void deactivate():1391:1391 -> deactivate + 3:3:void deactivate():2394:2394 -> deactivate + 4:8:void deactivate():1392:1392 -> deactivate + 9:10:void deactivate():1393:1393 -> deactivate + 11:13:void deactivate():2396:2396 -> deactivate + 14:15:void deactivate():1395:1395 -> deactivate + 16:26:int androidx.compose.runtime.SlotTable.getGroupsSize():102:102 -> deactivate + 16:26:void deactivate():1395 -> deactivate + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 27:28:void deactivate():1396:1396 -> deactivate + 29:30:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> deactivate + 29:30:void deactivate():1396 -> deactivate + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 31:40:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> deactivate + 31:40:void deactivate():1396 -> deactivate + 41:42:void deactivate():1397:1397 -> deactivate + 43:45:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> deactivate + 43:45:void deactivate():2399 -> deactivate + 46:55:void deactivate():1398:1398 -> deactivate + 56:60:void deactivate():2403:2403 -> deactivate + 61:65:void deactivate():1400:1400 -> deactivate + 66:67:void deactivate():1401:1401 -> deactivate + 68:71:void deactivate():2405:2405 -> deactivate + 72:73:void deactivate():1402:1402 -> deactivate + 74:75:int androidx.compose.runtime.SlotWriter.getCurrentGroup():1326:1326 -> deactivate + 74:75:void androidx.compose.runtime.ComposerKt.deactivateCurrentGroup(androidx.compose.runtime.SlotWriter,androidx.compose.runtime.RememberManager):4512 -> deactivate + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 74:75:void deactivate():1402 -> deactivate + 76:83:void androidx.compose.runtime.ComposerKt.deactivateCurrentGroup(androidx.compose.runtime.SlotWriter,androidx.compose.runtime.RememberManager):4512:4512 -> deactivate + 76:83:void deactivate():1402 -> deactivate + 84:85:void deactivate():1403:1403 -> deactivate + 86:88:void deactivate():2410:2410 -> deactivate + 89:93:void deactivate():1404:1404 -> deactivate + 94:100:void deactivate():1405:1405 -> deactivate + 101:104:void deactivate():2410:2410 -> deactivate + 105:107:void deactivate():1407:1407 -> deactivate + 108:110:void deactivate():2413:2413 -> deactivate + 111:112:void deactivate():1409:1409 -> deactivate + 113:115:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> deactivate + 113:115:void deactivate():2416 -> deactivate + 116:117:void deactivate():1411:1411 -> deactivate + 118:120:void androidx.compose.runtime.collection.ScopeMap.clear-impl(androidx.collection.MutableScatterMap):87:87 -> deactivate + 118:120:void deactivate():1411 -> deactivate + 121:122:void deactivate():1412:1412 -> deactivate + 123:125:void androidx.compose.runtime.collection.ScopeMap.clear-impl(androidx.collection.MutableScatterMap):87:87 -> deactivate + 123:125:void deactivate():1412 -> deactivate + 126:127:void deactivate():1413:1413 -> deactivate + 128:130:void androidx.compose.runtime.collection.ScopeMap.clear-impl(androidx.collection.MutableScatterMap):87:87 -> deactivate + 128:130:void deactivate():1413 -> deactivate + 131:132:void deactivate():1414:1414 -> deactivate + 133:134:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> deactivate + 133:134:void deactivate():1414 -> deactivate + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 135:137:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> deactivate + 135:137:void deactivate():1414 -> deactivate + 138:139:void deactivate():1415:1415 -> deactivate + 140:141:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> deactivate + 140:141:void deactivate():1415 -> deactivate + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 142:144:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> deactivate + 142:144:void deactivate():1415 -> deactivate + 145:146:void deactivate():1416:1416 -> deactivate + 147:148:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1819:1819 -> deactivate + 147:148:void deactivate():1416 -> deactivate + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 149:151:void androidx.compose.runtime.Stack.clear-impl(java.util.ArrayList):42:42 -> deactivate + 149:151:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1819 -> deactivate + 149:151:void deactivate():1416 -> deactivate + 152:156:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1820:1820 -> deactivate + 152:156:void deactivate():1416 -> deactivate + 157:158:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1821:1821 -> deactivate + 157:158:void deactivate():1416 -> deactivate + 159:164:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> deactivate + 159:164:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1821 -> deactivate + 159:164:void deactivate():1416 -> deactivate + 165:166:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1822:1822 -> deactivate + 165:166:void deactivate():1416 -> deactivate + 167:168:void deactivate():1418:1418 -> deactivate + 169:170:void deactivate():1419:1419 -> deactivate + 171:174:void deactivate():2394:2394 -> deactivate + 175:178:void deactivate():2413:2413 -> deactivate + 179:181:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> deactivate + 179:181:void deactivate():2416 -> deactivate + 182:182:void deactivate():2416:2416 -> deactivate + 183:184:void deactivate():2394:2394 -> deactivate + 1:2:void dispose():848:848 -> dispose + 3:3:void dispose():1511:1511 -> dispose + 4:5:void dispose():849:849 -> dispose + 6:9:boolean androidx.compose.runtime.ComposerImpl.isComposing$runtime():1460:1460 -> dispose + 6:9:void dispose():849 -> dispose + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 10:11:void dispose():850:850 -> dispose + 12:18:void dispose():1513:1513 -> dispose + 19:23:void dispose():853:853 -> dispose + 24:25:void dispose():854:854 -> dispose + 26:29:void dispose():855:855 -> dispose + 30:31:void dispose():864:864 -> dispose + 32:35:androidx.compose.runtime.changelist.ChangeList androidx.compose.runtime.ComposerImpl.getDeferredChanges$runtime():1483:1483 -> dispose + 32:35:void dispose():864 -> dispose + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 36:38:void dispose():866:866 -> dispose + 39:40:void dispose():874:874 -> dispose + 41:51:int androidx.compose.runtime.SlotTable.getGroupsSize():102:102 -> dispose + 41:51:void dispose():874 -> dispose + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 52:53:void dispose():875:875 -> dispose + 54:55:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> dispose + 54:55:void dispose():875 -> dispose + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 56:61:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> dispose + 56:61:void dispose():875 -> dispose + 62:71:void dispose():876:876 -> dispose + 72:76:void dispose():1517:1517 -> dispose + 77:81:void dispose():878:878 -> dispose + 82:83:void dispose():879:879 -> dispose + 84:87:void dispose():1519:1519 -> dispose + 88:89:void dispose():879:879 -> dispose + 90:91:int androidx.compose.runtime.SlotWriter.getCurrentGroup():1326:1326 -> dispose + 90:91:void androidx.compose.runtime.ComposerKt.removeCurrentGroup(androidx.compose.runtime.SlotWriter,androidx.compose.runtime.RememberManager):4473 -> dispose + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 90:91:void dispose():879 -> dispose + 92:99:void androidx.compose.runtime.ComposerKt.removeCurrentGroup(androidx.compose.runtime.SlotWriter,androidx.compose.runtime.RememberManager):4473:4473 -> dispose + 92:99:void dispose():879 -> dispose + 100:102:void androidx.compose.runtime.ComposerKt.removeCurrentGroup(androidx.compose.runtime.SlotWriter,androidx.compose.runtime.RememberManager):4487:4487 -> dispose + 100:102:void dispose():879 -> dispose + 103:104:void dispose():879:879 -> dispose + 105:107:void dispose():1524:1524 -> dispose + 108:112:void dispose():880:880 -> dispose + 113:117:void dispose():881:881 -> dispose + 118:124:void dispose():882:882 -> dispose + 125:128:void dispose():1524:1524 -> dispose + 129:131:void dispose():884:884 -> dispose + 132:134:void dispose():1527:1527 -> dispose + 135:139:void dispose():887:887 -> dispose + 140:141:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1810:1810 -> dispose + 140:141:void dispose():887 -> dispose + 142:144:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> dispose + 142:144:void androidx.compose.runtime.ComposerImpl.dispose$runtime():5045 -> dispose + 142:144:void dispose():887 -> dispose + 145:149:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1811:1811 -> dispose + 145:149:void dispose():887 -> dispose + 150:151:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1819:1819 -> dispose + 150:151:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1812 -> dispose + 150:151:void dispose():887 -> dispose + 152:154:void androidx.compose.runtime.Stack.clear-impl(java.util.ArrayList):42:42 -> dispose + 152:154:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1819 -> dispose + 152:154:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1812 -> dispose + 152:154:void dispose():887 -> dispose + 155:159:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1820:1820 -> dispose + 155:159:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1812 -> dispose + 155:159:void dispose():887 -> dispose + 160:161:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1821:1821 -> dispose + 160:161:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1812 -> dispose + 160:161:void dispose():887 -> dispose + 162:167:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> dispose + 162:167:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1821 -> dispose + 162:167:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1812 -> dispose + 162:167:void dispose():887 -> dispose + 168:169:void androidx.compose.runtime.ComposerImpl.deactivate$runtime():1822:1822 -> dispose + 168:169:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1812 -> dispose + 168:169:void dispose():887 -> dispose + 170:171:androidx.compose.runtime.Applier androidx.compose.runtime.ComposerImpl.getApplier():1407:1407 -> dispose + 170:171:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1813 -> dispose + 170:171:void dispose():887 -> dispose + 172:174:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1813:1813 -> dispose + 172:174:void dispose():887 -> dispose + 175:176:void androidx.compose.runtime.ComposerImpl.dispose$runtime():1815:1815 -> dispose + 175:176:void dispose():887 -> dispose + 177:184:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> dispose + 177:184:void androidx.compose.runtime.ComposerImpl.dispose$runtime():5049 -> dispose + 177:184:void dispose():887 -> dispose + 185:185:void androidx.compose.runtime.ComposerImpl.dispose$runtime():5049:5049 -> dispose + 185:185:void dispose():887 -> dispose + 186:189:void dispose():1527:1527 -> dispose + 190:191:void dispose():889:889 -> dispose + 192:192:void dispose():1511:1511 -> dispose + 193:198:void dispose():890:890 -> dispose + 199:200:void dispose():1511:1511 -> dispose + 1:3:androidx.compose.runtime.PausedComposition setPausableContentWithReuse(kotlin.jvm.functions.Function2):656:656 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lkz3/o;)Lh1/g2;"} + 4:7:androidx.compose.runtime.PausedComposition setPausableContentWithReuse(kotlin.jvm.functions.Function2):657:657 -> e + 8:12:androidx.compose.runtime.PausedComposition setPausableContentWithReuse(kotlin.jvm.functions.Function2):659:659 -> e + 1:2:androidx.compose.runtime.ShouldPauseCallback getAndSetShouldPauseCallback(androidx.compose.runtime.ShouldPauseCallback):1245:1245 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lc5/c;)Lc5/c;"} + 3:5:androidx.compose.runtime.ShouldPauseCallback getAndSetShouldPauseCallback(androidx.compose.runtime.ShouldPauseCallback):1246:1246 -> f + 1:2:boolean recompose():1061:1061 -> g + 3:3:boolean recompose():2074:2074 -> g + 4:8:boolean recompose():1062:1062 -> g + 9:19:boolean androidx.compose.runtime.PausedCompositionImpl.isRecomposing$runtime():218:218 -> g + 9:19:boolean recompose():1063 -> g + 20:22:boolean recompose():1069:1069 -> g + 23:27:boolean recompose():1070:1070 -> g + 28:30:boolean recompose():1072:1072 -> g + 31:32:androidx.collection.MutableScatterMap takeInvalidations-afanTW4():1355:1355 -> g + 31:32:boolean recompose():2080 -> g + 33:36:androidx.collection.MutableScatterMap androidx.compose.runtime.collection.ScopeMap.constructor-impl$default(androidx.collection.MutableScatterMap,int,kotlin.jvm.internal.DefaultConstructorMarker):27:27 -> g + 33:36:androidx.collection.MutableScatterMap takeInvalidations-afanTW4():1356 -> g + 33:36:boolean recompose():2080 -> g + 37:38:androidx.collection.MutableScatterMap takeInvalidations-afanTW4():1356:1356 -> g + 37:38:boolean recompose():2080 -> g + 39:42:boolean recompose():1075:1075 -> g + 43:44:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3771:3771 -> g + 43:44:boolean recompose():1075 -> g + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 45:46:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> g + 45:46:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3771 -> g + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 45:46:boolean recompose():1075 -> g + 47:52:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> g + 47:52:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3771 -> g + 47:52:boolean recompose():1075 -> g + 53:54:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3771:3771 -> g + 53:54:boolean recompose():1075 -> g + 55:57:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):5282:5282 -> g + 55:57:boolean recompose():1075 -> g + 58:61:int androidx.collection.ScatterMap.getSize():280:280 -> g + 58:61:int androidx.compose.runtime.collection.ScopeMap.getSize-impl(androidx.collection.MutableScatterMap):32 -> g + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 58:61:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3776 -> g + 58:61:boolean recompose():1075 -> g + 62:70:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3776:3776 -> g + 62:70:boolean recompose():1075 -> g + 71:73:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3777:3777 -> g + 71:73:boolean recompose():1075 -> g + 74:76:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3779:3779 -> g + 74:76:boolean recompose():1075 -> g + 77:78:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3781:3781 -> g + 77:78:boolean recompose():1075 -> g + 79:84:boolean androidx.compose.runtime.changelist.ChangeList.isNotEmpty():78:78 -> g + 79:84:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3783 -> g + 79:84:boolean recompose():1075 -> g + 85:90:boolean recompose():1077:1077 -> g + 91:93:boolean recompose():2074:2074 -> g + 94:96:boolean androidx.compose.runtime.ComposerImpl.recompose-aFTiNEg$runtime(androidx.collection.MutableScatterMap,androidx.compose.runtime.ShouldPauseCallback):3781:3781 -> g + 94:96:boolean recompose():1075 -> g + 97:98:boolean recompose():2084:2084 -> g + 99:100:boolean recompose():2085:2085 -> g + 101:102:boolean recompose():2087:2087 -> g + 103:104:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> g + 103:104:boolean recompose():2087 -> g + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 105:110:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> g + 105:110:boolean recompose():2087 -> g + 111:120:boolean recompose():2088:2088 -> g + 121:123:boolean recompose():2090:2090 -> g + 124:126:boolean recompose():2088:2088 -> g + 127:137:boolean recompose():2093:2093 -> g + 138:138:boolean recompose():2095:2095 -> g + 139:141:boolean recompose():2098:2098 -> g + 142:142:boolean recompose():2099:2099 -> g + 143:144:boolean recompose():2074:2074 -> g + 5:14:boolean observesAnyOf(java.util.Set):1533:1533 -> h + 15:16:boolean observesAnyOf(java.util.Set):1534:1534 -> h + 17:18:androidx.collection.ScatterSet androidx.compose.runtime.collection.ScatterSetWrapper.getSet$runtime():25:25 -> h + 17:18:boolean observesAnyOf(java.util.Set):1534 -> h + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 19:20:boolean observesAnyOf(java.util.Set):1536:1536 -> h + 21:22:boolean observesAnyOf(java.util.Set):1539:1539 -> h + 23:28:boolean observesAnyOf(java.util.Set):1540:1540 -> h + 29:68:boolean observesAnyOf(java.util.Set):1543:1543 -> h + 69:70:boolean observesAnyOf(java.util.Set):1537:1537 -> h + 71:94:boolean androidx.compose.runtime.collection.ScopeMap.contains-impl(androidx.collection.MutableScatterMap,java.lang.Object):63:63 -> h + 71:94:boolean observesAnyOf(java.util.Set):926 -> h + 95:96:boolean observesAnyOf(java.util.Set):1560:1560 -> h + 97:110:boolean observesAnyOf(java.util.Set):1561:1561 -> h + 111:124:boolean androidx.compose.runtime.collection.ScopeMap.contains-impl(androidx.collection.MutableScatterMap,java.lang.Object):63:63 -> h + 111:124:boolean observesAnyOf(java.util.Set):926 -> h + 1:4:void insertMovableContent(java.util.List):1086:1086 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/ArrayList;)V"} + 5:11:void insertMovableContent(java.util.List):2102:2102 -> i + 12:15:void insertMovableContent(java.util.List):2103:2103 -> i + 16:17:void insertMovableContent(java.util.List):2101:2101 -> i + 18:19:java.lang.Object kotlin.Pair.getFirst():27:27 -> i + 18:19:void insertMovableContent(java.util.List):1086 -> i + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 20:21:void insertMovableContent(java.util.List):1086:1086 -> i + 22:23:androidx.compose.runtime.ControlledComposition androidx.compose.runtime.MovableContentStateReference.getComposition$runtime():389:389 -> i + 22:23:void insertMovableContent(java.util.List):1086 -> i + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 24:29:boolean kotlin.jvm.internal.Intrinsics.areEqual(java.lang.Object,java.lang.Object):169:169 -> i + 24:29:void insertMovableContent(java.util.List):1086 -> i + 30:31:void insertMovableContent(java.util.List):2108:2108 -> i + 32:38:void insertMovableContent(java.util.List):2110:2110 -> i + 39:41:void insertMovableContent(java.util.List):1087:1087 -> i + 42:44:void androidx.compose.runtime.ComposerImpl.insertMovableContentReferences(java.util.List):3498:3498 -> i + 42:44:void insertMovableContent(java.util.List):1087 -> i + 45:47:void androidx.compose.runtime.ComposerImpl.insertMovableContentReferences(java.util.List):3502:3502 -> i + 45:47:void insertMovableContent(java.util.List):1087 -> i + 48:53:void insertMovableContent(java.util.List):1087:1087 -> i + 54:57:void androidx.compose.runtime.ComposerImpl.insertMovableContentReferences(java.util.List):3505:3505 -> i + 54:57:void insertMovableContent(java.util.List):1087 -> i + 58:65:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> i + 58:65:void insertMovableContent(java.util.List):2119 -> i + 66:71:void insertMovableContent(java.util.List):2120:2120 -> i + 72:74:void insertMovableContent(java.util.List):2122:2122 -> i + 75:77:void insertMovableContent(java.util.List):2120:2120 -> i + 78:88:void insertMovableContent(java.util.List):2125:2125 -> i + 89:89:void insertMovableContent(java.util.List):2127:2127 -> i + 90:92:void insertMovableContent(java.util.List):2130:2130 -> i + 93:93:void insertMovableContent(java.util.List):2131:2131 -> i + 1:9:boolean isDisposed():627:627 -> isDisposed + 1:8:boolean androidx.compose.runtime.RecomposeScopeImpl.getDefaultsInScope():488:488 -> j + 1:8:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1251 -> j + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/t2;Ljava/lang/Object;)Lh1/a1;"} + 9:10:void androidx.compose.runtime.RecomposeScopeImpl.setDefaultsInvalid(boolean):499:499 -> j + 9:10:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1252 -> j + 11:14:androidx.compose.runtime.Anchor androidx.compose.runtime.RecomposeScopeImpl.getAnchor():95:95 -> j + 11:14:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1254 -> j + 15:21:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1255:1255 -> j + 22:29:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1257:1257 -> j + 30:31:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1259:1259 -> j + 32:32:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):2324:2324 -> j + 33:34:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1259:1259 -> j + 35:37:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):2324:2324 -> j + 38:39:boolean isComposing():624:624 -> j + 38:39:boolean tryImminentInvalidation(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1285 -> j + 38:39:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1260 -> j + 40:43:boolean androidx.compose.runtime.ComposerImpl.isComposing$runtime():1460:1460 -> j + 40:43:boolean isComposing():624 -> j + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 40:43:boolean tryImminentInvalidation(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1285 -> j + 40:43:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1260 -> j + 44:49:boolean tryImminentInvalidation(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1285:1285 -> j + 44:49:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1260 -> j + 50:52:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1261:1261 -> j + 53:56:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1263:1263 -> j + 57:58:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):2324:2324 -> j + 59:62:boolean androidx.compose.runtime.RecomposeScopeImpl.getCanRecompose():106:106 -> j + 59:62:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1265 -> j + 63:66:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1267:1267 -> j + 67:70:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1268:1268 -> j + 71:76:androidx.compose.runtime.tooling.CompositionObserver observer():1388:1388 -> j + 71:76:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1269 -> j + 77:79:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1266:1266 -> j + 80:82:androidx.compose.runtime.InvalidationResult invalidate(androidx.compose.runtime.RecomposeScopeImpl,java.lang.Object):1256:1256 -> j + 1:4:void setContent(kotlin.jvm.functions.Function2):633:633 -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lkz3/o;)V"} + 5:7:void setContent(kotlin.jvm.functions.Function2):634:634 -> k + 8:13:void setContent(kotlin.jvm.functions.Function2):636:636 -> k + 14:18:void androidx.compose.runtime.ComposerImpl.startReuseFromRoot():1932:1932 -> k + 14:18:void composeInitialWithReuse(kotlin.jvm.functions.Function2):698 -> k + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 14:18:void setContent(kotlin.jvm.functions.Function2):637 -> k + 19:20:void androidx.compose.runtime.ComposerImpl.startReuseFromRoot():1933:1933 -> k + 19:20:void composeInitialWithReuse(kotlin.jvm.functions.Function2):698 -> k + 19:20:void setContent(kotlin.jvm.functions.Function2):637 -> k + 21:22:void composeInitial(kotlin.jvm.functions.Function2):671:671 -> k + 21:22:void composeInitialWithReuse(kotlin.jvm.functions.Function2):699 -> k + 21:22:void setContent(kotlin.jvm.functions.Function2):637 -> k + 23:25:void composeInitial(kotlin.jvm.functions.Function2):672:672 -> k + 23:25:void composeInitialWithReuse(kotlin.jvm.functions.Function2):699 -> k + 23:25:void setContent(kotlin.jvm.functions.Function2):637 -> k + 26:29:void composeInitialWithReuse(kotlin.jvm.functions.Function2):700:700 -> k + 26:29:void setContent(kotlin.jvm.functions.Function2):637 -> k + 30:31:void composeInitial(kotlin.jvm.functions.Function2):671:671 -> k + 30:31:void setContent(kotlin.jvm.functions.Function2):639 -> k + 32:35:void composeInitial(kotlin.jvm.functions.Function2):672:672 -> k + 32:35:void setContent(kotlin.jvm.functions.Function2):639 -> k + 1:10:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):1091:1091 -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/l1;)V"} + 11:13:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):2134:2134 -> l + 14:15:androidx.compose.runtime.SlotTable androidx.compose.runtime.MovableContentState.getSlotTable$runtime():411:411 -> l + 14:15:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):1092 -> l + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 16:19:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):2136:2136 -> l + 20:21:int androidx.compose.runtime.SlotWriter.getCurrentGroup():1326:1326 -> l + 20:21:void androidx.compose.runtime.ComposerKt.removeCurrentGroup(androidx.compose.runtime.SlotWriter,androidx.compose.runtime.RememberManager):4473 -> l + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 20:21:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):1093 -> l + 22:29:void androidx.compose.runtime.ComposerKt.removeCurrentGroup(androidx.compose.runtime.SlotWriter,androidx.compose.runtime.RememberManager):4473:4473 -> l + 22:29:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):1093 -> l + 30:32:void androidx.compose.runtime.ComposerKt.removeCurrentGroup(androidx.compose.runtime.SlotWriter,androidx.compose.runtime.RememberManager):4487:4487 -> l + 30:32:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):1093 -> l + 33:35:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):1093:1093 -> l + 36:38:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):2141:2141 -> l + 39:41:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):1094:1094 -> l + 42:49:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):2144:2144 -> l + 50:53:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):2141:2141 -> l + 54:57:void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState):2144:2144 -> l + 1:2:void applyChanges():1147:1147 -> m + 3:3:void applyChanges():2229:2229 -> m + 4:8:void applyChanges():1149:1149 -> m + 9:11:void applyChanges():1150:1150 -> m + 12:13:void applyChanges():1151:1151 -> m + 14:16:void applyChanges():2229:2229 -> m + 17:18:void applyChanges():2236:2236 -> m + 19:20:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> m + 19:20:void applyChanges():2236 -> m + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 21:26:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> m + 21:26:void applyChanges():2236 -> m + 27:36:void applyChanges():2237:2237 -> m + 37:39:void applyChanges():2239:2239 -> m + 40:42:void applyChanges():2237:2237 -> m + 43:53:void applyChanges():2242:2242 -> m + 54:54:void applyChanges():2244:2244 -> m + 55:57:void applyChanges():2247:2247 -> m + 58:59:void applyChanges():2248:2248 -> m + 60:61:void applyChanges():2229:2229 -> m + 1:2:boolean isComposing():624:624 -> n + 3:5:boolean androidx.compose.runtime.ComposerImpl.isComposing$runtime():1460:1460 -> n + 3:5:boolean isComposing():624 -> n + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 1:2:void recordWriteOf(java.lang.Object):1052:1052 -> o + 3:3:void recordWriteOf(java.lang.Object):2038:2038 -> o + 4:6:void recordWriteOf(java.lang.Object):1053:1053 -> o + 7:8:void recordWriteOf(java.lang.Object):1057:1057 -> o + 9:14:void recordWriteOf(java.lang.Object):2039:2039 -> o + 15:18:void recordWriteOf(java.lang.Object):2043:2043 -> o + 19:20:void recordWriteOf(java.lang.Object):2044:2044 -> o + 21:22:void recordWriteOf(java.lang.Object):2046:2046 -> o + 23:24:void recordWriteOf(java.lang.Object):2049:2049 -> o + 25:31:void recordWriteOf(java.lang.Object):2050:2050 -> o + 32:71:void recordWriteOf(java.lang.Object):2053:2053 -> o + 72:75:void recordWriteOf(java.lang.Object):2047:2047 -> o + 76:92:void recordWriteOf(java.lang.Object):1057:1057 -> o + 93:94:void recordWriteOf(java.lang.Object):2070:2070 -> o + 95:97:void recordWriteOf(java.lang.Object):1057:1057 -> o + 98:99:void recordWriteOf(java.lang.Object):1058:1058 -> o + 100:103:void recordWriteOf(java.lang.Object):2038:2038 -> o + 1:2:void composeContent(kotlin.jvm.functions.Function2):829:829 -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lkz3/o;)V"} + 3:3:void composeContent(kotlin.jvm.functions.Function2):1482:1482 -> p + 4:6:void composeContent(kotlin.jvm.functions.Function2):830:830 -> p + 7:8:androidx.collection.MutableScatterMap takeInvalidations-afanTW4():1355:1355 -> p + 7:8:void composeContent(kotlin.jvm.functions.Function2):1483 -> p + 9:12:androidx.collection.MutableScatterMap androidx.compose.runtime.collection.ScopeMap.constructor-impl$default(androidx.collection.MutableScatterMap,int,kotlin.jvm.internal.DefaultConstructorMarker):27:27 -> p + 9:12:androidx.collection.MutableScatterMap takeInvalidations-afanTW4():1356 -> p + 9:12:void composeContent(kotlin.jvm.functions.Function2):1483 -> p + 13:14:androidx.collection.MutableScatterMap takeInvalidations-afanTW4():1356:1356 -> p + 13:14:void composeContent(kotlin.jvm.functions.Function2):1483 -> p + 15:18:void composeContent(kotlin.jvm.functions.Function2):832:832 -> p + 19:20:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):3744:3744 -> p + 19:20:void composeContent(kotlin.jvm.functions.Function2):832 -> p + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 21:22:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> p + 21:22:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):3744 -> p + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 21:22:void composeContent(kotlin.jvm.functions.Function2):832 -> p + 23:28:boolean androidx.compose.runtime.changelist.ChangeList.isEmpty():76:76 -> p + 23:28:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):3744 -> p + 23:28:void composeContent(kotlin.jvm.functions.Function2):832 -> p + 29:30:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):3744:3744 -> p + 29:30:void composeContent(kotlin.jvm.functions.Function2):832 -> p + 31:33:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):5274:5274 -> p + 31:33:void composeContent(kotlin.jvm.functions.Function2):832 -> p + 34:36:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):3745:3745 -> p + 34:36:void composeContent(kotlin.jvm.functions.Function2):832 -> p + 37:39:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):3747:3747 -> p + 37:39:void composeContent(kotlin.jvm.functions.Function2):832 -> p + 40:41:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):3749:3749 -> p + 40:41:void composeContent(kotlin.jvm.functions.Function2):832 -> p + 42:43:void composeContent(kotlin.jvm.functions.Function2):833:833 -> p + 44:50:void composeContent(kotlin.jvm.functions.Function2):1482:1482 -> p + 51:53:void androidx.compose.runtime.ComposerImpl.composeContent--ZbOJvo$runtime(androidx.collection.MutableScatterMap,kotlin.jvm.functions.Function2,androidx.compose.runtime.ShouldPauseCallback):3749:3749 -> p + 51:53:void composeContent(kotlin.jvm.functions.Function2):832 -> p + 54:55:void composeContent(kotlin.jvm.functions.Function2):1487:1487 -> p + 56:57:void composeContent(kotlin.jvm.functions.Function2):1488:1488 -> p + 58:59:void composeContent(kotlin.jvm.functions.Function2):1482:1482 -> p + 60:61:void composeContent(kotlin.jvm.functions.Function2):1490:1490 -> p + 62:63:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> p + 62:63:void composeContent(kotlin.jvm.functions.Function2):1490 -> p + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 64:69:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> p + 64:69:void composeContent(kotlin.jvm.functions.Function2):1490 -> p + 70:79:void composeContent(kotlin.jvm.functions.Function2):1491:1491 -> p + 80:82:void composeContent(kotlin.jvm.functions.Function2):1493:1493 -> p + 83:85:void composeContent(kotlin.jvm.functions.Function2):1491:1491 -> p + 86:96:void composeContent(kotlin.jvm.functions.Function2):1496:1496 -> p + 97:97:void composeContent(kotlin.jvm.functions.Function2):1498:1498 -> p + 98:100:void composeContent(kotlin.jvm.functions.Function2):1501:1501 -> p + 101:101:void composeContent(kotlin.jvm.functions.Function2):1502:1502 -> p + 1:2:boolean getHasInvalidations():894:894 -> q + 3:3:boolean getHasInvalidations():1530:1530 -> q + 4:5:boolean getHasInvalidations():894:894 -> q + 6:12:int androidx.collection.ScatterMap.getSize():280:280 -> q + 6:12:int androidx.compose.runtime.collection.ScopeMap.getSize-impl(androidx.collection.MutableScatterMap):32 -> q + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 6:12:boolean getHasInvalidations():894 -> q + 13:17:boolean getHasInvalidations():1530:1530 -> q + 1:6:void androidx.compose.runtime.ComposerImpl.prepareCompose$runtime(kotlin.jvm.functions.Function0):3754:3754 -> r + 1:6:void prepareCompose(kotlin.jvm.functions.Function0):931 -> r + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/a3;)V"} + 7:8:void androidx.compose.runtime.ComposerImpl.prepareCompose$runtime(kotlin.jvm.functions.Function0):3754:3754 -> r + 7:8:void prepareCompose(kotlin.jvm.functions.Function0):931 -> r + 9:12:void androidx.compose.runtime.ComposerImpl.prepareCompose$runtime(kotlin.jvm.functions.Function0):5278:5278 -> r + 9:12:void prepareCompose(kotlin.jvm.functions.Function0):931 -> r + 13:15:void androidx.compose.runtime.ComposerImpl.prepareCompose$runtime(kotlin.jvm.functions.Function0):3755:3755 -> r + 13:15:void prepareCompose(kotlin.jvm.functions.Function0):931 -> r + 16:18:void androidx.compose.runtime.ComposerImpl.prepareCompose$runtime(kotlin.jvm.functions.Function0):3757:3757 -> r + 16:18:void prepareCompose(kotlin.jvm.functions.Function0):931 -> r + 19:25:void androidx.compose.runtime.ComposerImpl.prepareCompose$runtime(kotlin.jvm.functions.Function0):3759:3759 -> r + 19:25:void prepareCompose(kotlin.jvm.functions.Function0):931 -> r + 1:6:void abandonChanges():1202:1202 -> s + 7:8:void abandonChanges():1203:1203 -> s + 9:10:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> s + 9:10:void abandonChanges():1203 -> s + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 11:13:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> s + 11:13:void abandonChanges():1203 -> s + 14:15:void abandonChanges():1204:1204 -> s + 16:17:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> s + 16:17:void abandonChanges():1204 -> s + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 18:20:void androidx.compose.runtime.changelist.ChangeList.clear():81:81 -> s + 18:20:void abandonChanges():1204 -> s + 21:24:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> s + 21:24:void abandonChanges():1206 -> s + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 25:30:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> s + 25:30:void abandonChanges():1206 -> s + 31:38:void abandonChanges():1207:1207 -> s + 39:41:void abandonChanges():2314:2314 -> s + 42:44:void abandonChanges():1207:1207 -> s + 45:54:void abandonChanges():2317:2317 -> s + 1:2:void changesApplied():1166:1166 -> t + 3:3:void changesApplied():2271:2271 -> t + 4:6:void changesApplied():1168:1168 -> t + 7:8:void androidx.compose.runtime.ComposerImpl.changesApplied$runtime():1764:1764 -> t + 7:8:void changesApplied():1168 -> t + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 9:10:void changesApplied():1172:1172 -> t + 11:12:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> t + 11:12:void changesApplied():1172 -> t + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 13:18:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> t + 13:18:void changesApplied():1172 -> t + 19:28:void changesApplied():1173:1173 -> t + 29:31:void changesApplied():2278:2278 -> t + 32:34:void changesApplied():1174:1174 -> t + 35:45:void changesApplied():2281:2281 -> t + 46:47:void changesApplied():1177:1177 -> t + 48:49:void changesApplied():2271:2271 -> t + 50:51:void changesApplied():2285:2285 -> t + 52:53:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> t + 52:53:void changesApplied():2285 -> t + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 54:59:boolean androidx.collection.SetWrapper.isEmpty():1150:1150 -> t + 54:59:void changesApplied():2285 -> t + 60:69:void changesApplied():2286:2286 -> t + 70:72:void changesApplied():2288:2288 -> t + 73:75:void changesApplied():2286:2286 -> t + 76:86:void changesApplied():2291:2291 -> t + 87:87:void changesApplied():2293:2293 -> t + 88:90:void changesApplied():2296:2296 -> t + 91:92:void changesApplied():2297:2297 -> t + 93:94:void changesApplied():2271:2271 -> t + 1:8:void recordModificationsOf(java.util.Set):906:906 -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lj1/e;)V"} + 9:10:void recordModificationsOf(java.util.Set):910:910 -> u + 11:17:boolean kotlin.jvm.internal.Intrinsics.areEqual(java.lang.Object,java.lang.Object):169:169 -> u + 11:17:void recordModificationsOf(java.util.Set):910 -> u + 18:31:void recordModificationsOf(java.util.Set):911:911 -> u + 32:38:void recordModificationsOf(java.util.Set):912:912 -> u + 39:41:java.lang.Object[] kotlin.collections.ArraysKt___ArraysJvmKt.plus(java.lang.Object[],java.lang.Object):1664:1664 -> u + 39:41:void recordModificationsOf(java.util.Set):912 -> u + 42:45:java.lang.Object[] kotlin.collections.ArraysKt___ArraysJvmKt.plus(java.lang.Object[],java.lang.Object):1665:1665 -> u + 42:45:void recordModificationsOf(java.util.Set):912 -> u + 46:48:java.lang.Object[] kotlin.collections.ArraysKt___ArraysJvmKt.plus(java.lang.Object[],java.lang.Object):1666:1666 -> u + 46:48:void recordModificationsOf(java.util.Set):912 -> u + 49:50:void recordModificationsOf(java.util.Set):912:912 -> u + 51:75:void recordModificationsOf(java.util.Set):913:913 -> u + 76:77:void recordModificationsOf(java.util.Set):915:915 -> u + 78:85:boolean java.util.concurrent.atomic.AtomicReference.compareAndSet(java.lang.Object,java.lang.Object):0:0 -> u + 78:85:void recordModificationsOf(java.util.Set):915 -> u + 86:87:void recordModificationsOf(java.util.Set):917:917 -> u + 88:88:void recordModificationsOf(java.util.Set):1531:1531 -> u + 89:93:void recordModificationsOf(java.util.Set):917:917 -> u + 94:99:void recordModificationsOf(java.util.Set):1531:1531 -> u + 100:106:boolean java.util.concurrent.atomic.AtomicReference.compareAndSet(java.lang.Object,java.lang.Object):0:0 -> u + 100:106:void recordModificationsOf(java.util.Set):915 -> u + 1:3:void setContentWithReuse(kotlin.jvm.functions.Function2):644:644 -> v + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lkz3/o;)V"} + 4:8:void setContentWithReuse(kotlin.jvm.functions.Function2):645:645 -> v + 9:13:void androidx.compose.runtime.ComposerImpl.startReuseFromRoot():1932:1932 -> v + 9:13:void composeInitialWithReuse(kotlin.jvm.functions.Function2):698 -> v + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 9:13:void setContentWithReuse(kotlin.jvm.functions.Function2):647 -> v + 14:15:void androidx.compose.runtime.ComposerImpl.startReuseFromRoot():1933:1933 -> v + 14:15:void composeInitialWithReuse(kotlin.jvm.functions.Function2):698 -> v + 14:15:void setContentWithReuse(kotlin.jvm.functions.Function2):647 -> v + 16:17:void composeInitial(kotlin.jvm.functions.Function2):671:671 -> v + 16:17:void composeInitialWithReuse(kotlin.jvm.functions.Function2):699 -> v + 16:17:void setContentWithReuse(kotlin.jvm.functions.Function2):647 -> v + 18:22:void composeInitial(kotlin.jvm.functions.Function2):672:672 -> v + 18:22:void composeInitialWithReuse(kotlin.jvm.functions.Function2):699 -> v + 18:22:void setContentWithReuse(kotlin.jvm.functions.Function2):647 -> v + 23:26:void composeInitialWithReuse(kotlin.jvm.functions.Function2):700:700 -> v + 23:26:void setContentWithReuse(kotlin.jvm.functions.Function2):647 -> v + 1:4:androidx.compose.runtime.PausedComposition setPausableContent(kotlin.jvm.functions.Function2):651:651 -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lkz3/o;)Lh1/g2;"} + 5:9:androidx.compose.runtime.PausedComposition setPausableContent(kotlin.jvm.functions.Function2):652:652 -> w + 1:2:void invalidateAll():1212:1212 -> x + 3:3:void invalidateAll():2320:2320 -> x + 4:5:void invalidateAll():1212:1212 -> x + 6:7:java.lang.Object[] androidx.compose.runtime.SlotTable.getSlots():111:111 -> x + 6:7:void invalidateAll():1212 -> x + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 8:13:void invalidateAll():2321:2321 -> x + 14:33:void invalidateAll():1212:1212 -> x + 34:37:void invalidateAll():2320:2320 -> x + 5:6:void addPendingInvalidationsLocked(java.lang.Object,boolean):959:959 -> y + 7:12:void addPendingInvalidationsLocked(java.lang.Object,boolean):1631:1631 -> y + 13:22:void addPendingInvalidationsLocked(java.lang.Object,boolean):1635:1635 -> y + 23:24:void addPendingInvalidationsLocked(java.lang.Object,boolean):1636:1636 -> y + 25:26:void addPendingInvalidationsLocked(java.lang.Object,boolean):1638:1638 -> y + 27:28:void addPendingInvalidationsLocked(java.lang.Object,boolean):1641:1641 -> y + 29:34:void addPendingInvalidationsLocked(java.lang.Object,boolean):1642:1642 -> y + 35:74:void addPendingInvalidationsLocked(java.lang.Object,boolean):1645:1645 -> y + 75:78:void addPendingInvalidationsLocked(java.lang.Object,boolean):1639:1639 -> y + 79:84:void addPendingInvalidationsLocked(java.lang.Object,boolean):961:961 -> y + 85:94:void addPendingInvalidationsLocked(java.lang.Object,boolean):962:962 -> y + 95:100:boolean androidx.compose.runtime.RecomposeScopeImpl.isConditional():319:319 -> y + 95:100:void addPendingInvalidationsLocked(java.lang.Object,boolean):964 -> y + 101:104:void addPendingInvalidationsLocked(java.lang.Object,boolean):965:965 -> y + 105:125:void addPendingInvalidationsLocked(java.lang.Object,boolean):967:967 -> y + 126:127:void addPendingInvalidationsLocked(java.lang.Object,boolean):1662:1662 -> y + 128:133:void addPendingInvalidationsLocked(java.lang.Object,boolean):961:961 -> y + 134:141:void addPendingInvalidationsLocked(java.lang.Object,boolean):962:962 -> y + 142:147:boolean androidx.compose.runtime.RecomposeScopeImpl.isConditional():319:319 -> y + 142:147:void addPendingInvalidationsLocked(java.lang.Object,boolean):964 -> y + 148:151:void addPendingInvalidationsLocked(java.lang.Object,boolean):965:965 -> y + 152:155:void addPendingInvalidationsLocked(java.lang.Object,boolean):967:967 -> y + 7:15:void addPendingInvalidationsLocked(java.util.Set,boolean):1667:1667 -> z + 16:17:void addPendingInvalidationsLocked(java.util.Set,boolean):1668:1668 -> z + 18:19:androidx.collection.ScatterSet androidx.compose.runtime.collection.ScatterSetWrapper.getSet$runtime():25:25 -> z + 18:19:void addPendingInvalidationsLocked(java.util.Set,boolean):1668 -> z + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 20:21:void addPendingInvalidationsLocked(java.util.Set,boolean):1670:1670 -> z + 22:23:void addPendingInvalidationsLocked(java.util.Set,boolean):1673:1673 -> z + 24:33:void addPendingInvalidationsLocked(java.util.Set,boolean):1674:1674 -> z + 34:69:void addPendingInvalidationsLocked(java.util.Set,boolean):1677:1677 -> z + 70:73:void addPendingInvalidationsLocked(java.util.Set,boolean):1671:1671 -> z + 74:77:void addPendingInvalidationsLocked(java.util.Set,boolean):975:975 -> z + 78:90:void addPendingInvalidationsLocked(java.util.Set,boolean):976:976 -> z + 91:93:void addPendingInvalidationsLocked(java.util.Set,boolean):978:978 -> z + 94:99:void addPendingInvalidationsLocked(java.util.Set,boolean):1686:1686 -> z + 100:103:void addPendingInvalidationsLocked(java.util.Set,boolean):1690:1690 -> z + 104:105:void addPendingInvalidationsLocked(java.util.Set,boolean):1691:1691 -> z + 106:107:void addPendingInvalidationsLocked(java.util.Set,boolean):1693:1693 -> z + 108:109:void addPendingInvalidationsLocked(java.util.Set,boolean):1696:1696 -> z + 110:119:void addPendingInvalidationsLocked(java.util.Set,boolean):1697:1697 -> z + 120:154:void addPendingInvalidationsLocked(java.util.Set,boolean):1700:1700 -> z + 155:162:void addPendingInvalidationsLocked(java.util.Set,boolean):1694:1694 -> z + 163:202:void addPendingInvalidationsLocked(java.util.Set,boolean):980:980 -> z + 203:204:void addPendingInvalidationsLocked(java.util.Set,boolean):1717:1717 -> z + 205:214:void addPendingInvalidationsLocked(java.util.Set,boolean):980:980 -> z + 215:293:void addPendingInvalidationsLocked(java.util.Set,boolean):1720:1720 -> z + 294:295:void addPendingInvalidationsLocked(java.util.Set,boolean):1728:1728 -> z + 296:309:void addPendingInvalidationsLocked(java.util.Set,boolean):1729:1729 -> z + 310:313:void addPendingInvalidationsLocked(java.util.Set,boolean):975:975 -> z + 314:321:void addPendingInvalidationsLocked(java.util.Set,boolean):976:976 -> z + 322:324:void addPendingInvalidationsLocked(java.util.Set,boolean):978:978 -> z + 325:330:void addPendingInvalidationsLocked(java.util.Set,boolean):1686:1686 -> z + 331:334:void addPendingInvalidationsLocked(java.util.Set,boolean):1690:1690 -> z + 335:336:void addPendingInvalidationsLocked(java.util.Set,boolean):1691:1691 -> z + 337:338:void addPendingInvalidationsLocked(java.util.Set,boolean):1731:1731 -> z + 339:340:void addPendingInvalidationsLocked(java.util.Set,boolean):1734:1734 -> z + 341:346:void addPendingInvalidationsLocked(java.util.Set,boolean):1735:1735 -> z + 347:379:void addPendingInvalidationsLocked(java.util.Set,boolean):1738:1738 -> z + 380:383:void addPendingInvalidationsLocked(java.util.Set,boolean):1732:1732 -> z + 384:401:void addPendingInvalidationsLocked(java.util.Set,boolean):980:980 -> z + 402:403:void addPendingInvalidationsLocked(java.util.Set,boolean):1717:1717 -> z + 404:406:void addPendingInvalidationsLocked(java.util.Set,boolean):980:980 -> z + 407:409:void addPendingInvalidationsLocked(java.util.Set,boolean):1720:1720 -> z + 410:427:void addPendingInvalidationsLocked(java.util.Set,boolean):987:987 -> z + 428:429:void addPendingInvalidationsLocked(java.util.Set,boolean):1759:1759 -> z + 430:435:void addPendingInvalidationsLocked(java.util.Set,boolean):1760:1760 -> z + 436:468:void addPendingInvalidationsLocked(java.util.Set,boolean):1763:1763 -> z + 469:476:void addPendingInvalidationsLocked(java.util.Set,boolean):1772:1772 -> z + 477:480:void addPendingInvalidationsLocked(java.util.Set,boolean):1774:1774 -> z + 481:485:void addPendingInvalidationsLocked(java.util.Set,boolean):1775:1775 -> z + 486:487:void addPendingInvalidationsLocked(java.util.Set,boolean):1777:1777 -> z + 488:491:void addPendingInvalidationsLocked(java.util.Set,boolean):1780:1780 -> z + 492:501:void addPendingInvalidationsLocked(java.util.Set,boolean):1781:1781 -> z + 502:541:void addPendingInvalidationsLocked(java.util.Set,boolean):1784:1784 -> z + 542:549:void addPendingInvalidationsLocked(java.util.Set,boolean):1793:1793 -> z + 550:561:void addPendingInvalidationsLocked(java.util.Set,boolean):989:989 -> z + 562:598:void addPendingInvalidationsLocked(java.util.Set,boolean):1794:1794 -> z + 599:609:void addPendingInvalidationsLocked(java.util.Set,boolean):1804:1804 -> z + 610:614:void addPendingInvalidationsLocked(java.util.Set,boolean):1807:1807 -> z + 615:632:void addPendingInvalidationsLocked(java.util.Set,boolean):989:989 -> z + 633:680:void addPendingInvalidationsLocked(java.util.Set,boolean):1810:1810 -> z + 681:683:void addPendingInvalidationsLocked(java.util.Set,boolean):991:991 -> z + 684:687:void addPendingInvalidationsLocked(java.util.Set,boolean):992:992 -> z + 688:693:void addPendingInvalidationsLocked(java.util.Set,boolean):993:993 -> z + 694:695:void addPendingInvalidationsLocked(java.util.Set,boolean):1823:1823 -> z + 696:701:void addPendingInvalidationsLocked(java.util.Set,boolean):1824:1824 -> z + 702:739:void addPendingInvalidationsLocked(java.util.Set,boolean):1827:1827 -> z + 740:747:void addPendingInvalidationsLocked(java.util.Set,boolean):1836:1836 -> z + 748:751:void addPendingInvalidationsLocked(java.util.Set,boolean):1838:1838 -> z + 752:756:void addPendingInvalidationsLocked(java.util.Set,boolean):1839:1839 -> z + 757:758:void addPendingInvalidationsLocked(java.util.Set,boolean):1841:1841 -> z + 759:760:void addPendingInvalidationsLocked(java.util.Set,boolean):1844:1844 -> z + 761:770:void addPendingInvalidationsLocked(java.util.Set,boolean):1845:1845 -> z + 771:817:void addPendingInvalidationsLocked(java.util.Set,boolean):1848:1848 -> z + 818:825:void addPendingInvalidationsLocked(java.util.Set,boolean):1857:1857 -> z + 826:831:void addPendingInvalidationsLocked(java.util.Set,boolean):994:994 -> z + 832:875:void addPendingInvalidationsLocked(java.util.Set,boolean):1858:1858 -> z + 876:886:void addPendingInvalidationsLocked(java.util.Set,boolean):1868:1868 -> z + 887:891:void addPendingInvalidationsLocked(java.util.Set,boolean):1871:1871 -> z + 892:897:void addPendingInvalidationsLocked(java.util.Set,boolean):994:994 -> z + 898:946:void addPendingInvalidationsLocked(java.util.Set,boolean):1874:1874 -> z + 947:949:void addPendingInvalidationsLocked(java.util.Set,boolean):995:995 -> z + 950:953:void addPendingInvalidationsLocked(java.util.Set,boolean):996:996 -> z +androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$ExternalSyntheticLambda0 -> h1.e3: +# {"id":"sourceFile","fileName":"R8$$SyntheticClass"} +# {"id":"com.android.tools.r8.synthesized"} + androidx.compose.runtime.Recomposer androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lh1/b3;"} + # {"id":"com.android.tools.r8.synthesized"} + androidx.collection.MutableScatterSet androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$1 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/l0;"} + # {"id":"com.android.tools.r8.synthesized"} + androidx.collection.MutableScatterSet androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$2 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/l0;"} + # {"id":"com.android.tools.r8.synthesized"} + java.util.List androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$3 -> d + # {"id":"com.android.tools.r8.synthesized"} + java.util.List androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$4 -> e + # {"id":"com.android.tools.r8.synthesized"} + androidx.collection.MutableScatterSet androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$5 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/l0;"} + # {"id":"com.android.tools.r8.synthesized"} + java.util.List androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$6 -> g + # {"id":"com.android.tools.r8.synthesized"} + androidx.collection.MutableScatterSet androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$7 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lx/l0;"} + # {"id":"com.android.tools.r8.synthesized"} + java.util.Set androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$InternalSyntheticLambda$2$b7d92ab79e12ad665ce7929b0c6ee8087c162ee98ed47cce4be00a2db4c9c46a$0.f$8 -> i + # {"id":"com.android.tools.r8.synthesized"} + 1:1:void h1.Recomposer$runRecomposeAndApplyChanges$2$$ExternalSyntheticLambda0.(h1.Recomposer,x.MutableScatterSet,x.MutableScatterSet,java.util.List,java.util.List,x.MutableScatterSet,java.util.List,x.MutableScatterSet,java.util.Set):0:0 -> + # {"id":"com.android.tools.r8.synthesized"} + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lh1/b3;Lx/l0;Lx/l0;Ljava/util/List;Ljava/util/List;Lx/l0;Ljava/util/List;Lx/l0;Ljava/util/Set;)V"} + 29:30:boolean androidx.compose.runtime.Recomposer.getHasBroadcastFrameClockAwaiters():318:318 -> invoke + 29:30:boolean androidx.compose.runtime.Recomposer.access$getHasBroadcastFrameClockAwaiters(androidx.compose.runtime.Recomposer):156 -> invoke + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 29:30:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):601 -> invoke + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/Object;)Ljava/lang/Object;"} + 31:31:boolean androidx.compose.runtime.Recomposer.getHasBroadcastFrameClockAwaiters():1912:1912 -> invoke + 31:31:boolean androidx.compose.runtime.Recomposer.access$getHasBroadcastFrameClockAwaiters(androidx.compose.runtime.Recomposer):156 -> invoke + 31:31:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):601 -> invoke + 32:35:boolean androidx.compose.runtime.Recomposer.getHasBroadcastFrameClockAwaiters():318:318 -> invoke + 32:35:boolean androidx.compose.runtime.Recomposer.access$getHasBroadcastFrameClockAwaiters(androidx.compose.runtime.Recomposer):156 -> invoke + 32:35:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):601 -> invoke + 36:38:boolean androidx.compose.runtime.Recomposer.getHasBroadcastFrameClockAwaiters():1912:1912 -> invoke + 36:38:boolean androidx.compose.runtime.Recomposer.access$getHasBroadcastFrameClockAwaiters(androidx.compose.runtime.Recomposer):156 -> invoke + 36:38:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):601 -> invoke + 39:40:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):602:602 -> invoke + 41:43:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> invoke + 41:43:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):1991 -> invoke + 44:45:androidx.compose.runtime.BroadcastFrameClock androidx.compose.runtime.Recomposer.access$getBroadcastFrameClock$p(androidx.compose.runtime.Recomposer):156:156 -> invoke + 44:45:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):605 -> invoke + 46:48:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):605:605 -> invoke + 49:56:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):608:608 -> invoke + 57:58:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):609:609 -> invoke + 59:66:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> invoke + 59:66:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):1995 -> invoke + 67:67:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):1995:1995 -> invoke + 68:69:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):612:612 -> invoke + 70:72:java.lang.Object androidx.compose.runtime.internal.Trace.beginSection(java.lang.String):21:21 -> invoke + 70:72:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):1996 -> invoke + 73:75:boolean androidx.compose.runtime.Recomposer.access$recordComposerModifications(androidx.compose.runtime.Recomposer):156:156 -> invoke + 73:75:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):615 -> invoke + 76:77:java.lang.Object androidx.compose.runtime.Recomposer.access$getStateLock$p(androidx.compose.runtime.Recomposer):156:156 -> invoke + 76:77:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):616 -> invoke + 78:78:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):1999:1999 -> invoke + 79:80:androidx.compose.runtime.collection.MutableVector androidx.compose.runtime.Recomposer.access$getCompositionInvalidations$p(androidx.compose.runtime.Recomposer):156:156 -> invoke + 79:80:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):617 -> invoke + 81:82:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2001:2001 -> invoke + 83:87:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> invoke + 83:87:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2002 -> invoke + 88:91:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2004:2004 -> invoke + 92:103:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):617:617 -> invoke + 104:105:androidx.compose.runtime.collection.MutableVector androidx.compose.runtime.Recomposer.access$getCompositionInvalidations$p(androidx.compose.runtime.Recomposer):156:156 -> invoke + 104:105:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):618 -> invoke + 106:108:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):618:618 -> invoke + 109:110:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):619:619 -> invoke + 111:111:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):1999:1999 -> invoke + 112:114:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):622:622 -> invoke + 115:117:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):623:623 -> invoke + 118:138:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):624:624 -> invoke + 139:143:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2036:2036 -> invoke + 144:147:androidx.compose.runtime.snapshots.Snapshot androidx.compose.runtime.snapshots.Snapshot$Companion.getCurrent():293:293 -> invoke + 144:147:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2036 -> invoke + 148:151:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2039:2039 -> invoke + 152:153:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2040:2040 -> invoke + 154:162:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2041:2041 -> invoke + 163:170:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2040:2040 -> invoke + 171:177:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2048:2048 -> invoke + 178:181:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2057:2057 -> invoke + 182:190:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):692:692 -> invoke + 191:200:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2060:2060 -> invoke + 201:204:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2061:2061 -> invoke + 205:206:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2062:2062 -> invoke + 207:214:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):702:702 -> invoke + 215:224:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2065:2065 -> invoke + 225:228:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2066:2066 -> invoke + 229:230:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2067:2067 -> invoke + 231:236:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):705:705 -> invoke + 237:243:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):712:712 -> invoke + 244:246:void androidx.compose.runtime.Recomposer.processCompositionError$default(androidx.compose.runtime.Recomposer,java.lang.Throwable,androidx.compose.runtime.ControlledComposition,boolean,int,java.lang.Object):764:764 -> invoke + 244:246:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):708 -> invoke + 247:249:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):709:709 -> invoke + 250:251:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):710:710 -> invoke + 252:254:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):712:712 -> invoke + 255:257:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2070:2070 -> invoke + 258:260:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2071:2071 -> invoke + 261:269:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> invoke + 261:269:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2013 -> invoke + 270:273:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):712:712 -> invoke + 274:288:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):716:716 -> invoke + 289:291:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):718:718 -> invoke + 292:295:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2073:2073 -> invoke + 296:297:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2076:2076 -> invoke + 298:307:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2077:2077 -> invoke + 308:341:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2080:2080 -> invoke + 342:345:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2074:2074 -> invoke + 346:370:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):720:720 -> invoke + 371:374:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):727:727 -> invoke + 375:377:void androidx.compose.runtime.Recomposer.processCompositionError$default(androidx.compose.runtime.Recomposer,java.lang.Throwable,androidx.compose.runtime.ControlledComposition,boolean,int,java.lang.Object):764:764 -> invoke + 375:377:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):723 -> invoke + 378:380:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):724:724 -> invoke + 381:382:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):725:725 -> invoke + 383:385:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):727:727 -> invoke + 386:391:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2070:2070 -> invoke + 392:397:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):727:727 -> invoke + 398:403:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):731:731 -> invoke + 404:405:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2098:2098 -> invoke + 406:407:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2101:2101 -> invoke + 408:413:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2102:2102 -> invoke + 414:451:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2105:2105 -> invoke + 452:455:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2099:2099 -> invoke + 456:488:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):734:734 -> invoke + 489:492:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):741:741 -> invoke + 493:495:void androidx.compose.runtime.Recomposer.processCompositionError$default(androidx.compose.runtime.Recomposer,java.lang.Throwable,androidx.compose.runtime.ControlledComposition,boolean,int,java.lang.Object):764:764 -> invoke + 493:495:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):737 -> invoke + 496:498:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):738:738 -> invoke + 499:500:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):739:739 -> invoke + 501:503:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):741:741 -> invoke + 504:509:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2070:2070 -> invoke + 510:513:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):741:741 -> invoke + 514:515:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):744:744 -> invoke + 516:518:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2070:2070 -> invoke + 519:521:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2071:2071 -> invoke + 522:523:java.lang.Object androidx.compose.runtime.Recomposer.access$getStateLock$p(androidx.compose.runtime.Recomposer):156:156 -> invoke + 522:523:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):746 -> invoke + 524:524:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2124:2124 -> invoke + 525:527:kotlinx.coroutines.CancellableContinuation androidx.compose.runtime.Recomposer.access$deriveStateLocked(androidx.compose.runtime.Recomposer):156:156 -> invoke + 525:527:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):746 -> invoke + 528:528:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2124:2124 -> invoke + 529:533:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):753:753 -> invoke + 534:540:void androidx.compose.runtime.snapshots.Snapshot$Companion.notifyObjectsInitialized():666:666 -> invoke + 534:540:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):753 -> invoke + 541:543:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):754:754 -> invoke + 544:547:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):755:755 -> invoke + 548:549:void androidx.compose.runtime.Recomposer.access$setCompositionsRemoved$p(androidx.compose.runtime.Recomposer,java.util.Set):156:156 -> invoke + 548:549:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):756 -> invoke + 550:552:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> invoke + 550:552:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2013 -> invoke + 553:556:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):758:758 -> invoke + 557:558:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2124:2124 -> invoke + 559:562:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2070:2070 -> invoke + 563:566:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2071:2071 -> invoke + 567:576:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2008:2008 -> invoke + 577:580:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2009:2009 -> invoke + 581:582:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2010:2010 -> invoke + 583:588:androidx.compose.runtime.ControlledComposition androidx.compose.runtime.Recomposer.access$performRecompose(androidx.compose.runtime.Recomposer,androidx.compose.runtime.ControlledComposition,androidx.collection.MutableScatterSet):156:156 -> invoke + 583:588:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):627 -> invoke + 589:594:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):628:628 -> invoke + 595:601:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):629:629 -> invoke + 602:607:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):630:630 -> invoke + 608:610:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):637:637 -> invoke + 611:616:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):645:645 -> invoke + 617:618:androidx.compose.runtime.collection.MutableVector androidx.compose.runtime.Recomposer.access$getCompositionInvalidations$p(androidx.compose.runtime.Recomposer):156:156 -> invoke + 617:618:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):645 -> invoke + 619:622:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> invoke + 619:622:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2014 -> invoke + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 623:624:java.lang.Object androidx.compose.runtime.Recomposer.access$getStateLock$p(androidx.compose.runtime.Recomposer):156:156 -> invoke + 623:624:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):647 -> invoke + 625:625:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2015:2015 -> invoke + 626:629:java.util.List androidx.compose.runtime.Recomposer.access$knownCompositionsLocked(androidx.compose.runtime.Recomposer):156:156 -> invoke + 626:629:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):648 -> invoke + 630:639:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2016:2016 -> invoke + 640:643:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2017:2017 -> invoke + 644:645:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2018:2018 -> invoke + 646:651:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):650:650 -> invoke + 652:657:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):651:651 -> invoke + 658:670:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):653:653 -> invoke + 671:672:androidx.compose.runtime.collection.MutableVector androidx.compose.runtime.Recomposer.access$getCompositionInvalidations$p(androidx.compose.runtime.Recomposer):156:156 -> invoke + 671:672:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):661 -> invoke + 673:678:int androidx.compose.runtime.collection.MutableVector.getSize():39:39 -> invoke + 673:678:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2022 -> invoke + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 679:684:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2024:2024 -> invoke + 685:696:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):662:662 -> invoke + 697:707:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):663:663 -> invoke + 708:718:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2030:2030 -> invoke + 719:723:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2033:2033 -> invoke + 724:726:void kotlin.collections.ArraysKt___ArraysJvmKt.fill(java.lang.Object[],java.lang.Object,int,int):1545:1545 -> invoke + 724:726:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2033 -> invoke + 727:728:void androidx.compose.runtime.collection.MutableVector.setSize(int):737:737 -> invoke + 727:728:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2034 -> invoke + 729:730:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):669:669 -> invoke + 731:731:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2015:2015 -> invoke + 732:737:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):672:672 -> invoke + 738:740:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):674:674 -> invoke + 741:749:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):675:675 -> invoke + 750:753:java.util.List androidx.compose.runtime.Recomposer.access$performInsertValues(androidx.compose.runtime.Recomposer,java.util.List,androidx.collection.MutableScatterSet):156:156 -> invoke + 750:753:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):676 -> invoke + 754:758:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):676:676 -> invoke + 759:772:void androidx.collection.MutableScatterSet.plusAssign(java.lang.Iterable):1225:1225 -> invoke + 759:772:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):676 -> invoke + 773:776:void androidx.collection.MutableScatterSet.plusAssign(java.lang.Iterable):614:614 -> invoke + 773:776:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):676 -> invoke + 777:787:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):677:677 -> invoke + 788:790:void androidx.compose.runtime.Recomposer.processCompositionError$default(androidx.compose.runtime.Recomposer,java.lang.Throwable,androidx.compose.runtime.ControlledComposition,boolean,int,java.lang.Object):764:764 -> invoke + 788:790:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):680 -> invoke + 791:793:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):681:681 -> invoke + 794:797:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):682:682 -> invoke + 798:799:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2015:2015 -> invoke + 800:802:void androidx.compose.runtime.Recomposer.processCompositionError$default(androidx.compose.runtime.Recomposer,java.lang.Throwable,androidx.compose.runtime.ControlledComposition,boolean,int,java.lang.Object):764:764 -> invoke + 800:802:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):633 -> invoke + 803:805:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):634:634 -> invoke + 806:807:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):635:635 -> invoke + 808:818:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):637:637 -> invoke + 819:820:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):1999:1999 -> invoke + 821:823:void androidx.compose.runtime.internal.Trace.endSection(java.lang.Object):26:26 -> invoke + 821:823:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2013 -> invoke + 824:825:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):2013:2013 -> invoke + 826:827:boolean androidx.compose.runtime.Recomposer.getHasBroadcastFrameClockAwaiters():1912:1912 -> invoke + 826:827:boolean androidx.compose.runtime.Recomposer.access$getHasBroadcastFrameClockAwaiters(androidx.compose.runtime.Recomposer):156 -> invoke + 826:827:kotlin.Unit androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(androidx.compose.runtime.Recomposer,androidx.collection.MutableScatterSet,androidx.collection.MutableScatterSet,java.util.List,java.util.List,androidx.collection.MutableScatterSet,java.util.List,androidx.collection.MutableScatterSet,java.util.Set,long):601 -> invoke +androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1 -> w2.r0$c: +# {"id":"sourceFile","fileName":"AndroidUiFrameClock.android.kt"} + kotlinx.coroutines.CancellableContinuation $co -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lvz3/k;"} + kotlin.jvm.functions.Function1 $onFrame -> b + 1:8:void (kotlinx.coroutines.CancellableContinuation,androidx.compose.ui.platform.AndroidUiFrameClock,kotlin.jvm.functions.Function1):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lvz3/k;Lw2/r0;Lkotlin/jvm/functions/Function1;)V"} + 1:22:void doFrame(long):39:39 -> doFrame +androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1 -> w2.q0$c: +# {"id":"sourceFile","fileName":"AndroidUiDispatcher.android.kt"} + androidx.compose.ui.platform.AndroidUiDispatcher this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lw2/q0;"} + 1:3:void (androidx.compose.ui.platform.AndroidUiDispatcher):55:55 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lw2/q0;)V"} + 4:6:void (androidx.compose.ui.platform.AndroidUiDispatcher):0:0 -> + 1:2:void doFrame(long):67:67 -> doFrame + 3:4:android.os.Handler androidx.compose.ui.platform.AndroidUiDispatcher.access$getHandler$p(androidx.compose.ui.platform.AndroidUiDispatcher):41:41 -> doFrame + 3:4:void doFrame(long):67 -> doFrame + 5:7:void doFrame(long):67:67 -> doFrame + 8:12:void doFrame(long):68:68 -> doFrame + 13:14:void doFrame(long):69:69 -> doFrame + 15:16:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):98:98 -> doFrame + 15:16:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + # {"id":"com.android.tools.r8.rewriteFrame","conditions":["throws(Ljava/lang/NullPointerException;)"],"actions":["removeInnerFrames(1)"]} + 15:16:void doFrame(long):69 -> doFrame + 17:17:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):196:196 -> doFrame + 17:17:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 17:17:void doFrame(long):69 -> doFrame + 18:24:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):99:99 -> doFrame + 18:24:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 18:24:void doFrame(long):69 -> doFrame + 25:26:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):100:100 -> doFrame + 25:26:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 25:26:void doFrame(long):69 -> doFrame + 27:28:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):101:101 -> doFrame + 27:28:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 27:28:void doFrame(long):69 -> doFrame + 29:32:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):102:102 -> doFrame + 29:32:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 29:32:void doFrame(long):69 -> doFrame + 33:34:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):103:103 -> doFrame + 33:34:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 33:34:void doFrame(long):69 -> doFrame + 35:35:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):196:196 -> doFrame + 35:35:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 35:35:void doFrame(long):69 -> doFrame + 36:41:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):106:106 -> doFrame + 36:41:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 36:41:void doFrame(long):69 -> doFrame + 42:53:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):108:108 -> doFrame + 42:53:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 42:53:void doFrame(long):69 -> doFrame + 54:58:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):110:110 -> doFrame + 54:58:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 54:58:void doFrame(long):69 -> doFrame + 59:60:void androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(long):196:196 -> doFrame + 59:60:void androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(androidx.compose.ui.platform.AndroidUiDispatcher,long):41 -> doFrame + 59:60:void doFrame(long):69 -> doFrame + 1:5:void run():57:57 -> run + 6:7:void run():58:58 -> run + 8:9:java.lang.Object androidx.compose.ui.platform.AndroidUiDispatcher.access$getLock$p(androidx.compose.ui.platform.AndroidUiDispatcher):41:41 -> run + 8:9:void run():58 -> run + 10:10:void run():194:194 -> run + 11:12:java.util.List androidx.compose.ui.platform.AndroidUiDispatcher.access$getToRunOnFrame$p(androidx.compose.ui.platform.AndroidUiDispatcher):41:41 -> run + 11:12:void run():59 -> run + 13:18:void run():59:59 -> run + 19:20:android.view.Choreographer androidx.compose.ui.platform.AndroidUiDispatcher.getChoreographer():42:42 -> run + 19:20:void run():60 -> run + 21:24:void run():60:60 -> run + 25:29:void androidx.compose.ui.platform.AndroidUiDispatcher.access$setScheduledFrameDispatch$p(androidx.compose.ui.platform.AndroidUiDispatcher,boolean):41:41 -> run + 25:29:void run():61 -> run + 30:31:void run():63:63 -> run + 32:35:void run():194:194 -> run +com.example.projection.MapProjectionViewController -> mw0.f: +# {"id":"sourceFile","fileName":"MapProjectionViewController.kt"} +com.example.mapcomponents.marker.currentlocation.DotRendererDelegate -> b80.h: +# {"id":"sourceFile","fileName":"DotRendererDelegate.kt"} +androidx.compose.ui.platform.AndroidUiFrameClock -> w2.r0: +# {"id":"sourceFile","fileName":"AndroidUiFrameClock.android.kt"} +androidx.compose.ui.platform.AndroidUiDispatcher -> w2.q0: +# {"id":"sourceFile","fileName":"AndroidUiDispatcher.android.kt"} +androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2 -> h1.f3: +# {"id":"sourceFile","fileName":"Recomposer.kt"} \ No newline at end of file diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index bcf33ed30..f1d3036a4 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -145,23 +145,19 @@ impl ProguardService { let mut remapped_stacktraces: Vec<_> = stacktraces .into_iter() .map(|raw_stacktrace| { - let mut remapped_frames: Vec<_> = raw_stacktrace - .frames - .iter() - .flat_map(|frame| { - Self::map_frame(&mappers, frame, release_package.as_deref(), &mut stats) - .into_iter() - }) - .collect(); + let mut st = Self::map_stacktrace( + &mappers, + raw_stacktrace, + release_package.as_deref(), + &mut stats, + ); if frame_order == FrameOrder::CallerFirst { // The symbolicated frames are expected in "caller first" order. - remapped_frames.reverse(); + st.frames.reverse(); } - JvmStacktrace { - frames: remapped_frames, - } + st }) .collect(); @@ -202,6 +198,148 @@ impl ProguardService { } } + fn map_stacktrace( + mappers: &[&proguard::ProguardCache], + stacktrace: JvmStacktrace, + release_package: Option<&str>, + stats: &mut SymbolicationStats, + ) -> JvmStacktrace { + let mut carried_outline_pos = vec![None; mappers.len()]; + let mut remapped_frames = Vec::new(); + + for frame in stacktrace.frames.into_iter() { + let deobfuscated_signature = frame.signature.as_ref().and_then(|signature| { + mappers + .iter() + .find_map(|mapper| mapper.deobfuscate_signature(signature)) + }); + + let params = deobfuscated_signature + .as_ref() + .map(|sig| sig.parameters_types().collect::>().join(",")); + + // We create the proguard frame according to these priorities: + // * Use the frame's line number if it exists + // * Use the frame's parameters if they exist + // * Use line number 0 + let proguard_frame = frame + .lineno + .map(|lineno| { + proguard::StackFrame::new(&frame.module, &frame.function, lineno as usize) + }) + .or_else(|| { + params.as_ref().map(|p| { + proguard::StackFrame::with_parameters( + &frame.module, + &frame.function, + p.as_str(), + ) + }) + }) + // This is for parity with the Python implementation. It's unclear why remapping a frame with line 0 + // would produce useful information, and I have no conclusive evidence that it does. + // See the `line_0_1` and `line_0_2` unit tests in this file for examples of the results this produces. + // + // TODO(@loewenheim): Find out if this is useful and remove it otherwise. + // The PR that introduced this was https://github.com/getsentry/symbolicator/pull/1434. + // + // UPDATE(@loewenheim): The retrace implementation at https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip + // returns the same value whether you give it line 0 or no line at all, and it is the same result that our implementation + // gives with line 0. This indicates that the _behavior_ is correct, but we should be able to get there without + // backfilling the line number with 0. + .unwrap_or_else(|| proguard::StackFrame::new(&frame.module, &frame.function, 0)); + + let mut skip_frame = false; + let mut mapped_result = None; + + let mut remap_buffer = Vec::new(); + for (mapper_idx, mapper) in mappers.iter().enumerate() { + if mapper.is_outline_frame( + proguard_frame.class(), + proguard_frame.method(), + proguard_frame.line(), + proguard_frame.parameters(), + ) { + carried_outline_pos[mapper_idx] = Some(proguard_frame.line()); + skip_frame = true; + break; + } + + let effective = mapper.prepare_frame_for_mapping( + &proguard_frame, + &mut carried_outline_pos[mapper_idx], + ); + + // First, try to remap the whole frame. + if let Some(frames_out) = + Self::map_full_frame(mapper, &frame, &effective, &mut remap_buffer) + { + mapped_result = Some(frames_out); + break; + } + + // Second, try to remap the frame's method. + if let Some(frames_out) = Self::map_class_method(mapper, &frame) { + mapped_result = Some(frames_out); + break; + } + + // Third, try to remap just the frame's class. + if let Some(frames_out) = Self::map_class(mapper, &frame) { + mapped_result = Some(frames_out); + break; + } + } + + if skip_frame { + continue; + } + + // Fix up the frames' in-app fields only if they were actually mapped + if let Some(frames) = mapped_result.as_mut() { + for mapped_frame in frames.iter_mut() { + // mark the frame as in_app after deobfuscation based on the release package name + // only if it's not present + if let Some(package) = release_package + && mapped_frame.module.starts_with(package) + && mapped_frame.in_app.is_none() + { + mapped_frame.in_app = Some(true); + } + + // Also count the frames as symbolicated at this point + *stats + .symbolicated_frames + .entry(mapped_frame.platform.clone()) + .or_default() += 1; + } + } + + // If all else fails, just return the original frame. + let mut frames = mapped_result.unwrap_or_else(|| { + *stats + .unsymbolicated_frames + .entry(frame.platform.clone()) + .or_default() += 1; + vec![frame.clone()] + }); + + for mapped_frame in &mut frames { + // add the signature if we received one and we were + // able to translate/deobfuscate it + if let Some(signature) = &deobfuscated_signature { + mapped_frame.signature = Some(signature.format_signature()); + } + } + + remapped_frames.extend(frames); + } + + JvmStacktrace { + frames: remapped_frames, + } + } + /// Remaps an exception using the provided mappers. /// /// This returns a new exception with the deobfuscated module and class names. @@ -236,122 +374,6 @@ impl ProguardService { }) } - /// Remaps a frame using the provided mappers. - /// - /// This returns a list of frames because remapping may - /// expand a frame into a list of inlined frames. The returned list is always - /// nonempty; if none of the mappers can remap the frame, the original - /// frame is returned. The returned list is sorted so that inlinees come before their callers. - #[tracing::instrument(skip_all)] - fn map_frame( - mappers: &[&proguard::ProguardCache], - frame: &JvmFrame, - release_package: Option<&str>, - stats: &mut SymbolicationStats, - ) -> Vec { - let deobfuscated_signature = frame.signature.as_ref().and_then(|signature| { - mappers - .iter() - .find_map(|mapper| mapper.deobfuscate_signature(signature)) - }); - - let params = deobfuscated_signature - .as_ref() - .map(|sig| sig.parameters_types().collect::>().join(",")); - - // We create the proguard frame according to these priorities: - // * Use the frame's line number if it exists - // * Use the frame's parameters if they exist - // * Use line number 0 - let proguard_frame = frame - .lineno - .map(|lineno| { - proguard::StackFrame::new(&frame.module, &frame.function, lineno as usize) - }) - .or_else(|| { - params.as_ref().map(|p| { - proguard::StackFrame::with_parameters( - &frame.module, - &frame.function, - p.as_str(), - ) - }) - }) - // This is for parity with the Python implementation. It's unclear why remapping a frame with line 0 - // would produce useful information, and I have no conclusive evidence that it does. - // See the `line_0_1` and `line_0_2` unit tests in this file for examples of the results this produces. - // - // TODO(@loewenheim): Find out if this is useful and remove it otherwise. - // The PR that introduced this was https://github.com/getsentry/symbolicator/pull/1434. - // - // UPDATE(@loewenheim): The retrace implementation at https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip - // returns the same value whether you give it line 0 or no line at all, and it is the same result that our implementation - // gives with line 0. This indicates that the _behavior_ is correct, but we should be able to get there without - // backfilling the line number with 0. - .unwrap_or_else(|| proguard::StackFrame::new(&frame.module, &frame.function, 0)); - - // First, try to remap the whole frame. - let mut mapped_frames = Vec::new(); - let mut frames = mappers - .iter() - .find_map(|mapper| { - Self::map_full_frame(mapper, frame, &proguard_frame, &mut mapped_frames) - }) - // Second, try to remap the frame's method. - .or_else(|| { - mappers - .iter() - .find_map(|mapper| Self::map_class_method(mapper, frame)) - }) - // Third, try to remap just the frame's class. - .or_else(|| { - mappers - .iter() - .find_map(|mapper| Self::map_class(mapper, frame)) - }); - - // Fix up the frames' in-app fields only if they were actually mapped - if let Some(frames) = frames.as_mut() { - for frame in frames.iter_mut() { - // mark the frame as in_app after deobfuscation based on the release package name - // only if it's not present - if let Some(package) = release_package - && frame.module.starts_with(package) - && frame.in_app.is_none() - { - frame.in_app = Some(true); - } - } - - // Also count the frames as symbolicated at this point - for frame in frames { - *stats - .symbolicated_frames - .entry(frame.platform.clone()) - .or_default() += 1; - } - } - - // If all else fails, just return the original frame. - let mut frames = frames.unwrap_or_else(|| { - *stats - .unsymbolicated_frames - .entry(frame.platform.clone()) - .or_default() += 1; - vec![frame.clone()] - }); - - for frame in &mut frames { - // add the signature if we received one and we were - // able to translate/deobfuscate it - if let Some(signature) = &deobfuscated_signature { - frame.signature = Some(signature.format_signature()); - } - } - - frames - } - /// Tries to remap a `JvmFrame` using a `proguard::StackFrame` /// constructed from it. /// @@ -496,31 +518,37 @@ mod tests { use super::*; use proguard::{ProguardCache, ProguardMapping}; - fn remap_stacktrace_caller_first( + static MAPPING_OUTLINE_COMPLEX: &[u8] = include_bytes!("res/mapping-outline-complex.txt"); + + fn map_frames_via_stacktrace( proguard_source: &[u8], + mut frames: Vec, release_package: Option<&str>, - frames: &[JvmFrame], + frame_order: FrameOrder, ) -> Vec { + if frame_order == FrameOrder::CallerFirst { + frames.reverse(); + } + let mapping = ProguardMapping::new(proguard_source); let mut cache = Vec::new(); ProguardCache::write(&mapping, &mut cache).unwrap(); let cache = ProguardCache::parse(&cache).unwrap(); cache.test(); - frames - .iter() - .rev() - .flat_map(|frame| { - ProguardService::map_frame( - &[&cache], - frame, - release_package, - &mut Default::default(), - ) - .into_iter() - }) - .rev() - .collect() + let mut remapped_frames = ProguardService::map_stacktrace( + &[&cache], + JvmStacktrace { frames }, + release_package, + &mut SymbolicationStats::default(), + ) + .frames; + + if frame_order == FrameOrder::CallerFirst { + remapped_frames.reverse(); + } + + remapped_frames } #[test] @@ -623,7 +651,12 @@ io.sentry.sample.MainActivity -> io.sentry.sample.MainActivity: }, ]; - let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); + let mapped_frames = map_frames_via_stacktrace( + proguard_source, + frames.to_vec(), + None, + FrameOrder::CallerFirst, + ); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: onClick @@ -709,8 +742,12 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: }, ]; - let mapped_frames = - remap_stacktrace_caller_first(proguard_source, Some("org.slf4j"), &frames); + let mapped_frames = map_frames_via_stacktrace( + proguard_source, + frames.to_vec(), + Some("org.slf4j"), + FrameOrder::CallerFirst, + ); assert_eq!(mapped_frames[0].in_app, Some(true)); assert_eq!(mapped_frames[1].in_app, Some(false)); @@ -732,8 +769,12 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: ..Default::default() }; - let remapped = - ProguardService::map_frame(&[], &frame, Some("android"), &mut Default::default()); + let remapped = map_frames_via_stacktrace( + b"", + vec![frame.clone()], + Some("android"), + FrameOrder::CallerFirst, + ); assert_eq!(remapped.len(), 1); // The frame didn't get mapped, so we shouldn't set `in_app` even though @@ -765,12 +806,6 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: 21:24:void onCreate():43:43 -> onCreate "#; - let mapping = ProguardMapping::new(proguard_source); - let mut cache = Vec::new(); - ProguardCache::write(&mapping, &mut cache).unwrap(); - let cache = ProguardCache::parse(&cache).unwrap(); - cache.test(); - let frame = JvmFrame { function: "onCreate".into(), module: "com.example.App".into(), @@ -780,8 +815,12 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: ..Default::default() }; - let mapped_frames = - ProguardService::map_frame(&[&cache], &frame, None, &mut Default::default()); + let mapped_frames = map_frames_via_stacktrace( + proguard_source, + vec![frame.clone()], + None, + FrameOrder::CallerFirst, + ); // Without the "line 0" change, the second frame doesn't exist. // The `retrace` implementation at @@ -823,12 +862,6 @@ y.b -> y.b: 5:8:void a(com.google.common.util.concurrent.ListenableFuture,com.drivit.core.DrivitCloud$OperationListener):2:2 -> a "#; - let mapping = ProguardMapping::new(proguard_source); - let mut cache = Vec::new(); - ProguardCache::write(&mapping, &mut cache).unwrap(); - let cache = ProguardCache::parse(&cache).unwrap(); - cache.test(); - let frame = JvmFrame { function: "run".into(), module: "com.google.firebase.concurrent.a".into(), @@ -838,8 +871,12 @@ y.b -> y.b: ..Default::default() }; - let mapped_frames = - ProguardService::map_frame(&[&cache], &frame, None, &mut Default::default()); + let mapped_frames = map_frames_via_stacktrace( + proguard_source, + vec![frame.clone()], + None, + FrameOrder::CallerFirst, + ); // Without the "line 0" change, the module is "com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0". // The `retrace` implementation at @@ -963,7 +1000,12 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: ) .unwrap(); - let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); + let mapped_frames = map_frames_via_stacktrace( + proguard_source, + frames.clone(), + None, + FrameOrder::CallerFirst, + ); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: foo @@ -1077,7 +1119,12 @@ com.mycompany.android.Delegate -> b80.h: ) .unwrap(); - let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); + let mapped_frames = map_frames_via_stacktrace( + proguard_source, + frames.clone(), + None, + FrameOrder::CallerFirst, + ); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: render @@ -1119,4 +1166,217 @@ com.mycompany.android.Delegate -> b80.h: method_synthesized: true "###); } + + #[test] + fn remap_outline() { + let proguard_source = br#"# compiler: R8 +# compiler_version: 2.0 +# min_api: 15 +outline.Class -> a: + 1:2:int outline() -> a +# {"id":"com.android.tools.r8.outline"} +some.Class -> b: + 4:4:int outlineCaller(int):98:98 -> s + 5:5:int outlineCaller(int):100:100 -> s + 27:27:int outlineCaller(int):0:0 -> s +# {"id":"com.android.tools.r8.outlineCallsite","positions":{"1":4,"2":5},"outline":"La;a()I"} +"#; + + let frames = vec![ + JvmFrame { + function: "a".to_owned(), + module: "a".to_owned(), + lineno: Some(1), + index: 0, + ..Default::default() + }, + JvmFrame { + function: "s".to_owned(), + module: "b".to_owned(), + lineno: Some(27), + index: 1, + ..Default::default() + }, + ]; + + let remapped = + map_frames_via_stacktrace(proguard_source, frames, None, FrameOrder::CalleeFirst); + + assert_eq!(remapped.len(), 1); + assert_eq!(remapped[0].module, "some.Class"); + assert_eq!(remapped[0].function, "outlineCaller"); + assert_eq!(remapped[0].lineno, Some(98)); + assert_eq!(remapped[0].index, 1); + } + + #[test] + fn remap_outline_complex() { + let frames: Vec = serde_json::from_str( + r#"[ + { + "function": "b", + "module": "ev.h", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 3, + "index": 0 + }, + { + "function": "l", + "module": "uu0.k", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 43, + "index": 1 + }, + { + "function": "a", + "module": "b80.f", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 33, + "index": 2 + }, + { + "function": "invoke", + "module": "er3.f", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 3, + "index": 3 + }, + { + "function": "d", + "module": "yv0.g", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 17, + "index": 4 + }, + { + "function": "invoke", + "module": "er3.g$a", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 36, + "index": 5 + }, + { + "function": "d", + "module": "h1.p0", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 5, + "index": 6 + }, + { + "function": "c", + "module": "p1.k", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 135, + "index": 7 + }, + { + "function": "A", + "module": "h1.y", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 111, + "index": 8 + }, + { + "function": "m", + "module": "h1.y", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 6, + "index": 9 + }, + { + "function": "invoke", + "module": "h1.e3", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 231, + "index": 10 + }, + { + "function": "doFrame", + "module": "w2.r0$c", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 7, + "index": 11 + }, + { + "function": "doFrame", + "module": "w2.q0$c", + "filename": "SourceFile", + "abs_path": "SourceFile", + "lineno": 48, + "index": 12 + }, + { + "function": "run", + "module": "android.view.Choreographer$CallbackRecord", + "filename": "Choreographer.java", + "lineno": 1899, + "index": 13 + }]"#, + ) + .unwrap(); + + let remapped_frames = map_frames_via_stacktrace( + MAPPING_OUTLINE_COMPLEX, + frames, + None, + FrameOrder::CalleeFirst, + ); + + let actual = { + let mut out = String::from("java.lang.IllegalStateException: Oops!"); + // sentry expects stack traces in reverse order, but to verify expected output, we need to reverse them back + for frame in remapped_frames { + let filename = frame.filename.as_deref().unwrap_or(""); + let lineno = frame + .lineno + .map(|n| n.to_string()) + .unwrap_or_else(|| "".to_owned()); + out.push_str(&format!( + "\n at {}.{}({}:{})", + frame.module, frame.function, filename, lineno + )); + } + out + }; + + let expected = r#" +java.lang.IllegalStateException: Oops! + at com.example.projection.MapProjectionViewController.onProjectionView(MapProjectionViewController.kt:160) + at com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(MapProjectionViewController.kt:133) + at com.example.projection.MapProjectionViewController.createProjectionMarker(MapProjectionViewController.kt:79) + at com.example.MapAnnotations.createProjectionMarker(MapAnnotations.kt:63) + at com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createCurrentLocationProjectionMarker(DotRendererDelegate.kt:101) + at com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render(DotRendererDelegate.kt:34) + at com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer.render(CurrentLocationRenderer.kt:39) + at com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1.invoke(CurrentLocationMarkerMapCollection.kt:36) + at com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1.invoke(CurrentLocationMarkerMapCollection.kt:36) + at com.example.mapbox.MapboxMapView.addMapReadyCallback(MapboxMapView.kt:368) + at com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1.invoke(CurrentLocationMarkerMapCollection.kt:40) + at com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1.invoke(CurrentLocationMarkerMapCollection.kt:35) + at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:85) + at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberList(RememberEventDispatcher.kt:253) + at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberObservers(RememberEventDispatcher.kt:225) + at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:1122) + at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1149) + at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(Recomposer.kt:705) + at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:39) + at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:108) + at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41) + at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69) + at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1899)"#; + + assert_eq!(actual.trim(), expected.trim()); + } } From 4d2873c992a87888764460761693f4e5c57d39bd Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Thu, 20 Nov 2025 15:47:37 +0100 Subject: [PATCH 16/24] Ref and fix test --- .../src/symbolication.rs | 124 ++++++------------ 1 file changed, 39 insertions(+), 85 deletions(-) diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index f1d3036a4..92ed9f8e6 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -145,19 +145,19 @@ impl ProguardService { let mut remapped_stacktraces: Vec<_> = stacktraces .into_iter() .map(|raw_stacktrace| { - let mut st = Self::map_stacktrace( + let mut frames = Self::map_stacktrace( &mappers, - raw_stacktrace, + &raw_stacktrace.frames, release_package.as_deref(), &mut stats, ); if frame_order == FrameOrder::CallerFirst { // The symbolicated frames are expected in "caller first" order. - st.frames.reverse(); + frames.reverse(); } - st + JvmStacktrace { frames } }) .collect(); @@ -200,14 +200,14 @@ impl ProguardService { fn map_stacktrace( mappers: &[&proguard::ProguardCache], - stacktrace: JvmStacktrace, + stacktrace: &[JvmFrame], release_package: Option<&str>, stats: &mut SymbolicationStats, - ) -> JvmStacktrace { + ) -> Vec { let mut carried_outline_pos = vec![None; mappers.len()]; let mut remapped_frames = Vec::new(); - for frame in stacktrace.frames.into_iter() { + 'frames: for frame in stacktrace { let deobfuscated_signature = frame.signature.as_ref().and_then(|signature| { mappers .iter() @@ -249,7 +249,6 @@ impl ProguardService { // backfilling the line number with 0. .unwrap_or_else(|| proguard::StackFrame::new(&frame.module, &frame.function, 0)); - let mut skip_frame = false; let mut mapped_result = None; let mut remap_buffer = Vec::new(); @@ -261,8 +260,7 @@ impl ProguardService { proguard_frame.parameters(), ) { carried_outline_pos[mapper_idx] = Some(proguard_frame.line()); - skip_frame = true; - break; + continue 'frames; } let effective = mapper.prepare_frame_for_mapping( @@ -272,32 +270,28 @@ impl ProguardService { // First, try to remap the whole frame. if let Some(frames_out) = - Self::map_full_frame(mapper, &frame, &effective, &mut remap_buffer) + Self::map_full_frame(mapper, frame, &effective, &mut remap_buffer) { mapped_result = Some(frames_out); break; } // Second, try to remap the frame's method. - if let Some(frames_out) = Self::map_class_method(mapper, &frame) { + if let Some(frames_out) = Self::map_class_method(mapper, frame) { mapped_result = Some(frames_out); break; } // Third, try to remap just the frame's class. - if let Some(frames_out) = Self::map_class(mapper, &frame) { + if let Some(frames_out) = Self::map_class(mapper, frame) { mapped_result = Some(frames_out); break; } } - if skip_frame { - continue; - } - // Fix up the frames' in-app fields only if they were actually mapped if let Some(frames) = mapped_result.as_mut() { - for mapped_frame in frames.iter_mut() { + for mapped_frame in frames { // mark the frame as in_app after deobfuscation based on the release package name // only if it's not present if let Some(package) = release_package @@ -335,9 +329,7 @@ impl ProguardService { remapped_frames.extend(frames); } - JvmStacktrace { - frames: remapped_frames, - } + remapped_frames } /// Remaps an exception using the provided mappers. @@ -522,7 +514,7 @@ mod tests { fn map_frames_via_stacktrace( proguard_source: &[u8], - mut frames: Vec, + frames: &mut [JvmFrame], release_package: Option<&str>, frame_order: FrameOrder, ) -> Vec { @@ -538,11 +530,10 @@ mod tests { let mut remapped_frames = ProguardService::map_stacktrace( &[&cache], - JvmStacktrace { frames }, + frames, release_package, &mut SymbolicationStats::default(), - ) - .frames; + ); if frame_order == FrameOrder::CallerFirst { remapped_frames.reverse(); @@ -605,7 +596,7 @@ io.sentry.sample.MainActivity -> io.sentry.sample.MainActivity: 1:1:void foo():44 -> t 1:1:void onClickHandler(android.view.View):40 -> t"; - let frames = [ + let mut frames = [ JvmFrame { function: "onClick".to_owned(), module: "e.a.c.a".to_owned(), @@ -651,12 +642,8 @@ io.sentry.sample.MainActivity -> io.sentry.sample.MainActivity: }, ]; - let mapped_frames = map_frames_via_stacktrace( - proguard_source, - frames.to_vec(), - None, - FrameOrder::CallerFirst, - ); + let mapped_frames = + map_frames_via_stacktrace(proguard_source, &mut frames, None, FrameOrder::CallerFirst); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: onClick @@ -707,7 +694,7 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: 65:65:void () -> "; - let frames = [ + let mut frames = [ JvmFrame { function: "a".to_owned(), module: "org.a.b.g$a".to_owned(), @@ -744,7 +731,7 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: let mapped_frames = map_frames_via_stacktrace( proguard_source, - frames.to_vec(), + &mut frames, Some("org.slf4j"), FrameOrder::CallerFirst, ); @@ -769,12 +756,8 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: ..Default::default() }; - let remapped = map_frames_via_stacktrace( - b"", - vec![frame.clone()], - Some("android"), - FrameOrder::CallerFirst, - ); + let remapped = + map_frames_via_stacktrace(b"", &mut [frame], Some("android"), FrameOrder::CalleeFirst); assert_eq!(remapped.len(), 1); // The frame didn't get mapped, so we shouldn't set `in_app` even though @@ -815,12 +798,8 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: ..Default::default() }; - let mapped_frames = map_frames_via_stacktrace( - proguard_source, - vec![frame.clone()], - None, - FrameOrder::CallerFirst, - ); + let mapped_frames = + map_frames_via_stacktrace(proguard_source, &mut [frame], None, FrameOrder::CalleeFirst); // Without the "line 0" change, the second frame doesn't exist. // The `retrace` implementation at @@ -871,12 +850,8 @@ y.b -> y.b: ..Default::default() }; - let mapped_frames = map_frames_via_stacktrace( - proguard_source, - vec![frame.clone()], - None, - FrameOrder::CallerFirst, - ); + let mapped_frames = + map_frames_via_stacktrace(proguard_source, &mut [frame], None, FrameOrder::CalleeFirst); // Without the "line 0" change, the module is "com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0". // The `retrace` implementation at @@ -946,7 +921,7 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: void () -> # {"id":"com.android.tools.r8.synthesized"}"#; - let frames: Vec = serde_json::from_str( + let mut frames: Vec = serde_json::from_str( r#"[{ "function": "a", "abs_path": "SourceFile", @@ -1000,12 +975,8 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: ) .unwrap(); - let mapped_frames = map_frames_via_stacktrace( - proguard_source, - frames.clone(), - None, - FrameOrder::CallerFirst, - ); + let mapped_frames = + map_frames_via_stacktrace(proguard_source, &mut frames, None, FrameOrder::CallerFirst); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: foo @@ -1090,7 +1061,7 @@ com.mycompany.android.Delegate -> b80.h: com.mycompany.android.IMapAnnotations mapAnnotations -> a # {"id":"com.android.tools.r8.residualsignature","signature":"Lbv0/b;"}"#; - let frames: Vec = serde_json::from_str( + let mut frames: Vec = serde_json::from_str( r#"[ { "function": "a", @@ -1119,12 +1090,8 @@ com.mycompany.android.Delegate -> b80.h: ) .unwrap(); - let mapped_frames = map_frames_via_stacktrace( - proguard_source, - frames.clone(), - None, - FrameOrder::CallerFirst, - ); + let mapped_frames = + map_frames_via_stacktrace(proguard_source, &mut frames, None, FrameOrder::CallerFirst); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: render @@ -1147,23 +1114,10 @@ com.mycompany.android.Delegate -> b80.h: index: 0 - function: createProjectionMarker filename: SourceFile - module: uu0.MapAnnotations - abs_path: SourceFile - lineno: 0 - index: 1 - - function: createProjectionMarker - filename: MapAnnotations.kt module: com.mycompany.android.MapAnnotations - abs_path: MapAnnotations.kt - lineno: 0 - index: 1 - - function: m - filename: SourceFile - module: ev.StuffKt$$ExternalSyntheticOutline0 abs_path: SourceFile - lineno: 1 - index: 2 - method_synthesized: true + lineno: 43 + index: 1 "###); } @@ -1182,7 +1136,7 @@ some.Class -> b: # {"id":"com.android.tools.r8.outlineCallsite","positions":{"1":4,"2":5},"outline":"La;a()I"} "#; - let frames = vec![ + let mut frames = [ JvmFrame { function: "a".to_owned(), module: "a".to_owned(), @@ -1200,7 +1154,7 @@ some.Class -> b: ]; let remapped = - map_frames_via_stacktrace(proguard_source, frames, None, FrameOrder::CalleeFirst); + map_frames_via_stacktrace(proguard_source, &mut frames, None, FrameOrder::CalleeFirst); assert_eq!(remapped.len(), 1); assert_eq!(remapped[0].module, "some.Class"); @@ -1211,7 +1165,7 @@ some.Class -> b: #[test] fn remap_outline_complex() { - let frames: Vec = serde_json::from_str( + let mut frames: Vec = serde_json::from_str( r#"[ { "function": "b", @@ -1329,7 +1283,7 @@ some.Class -> b: let remapped_frames = map_frames_via_stacktrace( MAPPING_OUTLINE_COMPLEX, - frames, + &mut frames, None, FrameOrder::CalleeFirst, ); From 5bb691c9a4a97f5fe0b3556db8dc259fc6b93706 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Mon, 24 Nov 2025 16:20:17 +0100 Subject: [PATCH 17/24] Keep current defaults --- crates/symbolicator-service/src/types.rs | 3 +-- crates/symbolicator/src/endpoints/symbolicate_js.rs | 9 ++------- crates/symbolicator/src/endpoints/symbolicate_jvm.rs | 9 ++------- crates/symbolicator/src/service.rs | 10 ++-------- docs/api/symbolication.md | 4 ++-- 5 files changed, 9 insertions(+), 26 deletions(-) diff --git a/crates/symbolicator-service/src/types.rs b/crates/symbolicator-service/src/types.rs index 64013912c..e0e590c59 100644 --- a/crates/symbolicator-service/src/types.rs +++ b/crates/symbolicator-service/src/types.rs @@ -314,7 +314,7 @@ impl fmt::Display for Platform { /// The order in which stack frames are received by Symbolicator and returned /// to the caller. -#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] pub enum FrameOrder { /// Callee frames come before caller frames. @@ -325,6 +325,5 @@ pub enum FrameOrder { /// /// This means that the innermost frame is at the end of the stacktrace. This is /// how stacktraces are stored in Sentry events. - #[default] CallerFirst, } diff --git a/crates/symbolicator/src/endpoints/symbolicate_js.rs b/crates/symbolicator/src/endpoints/symbolicate_js.rs index 7bfb90685..fbe1483c5 100644 --- a/crates/symbolicator/src/endpoints/symbolicate_js.rs +++ b/crates/symbolicator/src/endpoints/symbolicate_js.rs @@ -40,25 +40,20 @@ fn default_allow_scraping() -> bool { } #[derive(Serialize, Deserialize)] +#[serde(default)] pub struct JsRequestOptions { /// Whether to apply source context for the stack frames. - #[serde(default = "default_apply_source_context")] pub apply_source_context: bool, /// The order in which stack frames are received by Symbolicator and returned to the caller. - #[serde(default)] pub frame_order: FrameOrder, } -fn default_apply_source_context() -> bool { - true -} - impl Default for JsRequestOptions { fn default() -> Self { Self { apply_source_context: true, - frame_order: Default::default(), + frame_order: FrameOrder::CallerFirst, } } } diff --git a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs index 8f163b86c..f8f978508 100644 --- a/crates/symbolicator/src/endpoints/symbolicate_jvm.rs +++ b/crates/symbolicator/src/endpoints/symbolicate_jvm.rs @@ -33,24 +33,19 @@ pub struct JvmSymbolicationRequestBody { } #[derive(Serialize, Deserialize)] +#[serde(default)] pub struct JvmRequestOptions { /// Whether to apply source context for the stack frames. - #[serde(default = "default_apply_source_context")] pub apply_source_context: bool, /// The order in which stack frames are received by Symbolicator and returned to the caller. - #[serde(default)] pub frame_order: FrameOrder, } -fn default_apply_source_context() -> bool { - true -} - impl Default for JvmRequestOptions { fn default() -> Self { Self { apply_source_context: true, - frame_order: Default::default(), + frame_order: FrameOrder::CallerFirst, } } } diff --git a/crates/symbolicator/src/service.rs b/crates/symbolicator/src/service.rs index 45e4dbfc6..793260d1a 100644 --- a/crates/symbolicator/src/service.rs +++ b/crates/symbolicator/src/service.rs @@ -121,6 +121,7 @@ pub enum CompletedResponse { /// These options control some features which control the symbolication and general request /// handling behaviour. #[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(default)] pub struct RequestOptions { /// Whether to return detailed information on DIF object candidates. /// @@ -130,28 +131,21 @@ pub struct RequestOptions { /// considered, any problems with them and what they were used for. See the /// [`ObjectCandidate`](symbolicator_service::objects::ObjectCandidate) struct /// for which extra information is returned for DIF objects. - #[serde(default)] pub dif_candidates: bool, /// Whether to apply source context for the stack frames. - #[serde(default = "default_apply_source_context")] pub apply_source_context: bool, /// The order in which stack frames are received by Symbolicator and returned to the caller. - #[serde(default)] pub frame_order: FrameOrder, } -fn default_apply_source_context() -> bool { - true -} - impl Default for RequestOptions { fn default() -> Self { Self { dif_candidates: false, apply_source_context: true, - frame_order: Default::default(), + frame_order: FrameOrder::CalleeFirst, } } } diff --git a/docs/api/symbolication.md b/docs/api/symbolication.md index e0347b3fe..bfa38b1e5 100644 --- a/docs/api/symbolication.md +++ b/docs/api/symbolication.md @@ -48,7 +48,7 @@ Content-Type: application/json "options": { "dif_candidates": true, "apply_source_context": true, - "frame_order": "callee_first" + "frame_order": "caller_first" } } ``` @@ -96,7 +96,7 @@ as well as external sources to pull symbols from: - `dif_candidates`: Whether to return detailed information on DIF object candidates. - `apply_source_context`: Whether to apply source context for the stack frames. - `frame_order`: How stack frames are ordered. The possible values are - `"callee_first"` and `"caller_first"`. The default is `"caller_first"`. + `"callee_first"` and `"caller_first"`. The default is `"callee_first"`. Frames in the response will be ordered the same way. From 657cb70760cfa2bb447666f080873501fa0b47d6 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 27 Nov 2025 11:31:04 +0100 Subject: [PATCH 18/24] Bump rust-proguard version --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1e528b719..00d276670 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3768,9 +3768,9 @@ dependencies = [ [[package]] name = "proguard" -version = "5.7.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29461f52dac135ba359e6916b049390cc47e4ac0afa5780efc89a4f87827e2c" +checksum = "260b8aaeeb4bc5175bb90a599f51d74a560f19de428c2d058c67eac92b5085d3" dependencies = [ "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 3b501984d..838bc5221 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,7 +94,7 @@ minidump-processor = "0.26.1" minidump-unwind = "0.26.1" moka = { version = "0.12.8", features = ["future", "sync"] } prettytable-rs = "0.10.0" -proguard = "5.7.0" +proguard = "5.8.0" rand = "0.9.0" rayon = "1.10.0" regex = "1.5.5" From 42ceec0d6b874a1d5f663640577ec9799d903a4d Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 27 Nov 2025 14:02:24 +0100 Subject: [PATCH 19/24] use insta snapshot for assertions in remap_outline_complex test --- crates/symbolicator-crash/sentry-native | 2 +- .../src/symbolication.rs | 192 +++++++++++++----- 2 files changed, 143 insertions(+), 51 deletions(-) diff --git a/crates/symbolicator-crash/sentry-native b/crates/symbolicator-crash/sentry-native index 027459265..11f94efc6 160000 --- a/crates/symbolicator-crash/sentry-native +++ b/crates/symbolicator-crash/sentry-native @@ -1 +1 @@ -Subproject commit 027459265ab94de340a5f59b767248652640d1e6 +Subproject commit 11f94efc64d55e90aef9456ce01716c846ae1732 diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 92ed9f8e6..308381bc1 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -253,12 +253,7 @@ impl ProguardService { let mut remap_buffer = Vec::new(); for (mapper_idx, mapper) in mappers.iter().enumerate() { - if mapper.is_outline_frame( - proguard_frame.class(), - proguard_frame.method(), - proguard_frame.line(), - proguard_frame.parameters(), - ) { + if mapper.is_outline_frame(proguard_frame.class(), proguard_frame.method()) { carried_outline_pos[mapper_idx] = Some(proguard_frame.line()); continue 'frames; } @@ -1288,49 +1283,146 @@ some.Class -> b: FrameOrder::CalleeFirst, ); - let actual = { - let mut out = String::from("java.lang.IllegalStateException: Oops!"); - // sentry expects stack traces in reverse order, but to verify expected output, we need to reverse them back - for frame in remapped_frames { - let filename = frame.filename.as_deref().unwrap_or(""); - let lineno = frame - .lineno - .map(|n| n.to_string()) - .unwrap_or_else(|| "".to_owned()); - out.push_str(&format!( - "\n at {}.{}({}:{})", - frame.module, frame.function, filename, lineno - )); - } - out - }; - - let expected = r#" -java.lang.IllegalStateException: Oops! - at com.example.projection.MapProjectionViewController.onProjectionView(MapProjectionViewController.kt:160) - at com.example.projection.MapProjectionViewController.createProjectionMarkerInternal(MapProjectionViewController.kt:133) - at com.example.projection.MapProjectionViewController.createProjectionMarker(MapProjectionViewController.kt:79) - at com.example.MapAnnotations.createProjectionMarker(MapAnnotations.kt:63) - at com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.createCurrentLocationProjectionMarker(DotRendererDelegate.kt:101) - at com.example.mapcomponents.marker.currentlocation.DotRendererDelegate.render(DotRendererDelegate.kt:34) - at com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer.render(CurrentLocationRenderer.kt:39) - at com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1.invoke(CurrentLocationMarkerMapCollection.kt:36) - at com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1.invoke(CurrentLocationMarkerMapCollection.kt:36) - at com.example.mapbox.MapboxMapView.addMapReadyCallback(MapboxMapView.kt:368) - at com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1.invoke(CurrentLocationMarkerMapCollection.kt:40) - at com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1.invoke(CurrentLocationMarkerMapCollection.kt:35) - at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:85) - at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberList(RememberEventDispatcher.kt:253) - at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberObservers(RememberEventDispatcher.kt:225) - at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:1122) - at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1149) - at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$22(Recomposer.kt:705) - at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:39) - at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:108) - at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41) - at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69) - at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1899)"#; - - assert_eq!(actual.trim(), expected.trim()); + insta::assert_yaml_snapshot!( + remapped_frames, + @r###" + - function: onProjectionView + filename: MapProjectionViewController.kt + module: com.example.projection.MapProjectionViewController + abs_path: MapProjectionViewController.kt + lineno: 160 + index: 1 + - function: createProjectionMarkerInternal + filename: MapProjectionViewController.kt + module: com.example.projection.MapProjectionViewController + abs_path: MapProjectionViewController.kt + lineno: 133 + index: 1 + - function: createProjectionMarker + filename: MapProjectionViewController.kt + module: com.example.projection.MapProjectionViewController + abs_path: MapProjectionViewController.kt + lineno: 79 + index: 1 + - function: createProjectionMarker + filename: MapAnnotations.kt + module: com.example.MapAnnotations + abs_path: MapAnnotations.kt + lineno: 63 + index: 1 + - function: createCurrentLocationProjectionMarker + filename: DotRendererDelegate.kt + module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate + abs_path: DotRendererDelegate.kt + lineno: 101 + index: 2 + - function: render + filename: DotRendererDelegate.kt + module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate + abs_path: DotRendererDelegate.kt + lineno: 34 + index: 2 + - function: render + filename: CurrentLocationRenderer.kt + module: com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer + abs_path: CurrentLocationRenderer.kt + lineno: 39 + index: 2 + - function: invoke + filename: CurrentLocationMarkerMapCollection.kt + module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1 + abs_path: CurrentLocationMarkerMapCollection.kt + lineno: 36 + index: 3 + - function: invoke + filename: CurrentLocationMarkerMapCollection.kt + module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1 + abs_path: CurrentLocationMarkerMapCollection.kt + lineno: 36 + index: 3 + - function: addMapReadyCallback + filename: MapboxMapView.kt + module: com.example.mapbox.MapboxMapView + abs_path: MapboxMapView.kt + lineno: 368 + index: 4 + - function: invoke + filename: CurrentLocationMarkerMapCollection.kt + module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1 + abs_path: CurrentLocationMarkerMapCollection.kt + lineno: 40 + index: 5 + - function: invoke + filename: CurrentLocationMarkerMapCollection.kt + module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1 + abs_path: CurrentLocationMarkerMapCollection.kt + lineno: 35 + index: 5 + - function: onRemembered + filename: Effects.kt + module: androidx.compose.runtime.DisposableEffectImpl + abs_path: Effects.kt + lineno: 85 + index: 6 + - function: dispatchRememberList + filename: RememberEventDispatcher.kt + module: androidx.compose.runtime.internal.RememberEventDispatcher + abs_path: RememberEventDispatcher.kt + lineno: 253 + index: 7 + - function: dispatchRememberObservers + filename: RememberEventDispatcher.kt + module: androidx.compose.runtime.internal.RememberEventDispatcher + abs_path: RememberEventDispatcher.kt + lineno: 225 + index: 7 + - function: applyChangesInLocked + filename: Composition.kt + module: androidx.compose.runtime.CompositionImpl + abs_path: Composition.kt + lineno: 1122 + index: 8 + - function: applyChanges + filename: Composition.kt + module: androidx.compose.runtime.CompositionImpl + abs_path: Composition.kt + lineno: 1149 + index: 9 + - function: invokeSuspend$lambda$22 + filename: Recomposer.kt + module: androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2 + abs_path: Recomposer.kt + lineno: 705 + index: 10 + - function: doFrame + filename: AndroidUiFrameClock.android.kt + module: androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1 + abs_path: AndroidUiFrameClock.android.kt + lineno: 39 + index: 11 + - function: performFrameDispatch + filename: AndroidUiDispatcher.android.kt + module: androidx.compose.ui.platform.AndroidUiDispatcher + abs_path: AndroidUiDispatcher.android.kt + lineno: 108 + index: 12 + - function: access$performFrameDispatch + filename: AndroidUiDispatcher.android.kt + module: androidx.compose.ui.platform.AndroidUiDispatcher + abs_path: AndroidUiDispatcher.android.kt + lineno: 41 + index: 12 + - function: doFrame + filename: AndroidUiDispatcher.android.kt + module: androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1 + abs_path: AndroidUiDispatcher.android.kt + lineno: 69 + index: 12 + - function: run + filename: Choreographer.java + module: android.view.Choreographer$CallbackRecord + lineno: 1899 + index: 13 + "###); } } From 91b1eb1c6b367719e19e54fe857597fb2568fbfd Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 27 Nov 2025 14:04:08 +0100 Subject: [PATCH 20/24] add newline --- .../symbolicator-proguard/src/res/mapping-outline-complex.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/symbolicator-proguard/src/res/mapping-outline-complex.txt b/crates/symbolicator-proguard/src/res/mapping-outline-complex.txt index 9e62fb267..04671900b 100644 --- a/crates/symbolicator-proguard/src/res/mapping-outline-complex.txt +++ b/crates/symbolicator-proguard/src/res/mapping-outline-complex.txt @@ -2073,4 +2073,4 @@ androidx.compose.ui.platform.AndroidUiFrameClock -> w2.r0: androidx.compose.ui.platform.AndroidUiDispatcher -> w2.q0: # {"id":"sourceFile","fileName":"AndroidUiDispatcher.android.kt"} androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2 -> h1.f3: -# {"id":"sourceFile","fileName":"Recomposer.kt"} \ No newline at end of file +# {"id":"sourceFile","fileName":"Recomposer.kt"} From 6bb4feda9969ddc2ec0b080b238e3c475abec7b3 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 27 Nov 2025 17:55:56 +0100 Subject: [PATCH 21/24] Fix tests --- .../src/symbolication.rs | 399 +++++++++--------- 1 file changed, 201 insertions(+), 198 deletions(-) diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index a814ea98a..159eb7f8e 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -510,22 +510,24 @@ mod tests { fn remap_stacktrace_caller_first( proguard_source: &[u8], release_package: Option<&str>, - frames: &[JvmFrame], + frames: &mut [JvmFrame], ) -> Vec { + frames.reverse(); let mapping = ProguardMapping::new(proguard_source); let mut cache = Vec::new(); ProguardCache::write(&mapping, &mut cache).unwrap(); let cache = ProguardCache::parse(&cache).unwrap(); cache.test(); - let remapped_frames = ProguardService::map_stacktrace( + let mut remapped_frames = ProguardService::map_stacktrace( &[&cache], frames, release_package, &mut SymbolicationStats::default(), ); - return remapped_frames; + remapped_frames.reverse(); + remapped_frames } #[test] @@ -628,7 +630,7 @@ io.sentry.sample.MainActivity -> io.sentry.sample.MainActivity: }, ]; - let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &mut frames); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: onClick @@ -679,7 +681,7 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: 65:65:void () -> "; - let frames = [ + let mut frames = [ JvmFrame { function: "a".to_owned(), module: "org.a.b.g$a".to_owned(), @@ -715,7 +717,7 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: ]; let mapped_frames = - remap_stacktrace_caller_first(proguard_source, Some("org.slf4j"), &frames); + remap_stacktrace_caller_first(proguard_source, Some("org.slf4j"), &mut frames); assert_eq!(mapped_frames[0].in_app, Some(true)); assert_eq!(mapped_frames[1].in_app, Some(false)); @@ -737,7 +739,7 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: ..Default::default() }; - let remapped = remap_stacktrace_caller_first(b"", Some("android"), &[frame]); + let remapped = remap_stacktrace_caller_first(b"", Some("android"), &mut [frame]); assert_eq!(remapped.len(), 1); // The frame didn't get mapped, so we shouldn't set `in_app` even though @@ -778,19 +780,19 @@ org.slf4j.helpers.Util$ClassContext -> org.a.b.g$b: ..Default::default() }; - let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &[frame]); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &mut [frame]); // Without the "line 0" change, the second frame doesn't exist. // The `retrace` implementation at // https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip // also returns this, no matter whether you give it line 0 or no line at all. insta::assert_yaml_snapshot!(mapped_frames, @r###" - - function: barInternalInject + - function: onCreate filename: App.java module: com.example.App abs_path: App.java lineno: 0 index: 0 - - function: onCreate + - function: barInternalInject filename: App.java module: com.example.App abs_path: App.java @@ -828,7 +830,7 @@ y.b -> y.b: ..Default::default() }; - let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &[frame]); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &mut [frame]); // Without the "line 0" change, the module is "com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0". // The `retrace` implementation at @@ -898,7 +900,7 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: void () -> # {"id":"com.android.tools.r8.synthesized"}"#; - let frames: Vec = serde_json::from_str( + let mut frames: Vec = serde_json::from_str( r#"[{ "function": "a", "abs_path": "SourceFile", @@ -952,7 +954,7 @@ io.wzieba.r8fullmoderenamessources.R -> a.d: ) .unwrap(); - let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &mut frames); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: foo @@ -1037,7 +1039,7 @@ com.mycompany.android.Delegate -> b80.h: com.mycompany.android.IMapAnnotations mapAnnotations -> a # {"id":"com.android.tools.r8.residualsignature","signature":"Lbv0/b;"}"#; - let frames: Vec = serde_json::from_str( + let mut frames: Vec = serde_json::from_str( r#"[ { "function": "a", @@ -1066,7 +1068,7 @@ com.mycompany.android.Delegate -> b80.h: ) .unwrap(); - let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &frames); + let mapped_frames = remap_stacktrace_caller_first(proguard_source, None, &mut frames); insta::assert_yaml_snapshot!(mapped_frames, @r###" - function: render @@ -1111,14 +1113,7 @@ some.Class -> b: # {"id":"com.android.tools.r8.outlineCallsite","positions":{"1":4,"2":5},"outline":"La;a()I"} "#; - let frames = [ - JvmFrame { - function: "a".to_owned(), - module: "a".to_owned(), - lineno: Some(1), - index: 0, - ..Default::default() - }, + let mut frames = [ JvmFrame { function: "s".to_owned(), module: "b".to_owned(), @@ -1126,9 +1121,16 @@ some.Class -> b: index: 1, ..Default::default() }, + JvmFrame { + function: "a".to_owned(), + module: "a".to_owned(), + lineno: Some(1), + index: 0, + ..Default::default() + }, ]; - let remapped = remap_stacktrace_caller_first(proguard_source, None, &frames); + let remapped = remap_stacktrace_caller_first(proguard_source, None, &mut frames); assert_eq!(remapped.len(), 1); assert_eq!(remapped[0].module, "some.Class"); @@ -1139,55 +1141,62 @@ some.Class -> b: #[test] fn remap_outline_complex() { - let frames: Vec = serde_json::from_str( + let mut frames: Vec = serde_json::from_str( r#"[ { - "function": "b", - "module": "ev.h", + "function": "run", + "module": "android.view.Choreographer$CallbackRecord", + "filename": "Choreographer.java", + "lineno": 1899, + "index": 13 + }, + { + "function": "doFrame", + "module": "w2.q0$c", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 3, - "index": 0 + "lineno": 48, + "index": 12 }, { - "function": "l", - "module": "uu0.k", + "function": "doFrame", + "module": "w2.r0$c", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 43, - "index": 1 + "lineno": 7, + "index": 11 }, { - "function": "a", - "module": "b80.f", + "function": "invoke", + "module": "h1.e3", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 33, - "index": 2 + "lineno": 231, + "index": 10 }, { - "function": "invoke", - "module": "er3.f", + "function": "m", + "module": "h1.y", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 3, - "index": 3 + "lineno": 6, + "index": 9 }, { - "function": "d", - "module": "yv0.g", + "function": "A", + "module": "h1.y", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 17, - "index": 4 + "lineno": 111, + "index": 8 }, { - "function": "invoke", - "module": "er3.g$a", + "function": "c", + "module": "p1.k", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 36, - "index": 5 + "lineno": 135, + "index": 7 }, { "function": "d", @@ -1198,122 +1207,139 @@ some.Class -> b: "index": 6 }, { - "function": "c", - "module": "p1.k", + "function": "invoke", + "module": "er3.g$a", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 135, - "index": 7 + "lineno": 36, + "index": 5 }, { - "function": "A", - "module": "h1.y", + "function": "d", + "module": "yv0.g", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 111, - "index": 8 + "lineno": 17, + "index": 4 }, { - "function": "m", - "module": "h1.y", + "function": "invoke", + "module": "er3.f", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 6, - "index": 9 + "lineno": 3, + "index": 3 }, { - "function": "invoke", - "module": "h1.e3", + "function": "a", + "module": "b80.f", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 231, - "index": 10 + "lineno": 33, + "index": 2 }, { - "function": "doFrame", - "module": "w2.r0$c", + "function": "l", + "module": "uu0.k", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 7, - "index": 11 + "lineno": 43, + "index": 1 }, { - "function": "doFrame", - "module": "w2.q0$c", + "function": "b", + "module": "ev.h", "filename": "SourceFile", "abs_path": "SourceFile", - "lineno": 48, - "index": 12 - }, - { - "function": "run", - "module": "android.view.Choreographer$CallbackRecord", - "filename": "Choreographer.java", - "lineno": 1899, - "index": 13 + "lineno": 3, + "index": 0 }]"#, ) .unwrap(); - let remapped_frames = remap_stacktrace_caller_first(MAPPING_OUTLINE_COMPLEX, None, &frames); + let remapped_frames = + remap_stacktrace_caller_first(MAPPING_OUTLINE_COMPLEX, None, &mut frames); insta::assert_yaml_snapshot!( remapped_frames, @r###" - - function: onProjectionView - filename: MapProjectionViewController.kt - module: com.example.projection.MapProjectionViewController - abs_path: MapProjectionViewController.kt - lineno: 160 - index: 1 - - function: createProjectionMarkerInternal - filename: MapProjectionViewController.kt - module: com.example.projection.MapProjectionViewController - abs_path: MapProjectionViewController.kt - lineno: 133 - index: 1 - - function: createProjectionMarker - filename: MapProjectionViewController.kt - module: com.example.projection.MapProjectionViewController - abs_path: MapProjectionViewController.kt - lineno: 79 - index: 1 - - function: createProjectionMarker - filename: MapAnnotations.kt - module: com.example.MapAnnotations - abs_path: MapAnnotations.kt - lineno: 63 - index: 1 - - function: createCurrentLocationProjectionMarker - filename: DotRendererDelegate.kt - module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate - abs_path: DotRendererDelegate.kt - lineno: 101 - index: 2 - - function: render - filename: DotRendererDelegate.kt - module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate - abs_path: DotRendererDelegate.kt - lineno: 34 - index: 2 - - function: render - filename: CurrentLocationRenderer.kt - module: com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer - abs_path: CurrentLocationRenderer.kt + - function: run + filename: Choreographer.java + module: android.view.Choreographer$CallbackRecord + lineno: 1899 + index: 13 + - function: doFrame + filename: AndroidUiDispatcher.android.kt + module: androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1 + abs_path: AndroidUiDispatcher.android.kt + lineno: 69 + index: 12 + - function: access$performFrameDispatch + filename: AndroidUiDispatcher.android.kt + module: androidx.compose.ui.platform.AndroidUiDispatcher + abs_path: AndroidUiDispatcher.android.kt + lineno: 41 + index: 12 + - function: performFrameDispatch + filename: AndroidUiDispatcher.android.kt + module: androidx.compose.ui.platform.AndroidUiDispatcher + abs_path: AndroidUiDispatcher.android.kt + lineno: 108 + index: 12 + - function: doFrame + filename: AndroidUiFrameClock.android.kt + module: androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1 + abs_path: AndroidUiFrameClock.android.kt lineno: 39 - index: 2 + index: 11 + - function: invokeSuspend$lambda$22 + filename: Recomposer.kt + module: androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2 + abs_path: Recomposer.kt + lineno: 705 + index: 10 + - function: applyChanges + filename: Composition.kt + module: androidx.compose.runtime.CompositionImpl + abs_path: Composition.kt + lineno: 1149 + index: 9 + - function: applyChangesInLocked + filename: Composition.kt + module: androidx.compose.runtime.CompositionImpl + abs_path: Composition.kt + lineno: 1122 + index: 8 + - function: dispatchRememberObservers + filename: RememberEventDispatcher.kt + module: androidx.compose.runtime.internal.RememberEventDispatcher + abs_path: RememberEventDispatcher.kt + lineno: 225 + index: 7 + - function: dispatchRememberList + filename: RememberEventDispatcher.kt + module: androidx.compose.runtime.internal.RememberEventDispatcher + abs_path: RememberEventDispatcher.kt + lineno: 253 + index: 7 + - function: onRemembered + filename: Effects.kt + module: androidx.compose.runtime.DisposableEffectImpl + abs_path: Effects.kt + lineno: 85 + index: 6 - function: invoke filename: CurrentLocationMarkerMapCollection.kt - module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1 + module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1 abs_path: CurrentLocationMarkerMapCollection.kt - lineno: 36 - index: 3 + lineno: 35 + index: 5 - function: invoke filename: CurrentLocationMarkerMapCollection.kt - module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1 + module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1 abs_path: CurrentLocationMarkerMapCollection.kt - lineno: 36 - index: 3 + lineno: 40 + index: 5 - function: addMapReadyCallback filename: MapboxMapView.kt module: com.example.mapbox.MapboxMapView @@ -1322,81 +1348,58 @@ some.Class -> b: index: 4 - function: invoke filename: CurrentLocationMarkerMapCollection.kt - module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1 + module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1 abs_path: CurrentLocationMarkerMapCollection.kt - lineno: 40 - index: 5 + lineno: 36 + index: 3 - function: invoke filename: CurrentLocationMarkerMapCollection.kt - module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1 + module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1 abs_path: CurrentLocationMarkerMapCollection.kt - lineno: 35 - index: 5 - - function: onRemembered - filename: Effects.kt - module: androidx.compose.runtime.DisposableEffectImpl - abs_path: Effects.kt - lineno: 85 - index: 6 - - function: dispatchRememberList - filename: RememberEventDispatcher.kt - module: androidx.compose.runtime.internal.RememberEventDispatcher - abs_path: RememberEventDispatcher.kt - lineno: 253 - index: 7 - - function: dispatchRememberObservers - filename: RememberEventDispatcher.kt - module: androidx.compose.runtime.internal.RememberEventDispatcher - abs_path: RememberEventDispatcher.kt - lineno: 225 - index: 7 - - function: applyChangesInLocked - filename: Composition.kt - module: androidx.compose.runtime.CompositionImpl - abs_path: Composition.kt - lineno: 1122 - index: 8 - - function: applyChanges - filename: Composition.kt - module: androidx.compose.runtime.CompositionImpl - abs_path: Composition.kt - lineno: 1149 - index: 9 - - function: invokeSuspend$lambda$22 - filename: Recomposer.kt - module: androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2 - abs_path: Recomposer.kt - lineno: 705 - index: 10 - - function: doFrame - filename: AndroidUiFrameClock.android.kt - module: androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1 - abs_path: AndroidUiFrameClock.android.kt + lineno: 36 + index: 3 + - function: render + filename: CurrentLocationRenderer.kt + module: com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer + abs_path: CurrentLocationRenderer.kt lineno: 39 - index: 11 - - function: performFrameDispatch - filename: AndroidUiDispatcher.android.kt - module: androidx.compose.ui.platform.AndroidUiDispatcher - abs_path: AndroidUiDispatcher.android.kt - lineno: 108 - index: 12 - - function: access$performFrameDispatch - filename: AndroidUiDispatcher.android.kt - module: androidx.compose.ui.platform.AndroidUiDispatcher - abs_path: AndroidUiDispatcher.android.kt - lineno: 41 - index: 12 - - function: doFrame - filename: AndroidUiDispatcher.android.kt - module: androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1 - abs_path: AndroidUiDispatcher.android.kt - lineno: 69 - index: 12 - - function: run - filename: Choreographer.java - module: android.view.Choreographer$CallbackRecord - lineno: 1899 - index: 13 + index: 2 + - function: render + filename: DotRendererDelegate.kt + module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate + abs_path: DotRendererDelegate.kt + lineno: 34 + index: 2 + - function: createCurrentLocationProjectionMarker + filename: DotRendererDelegate.kt + module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate + abs_path: DotRendererDelegate.kt + lineno: 101 + index: 2 + - function: createProjectionMarker + filename: MapAnnotations.kt + module: com.example.MapAnnotations + abs_path: MapAnnotations.kt + lineno: 63 + index: 1 + - function: createProjectionMarker + filename: MapProjectionViewController.kt + module: com.example.projection.MapProjectionViewController + abs_path: MapProjectionViewController.kt + lineno: 79 + index: 1 + - function: createProjectionMarkerInternal + filename: MapProjectionViewController.kt + module: com.example.projection.MapProjectionViewController + abs_path: MapProjectionViewController.kt + lineno: 133 + index: 1 + - function: onProjectionView + filename: MapProjectionViewController.kt + module: com.example.projection.MapProjectionViewController + abs_path: MapProjectionViewController.kt + lineno: 160 + index: 1 "###); } } From d185d12c2a7f8cb197b6f6821ad3b4bb23716761 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 27 Nov 2025 17:56:36 +0100 Subject: [PATCH 22/24] Clean up --- .../src/.symbolication.rs.pending-snap | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 crates/symbolicator-proguard/src/.symbolication.rs.pending-snap diff --git a/crates/symbolicator-proguard/src/.symbolication.rs.pending-snap b/crates/symbolicator-proguard/src/.symbolication.rs.pending-snap deleted file mode 100644 index 001f575b4..000000000 --- a/crates/symbolicator-proguard/src/.symbolication.rs.pending-snap +++ /dev/null @@ -1,8 +0,0 @@ -{"run_id":"1764245173-286984000","line":1286,"new":{"module_name":"symbolicator_proguard__symbolication__tests","snapshot_name":"remap_outline_complex","metadata":{"source":"crates/symbolicator-proguard/src/symbolication.rs","assertion_line":1286,"expression":"remapped_frames"},"snapshot":"- function: onProjectionView\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 160\n index: 1\n- function: createProjectionMarkerInternal\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 133\n index: 1\n- function: createProjectionMarker\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 79\n index: 1\n- function: createProjectionMarker\n filename: MapAnnotations.kt\n module: com.example.MapAnnotations\n abs_path: MapAnnotations.kt\n lineno: 63\n index: 1\n- function: createCurrentLocationProjectionMarker\n filename: DotRendererDelegate.kt\n module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate\n abs_path: DotRendererDelegate.kt\n lineno: 101\n index: 2\n- function: render\n filename: DotRendererDelegate.kt\n module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate\n abs_path: DotRendererDelegate.kt\n lineno: 34\n index: 2\n- function: render\n filename: CurrentLocationRenderer.kt\n module: com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer\n abs_path: CurrentLocationRenderer.kt\n lineno: 39\n index: 2\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 36\n index: 3\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 36\n index: 3\n- function: addMapReadyCallback\n filename: MapboxMapView.kt\n module: com.example.mapbox.MapboxMapView\n abs_path: MapboxMapView.kt\n lineno: 368\n index: 4\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 40\n index: 5\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 35\n index: 5\n- function: onRemembered\n filename: Effects.kt\n module: androidx.compose.runtime.DisposableEffectImpl\n abs_path: Effects.kt\n lineno: 85\n index: 6\n- function: dispatchRememberList\n filename: RememberEventDispatcher.kt\n module: androidx.compose.runtime.internal.RememberEventDispatcher\n abs_path: RememberEventDispatcher.kt\n lineno: 253\n index: 7\n- function: dispatchRememberObservers\n filename: RememberEventDispatcher.kt\n module: androidx.compose.runtime.internal.RememberEventDispatcher\n abs_path: RememberEventDispatcher.kt\n lineno: 225\n index: 7\n- function: applyChangesInLocked\n filename: Composition.kt\n module: androidx.compose.runtime.CompositionImpl\n abs_path: Composition.kt\n lineno: 1122\n index: 8\n- function: applyChanges\n filename: Composition.kt\n module: androidx.compose.runtime.CompositionImpl\n abs_path: Composition.kt\n lineno: 1149\n index: 9\n- function: invokeSuspend$lambda$22\n filename: Recomposer.kt\n module: androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2\n abs_path: Recomposer.kt\n lineno: 705\n index: 10\n- function: doFrame\n filename: AndroidUiFrameClock.android.kt\n module: androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1\n abs_path: AndroidUiFrameClock.android.kt\n lineno: 39\n index: 11\n- function: performFrameDispatch\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 108\n index: 12\n- function: access$performFrameDispatch\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 41\n index: 12\n- function: doFrame\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 69\n index: 12\n- function: run\n filename: Choreographer.java\n module: android.view.Choreographer$CallbackRecord\n lineno: 1899\n index: 13"},"old":{"module_name":"symbolicator_proguard__symbolication__tests","metadata":{},"snapshot":"- function: onProjectionView\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 160\n index: 1\n- function: createProjectionMarkerInternal\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 133\n index: 1\n- function: createProjectionMarker\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 79\n index: 1\n- function: createProjectionMarker\n filename: MapAnnotations.kt\n module: com.example.MapAnnotations\n abs_path: MapAnnotations.kt\n lineno: 63\n index: 1\n- function: createCurrentLocationProjectionMarker\n filename: DotRendererDelegate.kt\n module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate\n abs_path: DotRendererDelegate.kt\n lineno: 101\n index: 2\n- function: render\n filename: DotRendererDelegate.kt\n module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate\n abs_path: DotRendererDelegate.kt\n lineno: 34\n index: 2\n- function: render\n filename: CurrentLocationRenderer.kt\n module: com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer\n abs_path: CurrentLocationRenderer.kt\n lineno: 39\n index: 2\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 36\n index: 3\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 36\n index: 3\n- function: addMapReadyCallback\n filename: MapboxMapView.kt\n module: com.example.mapbox.MapboxMapView\n abs_path: MapboxMapView.kt\n lineno: 368\n index: 4\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 40\n index: 5\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 35\n index: 5\n- function: onRemembered\n filename: Effects.kt\n module: androidx.compose.runtime.DisposableEffectImpl\n abs_path: Effects.kt\n lineno: 85\n index: 6\n- function: dispatchRememberList\n filename: RememberEventDispatcher.kt\n module: androidx.compose.runtime.internal.RememberEventDispatcher\n abs_path: RememberEventDispatcher.kt\n lineno: 253\n index: 7\n- function: dispatchRememberObservers\n filename: RememberEventDispatcher.kt\n module: androidx.compose.runtime.internal.RememberEventDispatcher\n abs_path: RememberEventDispatcher.kt\n lineno: 225\n index: 7\n- function: applyChangesInLocked\n filename: Composition.kt\n module: androidx.compose.runtime.CompositionImpl\n abs_path: Composition.kt\n lineno: 1122\n index: 8\n- function: applyChanges\n filename: Composition.kt\n module: androidx.compose.runtime.CompositionImpl\n abs_path: Composition.kt\n lineno: 1149\n index: 9\n- function: invokeSuspend$lambda$22\n filename: Recomposer.kt\n module: androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2\n abs_path: Recomposer.kt\n lineno: 705\n index: 10\n- function: doFrame\n filename: AndroidUiFrameClock.android.kt\n module: androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1\n abs_path: AndroidUiFrameClock.android.kt\n lineno: 39\n index: 11\n- function: performFrameDispatch\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 108\n index: 12\n- function: access$performFrameDispatch\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 41\n index: 12\n- function: doFrame\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 69\n index: 12\n- function: run\n filename: Choreographer.java\n module: android.view.Choreographer$CallbackRecord\n abs_path: Choreographer.java\n lineno: 1899\n index: 13"}} -{"run_id":"1764246952-135991000","line":1286,"new":{"module_name":"symbolicator_proguard__symbolication__tests","snapshot_name":"remap_outline_complex","metadata":{"source":"crates/symbolicator-proguard/src/symbolication.rs","assertion_line":1286,"expression":"remapped_frames"},"snapshot":"- function: onProjectionView\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 160\n index: 1\n- function: createProjectionMarkerInternal\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 133\n index: 1\n- function: createProjectionMarker\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 79\n index: 1\n- function: createProjectionMarker\n filename: MapAnnotations.kt\n module: com.example.MapAnnotations\n abs_path: MapAnnotations.kt\n lineno: 63\n index: 1\n- function: createCurrentLocationProjectionMarker\n filename: DotRendererDelegate.kt\n module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate\n abs_path: DotRendererDelegate.kt\n lineno: 101\n index: 2\n- function: render\n filename: DotRendererDelegate.kt\n module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate\n abs_path: DotRendererDelegate.kt\n lineno: 34\n index: 2\n- function: render\n filename: CurrentLocationRenderer.kt\n module: com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer\n abs_path: CurrentLocationRenderer.kt\n lineno: 39\n index: 2\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 36\n index: 3\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 36\n index: 3\n- function: addMapReadyCallback\n filename: MapboxMapView.kt\n module: com.example.mapbox.MapboxMapView\n abs_path: MapboxMapView.kt\n lineno: 368\n index: 4\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 40\n index: 5\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 35\n index: 5\n- function: onRemembered\n filename: Effects.kt\n module: androidx.compose.runtime.DisposableEffectImpl\n abs_path: Effects.kt\n lineno: 85\n index: 6\n- function: dispatchRememberList\n filename: RememberEventDispatcher.kt\n module: androidx.compose.runtime.internal.RememberEventDispatcher\n abs_path: RememberEventDispatcher.kt\n lineno: 253\n index: 7\n- function: dispatchRememberObservers\n filename: RememberEventDispatcher.kt\n module: androidx.compose.runtime.internal.RememberEventDispatcher\n abs_path: RememberEventDispatcher.kt\n lineno: 225\n index: 7\n- function: applyChangesInLocked\n filename: Composition.kt\n module: androidx.compose.runtime.CompositionImpl\n abs_path: Composition.kt\n lineno: 1122\n index: 8\n- function: applyChanges\n filename: Composition.kt\n module: androidx.compose.runtime.CompositionImpl\n abs_path: Composition.kt\n lineno: 1149\n index: 9\n- function: invokeSuspend$lambda$22\n filename: Recomposer.kt\n module: androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2\n abs_path: Recomposer.kt\n lineno: 705\n index: 10\n- function: doFrame\n filename: AndroidUiFrameClock.android.kt\n module: androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1\n abs_path: AndroidUiFrameClock.android.kt\n lineno: 39\n index: 11\n- function: performFrameDispatch\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 108\n index: 12\n- function: access$performFrameDispatch\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 41\n index: 12\n- function: doFrame\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 69\n index: 12\n- function: run\n filename: Choreographer.java\n module: android.view.Choreographer$CallbackRecord\n lineno: 1899\n index: 13"},"old":{"module_name":"symbolicator_proguard__symbolication__tests","metadata":{},"snapshot":"- function: onProjectionView\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 160\n index: 1\n- function: createProjectionMarkerInternal\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 133\n index: 1\n- function: createProjectionMarker\n filename: MapProjectionViewController.kt\n module: com.example.projection.MapProjectionViewController\n abs_path: MapProjectionViewController.kt\n lineno: 79\n index: 1\n- function: createProjectionMarker\n filename: MapAnnotations.kt\n module: com.example.MapAnnotations\n abs_path: MapAnnotations.kt\n lineno: 63\n index: 1\n- function: createCurrentLocationProjectionMarker\n filename: DotRendererDelegate.kt\n module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate\n abs_path: DotRendererDelegate.kt\n lineno: 101\n index: 2\n- function: render\n filename: DotRendererDelegate.kt\n module: com.example.mapcomponents.marker.currentlocation.DotRendererDelegate\n abs_path: DotRendererDelegate.kt\n lineno: 34\n index: 2\n- function: render\n filename: CurrentLocationRenderer.kt\n module: com.example.mapcomponents.marker.currentlocation.CurrentLocationRenderer\n abs_path: CurrentLocationRenderer.kt\n lineno: 39\n index: 2\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 36\n index: 3\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1$mapReadyCallback$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 36\n index: 3\n- function: addMapReadyCallback\n filename: MapboxMapView.kt\n module: com.example.mapbox.MapboxMapView\n abs_path: MapboxMapView.kt\n lineno: 368\n index: 4\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 40\n index: 5\n- function: invoke\n filename: CurrentLocationMarkerMapCollection.kt\n module: com.example.map.internal.CurrentLocationMarkerMapCollectionKt$CurrentLocationMarkerMapCollection$1$1\n abs_path: CurrentLocationMarkerMapCollection.kt\n lineno: 35\n index: 5\n- function: onRemembered\n filename: Effects.kt\n module: androidx.compose.runtime.DisposableEffectImpl\n abs_path: Effects.kt\n lineno: 85\n index: 6\n- function: dispatchRememberList\n filename: RememberEventDispatcher.kt\n module: androidx.compose.runtime.internal.RememberEventDispatcher\n abs_path: RememberEventDispatcher.kt\n lineno: 253\n index: 7\n- function: dispatchRememberObservers\n filename: RememberEventDispatcher.kt\n module: androidx.compose.runtime.internal.RememberEventDispatcher\n abs_path: RememberEventDispatcher.kt\n lineno: 225\n index: 7\n- function: applyChangesInLocked\n filename: Composition.kt\n module: androidx.compose.runtime.CompositionImpl\n abs_path: Composition.kt\n lineno: 1122\n index: 8\n- function: applyChanges\n filename: Composition.kt\n module: androidx.compose.runtime.CompositionImpl\n abs_path: Composition.kt\n lineno: 1149\n index: 9\n- function: invokeSuspend$lambda$22\n filename: Recomposer.kt\n module: androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2\n abs_path: Recomposer.kt\n lineno: 705\n index: 10\n- function: doFrame\n filename: AndroidUiFrameClock.android.kt\n module: androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1\n abs_path: AndroidUiFrameClock.android.kt\n lineno: 39\n index: 11\n- function: performFrameDispatch\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 108\n index: 12\n- function: access$performFrameDispatch\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 41\n index: 12\n- function: doFrame\n filename: AndroidUiDispatcher.android.kt\n module: androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1\n abs_path: AndroidUiDispatcher.android.kt\n lineno: 69\n index: 12\n- function: run\n filename: Choreographer.java\n module: android.view.Choreographer$CallbackRecord\n abs_path: Choreographer.java\n lineno: 1899\n index: 13"}} -{"run_id":"1764247054-730792000","line":855,"new":null,"old":null} -{"run_id":"1764247054-730792000","line":976,"new":null,"old":null} -{"run_id":"1764247054-730792000","line":803,"new":null,"old":null} -{"run_id":"1764247054-730792000","line":643,"new":null,"old":null} -{"run_id":"1764247054-730792000","line":1091,"new":null,"old":null} -{"run_id":"1764247054-730792000","line":1286,"new":null,"old":null} From 7e7c5299eff6d1a209c51c446234b2996f1bd802 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 27 Nov 2025 21:24:35 +0100 Subject: [PATCH 23/24] Revert --- crates/symbolicator-crash/sentry-native | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/symbolicator-crash/sentry-native b/crates/symbolicator-crash/sentry-native index 11f94efc6..027459265 160000 --- a/crates/symbolicator-crash/sentry-native +++ b/crates/symbolicator-crash/sentry-native @@ -1 +1 @@ -Subproject commit 11f94efc64d55e90aef9456ce01716c846ae1732 +Subproject commit 027459265ab94de340a5f59b767248652640d1e6 From f6f57bba9b17854a7c55d2056c45d4e5e185cdfa Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Fri, 28 Nov 2025 12:08:10 +0100 Subject: [PATCH 24/24] Use snapshot in remap_outline --- crates/symbolicator-proguard/src/symbolication.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/symbolicator-proguard/src/symbolication.rs b/crates/symbolicator-proguard/src/symbolication.rs index 159eb7f8e..3c45b2074 100644 --- a/crates/symbolicator-proguard/src/symbolication.rs +++ b/crates/symbolicator-proguard/src/symbolication.rs @@ -1132,11 +1132,12 @@ some.Class -> b: let remapped = remap_stacktrace_caller_first(proguard_source, None, &mut frames); - assert_eq!(remapped.len(), 1); - assert_eq!(remapped[0].module, "some.Class"); - assert_eq!(remapped[0].function, "outlineCaller"); - assert_eq!(remapped[0].lineno, Some(98)); - assert_eq!(remapped[0].index, 1); + insta::assert_yaml_snapshot!(remapped, @r###" + - function: outlineCaller + module: some.Class + lineno: 98 + index: 1 + "###); } #[test]