Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE

Change-Id: If02b100e7f22a1f1dd198fa50a6ee61ae3747bc7
diff --git a/script.js b/script.js
index a8acc0a..6eb2b37 100644
--- a/script.js
+++ b/script.js
@@ -11,14 +11,14 @@
 window.FLATTENED["tracing.tracks.drawing_container"]=!0;window.FLATTENED["tracing.constants"]=!0;window.FLATTENED["tracing.tracks.heading_track"]=!0;window.FLATTENED["tracing.tracks.ruler_track"]=!0;window.FLATTENED["base.measuring_stick"]=!0;window.FLATTENED["tracing.tracks.container_track"]=!0;window.FLATTENED["tracing.fast_rect_renderer"]=!0;window.FLATTENED["tracing.tracks.slice_track"]=!0;window.FLATTENED["tracing.tracks.cpu_track"]=!0;
 window.FLATTENED["tracing.tracks.object_instance_track"]=!0;window.FLATTENED["tcmalloc.heap_instance_track"]=!0;window.FLATTENED["tracing.tracks.counter_track"]=!0;window.FLATTENED["tracing.tracks.spacing_track"]=!0;window.FLATTENED["tracing.tracks.slice_group_track"]=!0;window.FLATTENED["tracing.tracks.async_slice_group_track"]=!0;window.FLATTENED["tracing.tracks.thread_track"]=!0;window.FLATTENED["ui.dom_helpers"]=!0;window.FLATTENED["tracing.tracks.process_track_base"]=!0;
 window.FLATTENED["tracing.tracks.kernel_track"]=!0;window.FLATTENED["tracing.tracks.process_track"]=!0;window.FLATTENED["tracing.tracks.trace_model_track"]=!0;window.FLATTENED["ui.mouse_mode_selector"]=!0;window.FLATTENED["tracing.timeline_track_view"]=!0;window.FLATTENED["tracing.find_control"]=!0;window.FLATTENED["ui.drag_handle"]=!0;window.FLATTENED["tracing.timeline_view"]=!0;window.FLATTENED["tracing.standalone_timeline_view"]=!0;
-var templateData_=window.atob("PCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InRpbWVsaW5lLXZpZXctdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImNvbnRyb2wiPgogICAgPGRpdiBpZD0ibGVmdC1jb250cm9scyIgY2xhc3M9ImNvbnRyb2xzIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InRpdGxlIj5eX148L2Rpdj4KICAgIDxkaXYgaWQ9InJpZ2h0LWNvbnRyb2xzIiBjbGFzcz0iY29udHJvbHMgY2F0ZWdvcnktZmlsdGVyIj48L2Rpdj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPjwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJ0cmFjay1zZWxlY3Rvci1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9InRyYWNrLXNlbGVjdG9yLWFuY2hvciI+CiAgICA8YnV0dG9uIGNsYXNzPSJidXR0b24gdHJhY2stc2VsZWN0b3ItYnV0dG9uIHRyYWNrLXNlbGVjdG9yLWNsb3NlZCI+CiAgICAgIFRyYWNrIFNlbGVjdG9yCiAgICA8L2J1dHRvbj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KCjx0ZW1wbGF0ZSBpZD0iaW1wb3J0LWVycm9ycy1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImJ1dHRvbiB2aWV3LWltcG9ydC1lcnJvcnMtYnV0dG9uIHZpZXctaW5mby1idXR0b24iPgogICAgSW1wb3J0IGVycm9ycyEKICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi1jb250YWluZXIgaW1wb3J0LWVycm9ycy1kaWFsb2ciPgogICAgRXJyb3JzIG9jY3VycmVkIGR1cmluZyBpbXBvcnQ6CiAgICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi10ZXh0IGltcG9ydC1lcnJvcnMtZGlhbG9nLXRleHQiPjwvZGl2PgogIDwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJjYXRlZ29yeS1maWx0ZXItYnRuLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJidXR0b24gdmlldy1pbmZvLWJ1dHRvbiI+Q2F0ZWdvcmllczwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJoZWxwLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iYnV0dG9uIHZpZXctaGVscC1idXR0b24iPj88L2Rpdj4KICA8ZGl2IGNsYXNzPSJ2aWV3LWhlbHAtdGV4dCIKICAgICAgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2UiPjwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJtZXRhZGF0YS1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImJ1dHRvbiB2aWV3LW1ldGFkYXRhLWJ1dHRvbiB2aWV3LWluZm8tYnV0dG9uIj4KICAgIE1ldGFkYXRhCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iaW5mby1idXR0b24tY29udGFpbmVyIG1ldGFkYXRhLWRpYWxvZyI+CiAgICBNZXRhZGF0YSBJbmZvOgogICAgPGRpdiBjbGFzcz0iaW5mby1idXR0b24tdGV4dCBtZXRhZGF0YS1kaWFsb2ctdGV4dCI+PC9kaXY+CiAgPC9kaXY+CjwvdGVtcGxhdGU+CjwhLS0KQ29weXJpZ2h0IChjKSAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCmZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0tPgoKPHRlbXBsYXRlIGlkPSJyZWNvcmQtc2VsZWN0aW9uLWRpYWxvZy10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0icmVjb3JkLXNlbGVjdGlvbi1kaWFsb2ciPgogICAgPGZvcm0+CiAgICAgIDx0YWJsZT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImRlZmF1bHQtZW5hYmxlZC1jYXRlZ29yaWVzIj4KICAgICAgICAgICAgPGRpdj5SZWNvcmQmbmJzcDtDYXRlZ29yaWVzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwLXNlbGVjdG9ycyI+CiAgICAgICAgICAgICAgU2VsZWN0CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWxsLWJ0biI+QWxsPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibm9uZS1idG4iPk5vbmU8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhdGVnb3JpZXMiPjwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iZGVmYXVsdC1kaXNhYmxlZC1jYXRlZ29yaWVzIj4KICAgICAgICAgICAgPGRpdj5EaXNhYmxlZCZuYnNwO2J5Jm5ic3A7RGVmYXVsdCZuYnNwO0NhdGVnb3JpZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtc2VsZWN0b3JzIj4KICAgICAgICAgICAgICBTZWxlY3QKICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhbGwtYnRuIj5BbGw8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJub25lLWJ0biI+Tm9uZTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcmllcyI+PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L2Zvcm0+CgogICAgPGRpdiBjbGFzcz0ib3B0aW9ucyI+CiAgICAgIDxidXR0b24gY2xhc3M9InJlY29yZC1jYXRlZ29yaWVzIj5SZWNvcmQ8L2J1dHRvbj4KICAgICAgPGxhYmVsIGNsYXNzPSJjb250aW51b3VzLXRyYWNpbmctbGFiZWwiPgogICAgICAgIENvbnRpbnVvdXMgdHJhY2luZwogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9ImNvbnRpbnVvdXNUcmFjaW5nIiBjaGVja2VkPSJjaGVja2VkIgogICAgICAgICAgICAgICBjbGFzcz0iY29udGludW91cy10cmFjaW5nLWJ1dHRvbiIgLz4KICAgICAgPC9sYWJlbD4KICAgICAgPGxhYmVsIGNsYXNzPSJzeXN0ZW0tdHJhY2luZy1sYWJlbCI+CiAgICAgICAgU3lzdGVtIGV2ZW50cwogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9InN5c3RlbVRyYWNpbmciCiAgICAgICAgICAgICAgIGNsYXNzPSJzeXN0ZW0tdHJhY2luZy1idXR0b24iIC8+CiAgICAgIDwvbGFiZWw+CiAgICAgIDxsYWJlbCBjbGFzcz0ic2FtcGxpbmctbGFiZWwiPgogICAgICAgIEVuYWJsZSBzYW1wbGluZwogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9ImVuYWJsZVNhbXBsaW5nIiBjbGFzcz0ic2FtcGxpbmctYnV0dG9uIiAvPgogICAgICA8L2xhYmVsPgogICAgPC9kaXY+CiAgPC9kaXY+CjwvdGVtcGxhdGU+CjwhLS0KQ29weXJpZ2h0IChjKSAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCmZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0tPgoKPHRlbXBsYXRlIGlkPSJ2aWV3LWNhdGVnb3J5LWZpbHRlci1kaWFsb2ctdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImNhdGVnb3J5LWZpbHRlci1kaWFsb2ciPgogICAgU2VsZWN0IGFjdGl2ZSBjYXRlZ29yaWVzOgogICAgPGZvcm0gY2xhc3M9ImNhdGVnb3J5LWZpbHRlci1kaWFsb2ctZm9ybSI+CiAgICAgIDxkaXYgY2xhc3M9ImNhdGVnb3JpZXMiPgogICAgICA8L2Rpdj4KICAgIDwvZm9ybT4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KPCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9Im1vdXNlLW1vZGUtc2VsZWN0b3ItdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImRyYWctaGFuZGxlIj48L2Rpdj4KICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgIDxkaXYgY2xhc3M9InBhbi1zY2FuLW1vZGUtYnV0dG9uIHRvb2wtYnV0dG9uIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InNlbGVjdGlvbi1tb2RlLWJ1dHRvbiB0b29sLWJ1dHRvbiI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ6b29tLW1vZGUtYnV0dG9uIHRvb2wtYnV0dG9uIj48L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4K"),templateElem_=
+var templateData_=window.atob("PCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InJlY29yZC1zZWxlY3Rpb24tZGlhbG9nLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJyZWNvcmQtc2VsZWN0aW9uLWRpYWxvZyI+CiAgICA8Zm9ybT4KICAgICAgPHRhYmxlPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iZGVmYXVsdC1lbmFibGVkLWNhdGVnb3JpZXMiPgogICAgICAgICAgICA8ZGl2PlJlY29yZCZuYnNwO0NhdGVnb3JpZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtc2VsZWN0b3JzIj4KICAgICAgICAgICAgICBTZWxlY3QKICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhbGwtYnRuIj5BbGw8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJub25lLWJ0biI+Tm9uZTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcmllcyI+PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJkZWZhdWx0LWRpc2FibGVkLWNhdGVnb3JpZXMiPgogICAgICAgICAgICA8ZGl2PkRpc2FibGVkJm5ic3A7YnkmbmJzcDtEZWZhdWx0Jm5ic3A7Q2F0ZWdvcmllczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncm91cC1zZWxlY3RvcnMiPgogICAgICAgICAgICAgIFNlbGVjdAogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFsbC1idG4iPkFsbDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im5vbmUtYnRuIj5Ob25lPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXRlZ29yaWVzIj48L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZm9ybT4KCiAgICA8ZGl2IGNsYXNzPSJvcHRpb25zIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0icmVjb3JkLWNhdGVnb3JpZXMiPlJlY29yZDwvYnV0dG9uPgogICAgICA8bGFiZWwgY2xhc3M9ImNvbnRpbnVvdXMtdHJhY2luZy1sYWJlbCI+CiAgICAgICAgQ29udGludW91cyB0cmFjaW5nCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iY29udGludW91c1RyYWNpbmciIGNoZWNrZWQ9ImNoZWNrZWQiCiAgICAgICAgICAgICAgIGNsYXNzPSJjb250aW51b3VzLXRyYWNpbmctYnV0dG9uIiAvPgogICAgICA8L2xhYmVsPgogICAgICA8bGFiZWwgY2xhc3M9InN5c3RlbS10cmFjaW5nLWxhYmVsIj4KICAgICAgICBTeXN0ZW0gZXZlbnRzCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0ic3lzdGVtVHJhY2luZyIKICAgICAgICAgICAgICAgY2xhc3M9InN5c3RlbS10cmFjaW5nLWJ1dHRvbiIgLz4KICAgICAgPC9sYWJlbD4KICAgICAgPGxhYmVsIGNsYXNzPSJzYW1wbGluZy1sYWJlbCI+CiAgICAgICAgRW5hYmxlIHNhbXBsaW5nCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iZW5hYmxlU2FtcGxpbmciIGNsYXNzPSJzYW1wbGluZy1idXR0b24iIC8+CiAgICAgIDwvbGFiZWw+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KPCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InZpZXctY2F0ZWdvcnktZmlsdGVyLWRpYWxvZy10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iY2F0ZWdvcnktZmlsdGVyLWRpYWxvZyI+CiAgICBTZWxlY3QgYWN0aXZlIGNhdGVnb3JpZXM6CiAgICA8Zm9ybSBjbGFzcz0iY2F0ZWdvcnktZmlsdGVyLWRpYWxvZy1mb3JtIj4KICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcmllcyI+CiAgICAgIDwvZGl2PgogICAgPC9mb3JtPgogIDwvZGl2Pgo8L3RlbXBsYXRlPgo8IS0tCkNvcHlyaWdodCAoYykgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQpmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLT4KCjx0ZW1wbGF0ZSBpZD0idGltZWxpbmUtdmlldy10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iY29udHJvbCI+CiAgICA8ZGl2IGlkPSJsZWZ0LWNvbnRyb2xzIiBjbGFzcz0iY29udHJvbHMiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0idGl0bGUiPl5fXjwvZGl2PgogICAgPGRpdiBpZD0icmlnaHQtY29udHJvbHMiIGNsYXNzPSJjb250cm9scyBjYXRlZ29yeS1maWx0ZXIiPjwvZGl2PgogIDwvZGl2PgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+PC9kaXY+CjwvdGVtcGxhdGU+Cgo8dGVtcGxhdGUgaWQ9InRyYWNrLXNlbGVjdG9yLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0idHJhY2stc2VsZWN0b3ItYW5jaG9yIj4KICAgIDxidXR0b24gY2xhc3M9ImJ1dHRvbiB0cmFjay1zZWxlY3Rvci1idXR0b24gdHJhY2stc2VsZWN0b3ItY2xvc2VkIj4KICAgICAgVHJhY2sgU2VsZWN0b3IKICAgIDwvYnV0dG9uPgogIDwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJpbXBvcnQtZXJyb3JzLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iYnV0dG9uIHZpZXctaW1wb3J0LWVycm9ycy1idXR0b24gdmlldy1pbmZvLWJ1dHRvbiI+CiAgICBJbXBvcnQgZXJyb3JzIQogIDwvZGl2PgogIDxkaXYgY2xhc3M9ImluZm8tYnV0dG9uLWNvbnRhaW5lciBpbXBvcnQtZXJyb3JzLWRpYWxvZyI+CiAgICBFcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGltcG9ydDoKICAgIDxkaXYgY2xhc3M9ImluZm8tYnV0dG9uLXRleHQgaW1wb3J0LWVycm9ycy1kaWFsb2ctdGV4dCI+PC9kaXY+CiAgPC9kaXY+CjwvdGVtcGxhdGU+Cgo8dGVtcGxhdGUgaWQ9ImNhdGVnb3J5LWZpbHRlci1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImJ1dHRvbiB2aWV3LWluZm8tYnV0dG9uIj5DYXRlZ29yaWVzPC9kaXY+CjwvdGVtcGxhdGU+Cgo8dGVtcGxhdGUgaWQ9ImhlbHAtYnRuLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJidXR0b24gdmlldy1oZWxwLWJ1dHRvbiI+PzwvZGl2PgogIDxkaXYgY2xhc3M9InZpZXctaGVscC10ZXh0IgogICAgICBzdHlsZT0id2hpdGUtc3BhY2U6IHByZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSI+PC9kaXY+CjwvdGVtcGxhdGU+Cgo8dGVtcGxhdGUgaWQ9Im1ldGFkYXRhLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iYnV0dG9uIHZpZXctbWV0YWRhdGEtYnV0dG9uIHZpZXctaW5mby1idXR0b24iPgogICAgTWV0YWRhdGEKICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi1jb250YWluZXIgbWV0YWRhdGEtZGlhbG9nIj4KICAgIE1ldGFkYXRhIEluZm86CiAgICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi10ZXh0IG1ldGFkYXRhLWRpYWxvZy10ZXh0Ij48L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KPCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9Im1vdXNlLW1vZGUtc2VsZWN0b3ItdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImRyYWctaGFuZGxlIj48L2Rpdj4KICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgIDxkaXYgY2xhc3M9InBhbi1zY2FuLW1vZGUtYnV0dG9uIHRvb2wtYnV0dG9uIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InNlbGVjdGlvbi1tb2RlLWJ1dHRvbiB0b29sLWJ1dHRvbiI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ6b29tLW1vZGUtYnV0dG9uIHRvb2wtYnV0dG9uIj48L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4K"),templateElem_=
 document.createElement("div");for(templateElem_.innerHTML=templateData_;templateElem_.hasChildNodes();)document.head.appendChild(templateElem_.removeChild(templateElem_.firstChild));"use strict";var global=this;
 this.base=function(){function d(a){"/"==a[a.length-1]&&(a=a.substring(0,a.length-1));l=a}function b(a,c){n[a]||(n[a]=[]);for(var e=n[a],f=!1,b=0;b<e.length;b++)e[b]==c&&(f=!0);f||e.push(c)}function a(a,c){q[a]||(q[a]=[]);for(var e=q[a],f=!1,b=0;b<q.length;b++)e[b]==c&&(f=!0);f||e.push(c)}function c(a,c){p[a]||(p[a]=[]);for(var e=p[a],f=!1,b=0;b<e.length;b++)e[b]==c&&(f=!0);f||e.push(c)}function e(){if(!window.FLATTENED&&!m){m=!0;var e=new XMLHttpRequest;e.open("GET","/deps.js",!1);e.send(null);if(200!=
 e.status){var e=JSON.parse(e.responseText),f="You have a module problem: "+e.message,g=document.createElement("div");g.style.position="fixed";g.style.border="3px solid red";g.style.color="black";g.style.padding="8px";g.innerHTML='<h2>Module parsing problem</h2><div id="message"></div><pre id="details"></pre>';g.querySelector("#message").textContent=e.message;var h=g.querySelector("#details");h.textContent=e.details;h.style.maxWidth="800px";h.style.overflow="auto";document.body?document.body.appendChild(g):
-setTimeout(function(){document.body.appendChild(g)},150);throw Error(f);}base.addModuleDependency=b;base.addModuleRawScriptDependency=a;base.addModuleStylesheet=c;try{eval(e.responseText)}catch(d){throw Error("When loading deps, got "+d.stack?d.stack:d.message);}delete base.addModuleStylesheet;delete base.addModuleRawScriptDependency;delete base.addModuleDependency}}function f(){if(!t&&!window.FLATTENED){t=!0;var a=new XMLHttpRequest;a.open("GET","/templates",!1);a.send(null);var c=document.createElement("div");
-for(c.innerHTML=a.responseText;c.hasChildNodes();)document.head.appendChild(c.removeChild(c.firstChild))}}function g(a,c){var b=c||0,d=a;a instanceof Array||(d=[a]);e();f();d.forEach(function(a){if(window.FLATTENED){if(!window.FLATTENED[a])throw Error("Somehow, module "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if("APPENDED"!=v[a]&&"RESOLVING"!=v[a]){v[a]="RESOLVING";g(n[a]||[],b+1);for(var c=p[a]||[],e=0;e<c.length;e++)k(c[e]);
-c=q[a]||[];for(e=0;e<c.length;e++){var f=c[e];w[f]||(h(f),w[f]="APPENDED")}h(a.replace(/\./g,"/")+".js");v[name]="APPENDED"}})}function h(a){var c=document.createElement("script");c.src=l+"/"+a;c.type="text/javascript";c.defer=!0;c.async=!1;base.doc.head.appendChild(c)}function k(a){if(!window.FLATTENED&&!s[a]){s[a]=!0;a=a.replace(/\./g,"/")+".css";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","stylesheet");c.setAttribute("href",a);base.doc.head.appendChild(c)}}var l=".",m=!1,
-n={},p={},q={},t=!1,v={},w={},s={},r={};return{set moduleBasePath(a){d(a)},get moduleBasePath(){return l},initialize:function(){if(global.document)base.doc=document,base.isMac=/Mac/.test(navigator.platform),base.isWindows=/Win/.test(navigator.platform),base.isChromeOS=/CrOS/.test(navigator.userAgent),base.isLinux=/Linux/.test(navigator.userAgent),base.isGTK=/GTK/.test(chrome.toolkit),base.isViews=/views/.test(chrome.toolkit),d("/src");else{var a=base;Object.defineProperty(global,"base",{get:function(){Object.defineProperty(global,
+setTimeout(function(){document.body.appendChild(g)},150);throw Error(f);}base.addModuleDependency=b;base.addModuleRawScriptDependency=a;base.addModuleStylesheet=c;try{eval(e.responseText)}catch(d){throw Error("When loading deps, got "+d.stack?d.stack:d.message);}delete base.addModuleStylesheet;delete base.addModuleRawScriptDependency;delete base.addModuleDependency}}function f(){if(!s&&!window.FLATTENED){s=!0;var a=new XMLHttpRequest;a.open("GET","/templates",!1);a.send(null);var c=document.createElement("div");
+for(c.innerHTML=a.responseText;c.hasChildNodes();)document.head.appendChild(c.removeChild(c.firstChild))}}function g(a,c){var b=c||0,d=a;a instanceof Array||(d=[a]);e();f();d.forEach(function(a){if(window.FLATTENED){if(!window.FLATTENED[a])throw Error("Somehow, module "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if("APPENDED"!=u[a]&&"RESOLVING"!=u[a]){u[a]="RESOLVING";g(n[a]||[],b+1);for(var c=p[a]||[],e=0;e<c.length;e++)k(c[e]);
+c=q[a]||[];for(e=0;e<c.length;e++){var f=c[e];w[f]||(h(f),w[f]="APPENDED")}h(a.replace(/\./g,"/")+".js");u[name]="APPENDED"}})}function h(a){var c=document.createElement("script");c.src=l+"/"+a;c.type="text/javascript";c.defer=!0;c.async=!1;base.doc.head.appendChild(c)}function k(a){if(!window.FLATTENED&&!t[a]){t[a]=!0;a=a.replace(/\./g,"/")+".css";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","stylesheet");c.setAttribute("href",a);base.doc.head.appendChild(c)}}var l=".",m=!1,
+n={},p={},q={},s=!1,u={},w={},t={},r={};return{set moduleBasePath(a){d(a)},get moduleBasePath(){return l},initialize:function(){if(global.document)base.doc=document,base.isMac=/Mac/.test(navigator.platform),base.isWindows=/Win/.test(navigator.platform),base.isChromeOS=/CrOS/.test(navigator.userAgent),base.isLinux=/Linux/.test(navigator.userAgent),base.isGTK=/GTK/.test(chrome.toolkit),base.isViews=/views/.test(chrome.toolkit),d("/src");else{var a=base;Object.defineProperty(global,"base",{get:function(){Object.defineProperty(global,
 "base",{value:a});a.initialize();return a},configurable:!0})}},require:g,requireStylesheet:k,requireRawScript:function(a){if(window.FLATTENED_RAW_SCRIPTS){if(!window.FLATTENED_RAW_SCRIPTS[a])throw Error("Somehow, "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if(!w[a])throw Error(a+" should already have been loaded. Did you forget to run build/generate_about_tracing_contents.py?");},requireTemplate:function(a){if(!window.FLATTENED&&
 !r[a]){r[a]=!0;a=a.replace(/\./g,"/")+".html";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","import");c.setAttribute("href",a)}},exportTo:function(a,c){var e;e=a.split(".");for(var f=global,b;e.length&&(b=e.shift());)f=b in f?f[b]:f[b]={};e=f;try{var g=c()}catch(h){console.log("While running exports for ",a,":");console.log(h.stack||h);return}for(var d in g)(f=Object.getOwnPropertyDescriptor(g,d))&&Object.defineProperty(e,d,f)}}}();base.initialize();"use strict";
 base.exportTo("tracing",function(){function d(a){for(var c=0,e=0;e<a.length;++e)c=(c+37*c+11*a.charCodeAt(e))%4294967295;return c}var b=[{r:138,g:113,b:152},{r:175,g:112,b:133},{r:127,g:135,b:225},{r:93,g:81,b:137},{r:116,g:143,b:119},{r:178,g:214,b:122},{r:87,g:109,b:147},{r:119,g:155,b:95},{r:114,g:180,b:160},{r:132,g:85,b:103},{r:157,g:210,b:150},{r:148,g:94,b:86},{r:164,g:108,b:138},{r:139,g:191,b:150},{r:110,g:99,b:145},{r:80,g:129,b:109},{r:125,g:140,b:149},{r:93,g:124,b:132},{r:140,g:85,b:140},
@@ -42,13 +42,18 @@
 tracing.getStringColorId(a.name+".value")));a.series.forEach(function(a){a.addSample(f,d)});return!0}};b.registerSubtype(d);return{ClockParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
 base.exportTo("tracing.importer.linux_perf",function(){function d(c){a.call(this,c);c.registerEventHandler("cpufreq_interactive_up",d.prototype.cpufreqUpDownEvent.bind(this));c.registerEventHandler("cpufreq_interactive_down",d.prototype.cpufreqUpDownEvent.bind(this));c.registerEventHandler("cpufreq_interactive_already",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_notyet",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_setspeed",
 d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_target",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_boost",d.prototype.cpufreqBoostUnboostEvent.bind(this));c.registerEventHandler("cpufreq_interactive_unboost",d.prototype.cpufreqBoostUnboostEvent.bind(this))}function b(a){var e={};a=a.split(/\s+/);for(var f=a.length,b=0;b<f;b++){var h=a[b].split("=");e[h[0]]=parseInt(h[1])}return e}var a=tracing.importer.linux_perf.Parser;
-d.prototype={__proto__:a.prototype,cpufreqSlice:function(a,e,b,g){b=this.importer.getOrCreatePseudoThread("cpufreq");b.openSlice=e;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,g,0);b.thread.sliceGroup.pushSlice(a)},cpufreqBoostSlice:function(a,e,b){var g=this.importer.getOrCreatePseudoThread("cpufreq_boost");g.openSlice=e;a=new tracing.trace_model.Slice("",g.openSlice,tracing.getStringColorId(g.openSlice),a,b,0);g.thread.sliceGroup.pushSlice(a)},cpufreqUpDownEvent:function(a,
-e,f,g,h){e=b(h.details);this.cpufreqSlice(g,a,e.cpu,e);return!0},cpufreqTargetEvent:function(a,e,f,g,h){e=b(h.details);this.cpufreqSlice(g,a,e.cpu,e);return!0},cpufreqBoostUnboostEvent:function(a,e,b,g,h){this.cpufreqBoostSlice(g,a,{type:h.details});return!0}};a.registerSubtype(d);return{CpufreqParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
-base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("ext4_sync_file_enter",d.prototype.ext4SyncFileEnterEvent.bind(this));a.registerEventHandler("ext4_sync_file_exit",d.prototype.ext4SyncFileExitEvent.bind(this));a.registerEventHandler("block_rq_issue",d.prototype.blockRqIssueEvent.bind(this));a.registerEventHandler("block_rq_complete",d.prototype.blockRqCompleteEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,
-openAsyncSlice:function(a,c,e,b,g,h){e=this.importer.getOrCreateKernelThread(c+":"+e,b);a=new tracing.trace_model.AsyncSlice(c,h,tracing.getStringColorId(h),a);a.startThread=e.thread;e.openAsyncSlices||(e.openAsyncSlices={});e.openAsyncSlices[g]=a},closeAsyncSlice:function(a,c,e,b,g,h){e=this.importer.getOrCreateKernelThread(c+":"+e,b);e.openAsyncSlices&&(b=e.openAsyncSlices[g])&&(b.duration=a-b.start,b.args=h,b.endThread=e.thread,b.subSlices=[new tracing.trace_model.Slice(c,b.title,b.colorId,b.start,
-b.args,b.duration)],e.thread.asyncSliceGroup.push(b),delete e.openAsyncSlices[g])},ext4SyncFileEnterEvent:function(a,c,e,b,g){a=/dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.exec(g.details);if(!a)return!1;c=a[1];e=parseInt(a[2]);this.openAsyncSlice(b,"ext4",g.threadName,g.pid,c+"-"+e,1==a[4]?"fdatasync":"fsync");return!0},ext4SyncFileExitEvent:function(a,c,e,b,g){e=/dev (\d+,\d+) ino (\d+) ret (\d+)/.exec(g.details);if(!e)return!1;a=e[1];c=parseInt(e[2]);e=parseInt(e[3]);this.closeAsyncSlice(b,
-"ext4",g.threadName,g.pid,a+"-"+c,{device:a,inode:c,error:e});return!0},blockRqIssueEvent:function(a,c,e,b,g){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \d+ \(.*\) (\d+) \+ (\d+) \[.*\]/.exec(g.details);if(!h)return!1;switch(h[3]){case "D":a="discard";break;case "W":a="write";break;case "R":a="read";break;case "N":a="none";break;default:a="unknown"}h[2]&&(a+=" flush");"F"==h[4]&&(a+=" fua");"A"==h[5]&&(a+=" ahead");"S"==h[6]&&(a+=" sync");"M"==h[7]&&(a+=" meta");c=h[1];e=parseInt(h[8]);h=parseInt(h[9]);
-this.openAsyncSlice(b,"block",g.threadName,g.pid,c+"-"+e+"-"+h,a);return!0},blockRqCompleteEvent:function(a,c,e,b,g){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \(.*\) (\d+) \+ (\d+) \[(.*)\]/.exec(g.details);if(!h)return!1;a=h[1];c=parseInt(h[8]);e=parseInt(h[9]);h=parseInt(h[10]);this.closeAsyncSlice(b,"block",g.threadName,g.pid,a+"-"+c+"-"+e,{device:a,sector:c,numSectors:e,error:h});return!0}};b.registerSubtype(d);return{DiskParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+d.prototype={__proto__:a.prototype,cpufreqSlice:function(a,e,f,b){f=this.importer.getOrCreatePseudoThread("cpufreq");f.openSlice=e;a=new tracing.trace_model.Slice("",f.openSlice,tracing.getStringColorId(f.openSlice),a,b,0);f.thread.sliceGroup.pushSlice(a)},cpufreqBoostSlice:function(a,e,f){var b=this.importer.getOrCreatePseudoThread("cpufreq_boost");b.openSlice=e;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,f,0);b.thread.sliceGroup.pushSlice(a)},cpufreqUpDownEvent:function(a,
+e,f,g,h){e=b(h.details);this.cpufreqSlice(g,a,e.cpu,e);return!0},cpufreqTargetEvent:function(a,e,f,g,h){e=b(h.details);this.cpufreqSlice(g,a,e.cpu,e);return!0},cpufreqBoostUnboostEvent:function(a,e,f,b,h){this.cpufreqBoostSlice(b,a,{type:h.details});return!0}};a.registerSubtype(d);return{CpufreqParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("f2fs_write_begin",d.prototype.f2fsWriteBeginEvent.bind(this));a.registerEventHandler("f2fs_write_end",d.prototype.f2fsWriteEndEvent.bind(this));a.registerEventHandler("f2fs_sync_file_enter",d.prototype.f2fsSyncFileEnterEvent.bind(this));a.registerEventHandler("f2fs_sync_file_exit",d.prototype.f2fsSyncFileExitEvent.bind(this));a.registerEventHandler("ext4_sync_file_enter",d.prototype.ext4SyncFileEnterEvent.bind(this));
+a.registerEventHandler("ext4_sync_file_exit",d.prototype.ext4SyncFileExitEvent.bind(this));a.registerEventHandler("ext4_da_write_begin",d.prototype.ext4WriteBeginEvent.bind(this));a.registerEventHandler("ext4_da_write_end",d.prototype.ext4WriteEndEvent.bind(this));a.registerEventHandler("block_rq_issue",d.prototype.blockRqIssueEvent.bind(this));a.registerEventHandler("block_rq_complete",d.prototype.blockRqCompleteEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,
+openAsyncSlice:function(a,c,e,f,b,h){e=this.importer.getOrCreateKernelThread(c+":"+e,f);a=new tracing.trace_model.AsyncSlice(c,h,tracing.getStringColorId(h),a);a.startThread=e.thread;e.openAsyncSlices||(e.openAsyncSlices={});e.openAsyncSlices[b]=a},closeAsyncSlice:function(a,c,e,f,b,h){e=this.importer.getOrCreateKernelThread(c+":"+e,f);e.openAsyncSlices&&(f=e.openAsyncSlices[b])&&(f.duration=a-f.start,f.args=h,f.endThread=e.thread,f.subSlices=[new tracing.trace_model.Slice(c,f.title,f.colorId,f.start,
+f.args,f.duration)],e.thread.asyncSliceGroup.push(f),delete e.openAsyncSlices[b])},f2fsWriteBeginEvent:function(a,c,e,b,g){var h=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), flags = (\d+)/.exec(g.details);if(!h)return!1;a=h[1];c=parseInt(h[2]);e=parseInt(h[3]);h=parseInt(h[4]);this.openAsyncSlice(b,"f2fs",g.threadName,g.pid,a+"-"+c+"-"+e+"-"+h,"f2fs_write");return!0},f2fsWriteEndEvent:function(a,c,e,b,g){var h=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), copied = (\d+)/.exec(g.details);
+if(!h)return!1;a=h[1];c=parseInt(h[2]);e=parseInt(h[3]);var d=parseInt(h[4]),h=parseInt(h[5])!==d;this.closeAsyncSlice(b,"f2fs",g.threadName,g.pid,a+"-"+c+"-"+e+"-"+d,{device:a,inode:c,error:h});return!0},ext4WriteBeginEvent:function(a,c,e,b,g){var h=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) flags (\d+)/.exec(g.details);if(!h)return!1;a=h[1];c=parseInt(h[2]);e=parseInt(h[3]);h=parseInt(h[4]);this.openAsyncSlice(b,"ext4",g.threadName,g.pid,a+"-"+c+"-"+e+"-"+h,"ext4_write");return!0},ext4WriteEndEvent:function(a,
+c,e,b,g){var h=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) copied (\d+)/.exec(g.details);if(!h)return!1;a=h[1];c=parseInt(h[2]);e=parseInt(h[3]);var d=parseInt(h[4]),h=parseInt(h[5])!==d;this.closeAsyncSlice(b,"ext4",g.threadName,g.pid,a+"-"+c+"-"+e+"-"+d,{device:a,inode:c,error:h});return!0},f2fsSyncFileEnterEvent:function(a,c,e,b,g){c=/dev = \((\d+,\d+)\), ino = (\d+), pino = (\d+), i_mode = (\S+), i_size = (\d+), i_nlink = (\d+), i_blocks = (\d+), i_advise = (\d+)/.exec(g.details);if(!c)return!1;
+a=c[1];c=parseInt(c[2]);this.openAsyncSlice(b,"f2fs",g.threadName,g.pid,a+"-"+c,"fsync");return!0},f2fsSyncFileExitEvent:function(a,c,e,b,g){e=/dev = \((\d+,\d+)\), ino = (\d+), checkpoint is (\S+), datasync = (\d+), ret = (\d+)/.exec(g.details.replace("not needed","not_needed"));if(!e)return!1;a=e[1];c=parseInt(e[2]);e=parseInt(e[5]);this.closeAsyncSlice(b,"f2fs",g.threadName,g.pid,a+"-"+c,{device:a,inode:c,error:e});return!0},ext4SyncFileEnterEvent:function(a,c,e,b,g){a=/dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.exec(g.details);
+if(!a)return!1;c=a[1];e=parseInt(a[2]);this.openAsyncSlice(b,"ext4",g.threadName,g.pid,c+"-"+e,1==a[4]?"fdatasync":"fsync");return!0},ext4SyncFileExitEvent:function(a,c,e,b,g){e=/dev (\d+,\d+) ino (\d+) ret (\d+)/.exec(g.details);if(!e)return!1;a=e[1];c=parseInt(e[2]);e=parseInt(e[3]);this.closeAsyncSlice(b,"ext4",g.threadName,g.pid,a+"-"+c,{device:a,inode:c,error:e});return!0},blockRqIssueEvent:function(a,c,e,b,g){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \d+ \(.*\) (\d+) \+ (\d+) \[.*\]/.exec(g.details);
+if(!h)return!1;switch(h[3]){case "D":a="discard";break;case "W":a="write";break;case "R":a="read";break;case "N":a="none";break;default:a="unknown"}h[2]&&(a+=" flush");"F"==h[4]&&(a+=" fua");"A"==h[5]&&(a+=" ahead");"S"==h[6]&&(a+=" sync");"M"==h[7]&&(a+=" meta");c=h[1];e=parseInt(h[8]);h=parseInt(h[9]);this.openAsyncSlice(b,"block",g.threadName,g.pid,c+"-"+e+"-"+h,a);return!0},blockRqCompleteEvent:function(a,c,e,b,g){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \(.*\) (\d+) \+ (\d+) \[(.*)\]/.exec(g.details);
+if(!h)return!1;a=h[1];c=parseInt(h[8]);e=parseInt(h[9]);h=parseInt(h[10]);this.closeAsyncSlice(b,"block",g.threadName,g.pid,a+"-"+c+"-"+e,{device:a,sector:c,numSectors:e,error:h});return!0}};b.registerSubtype(d);return{DiskParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
 base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("drm_vblank_event",d.prototype.vblankEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,drmVblankSlice:function(a,c,e){var b=this.importer.getOrCreatePseudoThread("drm_vblank");b.openSlice=c;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,e,0);b.thread.sliceGroup.pushSlice(a)},vblankEvent:function(a,c,e,b,g){c=
 /crtc=(\d+), seq=(\d+)/.exec(g.details);if(!c)return!1;a=parseInt(c[1]);c=parseInt(c[2]);this.drmVblankSlice(b,"vblank:"+a,{crtc:a,seq:c});return!0}};b.registerSubtype(d);return{DrmParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
 base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("exynos_flip_request",d.prototype.flipEvent.bind(this));a.registerEventHandler("exynos_flip_complete",d.prototype.flipEvent.bind(this));a.registerEventHandler("exynos_busfreq_target_int",d.prototype.busfreqTargetIntEvent.bind(this));a.registerEventHandler("exynos_busfreq_target_mif",d.prototype.busfreqTargetMifEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,
@@ -103,13 +108,13 @@
 h)});return!0},jmSample:function(a,c,e,b){return this.hwcSample("mali:jm","JM: "+a,c,e,b)},addJMCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.jmSample(c,"count",h,d)}.bind(this))},addJMCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.jmSample(c,"cycles",h,d)}.bind(this))},tilerSample:function(a,c,e,b){return this.hwcSample("mali:tiler","Tiler: "+a,c,e,b)},addTilerCounter:function(a,c){this.importer.registerEventHandler(a,
 function(a,b,g,h,d){return this.tilerSample(c,"count",h,d)}.bind(this))},addTilerCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.tilerSample(c,"cycles",h,d)}.bind(this))},fragSample:function(a,c,e,b){return this.hwcSample("mali:fragment","Fragment: "+a,c,e,b)},addFragCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.fragSample(c,"count",h,d)}.bind(this))},addFragCycles:function(a,c){this.importer.registerEventHandler(a,
 function(a,b,g,h,d){return this.fragSample(c,"cycles",h,d)}.bind(this))},computeSample:function(a,c,e,b){return this.hwcSample("mali:compute","Compute: "+a,c,e,b)},addComputeCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.computeSample(c,"count",h,d)}.bind(this))},addComputeCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.computeSample(c,"cycles",h,d)}.bind(this))},addTripipeCycles:function(a,c){this.importer.registerEventHandler(a,
-function(a,b,g,d,k){return this.hwcSample("mali:shader","Tripipe: "+c,"cycles",d,k)}.bind(this))},arithSample:function(a,c,e,b){return this.hwcSample("mali:arith","Arith: "+a,c,e,b)},addArithCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.arithSample(c,"count",d,k)}.bind(this))},addArithCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.arithSample(c,"cycles",d,k)}.bind(this))},addLSCounter:function(a,c){this.importer.registerEventHandler(a,
-function(a,b,g,d,k){return this.hwcSample("mali:ls","LS: "+c,"count",d,k)}.bind(this))},textureSample:function(a,c,b,f){return this.hwcSample("mali:texture","Texture: "+a,c,b,f)},addTexCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.textureSample(c,"count",d,k)}.bind(this))},addLSCCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.hwcSample("mali:lsc","LSC: "+c,"count",d,k)}.bind(this))},addAXICounter:function(a,c){this.importer.registerEventHandler(a,
-function(a,b,g,d,k){return this.hwcSample("mali:axi","AXI: "+c,"count",d,k)}.bind(this))},mmuSample:function(a,c,b,f){return this.hwcSample("mali:mmu","MMU: "+a,c,b,f)},addMMUCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.mmuSample(c,"count",d,k)}.bind(this))},addMMUCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.mmuSample(c,"cycles",d,k)}.bind(this))},l2Sample:function(a,c,b,f){return this.hwcSample("mali:l2","L2: "+
-a,c,b,f)},addL2Counter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.l2Sample(c,"count",d,k)}.bind(this))},addL2Cycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.l2Sample(c,"cycles",d,k)}.bind(this))}};b.registerSubtype(d);return{MaliParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+function(a,b,g,h,d){return this.hwcSample("mali:shader","Tripipe: "+c,"cycles",h,d)}.bind(this))},arithSample:function(a,c,e,b){return this.hwcSample("mali:arith","Arith: "+a,c,e,b)},addArithCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.arithSample(c,"count",h,d)}.bind(this))},addArithCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.arithSample(c,"cycles",h,d)}.bind(this))},addLSCounter:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,h,d){return this.hwcSample("mali:ls","LS: "+c,"count",h,d)}.bind(this))},textureSample:function(a,c,e,b){return this.hwcSample("mali:texture","Texture: "+a,c,e,b)},addTexCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.textureSample(c,"count",h,d)}.bind(this))},addLSCCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.hwcSample("mali:lsc","LSC: "+c,"count",h,d)}.bind(this))},addAXICounter:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,h,d){return this.hwcSample("mali:axi","AXI: "+c,"count",h,d)}.bind(this))},mmuSample:function(a,c,e,b){return this.hwcSample("mali:mmu","MMU: "+a,c,e,b)},addMMUCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.mmuSample(c,"count",h,d)}.bind(this))},addMMUCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.mmuSample(c,"cycles",h,d)}.bind(this))},l2Sample:function(a,c,e,b){return this.hwcSample("mali:l2","L2: "+
+a,c,e,b)},addL2Counter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.l2Sample(c,"count",h,d)}.bind(this))},addL2Cycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.l2Sample(c,"cycles",h,d)}.bind(this))}};b.registerSubtype(d);return{MaliParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
 base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("mm_vmscan_kswapd_wake",d.prototype.kswapdWake.bind(this));a.registerEventHandler("mm_vmscan_kswapd_sleep",d.prototype.kswapdSleep.bind(this));a.registerEventHandler("mm_vmscan_direct_reclaim_begin",d.prototype.reclaimBegin.bind(this));a.registerEventHandler("mm_vmscan_direct_reclaim_end",d.prototype.reclaimEnd.bind(this))}var b=tracing.importer.linux_perf.Parser,a=/nid=(\d+) order=(\d+)/,c=
 /order=(\d+) may_writepage=\d+ gfp_flags=(.+)/,e=/nr_reclaimed=(\d+)/;d.prototype={__proto__:b.prototype,openAsyncSlice:function(a,c,b,e,d,m){b=this.importer.getOrCreateKernelThread(c+":"+b,e);a=new tracing.trace_model.AsyncSlice(c,m,tracing.getStringColorId(m),a);a.startThread=b.thread;b.openAsyncSlices||(b.openAsyncSlices={});b.openAsyncSlices[d]=a},closeAsyncSlice:function(a,c,b,e,d,m){b=this.importer.getOrCreateKernelThread(c+":"+b,e);b.openAsyncSlices&&(e=b.openAsyncSlices[d])&&(e.duration=a-
-e.start,e.args=m,e.endThread=b.thread,e.subSlices=[new tracing.trace_model.Slice(c,e.title,e.colorId,e.start,e.args,e.duration)],b.thread.asyncSliceGroup.push(e),delete b.openAsyncSlices[d])},kswapdWake:function(c,b,e,d,l){c=a.exec(l.details);if(!c)return!1;parseInt(c[1]);c=parseInt(c[2]);e=this.importer.getOrCreateKernelThread("kswapd: "+l.threadName,e,e);e.openSliceTS?c>e.order&&(e.order=c):(e.openSliceTS=d,e.order=c);return!0},kswapdSleep:function(a,c,b,e,d){a=this.importer.getOrCreateKernelThread("kswapd: "+
+e.start,e.args=m,e.endThread=b.thread,e.subSlices=[new tracing.trace_model.Slice(c,e.title,e.colorId,e.start,e.args,e.duration)],b.thread.asyncSliceGroup.push(e),delete b.openAsyncSlices[d])},kswapdWake:function(c,e,b,d,l){c=a.exec(l.details);if(!c)return!1;parseInt(c[1]);c=parseInt(c[2]);b=this.importer.getOrCreateKernelThread("kswapd: "+l.threadName,b,b);b.openSliceTS?c>b.order&&(b.order=c):(b.openSliceTS=d,b.order=c);return!0},kswapdSleep:function(a,c,b,e,d){a=this.importer.getOrCreateKernelThread("kswapd: "+
 d.threadName,b,b);a.openSliceTS&&(e=new tracing.trace_model.Slice("",d.threadName,tracing.getStringColorId(d.threadName),a.openSliceTS,{order:a.order},e-a.openSliceTS),a.thread.sliceGroup.pushSlice(e));a.openSliceTS=void 0;a.order=void 0;return!0},reclaimBegin:function(a,b,e,d,l){b=c.exec(l.details);if(!b)return!1;a=parseInt(b[1]);b=b[2];e=this.importer.getOrCreateKernelThread("direct reclaim: "+l.threadName,e,e);e.openSliceTS=d;e.order=a;e.gfp=b;return!0},reclaimEnd:function(a,c,b,d,l){a=e.exec(l.details);
 if(!a)return!1;a=parseInt(a[1]);b=this.importer.getOrCreateKernelThread("direct reclaim: "+l.threadName,b,b);void 0!==b.openSliceTS&&(d=new tracing.trace_model.Slice("","direct reclaim",tracing.getStringColorId(l.threadName),b.openSliceTS,{order:b.order,gfp:b.gfp,nr_reclaimed:a},d-b.openSliceTS),b.thread.sliceGroup.pushSlice(d));b.openSliceTS=void 0;b.order=void 0;b.gfp=void 0;return!0}};b.registerSubtype(d);return{MemReclaimParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
 base.require("tracing.trace_model.counter_series");
@@ -118,7 +123,7 @@
 tracing.getStringColorId(c.name)));var f=4294967295!=b?b+1:0;c.series.forEach(function(c){c.addSample(a,f)})},cpuFrequencySlice:function(a,c,b){c=this.importer.getOrCreateCpuState(c).cpu.getOrCreateCounter("","Clock Frequency");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("state",tracing.getStringColorId(c.name+".state")));c.series.forEach(function(c){c.addSample(a,b)})},powerStartEvent:function(a,c,b,f,g){a=/type=(\d+) state=(\d) cpu_id=(\d)+/.exec(g.details);if(!a)return!1;
 c=parseInt(a[3]);b=parseInt(a[2]);this.cpuStateSlice(f,c,a[1],b);return!0},powerFrequencyEvent:function(a,c,b,f,g){c=/type=(\d+) state=(\d+) cpu_id=(\d)+/.exec(g.details);if(!c)return!1;a=parseInt(c[3]);c=parseInt(c[2]);this.cpuFrequencySlice(f,a,c);return!0},cpuFrequencyEvent:function(a,c,b,f,g){c=/state=(\d+) cpu_id=(\d)+/.exec(g.details);if(!c)return!1;a=parseInt(c[2]);c=parseInt(c[1]);this.cpuFrequencySlice(f,a,c);return!0},cpuIdleEvent:function(a,c,b,f,g){c=/state=(\d+) cpu_id=(\d)+/.exec(g.details);
 if(!c)return!1;a=parseInt(c[2]);c=parseInt(c[1]);this.cpuIdleSlice(f,a,c);return!0}};b.registerSubtype(d);return{PowerParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
-base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("sched_switch",d.prototype.schedSwitchEvent.bind(this));a.registerEventHandler("sched_wakeup",d.prototype.schedWakeupEvent.bind(this))}var b=tracing.importer.linux_perf.Parser,a={},c=RegExp("prev_comm=(.+) prev_pid=(\\d+) prev_prio=(\\d+) prev_state=(\\S\\+?|\\S\\|\\S) ==> next_comm=(.+) next_pid=(\\d+) next_prio=(\\d+)");a.schedSwitchRE=c;var e=/comm=(.+) pid=(\d+) prio=(\d+) success=(\d+) target_cpu=(\d+)/;
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("sched_switch",d.prototype.schedSwitchEvent.bind(this));a.registerEventHandler("sched_wakeup",d.prototype.schedWakeupEvent.bind(this))}var b=tracing.importer.linux_perf.Parser,a={},c=/prev_comm=(.+) prev_pid=(\d+) prev_prio=(\d+) prev_state=(\S\+?|\S\|\S) ==> next_comm=(.+) next_pid=(\d+) next_prio=(\d+)/;a.schedSwitchRE=c;var e=/comm=(.+) pid=(\d+) prio=(\d+) success=(\d+) target_cpu=(\d+)/;
 a.schedWakeupRE=e;d.prototype={__proto__:b.prototype,schedSwitchEvent:function(a,b,e,d,l){var m=c.exec(l.details);if(!m)return!1;a=m[4];e=m[5];l=parseInt(m[6]);m=parseInt(m[7]);this.importer.getOrCreateCpuState(b).switchRunningLinuxPid(this.importer,a,d,l,e,m);return!0},schedWakeupEvent:function(a,c,b,d,l){l=e.exec(l.details);if(!l)return!1;a=b;c=l[1];b=parseInt(l[2]);l=parseInt(l[3]);this.importer.markPidRunnable(d,b,c,l,a);return!0}};b.registerSubtype(d);return{SchedParser:d,_SchedParserTestExports:a}});
 "use strict";base.require("tracing.importer.linux_perf.parser");
 base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("sync_timeline",d.prototype.timelineEvent.bind(this));a.registerEventHandler("sync_wait",d.prototype.syncWaitEvent.bind(this));a.registerEventHandler("sync_pt",d.prototype.syncPtEvent.bind(this));this.model_=a.model_}var b=tracing.importer.linux_perf.Parser,a=/name=(\S+) value=(\S*)/,c=/(\S+) name=(\S+) state=(\d+)/,e=/name=(\S+) value=(\S*)/;d.prototype={__proto__:b.prototype,timelineEvent:function(c,
@@ -159,7 +164,7 @@
 d.nameToConstructorMap_[b]:d};return{ObjectInstance:d}});"use strict";base.require("base.range");base.require("base.sorted_array_utils");
 base.exportTo("tracing.trace_model",function(){function d(b,a,c){this.createObjectInstanceFunction_=b;this.parent=a;this.id=c;this.instances=[]}d.prototype={idWasCreated:function(b,a,c){if(0==this.instances.length)return this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c)),this.instances[0].creationTsWasExplicit=!0,this.instances[0];var e=this.instances[this.instances.length-1];if(c<e.deletionTs)throw Error("Mutation of the TimeToObjectInstanceMap must be done in ascending timestamp order.");
 e=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c);e.creationTsWasExplicit=!0;this.instances.push(e);return e},addSnapshot:function(b,a,c,e){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c));var f=base.findLowIndexInSortedIntervals(this.instances,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},c);if(0>f){f=this.instances[0];if(c>f.deletionTs||f.creationTsWasExplicit)throw Error("At the provided timestamp, no instance was still alive");
-if(0!=f.snapshots.length)throw Error("Cannot shift creationTs forward, snapshots have been added. First snap was at ts="+f.snapshots[0].ts+" and creationTs was "+f.creationTs);f.creationTs=c}else if(f>=this.instances.length)if(f=this.instances[this.instances.length-1],c>=f.deletionTs)f=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c),this.instances.push(f);else{for(var g,f=this.instances.length-1;0<=f;f--){b=this.instances[f];if(c>=b.deletionTs)break;!1==b.creationTsWasExplicit&&0==b.snapshots.length&&
+if(0!=f.snapshots.length)throw Error("Cannot shift creationTs forward, snapshots have been added. First snap was at ts="+f.snapshots[0].ts+" and creationTs was "+f.creationTs);f.creationTs=c}else if(f>=this.instances.length)if(f=this.instances[this.instances.length-1],c>=f.deletionTs)f=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c),this.instances.push(f);else{for(var g,f=this.instances.length-1;0<=f;f--){b=this.instances[f];if(c>=b.deletionTs)break;0==b.creationTsWasExplicit&&0==b.snapshots.length&&
 (g=f)}if(void 0===g)throw Error("Cannot add snapshot. No instance was alive that was mutable.");f=this.instances[g];f.creationTs=c}else f=this.instances[f];return f.addSnapshot(c,e)},get lastInstance(){return 0==this.instances.length?void 0:this.instances[this.instances.length-1]},idWasDeleted:function(b,a,c){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c));var e=this.instances[this.instances.length-1];if(c<e.creationTs)throw Error("Cannot delete a id before it was crated");
 if(e.deletionTs==Number.MAX_VALUE)return e.wasDeleted(c),e;if(c<e.deletionTs)throw Error("id was already deleted earlier.");e=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c);this.instances.push(e);return e},getInstanceAt:function(b){b=base.findLowIndexInSortedIntervals(this.instances,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},b);return 0>b?this.instances[0].creationTsWasExplicit?void 0:this.instances[0]:b>=this.instances.length?void 0:this.instances[b]}};
 return{TimeToObjectInstanceMap:d}});"use strict";base.require("base.utils");base.require("base.range");base.require("base.sorted_array_utils");base.require("tracing.trace_model.object_instance");base.require("tracing.trace_model.time_to_object_instance_map");
@@ -178,7 +183,7 @@
 1]:void 0},endSlice:function(a){if(!this.openSliceCount)throw Error("endSlice called without an open slice");var c=this.openPartialSlices_[this.openSliceCount-1];this.openPartialSlices_.splice(this.openSliceCount-1,1);if(a<c.start)throw Error("Slice "+c.title+" end time is before its start.");c.duration=a-c.start;this.pushSlice(c);return c},autoCloseOpenSlices:function(a){a||(this.updateBounds(),a=this.bounds.max);for(;0<this.openSliceCount;)this.endSlice(a).didNotFinish=!0},shiftTimestampsForward:function(a){for(var c=
 0;c<this.slices.length;c++){var b=this.slices[c];b.start+=a}for(c=0;c<this.openPartialSlices_.length;c++)b=this.openPartialSlices_[i],b.start+=a},updateBounds:function(){this.bounds.reset();for(var a=0;a<this.slices.length;a++)this.bounds.addValue(this.slices[a].start),this.bounds.addValue(this.slices[a].end);this.openPartialSlices_.length&&(this.bounds.addValue(this.openPartialSlices_[0].start),this.bounds.addValue(this.openPartialSlices_[this.openPartialSlices_.length-1].start))},copySlice:function(a){var c=
 new this.sliceConstructor(a.category,a.title,a.colorId,a.start,a.args,a.duration);c.didNotFinish=a.didNotFinish;return c}};d.merge=function(a,c){if(0<a.openPartialSlices_.length)throw Error("groupA has open partial slices");if(0<c.openPartialSlices_.length)throw Error("groupB has open partial slices");for(var b=new d,f=a.slices,g=c.slices,h=f.length-1,k=g.length-1,l=[],m=[],n=function(a){for(var c=0;c<m.length;c++){var f=m[c],g=f.end;if(a<f.start||g<a)throw Error("slice should not be split");var d=
-b.copySlice(f);f.start=a;f.duration=g-a;f.title+=" (cont.)";d.duration=a-d.start;m[c]=d;b.pushSlice(d)}},p=function(a){for(;0<l.length||0<m.length;){var c=l[l.length-1],b=m[m.length-1],c=c&&c.start,b=b&&b.start;if((void 0===c||c<a)&&(void 0===b||b<a))break;void 0===b||c>b?(n(c),l.pop()):m.pop()}};0<=h||0<=k;){var q=f[h],t=g[k];void 0===q||void 0!==t&&q.end<t.end?(q=b.copySlice(t),t=!0,k--):(q=b.copySlice(q),t=!1,h--);p(q.end);b.pushSlice(q);t?m.push(q):(n(q.end),l.push(q))}p();b.slices.reverse();
+b.copySlice(f);f.start=a;f.duration=g-a;f.title+=" (cont.)";d.duration=a-d.start;m[c]=d;b.pushSlice(d)}},p=function(a){for(;0<l.length||0<m.length;){var c=l[l.length-1],b=m[m.length-1],c=c&&c.start,b=b&&b.start;if((void 0===c||c<a)&&(void 0===b||b<a))break;void 0===b||c>b?(n(c),l.pop()):m.pop()}};0<=h||0<=k;){var q=f[h],s=g[k];void 0===q||void 0!==s&&q.end<s.end?(q=b.copySlice(s),s=!0,k--):(q=b.copySlice(q),s=!1,h--);p(q.end);b.pushSlice(q);s?m.push(q):(n(q.end),l.push(q))}p();b.slices.reverse();
 return b};return{SliceGroup:d}});"use strict";base.require("base.guid");base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.trace_model.slice_group");base.require("tracing.trace_model.async_slice_group");base.require("tracing.trace_model.sample");
 base.exportTo("tracing.trace_model",function(){function d(c,b,e,d,l,m){a.call(this,c,b,e,d,l,m);this.subSlices=[]}function b(a,b){this.guid_=base.GUID.allocate();if(!a)throw Error("Parent must be provided.");this.parent=a;this.sortIndex=0;this.tid=b;this.sliceGroup=new c(d);this.cpuSlices=void 0;this.samples_=[];this.kernelSliceGroup=new c;this.asyncSliceGroup=new e;this.bounds=new base.Range;this.ephemeralSettings={}}var a=tracing.trace_model.Slice,c=tracing.trace_model.SliceGroup,e=tracing.trace_model.AsyncSliceGroup;
 d.prototype={__proto__:a.prototype};b.prototype={get guid(){return this.guid_},compareTo:function(a){return b.compare(this,a)},toJSON:function(){for(var a={},c=Object.keys(this),b=0;b<c.length;b++){var e=c[b];"function"!=typeof this[e]&&(a[e]="parent"==e?this[e].guid:this[e])}return a},addSample:function(a,c,b,e){if(this.samples_.length&&b<this.samples_[this.samples_.length-1].start)throw Error("Samples must be added in increasing timestamp order.");var d=tracing.getStringColorId(c);a=new tracing.trace_model.Sample(a,
@@ -214,10 +219,10 @@
 base.require("tracing.importer.linux_perf.i915_parser");base.require("tracing.importer.linux_perf.mali_parser");base.require("tracing.importer.linux_perf.power_parser");base.require("tracing.importer.linux_perf.sched_parser");base.require("tracing.importer.linux_perf.sync_parser");base.require("tracing.importer.linux_perf.workqueue_parser");base.require("tracing.importer.linux_perf.android_parser");base.require("tracing.importer.linux_perf.kfunc_parser");base.require("tracing.importer.linux_perf.irq_parser");
 base.require("tracing.importer.linux_perf.memreclaim_parser");
 base.exportTo("tracing.importer",function(){function d(a){this.cpu=a}function b(a,c){this.importPriority=2;this.model_=a;this.events_=c;this.clockSyncRecords_=[];this.cpuStates_={};this.wakeups_=[];this.kernelThreadStates_={};this.buildMapFromLinuxPidsToThreads();this.lineNumberBase=0;this.lineNumber=-1;this.pseudoThreadCounter=1;this.parsers_=[];this.eventHandlers_={}}function a(a){return"{"==a[0]?!1:e.test(a)?f:g.test(a)?h:k.test(a)?l:null}d.prototype={__proto__:Object.prototype,switchRunningLinuxPid:function(a,
-c,b,e,f,d){if(void 0!==this.lastActivePid&&0!=this.lastActivePid){var g=b-this.lastActiveTs;a=(a=a.threadsByLinuxPid[this.lastActivePid])?a.userFriendlyName:this.lastActiveComm;c=new tracing.trace_model.Slice("",a,tracing.getStringColorId(a),this.lastActiveTs,{comm:this.lastActiveComm,tid:this.lastActivePid,prio:this.lastActivePrio,stateWhenDescheduled:c},g);this.cpu.slices.push(c)}this.lastActiveTs=b;this.lastActivePid=e;this.lastActiveComm=f;this.lastActivePrio=d}};var c={},e=RegExp("^\\s*(.+)-(\\d+)\\s+\\(\\s*(\\d+|-+)\\)\\s\\[(\\d+)\\]\\s+[dX.][N.][Hhs.][0-9a-f.]\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$"),
+c,b,e,f,d){if(void 0!==this.lastActivePid&&0!=this.lastActivePid){var g=b-this.lastActiveTs;a=(a=a.threadsByLinuxPid[this.lastActivePid])?a.userFriendlyName:this.lastActiveComm;c=new tracing.trace_model.Slice("",a,tracing.getStringColorId(a),this.lastActiveTs,{comm:this.lastActiveComm,tid:this.lastActivePid,prio:this.lastActivePrio,stateWhenDescheduled:c},g);this.cpu.slices.push(c)}this.lastActiveTs=b;this.lastActivePid=e;this.lastActiveComm=f;this.lastActivePrio=d}};var c={},e=/^\s*(.+)-(\d+)\s+\(\s*(\d+|-+)\)\s\[(\d+)\]\s+[dX.][N.][Hhs.][0-9a-f.]\s+(\d+\.\d+):\s+(\S+):\s(.*)$/,
 f=function(a){a=e.exec(a);if(!a)return a;var c=a[3];"-"===c[0]&&(c=void 0);return{threadName:a[1],pid:a[2],tgid:c,cpuNumber:a[4],timestamp:a[5],eventName:a[6],details:a[7]}};c.lineParserWithTGID=f;var g=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s+[dX.][N.][Hhs.][0-9a-f.]\s+(\d+\.\d+):\s+(\S+):\s(.*)$/,h=function(a){return(a=g.exec(a))?{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}:a};c.lineParserWithIRQInfo=h;var k=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s*(\d+\.\d+):\s+(\S+):\s(.*)$/,
 l=function(a){return(a=k.exec(a))?{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}:a};c.lineParserWithLegacyFmt=l;c.traceEventClockSyncRE=/trace_event_clock_sync: parent_ts=(\d+\.?\d*)/;c.autoDetectLineParser=a;b.canImport=function(c){if(!("string"===typeof c||c instanceof String))return!1;if(b._extractEventsFromSystraceHTML(c,!1).ok||/^# tracer:/.test(c))return!0;var e=/^(.+)\n/.exec(c);e&&(c=e[1]);return a(c)?!0:!1};b._extractEventsFromSystraceHTML=function(a,
-c){function b(a){for(;g<d.length;g++)if(a.test(d[g]))return!0;return!1}function e(a,c){return-1===a.indexOf(c,a.length-c.length)?a:a.substring(a,a.length-c.length)}var f={ok:!1};void 0===c&&(c=!0);if(!1==/^<!DOCTYPE HTML>/.test(a))return f;var d=a.split("\n"),g=1;if(!b(/^  <script>$/)||!b(/^  var linuxPerfData = "\\$/))return f;var h=g+1;if(!b(/^  <\/script>$/))return f;var l=g;if(!b(/^<\/body>$/)||!b(/^<\/html>$/))return f;var k=d.slice(h,l),l=[];if(c)for(var x=0;x<k.length;x++){var y=k[x],y=e(y,
+c){function b(a){for(;g<d.length;g++)if(a.test(d[g]))return!0;return!1}function e(a,c){return-1===a.indexOf(c,a.length-c.length)?a:a.substring(a,a.length-c.length)}var f={ok:!1};void 0===c&&(c=!0);if(0==/^<!DOCTYPE HTML>/.test(a))return f;var d=a.split("\n"),g=1;if(!b(/^  <script>$/)||!b(/^  var linuxPerfData = "\\$/))return f;var h=g+1;if(!b(/^  <\/script>$/))return f;var l=g;if(!b(/^<\/body>$/)||!b(/^<\/html>$/))return f;var k=d.slice(h,l),l=[];if(c)for(var x=0;x<k.length;x++){var y=k[x],y=e(y,
 "\\n\\");l.push(y)}else l=[k[k.length-1]];k=l[l.length-1];x=e(k,'\\n";');if(x==k)return f;l[l.length-1]=x;return{ok:!0,lines:c?l:void 0,events_begin_at_line:h}};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){},get model(){return this.model_},buildMapFromLinuxPidsToThreads:function(){this.threadsByLinuxPid={};this.model_.getAllThreads().forEach(function(a){this.threadsByLinuxPid[a.tid]=a}.bind(this))},getOrCreateCpuState:function(a){if(!this.cpuStates_[a]){var c=this.model_.kernel.getOrCreateCpu(a);
 this.cpuStates_[a]=new d(c)}return this.cpuStates_[a]},getOrCreateKernelThread:function(a,c,b){this.kernelThreadStates_[a]||(b=this.model_.getOrCreateProcess(c).getOrCreateThread(b),b.name=a,this.kernelThreadStates_[a]={pid:c,thread:b,openSlice:void 0,openSliceTS:void 0},this.threadsByLinuxPid[c]=b);return this.kernelThreadStates_[a]},getOrCreatePseudoThread:function(a){var c=this.kernelThreadStates_[a];c||(c=this.getOrCreateKernelThread(a,0,this.pseudoThreadCounter),this.pseudoThreadCounter++);return c},
 importEvents:function(a){this.createParsers();this.importCpuData();this.alignClocks(a)&&(this.buildMapFromLinuxPidsToThreads(),this.buildPerThreadCpuSlicesFromCpuState())},finalizeImport:function(){},joinRefs:function(){},buildPerThreadCpuSlicesFromCpuState:function(){for(var a in this.cpuStates_)for(var c=this.cpuStates_[a].cpu,b=0;b<c.slices.length;b++){var e=c.slices[b],f=this.threadsByLinuxPid[e.args.tid];f&&(f.tempCpuSlices||(f.tempCpuSlices=[]),f.tempCpuSlices.push(e))}for(b in this.wakeups_)if(a=
@@ -239,8 +244,8 @@
 vec2.createXY(0,0);vec2.createXY(1,0);vec2.createXY(0,1);vec2.createXY(1,1);var h=vec2.create(),k=vec2.create();b.FromXYWH=function(a,c,e,f){var d=new b;vec2.set(d.p1,a,c);vec2.set(d.p2,a+e,c);vec2.set(d.p3,a+e,c+f);vec2.set(d.p4,a,c+f);return d};b.FromRect=function(a){return new b.FromXYWH(a.x,a.y,a.width,a.height)};b.From4Vecs=function(a,c,e,f){var d=new b;vec2.set(d.p1,a[0],a[1]);vec2.set(d.p2,c[0],c[1]);vec2.set(d.p3,e[0],e[1]);vec2.set(d.p4,f[0],f[1]);return d};b.From8Array=function(a){if(8!=
 a.length)throw Error("Array must be 8 long");var c=new b;c.p1[0]=a[0];c.p1[1]=a[1];c.p2[0]=a[2];c.p2[1]=a[3];c.p3[0]=a[4];c.p3[1]=a[5];c.p4[0]=a[6];c.p4[1]=a[7];return c};b.prototype={vecInside:function(a){return c(a,this.p1,this.p2,this.p3)||c(a,this.p1,this.p3,this.p4)},boundingRect:function(){var a=Math.min(this.p1[0],this.p2[0],this.p3[0],this.p4[0]),c=Math.min(this.p1[1],this.p2[1],this.p3[1],this.p4[1]),b=Math.max(this.p1[0],this.p2[0],this.p3[0],this.p4[0]),e=Math.max(this.p1[1],this.p2[1],
 this.p3[1],this.p4[1]);return new base.Rect.FromXYWH(a,c,b-a,e-c)},clone:function(){var a=new b;vec2.copy(a.p1,this.p1);vec2.copy(a.p2,this.p2);vec2.copy(a.p3,this.p3);vec2.copy(a.p4,this.p4);return a},scale:function(a){var c=new b;this.scaleFast(c,a);return c},scaleFast:function(a,c){vec2.copy(a.p1,this.p1,c);vec2.copy(a.p2,this.p2,c);vec2.copy(a.p3,this.p3,c);vec2.copy(a.p3,this.p3,c)},isRectangle:function(){var a=this.boundingRect();return a.x==this.p1[0]&&a.y==this.p1[1]&&a.width==this.p2[0]-
-this.p1[0]&&a.y==this.p2[1]&&a.width==this.p3[0]-this.p1[0]&&a.height==this.p3[1]-this.p2[1]&&a.x==this.p4[0]&&a.height==this.p4[1]-this.p2[1]},projectUnitRect:function(a){var c=new b;this.projectUnitRectFast(c,a);return c},projectUnitRectFast:function(a,c){var b=e[0],f=e[1],h=e[2],k=e[3],v,w,s,r;vec2.sub(b,this.p2,this.p1);v=vec2.length(b);vec2.scale(b,b,1/v);vec2.sub(f,this.p4,this.p1);w=vec2.length(f);vec2.scale(f,f,1/w);vec2.sub(h,this.p3,this.p2);s=vec2.length(h);vec2.scale(h,h,1/s);vec2.sub(k,
-this.p3,this.p4);r=vec2.length(k);vec2.scale(k,k,1/r);var u=e[0],x=e[1],y=e[2],z=e[3];d(u,b,k,c.y);d(z,b,k,1-c.bottom);d(x,f,h,c.x);d(y,f,h,1-c.right);vec2.addTwoScaledUnitVectors(g,u,v*c.x,x,w*c.y);vec2.add(a.p1,this.p1,g);vec2.addTwoScaledUnitVectors(g,u,v*-(1-c.right),y,s*c.y);vec2.add(a.p2,this.p2,g);vec2.addTwoScaledUnitVectors(g,z,r*-(1-c.right),y,s*-(1-c.bottom));vec2.add(a.p3,this.p3,g);vec2.addTwoScaledUnitVectors(g,z,r*c.left,x,w*-(1-c.bottom));vec2.add(a.p4,this.p4,g)},toString:function(){return"Quad("+
+this.p1[0]&&a.y==this.p2[1]&&a.width==this.p3[0]-this.p1[0]&&a.height==this.p3[1]-this.p2[1]&&a.x==this.p4[0]&&a.height==this.p4[1]-this.p2[1]},projectUnitRect:function(a){var c=new b;this.projectUnitRectFast(c,a);return c},projectUnitRectFast:function(a,c){var b=e[0],f=e[1],h=e[2],k=e[3],u,w,t,r;vec2.sub(b,this.p2,this.p1);u=vec2.length(b);vec2.scale(b,b,1/u);vec2.sub(f,this.p4,this.p1);w=vec2.length(f);vec2.scale(f,f,1/w);vec2.sub(h,this.p3,this.p2);t=vec2.length(h);vec2.scale(h,h,1/t);vec2.sub(k,
+this.p3,this.p4);r=vec2.length(k);vec2.scale(k,k,1/r);var v=e[0],x=e[1],y=e[2],z=e[3];d(v,b,k,c.y);d(z,b,k,1-c.bottom);d(x,f,h,c.x);d(y,f,h,1-c.right);vec2.addTwoScaledUnitVectors(g,v,u*c.x,x,w*c.y);vec2.add(a.p1,this.p1,g);vec2.addTwoScaledUnitVectors(g,v,u*-(1-c.right),y,t*c.y);vec2.add(a.p2,this.p2,g);vec2.addTwoScaledUnitVectors(g,z,r*-(1-c.right),y,t*-(1-c.bottom));vec2.add(a.p3,this.p3,g);vec2.addTwoScaledUnitVectors(g,z,r*c.left,x,w*-(1-c.bottom));vec2.add(a.p4,this.p4,g)},toString:function(){return"Quad("+
 vec2.toString(this.p1)+", "+vec2.toString(this.p2)+", "+vec2.toString(this.p3)+", "+vec2.toString(this.p4)+")"}};return{vecInTriangle2:c,Quad:b}});"use strict";base.require("tracing.trace_model.trace_model_event");
 base.exportTo("tracing.trace_model",function(){function d(a,c,b,e,d){tracing.trace_model.TraceModelEvent.apply(this,arguments);this.type=void 0}function b(a,c,b,k,l){d.apply(this,arguments);this.type=e.GLOBAL}function a(a,c,b,k,l){d.apply(this,arguments);this.type=e.PROCESS}function c(a,c,b,k,l){d.apply(this,arguments);this.type=e.THREAD}var e={GLOBAL:1,PROCESS:2,THREAD:3};d.prototype={__proto__:tracing.trace_model.TraceModelEvent.prototype};b.prototype={__proto__:d.prototype};a.prototype={__proto__:d.prototype};
 c.prototype={__proto__:d.prototype};return{GlobalInstantEvent:b,ProcessInstantEvent:a,ThreadInstantEvent:c,InstantEventType:e}});"use strict";base.require("base.quad");base.require("tracing.trace_model");base.require("tracing.color_scheme");base.require("tracing.trace_model.instant_event");base.require("tracing.trace_model.counter_series");
@@ -259,7 +264,7 @@
 1E3);m.duration=d.ts/1E3-l[0].event.ts/1E3;m.startThread=l[0].thread;m.endThread=f.thread;m.id=k;m.args=this.deepCopyIfNeeded_(l[0].event.args);m.subSlices=[];for(f=1;f<l.length;++f){var n=h;"T"==l[f-1].event.ph&&(n=h+":"+l[f-1].event.args.step);n=new tracing.trace_model.AsyncSlice(l[0].event.cat,n,tracing.getStringColorId(h+f),l[f-1].event.ts/1E3);n.duration=l[f].event.ts/1E3-l[f-1].event.ts/1E3;n.startThread=l[f-1].thread;n.endThread=l[f].thread;n.id=k;n.args=this.deepCopyIfNeeded_(l[f-1].event.args);
 m.subSlices.push(n)}var l=m.subSlices[m.subSlices.length-1],p;for(p in d.args)l.args[p]=this.deepCopyIfNeeded_(d.args[p]);m.startThread.asyncSliceGroup.push(m);delete a[h][k]}}}}}},createExplicitObjects_:function(){function a(a){var c=a.event;a=a.thread;void 0===c.name&&this.model_.importErrors.push("While processing "+JSON.stringify(c)+": Object events require an name parameter.");void 0===c.id&&this.model_.importErrors.push("While processing "+JSON.stringify(c)+": Object events require an id parameter.");
 a=a.parent;var b=c.ts/1E3,e;if("N"==c.ph)try{e=a.objects.idWasCreated(c.id,c.cat,c.name,b)}catch(f){this.model_.importErrors.push("While processing create of "+c.id+" at ts="+b+": "+f);return}else if("O"==c.ph){if(void 0===c.args.snapshot){this.model_.importErrors.push("While processing "+c.id+" at ts="+b+": Snapshots must have args: {snapshot: ...}");return}var d;try{d=a.objects.addSnapshot(c.id,c.cat,c.name,b,this.deepCopyIfNeeded_(c.args.snapshot))}catch(g){this.model_.importErrors.push("While processing snapshot of "+
-c.id+" at ts="+b+": "+g);return}e=d.objectInstance}else if("D"==c.ph)try{e=a.objects.idWasDeleted(c.id,c.cat,c.name,b)}catch(t){this.model_.importErrors.push("While processing delete of "+c.id+" at ts="+b+": "+t);return}e&&(e.colorId=tracing.getStringColorId(e.typeName))}if(0!=this.allObjectEvents_.length){this.allObjectEvents_.sort(function(a,c){return a.event.ts-c.event.ts});for(var c=this.allObjectEvents_,b=0;b<c.length;b++){var f=c[b];try{a.call(this,f)}catch(d){this.model_.importErrors.push(d.message)}}}},
+c.id+" at ts="+b+": "+g);return}e=d.objectInstance}else if("D"==c.ph)try{e=a.objects.idWasDeleted(c.id,c.cat,c.name,b)}catch(s){this.model_.importErrors.push("While processing delete of "+c.id+" at ts="+b+": "+s);return}e&&(e.colorId=tracing.getStringColorId(e.typeName))}if(0!=this.allObjectEvents_.length){this.allObjectEvents_.sort(function(a,c){return a.event.ts-c.event.ts});for(var c=this.allObjectEvents_,b=0;b<c.length;b++){var f=c[b];try{a.call(this,f)}catch(d){this.model_.importErrors.push(d.message)}}}},
 createImplicitObjects_:function(){base.iterItems(this.model_.processes,function(a,c){this.createImplicitObjectsForProcess_(c)},this)},createImplicitObjectsForProcess_:function(a){function c(c,b,e,d){if(e&&void 0!==e.id&&!(e instanceof tracing.trace_model.ObjectSnapshot)){var l=e.id,m=/(.+)\/(.+)/.exec(l);if(!m)throw Error("Implicit snapshots must have names.");delete e.id;var n=m[1],m=m[2],p;try{p=a.objects.addSnapshot(m,d.objectInstance.category,n,d.ts,e)}catch(q){this.model_.importErrors.push("While processing implicit snapshot of "+
 l+" at ts="+d.ts+": "+q);return}p.objectInstance.hasImplicitSnapshots=!0;p.containingSnapshot=d;c[b]=p;if(!(p instanceof tracing.trace_model.ObjectSnapshot))throw Error("Created object must be instanceof snapshot");return p.args}}function b(a,c,d,k){if(a instanceof Object)if(a instanceof Array)for(var l=0;l<a.length;l++){var m=c.call(k,a,l,a[l],d);m?b(m,c,d,k):b(a[l],c,d,k)}else for(l in a)(m=c.call(k,a,l,a[l],d))?b(m,c,d,k):b(a[l],c,d,k)}a.objects.iterObjectInstances(function(a){a.snapshots.forEach(function(a){if(void 0!==
 a.args.id)throw Error("args cannot have an id field inside it");b(a.args,c,a,this)},this)},this)},joinObjectRefs_:function(){base.iterItems(this.model_.processes,function(a,c){this.joinObjectRefsForProcess_(c)},this)},joinObjectRefsForProcess_:function(a){var c=[];base.iterItems(a.threads,function(b,f){f.asyncSliceGroup.slices.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"start",b)},this);f.sliceGroup.slices.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"start",b)},this)},
@@ -272,7 +277,7 @@
 a.push(c.right))}};d.Node=function(b,a){this.key=b;this.value=a};d.Node.prototype.left=null;d.Node.prototype.right=null;return{SplayTree:d}});"use strict";base.require("tracing.importer.v8.splaytree");
 base.exportTo("tracing.importer.v8",function(){function d(){this.dynamics_=new tracing.importer.v8.SplayTree;this.dynamicsNameGen_=new tracing.importer.v8.CodeMap.NameGenerator;this.statics_=new tracing.importer.v8.SplayTree;this.libraries_=new tracing.importer.v8.SplayTree;this.pages_=[]}d.PAGE_ALIGNMENT=12;d.PAGE_SIZE=1<<d.PAGE_ALIGNMENT;d.prototype.addCode=function(b,a){this.deleteAllCoveredNodes_(this.dynamics_,b,b+a.size);this.dynamics_.insert(b,a)};d.prototype.moveCode=function(b,a){var c=this.dynamics_.remove(b);
 this.deleteAllCoveredNodes_(this.dynamics_,a,a+c.value.size);this.dynamics_.insert(a,c.value)};d.prototype.deleteCode=function(b){this.dynamics_.remove(b)};d.prototype.addLibrary=function(b,a){this.markPages_(b,b+a.size);this.libraries_.insert(b,a)};d.prototype.addStaticCode=function(b,a){this.statics_.insert(b,a)};d.prototype.markPages_=function(b,a){for(var c=b;c<=a;c+=d.PAGE_SIZE)this.pages_[c>>>d.PAGE_ALIGNMENT]=1};d.prototype.deleteAllCoveredNodes_=function(b,a,c){for(var e=[],f=c-1;f>=a;){var d=
-b.findGreatestLessThan(f);if(!d)break;f=d.key;d=f+d.value.size;f<c&&a<d&&e.push(f);f-=1}a=0;for(c=e.length;a<c;++a)b.remove(e[a])};d.prototype.isAddressBelongsTo_=function(b,a){return b>=a.key&&b<a.key+a.value.size};d.prototype.findInTree_=function(b,a){var c=b.findGreatestLessThan(a);return c&&this.isAddressBelongsTo_(a,c)?c.value:null};d.prototype.findEntry=function(b){if(b>>>d.PAGE_ALIGNMENT in this.pages_)return this.findInTree_(this.statics_,b)||this.findInTree_(this.libraries_,b);var a=this.dynamics_.findMin(),
+b.findGreatestLessThan(f);if(!d)break;f=d.key;d=f+d.value.size;f<c&&a<d&&e.push(f);--f}a=0;for(c=e.length;a<c;++a)b.remove(e[a])};d.prototype.isAddressBelongsTo_=function(b,a){return b>=a.key&&b<a.key+a.value.size};d.prototype.findInTree_=function(b,a){var c=b.findGreatestLessThan(a);return c&&this.isAddressBelongsTo_(a,c)?c.value:null};d.prototype.findEntry=function(b){if(b>>>d.PAGE_ALIGNMENT in this.pages_)return this.findInTree_(this.statics_,b)||this.findInTree_(this.libraries_,b);var a=this.dynamics_.findMin(),
 c=this.dynamics_.findMax();if(null!=c&&b<c.key+c.value.size&&b>=a.key){b=this.findInTree_(this.dynamics_,b);if(null==b)return null;b.nameUpdated_||(b.name=this.dynamicsNameGen_.getName(b.name),b.nameUpdated_=!0);return b}return null};d.prototype.findDynamicEntryByStartAddress=function(b){return(b=this.dynamics_.find(b))?b.value:null};d.prototype.getAllDynamicEntries=function(){return this.dynamics_.exportValues()};d.prototype.getAllDynamicEntriesWithAddresses=function(){return this.dynamics_.exportKeysAndValues()};
 d.prototype.getAllStaticEntries=function(){return this.statics_.exportValues()};d.prototype.getAllLibrariesEntries=function(){return this.libraries_.exportValues()};d.CodeEntry=function(b,a){this.size=b;this.name=a||"";this.nameUpdated_=!1};d.CodeEntry.prototype.getName=function(){return this.name};d.CodeEntry.prototype.toString=function(){return this.name+": "+this.size.toString(16)};d.NameGenerator=function(){this.knownNames_={}};d.NameGenerator.prototype.getName=function(b){if(!(b in this.knownNames_))return this.knownNames_[b]=
 0,b;var a=++this.knownNames_[b];return b+" {"+a+"}"};return{CodeMap:d}});"use strict";
@@ -290,7 +295,7 @@
 this.v8_timer_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(1);this.v8_timer_thread_.name="V8 Timers";this.v8_stack_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(2);this.v8_stack_thread_.name="V8 JavaScript";this.v8_samples_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(3);this.v8_samples_thread_.name="V8 PC";for(var b=this.logData_.split("\n"),f=0;f<b.length;f++)a.processLogLine(b[f])},finalizeImport:function(){},joinRefs:function(){}};tracing.TraceModel.registerImporter(d);
 return{V8LogImporter:d}});"use strict";base.require("tracing.importer.linux_perf_importer");base.require("tracing.importer.trace_event_importer");base.require("tracing.importer.v8_log_importer");"use strict";base.exportTo("tracing.analysis",function(){return{tsRound:function(d){return Math.round(1E3*d)/1E3}}});"use strict";base.require("base.events");base.require("base.guid");base.require("base.range");
 base.exportTo("tracing",function(){function d(a,c){this.track=a;this.slice=c}function b(a,c,b){this.track=a;this.counter=c;this.sampleIndex=b}function a(a,c){this.track=a;this.objectSnapshot=c}function c(a,c){this.track=a;this.objectInstance=c}function e(a){this.bounds_dirty_=!0;this.bounds_=new base.Range;this.length_=0;this.guid_=base.GUID.allocate();a&&this.pushHits(a)}d.prototype={get modelObject(){return this.slice},get selected(){return this.slice.selected},set selected(a){this.slice.selected=
-a},addBoundsToRange:function(a){a.addValue(this.slice.start);a.addValue(this.slice.end)}};b.prototype={get modelObject(){return this.sampleIndex},get selected(){return!0==this.track.selectedSamples[this.sampleIndex]},set selected(a){this.track.selectedSamples[this.sampleIndex]=a?!0:!1},addBoundsToRange:function(a){this.track.timestamps&&a.addValue(this.track.timestamps[this.sampleIndex])}};a.prototype={get modelObject(){return this.objectSnapshot},get selected(){return this.objectSnapshot.selected},
+a},addBoundsToRange:function(a){a.addValue(this.slice.start);a.addValue(this.slice.end)}};b.prototype={get modelObject(){return this.sampleIndex},get selected(){return 1==this.track.selectedSamples[this.sampleIndex]},set selected(a){this.track.selectedSamples[this.sampleIndex]=a?!0:!1},addBoundsToRange:function(a){this.track.timestamps&&a.addValue(this.track.timestamps[this.sampleIndex])}};a.prototype={get modelObject(){return this.objectSnapshot},get selected(){return this.objectSnapshot.selected},
 set selected(a){this.objectSnapshot.selected=a},addBoundsToRange:function(a){a.addValue(this.objectSnapshot.ts)}};c.prototype={get modelObject(){return this.objectInstance},get selected(){return this.objectInstance.selected},set selected(a){this.objectInstance.selected=a},addBoundsToRange:function(a){a.addRange(this.objectInstance.bounds)}};var f=[{constructor:d,name:"slice",pluralName:"slices"},{constructor:b,name:"counterSample",pluralName:"counterSamples"},{constructor:a,name:"objectSnapshot",
 pluralName:"objectSnapshots"},{constructor:c,name:"objectInstance",pluralName:"objectInstances"}];e.prototype={__proto__:Object.prototype,get bounds(){if(this.bounds_dirty_){this.bounds_.reset();for(var a=0;a<this.length_;a++)this[a].addBoundsToRange(this.bounds_);this.bounds_dirty_=!1}return this.bounds_},get duration(){return this.bounds_.isEmpty?0:this.bounds_.max-this.bounds_.min},get length(){return this.length_},get guid(){return this.guid_},clear:function(){for(var a=0;a<this.length_;++a)delete this[a];
 this.length_=0;this.bounds_dirty_=!0},pushHit:function(a){this.push_(a)},pushHits:function(a){for(var c=0;c<a.length;c++)this.pushHit(a[c])},push_:function(a){this[this.length_++]=a;this.bounds_dirty_=!0;return a},addSlice:function(a,c){return this.push_(new d(a,c))},addCounterSample:function(a,c,e){return this.push_(new b(a,c,e))},addObjectSnapshot:function(c,b){return this.push_(new a(c,b))},addObjectInstance:function(a,b){return this.push_(new c(a,b))},addSelection:function(a){for(var c=0;c<a.length;c++)this.push_(a[c])},
@@ -319,12 +324,12 @@
 base.exportTo("tracing.analysis",function(){return{analyzeSingleCounterSampleHit:function(d,b){for(var a=b.counter,c=b.sampleIndex,e=[],f=0;f<a.numSeries;++f)e.push(a.getSeries(f).getSample(c).value);var g=d.appendTable("analysis-counter-table",2);d.appendTableHeader(g,"Selected counter:");d.appendSummaryRow(g,"Title",a.name);d.appendSummaryRowTime(g,"Timestamp",a.timestamps[c]);for(f=0;f<a.numSeries;f++)d.appendSummaryRow(g,a.getSeries(f).name,e[f])},analyzeMultipleCounterSampleHits:function(d,b){for(var a=
 {},c=0;c<b.length;c++){var e=b[c].counter;a[e.guid]||(a[e.guid]=[]);a[e.guid].push(b[c])}var f=d.appendTable("analysis-counter-table",2);d.appendTableHeader(f,"Counters:");for(var g in a){for(var h=a[g],e=h[0].counter,k=[],c=0;c<h.length;c++)k.push(h[c].sampleIndex);h=e.getSampleStatistics(k);for(c=0;c<h.length;c++){for(var l=[],m=0;m<k.length;++m)l.push(e.getSeries(c).getSample(k[m]).value);d.appendDataRow(f,e.name+": series("+e.getSeries(c).name+")",l,l.length,h[c])}}}}});"use strict";base.requireStylesheet("tracing.analysis.analyze_slices");
 base.require("tracing.analysis.util");base.require("ui");
-base.exportTo("tracing.analysis",function(){function d(b,a){var c=a.slice,e=b.appendTable("analysis-slice-table",2);b.appendTableHeader(e,"Selected slice:");b.appendSummaryRow(e,"Title",c.title);c.category&&b.appendSummaryRow(e,"Category",c.category);b.appendSummaryRowTime(e,"Start",c.start);b.appendSummaryRowTime(e,"Duration",c.duration);c.durationInUserTime&&b.appendSummaryRowTime(e,"Duration (U)",c.durationInUserTime);var d=0,g;for(g in c.args)d+=1;if(0<d)for(g in b.appendSummaryRow(e,"Args"),
-c.args)b.appendSummaryRow(e," "+g,c.args[g])}return{analyzeSingleSliceHit:d,analyzeMultipleSliceHits:function(b,a){var c=a.bounds.min,e=a.bounds.max;a.map(function(a){return a.slice.title});for(var f=0,g={},h=0;h<a.length;h++){var k=a[h].slice;g[k.title]||(g[k.title]={hits:[]},f++);g[k.title].hits.push(a[h])}var l;l=b.appendTable("analysis-slices-table",3);b.appendTableHeader(l,"Slices:");var m=0;base.iterItems(g,function(a,c){for(var e=0,g=0,h=Number.MAX_VALUE,k=-Number.MAX_VALUE,s=Number.MAX_VALUE,
-r=-Number.MAX_VALUE,g=0;g<c.hits.length;g++)var u=c.hits[g].slice,e=e+u.duration,h=Math.min(u.start,h),k=Math.max(u.start,k),s=Math.min(u.duration,s),r=Math.max(u.duration,r);m+=e;0==c.hits.length&&(g=0);g=e/c.hits.length;s={min:s,max:r,avg:g,avg_stddev:void 0,frequency:void 0,frequency_stddev:void 0};for(g=r=0;g<c.hits.length;g++)u=s.avg-c.hits[g].slice.duration,r+=u*u;s.avg_stddev=Math.sqrt(r/(c.hits.length-1));k-=h;if(2<c.hits.length&&0<k){h=c.hits.length-1;s.frequency=1E3*h/k;r=0;for(g=1;g<c.hits.length;g++)u=
-s.frequency-1E3/(c.hits[g].slice.start-c.hits[g-1].slice.start),r+=u*u;s.frequency_stddev=Math.sqrt(r/(h-1))}b.appendDataRow(l,a,e,c.hits.length,s,function(){return new tracing.Selection(c.hits)});if(1===f)for(g=0;g<c.hits.length;g++)d(b,c.hits[g])});1!==f&&(b.appendDataRow(l,"*Totals",m,a.length),b.appendSpacingRow(l));b.appendSummaryRowTime(l,"Selection start",c);b.appendSummaryRowTime(l,"Selection extent",e-c)}}});"use strict";base.require("tracing.analysis.analyze_counters");base.require("tracing.analysis.analyze_slices");
+base.exportTo("tracing.analysis",function(){function d(b,a){var c=a.slice,e=b.appendTable("analysis-slice-table",2);b.appendTableHeader(e,"Selected slice:");b.appendSummaryRow(e,"Title",c.title);c.category&&b.appendSummaryRow(e,"Category",c.category);b.appendSummaryRowTime(e,"Start",c.start);b.appendSummaryRowTime(e,"Duration",c.duration);c.durationInUserTime&&b.appendSummaryRowTime(e,"Duration (U)",c.durationInUserTime);var f=0,d;for(d in c.args)f+=1;if(0<f)for(d in b.appendSummaryRow(e,"Args"),
+c.args)b.appendSummaryRow(e," "+d,c.args[d])}return{analyzeSingleSliceHit:d,analyzeMultipleSliceHits:function(b,a){var c=a.bounds.min,e=a.bounds.max;a.map(function(a){return a.slice.title});for(var f=0,g={},h=0;h<a.length;h++){var k=a[h].slice;g[k.title]||(g[k.title]={hits:[]},f++);g[k.title].hits.push(a[h])}var l;l=b.appendTable("analysis-slices-table",3);b.appendTableHeader(l,"Slices:");var m=0;base.iterItems(g,function(a,c){for(var e=0,g=0,h=Number.MAX_VALUE,k=-Number.MAX_VALUE,t=Number.MAX_VALUE,
+r=-Number.MAX_VALUE,g=0;g<c.hits.length;g++)var v=c.hits[g].slice,e=e+v.duration,h=Math.min(v.start,h),k=Math.max(v.start,k),t=Math.min(v.duration,t),r=Math.max(v.duration,r);m+=e;0==c.hits.length&&(g=0);g=e/c.hits.length;t={min:t,max:r,avg:g,avg_stddev:void 0,frequency:void 0,frequency_stddev:void 0};for(g=r=0;g<c.hits.length;g++)v=t.avg-c.hits[g].slice.duration,r+=v*v;t.avg_stddev=Math.sqrt(r/(c.hits.length-1));k-=h;if(2<c.hits.length&&0<k){h=c.hits.length-1;t.frequency=1E3*h/k;r=0;for(g=1;g<c.hits.length;g++)v=
+t.frequency-1E3/(c.hits[g].slice.start-c.hits[g-1].slice.start),r+=v*v;t.frequency_stddev=Math.sqrt(r/(h-1))}b.appendDataRow(l,a,e,c.hits.length,t,function(){return new tracing.Selection(c.hits)});if(1===f)for(g=0;g<c.hits.length;g++)d(b,c.hits[g])});1!==f&&(b.appendDataRow(l,"*Totals",m,a.length),b.appendSpacingRow(l));b.appendSummaryRowTime(l,"Selection start",c);b.appendSummaryRowTime(l,"Selection extent",e-c)}}});"use strict";base.require("tracing.analysis.analyze_counters");base.require("tracing.analysis.analyze_slices");
 base.require("tracing.analysis.util");base.require("ui");
-base.exportTo("tracing.analysis",function(){function d(a,c){var e=c.slices,d=c.counterSamples,g=new tracing.Selection;g.addSelection(c.objectSnapshots);g.addSelection(c.objectInstances);1==e.length?tracing.analysis.analyzeSingleSliceHit(a,e[0]):1<e.length&&tracing.analysis.analyzeMultipleSliceHits(a,e);1==d.length?tracing.analysis.analyzeSingleCounterSampleHit(a,d[0]):1<d.length&&tracing.analysis.analyzeMultipleCounterSampleHits(a,d);g.length&&b(a,g)}function b(a,c){c=base.asArray(c).sort(base.Range.compareByMinTimes);
+base.exportTo("tracing.analysis",function(){function d(a,c){var e=c.slices,f=c.counterSamples,d=new tracing.Selection;d.addSelection(c.objectSnapshots);d.addSelection(c.objectInstances);1==e.length?tracing.analysis.analyzeSingleSliceHit(a,e[0]):1<e.length&&tracing.analysis.analyzeMultipleSliceHits(a,e);1==f.length?tracing.analysis.analyzeSingleCounterSampleHit(a,f[0]):1<f.length&&tracing.analysis.analyzeMultipleCounterSampleHits(a,f);d.length&&b(a,d)}function b(a,c){c=base.asArray(c).sort(base.Range.compareByMinTimes);
 var b=a.appendTable("analysis-object-sample-table",2);a.appendTableHeader(b,"Selected Objects:");c.forEach(function(c){var d=a.appendTableRow(b),h,k,l;if(c instanceof tracing.SelectionObjectSnapshotHit){var m=c.objectSnapshot;h=tracing.analysis.tsRound(m.ts);k=m.objectInstance.typeName+" "+m.objectInstance.id;l=function(){var a=new tracing.Selection;a.addObjectSnapshot(c.track,m);return a}}else{var n=c.objectInstance;h=n.deletionTs==Number.MAX_VALUE?"":tracing.analysis.tsRound(n.deletionTs);h=tracing.analysis.tsRound(n.creationTs)+
 "-"+h;k=n.typeName+" "+n.id;l=function(){var a=new tracing.Selection;a.addObjectInstance(c.track,n);return a}}a.appendTableCell(b,d,h);a.appendTableCell(b,d,"").appendChild(a.createSelectionChangingLink(k,l))})}return{analyzeSelection:function(a,c){d(a,c.getHitsOrganizedByType())},analyzeHitsByType:d}});"use strict";base.require("ui");
 base.exportTo("tracing.analysis",function(){var d=ui.define("object-instance-view");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.objectInstance_=void 0},set modelObject(b){this.objectInstance=b},get modelObject(){return this.objectInstance},get objectInstance(){return this.objectInstance_},set objectInstance(b){this.objectInstance_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};d.typeNameToViewInfoMap={};d.register=function(b,a,c){if(d.typeNameToViewInfoMap[b])throw Error("Handler already registerd for "+
@@ -372,8 +377,8 @@
 "rgba(255,0,0,0.25)";a.stroke()}},drawMarkerArrows:function(a,c,b,d){for(var g=0;g<this.markers.length;++g)this.markers[g].drawTriangle_(a,c,b,a.canvas.height,d,this)},drawMarkerLines:function(a,c,b){for(var d=0;d<this.markers.length;++d)this.markers[d].drawLine(a,c,b,a.canvas.height,this)}};b.prototype={get positionWorld(){return this.positionWorld_},set positionWorld(a){this.positionWorld_=a;this.viewport_.dispatchChangeEvent()},set selected(a){this.selected_=a;this.viewport_.dispatchChangeEvent()},
 get selected(){return this.selected_},get color(){return this.selected?"rgb(255,0,0)":"rgb(0,0,0)"},drawTriangle_:function(a,c,b,d,g,h){a.beginPath();var k=this.positionWorld_;k<c||k>b||(c=h.xWorldToView(k),a.moveTo(c,g),a.lineTo(c-3,g/2),a.lineTo(c+3,g/2),a.lineTo(c,g),a.closePath(),a.fillStyle=this.color,a.fill(),g!==d&&(a.beginPath(),a.moveTo(c,g),a.lineTo(c,d),a.closePath(),a.strokeStyle=this.color,a.stroke()))},drawLine:function(a,c,b,d,g){a.beginPath();var h=this.positionWorld_;h>=c&&h<b&&(c=
 g.xWorldToView(h),a.moveTo(c,0),a.lineTo(c,d));a.strokeStyle=this.color;a.stroke()}};return{TimelineViewport:d,ViewportMarker:b}});"use strict";base.require("base.utils");
-base.exportTo("base",function(){function d(a){try{a.callback.call(a.context)}catch(c){base.onAnimationFrameError(c,a.stack)}}function b(){k=!1;var a=f;h=g;f=[];g=[];for(var c=0;c<a.length;c++)d(a[c]);for(;0<h.length;)d(h.shift());h=void 0}function a(){if(!e)return"";var a=base.stackTrace();a.shift();return a.join("\n")}function c(c,e){g.push({callback:c,context:e||window,stack:a()});k||(k=!0,window.webkitRequestAnimationFrame(b))}var e=!1,f=[],g=[],h=void 0,k=!1;return{onAnimationFrameError:function(a,
-c){c&&console.log(c);a.message?console.error(a.message,a.stack):console.error(a)},requestPreAnimationFrame:function(c,e){f.push({callback:c,context:e||window,stack:a()});k||(k=!0,window.webkitRequestAnimationFrame(b))},requestAnimationFrame:c,requestAnimationFrameInThisFrameIfPossible:function(b,e){h?h.push({callback:b,context:e||window,stack:a()}):c(b,e)}}});"use strict";base.require("base.events");base.require("ui");
+base.exportTo("base",function(){function d(a){try{a.callback.call(a.context)}catch(c){base.onAnimationFrameError(c,a.stack)}}function b(){g=!1;var a=c;f=e;c=[];e=[];for(var b=0;b<a.length;b++)d(a[b]);for(;0<f.length;)d(f.shift());f=void 0}function a(a,c){e.push({callback:a,context:c||window,stack:""});g||(g=!0,window.webkitRequestAnimationFrame(b))}var c=[],e=[],f=void 0,g=!1;return{onAnimationFrameError:function(a,c){c&&console.log(c);a.message?console.error(a.message,a.stack):console.error(a)},
+requestPreAnimationFrame:function(a,e){c.push({callback:a,context:e||window,stack:""});g||(g=!0,window.webkitRequestAnimationFrame(b))},requestAnimationFrame:a,requestAnimationFrameInThisFrameIfPossible:function(c,b){f?f.push({callback:c,context:b||window,stack:""}):a(c,b)}}});"use strict";base.require("base.events");base.require("ui");
 base.exportTo("ui",function(){var d=ui.define("div");d.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.observer_=new WebKitMutationObserver(this.didMutate_.bind(this));this.observer_.observe(this,{childList:!0});Object.defineProperty(this,"textContent",{get:void 0,set:this.onSetTextContent_})},appendChild:function(b){HTMLUnknownElement.prototype.appendChild.call(this,b);this.didMutate_(this.observer_.takeRecords())},insertBefore:function(b,a){HTMLUnknownElement.prototype.insertBefore.call(this,
 b,a);this.didMutate_(this.observer_.takeRecords())},removeChild:function(b){HTMLUnknownElement.prototype.removeChild.call(this,b);this.didMutate_(this.observer_.takeRecords())},replaceChild:function(b,a){HTMLUnknownElement.prototype.replaceChild.call(this,b,a);this.didMutate_(this.observer_.takeRecords())},onSetTextContent_:function(b){if(""!=b)throw Error("textContent can only be set to ''.");this.clear()},clear:function(){for(;this.lastChild;)HTMLUnknownElement.prototype.removeChild.call(this,this.lastChild);
 this.didMutate_(this.observer_.takeRecords())},didMutate_:function(b){this.beginDecorating_();for(var a=0;a<b.length;a++){var c=b[a].addedNodes;if(c)for(var e=0;e<c.length;e++)this.decorateChild_(c[e]);if(c=b[a].removedNodes)for(e=0;e<c.length;e++)this.undecorateChild_(c[e])}this.doneDecoratingForNow_()},decorateChild_:function(b){throw Error("Not implemented");},undecorateChild_:function(b){throw Error("Not implemented");},beginDecorating_:function(){},doneDecoratingForNow_:function(){}};return{ContainerThatDecoratesItsChildren:d}});
@@ -393,11 +398,11 @@
 base.exportTo("tracing.tracks",function(){var d=ui.define("ruler-track",tracing.tracks.HeadingTrack),b=Math.log(10);d.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("ruler-track");this.strings_secs_=[];this.strings_msecs_=[];this.addEventListener("mousedown",this.onMouseDown);this.viewportMarkersChange_=this.viewportMarkersChange_.bind(this);a.addEventListener("markersChange",this.viewportMarkersChange_)},
 detach:function(){tracing.tracks.HeadingTrack.prototype.detach.call(this);this.viewport.removeEventListener("markersChange",this.viewportMarkersChange_)},viewportMarkersChange_:function(){2>this.viewport.markers.length?this.classList.remove("ruler-track-with-distance-measurements"):this.classList.add("ruler-track-with-distance-measurements")},onMouseDown:function(a){0===a.button&&this.placeAndBeginDraggingMarker(a.clientX)},placeAndBeginDraggingMarker:function(a){var c=window.devicePixelRatio||1;
 a=this.viewport.xViewToWorld((a-this.offsetLeft-tracing.constants.HEADING_WIDTH)*c);var b=this.viewport.findMarkerNear(a,6),d=!1,g=!1;b||(b=this.viewport.addMarker(a),d=!0);b.selected=!0;var h=function(a){a=this.viewport.xViewToWorld((a.clientX-this.offsetLeft-tracing.constants.HEADING_WIDTH)*c);b.positionWorld=a;g=!0}.bind(this),k=function(a){b.selected=!1;g||d||this.viewport.removeMarker(b);document.removeEventListener("mouseup",k);document.removeEventListener("mousemove",h)}.bind(this);document.addEventListener("mouseup",
-k);document.addEventListener("mousemove",h)},drawLine_:function(a,b,e,d,g,h){a.beginPath();a.moveTo(b,e);a.lineTo(d,g);a.closePath();a.strokeStyle=h;a.stroke()},drawArrow_:function(a,b,e,d,g,h,k){this.drawLine_(a,b,e,d,g,k);var l=d-b,m=g-e,n=Math.sqrt(l*l+m*m),p=(n-10)/n;b+=p*l;e+=p*m;m=m/n*h;h*=-(l/n);a.beginPath();a.fillStyle=k;a.moveTo(b+m,e+h);a.lineTo(d,g);a.lineTo(b-m,e-h);a.lineTo(b+m,e+h);a.closePath();a.fill()},draw:function(a,b,e){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,
-e)}},drawSlices_:function(a,c){var e=this.context(),d=window.devicePixelRatio||1,g=this.getBoundingClientRect(),h=g.width*d,k=g.height*d,l=this.classList.contains("ruler-track-with-distance-measurements"),g=l?k/2:k,m=this.viewport;m.drawMarkerArrows(e,a,c,g);var d=150*d,n=m.xViewVectorToWorld(d),p,q,t,v;v=Math.pow(10,Math.ceil(Math.log(n)/b));q=[10,5,2,1];for(n=0;n<q.length;++n)if(!(m.xWorldVectorToView(v/q[n])<d)){p=v/q[n-1];break}v=void 0;100>p?(q="ms",t=1,v=this.strings_msecs_):(q="s",t=1E3,v=
-this.strings_secs_);var w=m.xWorldVectorToView(p/5),n=Math.floor(a/p)*p,k=Math.floor(.25*k);e.fillStyle="rgb(0, 0, 0)";e.strokeStyle="rgb(0, 0, 0)";e.textAlign="left";e.textBaseline="top";d=window.devicePixelRatio||1;e.font=9*d+"px sans-serif";for(var s=n;s<c;s+=p){var r=Math.floor(m.xWorldToView(s)),n=Math.floor(s/t*1E5)/1E5;v[n]||(v[n]=n+" "+q);e.fillText(v[n],r+2*d,0);e.beginPath();e.moveTo(r,0);e.lineTo(r,g);for(n=1;5>n;++n){var u=Math.floor(r+w*n);e.moveTo(u,g-k);e.lineTo(u,g)}e.stroke()}e.moveTo(0,
-g);e.lineTo(h,g);e.stroke();if(l){p=m.markers.slice();p.sort(function(a,b){return a.positionWorld_-b.positionWorld_});l=g+2;d=l+4;for(n=0;n<p.length-1;n++){k=p[n+1];s=p[n];r=k.positionWorld-s.positionWorld;w=m.xWorldVectorToView(r);v=m.xWorldToView(s.positionWorld+r/2);100>r?(q="ms",t=1):(q="s",t=1E3);t=r/t;q=Math.abs(Math.floor(1E3*t)/1E3)+" "+q;t=e.measureText(q).width;u=m.xViewVectorToWorld(t);t=t+26+10;var x=s.positionWorld+r/2-u/2,y=x+u,r=l,u=m.xWorldToView(x),x=m.xWorldToView(y),s=m.xWorldToView(s.positionWorld),
-k=m.xWorldToView(k.positionWorld),y=!1;t<=w&&(e.fillStyle="rgb(0,0,0)",e.fillText(q,u,r),y=!0);26<=w&&(y?(q=u-10,v=x+10):q=v,this.drawArrow_(e,q,d,s,d,3,"rgb(128,121,121)"),this.drawArrow_(e,v,d,k,d,3,"rgb(128,121,121)"))}e.moveTo(0,2*g);e.lineTo(h,2*g);e.stroke()}},addIntersectingItemsInRangeToSelection:function(a,b,e,d,g){},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{RulerTrack:d}});"use strict";
+k);document.addEventListener("mousemove",h)},drawLine_:function(a,c,b,d,g,h){a.beginPath();a.moveTo(c,b);a.lineTo(d,g);a.closePath();a.strokeStyle=h;a.stroke()},drawArrow_:function(a,c,b,d,g,h,k){this.drawLine_(a,c,b,d,g,k);var l=d-c,m=g-b,n=Math.sqrt(l*l+m*m),p=(n-10)/n;c+=p*l;b+=p*m;m=m/n*h;h*=-(l/n);a.beginPath();a.fillStyle=k;a.moveTo(c+m,b+h);a.lineTo(d,g);a.lineTo(c-m,b-h);a.lineTo(c+m,b+h);a.closePath();a.fill()},draw:function(a,b,e){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,
+e)}},drawSlices_:function(a,c){var e=this.context(),d=window.devicePixelRatio||1,g=this.getBoundingClientRect(),h=g.width*d,k=g.height*d,l=this.classList.contains("ruler-track-with-distance-measurements"),g=l?k/2:k,m=this.viewport;m.drawMarkerArrows(e,a,c,g);var d=150*d,n=m.xViewVectorToWorld(d),p,q,s,u;u=Math.pow(10,Math.ceil(Math.log(n)/b));q=[10,5,2,1];for(n=0;n<q.length;++n)if(!(m.xWorldVectorToView(u/q[n])<d)){p=u/q[n-1];break}u=void 0;100>p?(q="ms",s=1,u=this.strings_msecs_):(q="s",s=1E3,u=
+this.strings_secs_);var w=m.xWorldVectorToView(p/5),n=Math.floor(a/p)*p,k=Math.floor(.25*k);e.fillStyle="rgb(0, 0, 0)";e.strokeStyle="rgb(0, 0, 0)";e.textAlign="left";e.textBaseline="top";d=window.devicePixelRatio||1;e.font=9*d+"px sans-serif";for(var t=n;t<c;t+=p){var r=Math.floor(m.xWorldToView(t)),n=Math.floor(t/s*1E5)/1E5;u[n]||(u[n]=n+" "+q);e.fillText(u[n],r+2*d,0);e.beginPath();e.moveTo(r,0);e.lineTo(r,g);for(n=1;5>n;++n){var v=Math.floor(r+w*n);e.moveTo(v,g-k);e.lineTo(v,g)}e.stroke()}e.moveTo(0,
+g);e.lineTo(h,g);e.stroke();if(l){p=m.markers.slice();p.sort(function(a,b){return a.positionWorld_-b.positionWorld_});l=g+2;d=l+4;for(n=0;n<p.length-1;n++){k=p[n+1];t=p[n];r=k.positionWorld-t.positionWorld;w=m.xWorldVectorToView(r);u=m.xWorldToView(t.positionWorld+r/2);100>r?(q="ms",s=1):(q="s",s=1E3);s=r/s;q=Math.abs(Math.floor(1E3*s)/1E3)+" "+q;s=e.measureText(q).width;v=m.xViewVectorToWorld(s);s=s+26+10;var x=t.positionWorld+r/2-v/2,y=x+v,r=l,v=m.xWorldToView(x),x=m.xWorldToView(y),t=m.xWorldToView(t.positionWorld),
+k=m.xWorldToView(k.positionWorld),y=!1;s<=w&&(e.fillStyle="rgb(0,0,0)",e.fillText(q,v,r),y=!0);26<=w&&(y?(q=v-10,u=x+10):q=u,this.drawArrow_(e,q,d,t,d,3,"rgb(128,121,121)"),this.drawArrow_(e,u,d,k,d,3,"rgb(128,121,121)"))}e.moveTo(0,2*g);e.lineTo(h,2*g);e.stroke()}},addIntersectingItemsInRangeToSelection:function(a,b,e,d,g){},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{RulerTrack:d}});"use strict";
 base.exportTo("base",function(){function d(){this.iframe_=void 0}d.prototype={__proto__:Object.prototype,measure:function(b){this.iframe_.contentDocument.body.appendChild(b);var a=this.iframe_.contentWindow.getComputedStyle(b),c=parseInt(a.width,10),a=parseInt(a.height,10);this.iframe_.contentDocument.body.removeChild(b);return{width:c,height:a}},attach:function(){var b=document.createElement("iframe");b.style.cssText="position:absolute;width:100%;height:0;border:0;visibility:hidden";document.body.appendChild(b);
 this.iframe_=b;this.iframe_.contentDocument.body.style.cssText="padding:0;margin:0;overflow:hidden";for(var b=document.querySelectorAll("link[rel=stylesheet]"),a=0;a<b.length;a++){var c=b[a],e=this.iframe_.contentDocument.createElement("link");e.rel="stylesheet";e.href=c.href;this.iframe_.contentDocument.head.appendChild(e)}},detach:function(){document.body.removeChild(this.iframe_);this.iframe_=void 0}};return{MeasuringStick:d}});"use strict";base.require("tracing.tracks.track");base.require("tracing.filter");
 base.require("ui");
@@ -409,9 +414,9 @@
 base.require("tracing.fast_rect_renderer");base.require("tracing.color_scheme");base.require("ui");
 base.exportTo("tracing.tracks",function(){function d(){}function b(a,b){this.string=a;this.width=b}var a=tracing.getColorPalette(),c=ui.define("slice-track",tracing.tracks.HeadingTrack);c.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,SHOULD_ELIDE_TEXT:!0,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("slice-track");this.elidedTitleCache=new d;this.asyncStyle_=!1;this.slices_=null},get asyncStyle(){return this.asyncStyle_},set asyncStyle(a){this.asyncStyle_=
 !!a},get slices(){return this.slices_},set slices(a){this.slices_=a||[]},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},get hasVisibleContent(){return 0<this.slices.length},labelWidth:function(a){var b=this.context(),c=f[a];c||(c=b.measureText(a).width,f[a]=c);return c+2},labelWidthWorld:function(a,b){return this.labelWidth(a)*b},draw:function(a,b,c){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,c)}},drawSlices_:function(b,c){var d=this.context(),
-f=window.devicePixelRatio||1,g=this.getBoundingClientRect().height*f,p=this.viewport,q=p.xViewVectorToWorld(1);d.save();p.applyTransformToCanvas(d);this.asyncStyle_&&(d.globalAlpha=.25);var t=new tracing.FastRectRenderer(d,2*q,2*q,a);t.setYandH(0,g);for(var v=this.slices_,w=base.findLowIndexInSortedArray(v,function(a){return a.start+a.duration},b),s=w;s<v.length;++s){var r=v[s],u=r.start;if(u>c)break;var x=Math.max(r.duration,.001),y=r.selected?r.colorId+e:r.colorId;x<q&&(x=q);0<r.duration?t.fillRect(u,
-x,y):.001<q?t.fillRect(u,q,y):(d.fillStyle=a[y],d.beginPath(),d.moveTo(u-4*q,g),d.lineTo(u,0),d.lineTo(u+4*q,g),d.closePath(),d.fill())}t.flush();d.restore();if(8<g)for(d.textAlign="center",d.textBaseline="top",d.font=10*f+"px sans-serif",d.strokeStyle="rgb(0,0,0)",d.fillStyle="rgb(0,0,0)",g=20*q,t=this.SHOULD_ELIDE_TEXT,s=w;s<v.length;++s){r=v[s];if(r.start>c)break;r.duration<=g||(w=r.title+(r.didNotFinish?" (Did Not Finish)":""),u=this.labelWidth(w),t&&this.labelWidthWorld(w,q)>r.duration&&(u=this.elidedTitleCache.get(this,
-q,w,u,r.duration),w=u.string,u=u.width),u*q<r.duration&&(r=p.xWorldToView(r.start+.5*r.duration),d.fillText(w,r,2.5*f,u)))}},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,c,e){base.iterateOverIntersectingIntervals(this.slices_,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=e.addSlice(this,a);this.decorateHit(a)}.bind(this))},indexOfSlice_:function(a){for(var b=base.findLowIndexInSortedArray(this.slices_,function(a){return a.start},a.start);b<this.slices_.length&&
+f=window.devicePixelRatio||1,g=this.getBoundingClientRect().height*f,p=this.viewport,q=p.xViewVectorToWorld(1);d.save();p.applyTransformToCanvas(d);this.asyncStyle_&&(d.globalAlpha=.25);var s=new tracing.FastRectRenderer(d,2*q,2*q,a);s.setYandH(0,g);for(var u=this.slices_,w=base.findLowIndexInSortedArray(u,function(a){return a.start+a.duration},b),t=w;t<u.length;++t){var r=u[t],v=r.start;if(v>c)break;var x=Math.max(r.duration,.001),y=r.selected?r.colorId+e:r.colorId;x<q&&(x=q);0<r.duration?s.fillRect(v,
+x,y):.001<q?s.fillRect(v,q,y):(d.fillStyle=a[y],d.beginPath(),d.moveTo(v-4*q,g),d.lineTo(v,0),d.lineTo(v+4*q,g),d.closePath(),d.fill())}s.flush();d.restore();if(8<g)for(d.textAlign="center",d.textBaseline="top",d.font=10*f+"px sans-serif",d.strokeStyle="rgb(0,0,0)",d.fillStyle="rgb(0,0,0)",g=20*q,s=this.SHOULD_ELIDE_TEXT,t=w;t<u.length;++t){r=u[t];if(r.start>c)break;r.duration<=g||(w=r.title+(r.didNotFinish?" (Did Not Finish)":""),v=this.labelWidth(w),s&&this.labelWidthWorld(w,q)>r.duration&&(v=this.elidedTitleCache.get(this,
+q,w,v,r.duration),w=v.string,v=v.width),v*q<r.duration&&(r=p.xWorldToView(r.start+.5*r.duration),d.fillText(w,r,2.5*f,v)))}},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,c,e){base.iterateOverIntersectingIntervals(this.slices_,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=e.addSlice(this,a);this.decorateHit(a)}.bind(this))},indexOfSlice_:function(a){for(var b=base.findLowIndexInSortedArray(this.slices_,function(a){return a.start},a.start);b<this.slices_.length&&
 a.start==this.slices_[b].start&&a.colorId!=this.slices_[b].colorId;)b++;return b<this.slices_.length?b:void 0},addItemNearToProvidedHitToSelection:function(a,b,c){if(!a.slice)return!1;a=this.indexOfSlice_(a.slice);if(void 0===a)return!1;b=a+b;if(0>b||b>=this.slices_.length)return!1;a=c.addSlice(this,this.slices_[b]);this.decorateHit(a);return!0},addAllObjectsMatchingFilterToSelection:function(a,b){for(var c=0;c<this.slices_.length;++c)if(a.matchSlice(this.slices_[c])){var e=b.addSlice(this,this.slices_[c]);
 this.decorateHit(e)}}};var e=tracing.getColorPaletteHighlightIdBoost(),f={},g={};d.prototype={get:function(a,c,e,d,f){var p=g[e];p||(p={},g[e]=p);d=p[c];d||(p[c]={},d=p[c]);p=d[f];if(void 0===p){for(p=!1;a.labelWidthWorld(e,c)>f&&!(1>.75*e.length);)e=e.substring(0,.75*e.length),p=!0;p&&3<e.length&&(e=e.substring(0,e.length-3)+"...");p=new b(e,a.labelWidth(e));d[f]=p}return p}};return{SliceTrack:c}});"use strict";base.require("tracing.tracks.container_track");base.require("tracing.tracks.slice_track");
 base.require("tracing.filter");base.require("tracing.trace_model");base.require("ui");
@@ -420,22 +425,22 @@
 this.appendChild(a)}}}};return{CpuTrack:d}});"use strict";base.requireStylesheet("tracing.tracks.object_instance_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.heading_track");base.require("tracing.color_scheme");base.require("ui");
 base.exportTo("tracing.tracks",function(){var d=tracing.getColorPalette(),b=tracing.getColorPaletteHighlightIdBoost(),a=ui.define("object-instance-track",tracing.tracks.HeadingTrack);a.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("object-instance-track");this.objectInstances_=[];this.objectSnapshots_=[]},get objectInstances(){return this.objectInstances_},set objectInstances(a){a&&0!=
 a.length?(this.heading=a[0].typeName,this.objectInstances_=a,this.objectSnapshots_=[],this.objectInstances_.forEach(function(a){this.objectSnapshots_.push.apply(this.objectSnapshots_,a.snapshots)},this)):(this.heading="",this.objectInstances_=[],this.objectSnapshots_=[])},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},get snapshotRadiusView(){return 7*(window.devicePixelRatio||1)},draw:function(a,b,d){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,
-d)}},drawSlices_:function(a,e){var f=this.context(),g=window.devicePixelRatio||1,h=this.getBoundingClientRect().height*g,k=.5*h,l=2*Math.PI,m=this.viewport,n=this.snapshotRadiusView,p=m.xViewVectorToWorld(h),q;f.save();m.applyTransformToCanvas(f);var t=this.objectInstances_;q=base.findLowIndexInSortedArray(t,function(a){return a.deletionTs},a);f.globalAlpha=.25;for(f.strokeStyle="rgb(0,0,0)";q<t.length;++q){var v=t[q],w=v.creationTs;if(w>e)break;var s=v.selected?v.colorId+b:v.colorId,v=v.deletionTs==
-Number.MAX_VALUE?e:v.deletionTs;f.fillStyle=d[s];f.fillRect(w,g,v-w,h-2*g)}f.globalAlpha=1;f.restore();g=this.objectSnapshots_;for(q=base.findLowIndexInSortedArray(g,function(a){return a.ts+p},a);q<g.length;++q){h=g[q];w=h.ts;if(w-p>e)break;w=m.xWorldToView(w);s=h.selected?h.objectInstance.colorId+b:h.objectInstance.colorId;f.fillStyle=d[s];f.beginPath();f.arc(w,k,n,0,l);f.fill();h.selected?(f.lineWidth=5,f.strokeStyle="rgb(100,100,0)",f.stroke(),f.beginPath(),f.arc(w,k,n-1,0,l),f.lineWidth=2,f.strokeStyle=
+d)}},drawSlices_:function(a,e){var f=this.context(),g=window.devicePixelRatio||1,h=this.getBoundingClientRect().height*g,k=.5*h,l=2*Math.PI,m=this.viewport,n=this.snapshotRadiusView,p=m.xViewVectorToWorld(h),q;f.save();m.applyTransformToCanvas(f);var s=this.objectInstances_;q=base.findLowIndexInSortedArray(s,function(a){return a.deletionTs},a);f.globalAlpha=.25;for(f.strokeStyle="rgb(0,0,0)";q<s.length;++q){var u=s[q],w=u.creationTs;if(w>e)break;var t=u.selected?u.colorId+b:u.colorId,u=u.deletionTs==
+Number.MAX_VALUE?e:u.deletionTs;f.fillStyle=d[t];f.fillRect(w,g,u-w,h-2*g)}f.globalAlpha=1;f.restore();g=this.objectSnapshots_;for(q=base.findLowIndexInSortedArray(g,function(a){return a.ts+p},a);q<g.length;++q){h=g[q];w=h.ts;if(w-p>e)break;w=m.xWorldToView(w);t=h.selected?h.objectInstance.colorId+b:h.objectInstance.colorId;f.fillStyle=d[t];f.beginPath();f.arc(w,k,n,0,l);f.fill();h.selected?(f.lineWidth=5,f.strokeStyle="rgb(100,100,0)",f.stroke(),f.beginPath(),f.arc(w,k,n-1,0,l),f.lineWidth=2,f.strokeStyle=
 "rgb(255,255,0)"):(f.lineWidth=1,f.strokeStyle="rgb(0,0,0)");f.stroke()}f.lineWidth=1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,g){function h(a){g.addObjectInstance(k,a)}var k=this,l=!1,m=d*this.snapshotRadiusView;base.iterateOverIntersectingIntervals(this.objectSnapshots_,function(a){return a.ts-m},function(a){return 2*m},a,b,function(a){g.addObjectSnapshot(k,a);l=!0});l||base.iterateOverIntersectingIntervals(this.objectInstances_,function(a){return a.creationTs},function(a){return a.deletionTs-
 a.creationTs},a,b,h)},addItemNearToProvidedHitToSelection:function(a,b,d){if(a instanceof tracing.SelectionObjectSnapshotHit){if(a=this.objectSnapshots_.indexOf(a.objectSnapshot),b=a+b,0<=b&&b<this.objectSnapshots_.length)return d.addObjectSnapshot(this,this.objectSnapshots_[b]),!0}else if(a instanceof tracing.SelectionObjectInstanceHit){if(a=this.objectInstances_.indexOf(a.objectInstance),b=a+b,0<=b&&b<this.objectInstances_.length)return d.addObjectInstance(this,this.objectInstances_[b]),!0}else throw Error("Unrecognized hit");
 return!1},addAllObjectsMatchingFilterToSelection:function(a,b){}};a.typeNameToTrackConstructorMap={};a.register=function(b,e){if(a.typeNameToTrackConstructorMap[b])throw Error("Handler already registered for "+b);a.typeNameToTrackConstructorMap[b]=e};a.getTrackConstructor=function(b){return a.typeNameToTrackConstructorMap[b]};return{ObjectInstanceTrack:a}});"use strict";base.requireStylesheet("tcmalloc.heap_instance_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.heading_track");
 base.require("tracing.tracks.object_instance_track");base.require("tracing.color_scheme");base.require("ui");
 base.exportTo("tcmalloc",function(){var d=tracing.getColorPalette(),b=tracing.getColorPaletteHighlightIdBoost(),a=ui.define("heap-instance-track",tracing.tracks.HeadingTrack);a.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("heap-instance-track");this.objectInstance_=null},set objectInstances(a){if(a){if(1!=a.length)throw Error("Bad object instance count.");this.objectInstance_=a[0];this.maxBytes_=
 this.computeMaxBytes_(this.objectInstance_.snapshots)}else this.objectInstance_=[]},computeMaxBytes_:function(a){for(var b=0,d=0;d<a.length;d++){for(var g=a[d],h=Object.keys(g.heap_.children),k=0,l=0;l<h.length;l++)k+=g.heap_.children[h[l]].currentBytes;k>b&&(b=k)}return b},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},draw:function(a,b,d){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,d)}},drawSlices_:function(a,e){var f=this.context(),
-g=window.devicePixelRatio||1,h=this.getBoundingClientRect(),k=h.width*g,g=h.height*g,h=this.viewport,l=this.maxBytes_,m=this.objectInstance_.snapshots,n=base.findLowIndexInSortedArray(m,function(a){return a.ts},a);for(0<n&&(n-=1);n<m.length;++n){var p=m[n],q=p.ts;if(q>e)break;q=h.xWorldToView(q);0>q&&(q=0);var t=h.xWorldToView(n<m.length-1?m[n+1].ts:m[m.length-1].ts+5E3);t>k&&(t=k);for(var q=Math.floor(q),t=Math.floor(t),v=g,w=Object.keys(p.heap_.children),s=w.length-1;0<=s;s--){var r=p.heap_.children[w[s]];
-f.fillStyle=this.objectInstance_.selectedTraces&&0<this.objectInstance_.selectedTraces.length&&this.objectInstance_.selectedTraces[0]==w[s]?"rgb(239, 248, 206)":d[(p.selected?p.objectInstance.colorId+b:p.objectInstance.colorId)+s];r=g*r.currentBytes/l;f.fillRect(q,v-r,Math.max(t-q,1),r);v-=r}}f.lineWidth=1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,g){var h=this;base.iterateOverIntersectingIntervals(this.objectInstance_.snapshots,function(a){return a.ts},function(a){return 5E3},
+g=window.devicePixelRatio||1,h=this.getBoundingClientRect(),k=h.width*g,g=h.height*g,h=this.viewport,l=this.maxBytes_,m=this.objectInstance_.snapshots,n=base.findLowIndexInSortedArray(m,function(a){return a.ts},a);for(0<n&&--n;n<m.length;++n){var p=m[n],q=p.ts;if(q>e)break;q=h.xWorldToView(q);0>q&&(q=0);var s=h.xWorldToView(n<m.length-1?m[n+1].ts:m[m.length-1].ts+5E3);s>k&&(s=k);for(var q=Math.floor(q),s=Math.floor(s),u=g,w=Object.keys(p.heap_.children),t=w.length-1;0<=t;t--){var r=p.heap_.children[w[t]];
+f.fillStyle=this.objectInstance_.selectedTraces&&0<this.objectInstance_.selectedTraces.length&&this.objectInstance_.selectedTraces[0]==w[t]?"rgb(239, 248, 206)":d[(p.selected?p.objectInstance.colorId+b:p.objectInstance.colorId)+t];r=g*r.currentBytes/l;f.fillRect(q,u-r,Math.max(s-q,1),r);u-=r}}f.lineWidth=1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,g){var h=this;base.iterateOverIntersectingIntervals(this.objectInstance_.snapshots,function(a){return a.ts},function(a){return 5E3},
 a,b,function(a){g.addObjectSnapshot(h,a)})},addItemNearToProvidedHitToSelection:function(a,b,d){if(a instanceof tracing.SelectionObjectSnapshotHit){var g=this.objectInstance_.snapshots;a=g.indexOf(a.objectSnapshot)+b;if(0<=a&&a<g.length)return d.addObjectSnapshot(this,g[a]),!0}else throw Error("Unrecognized hit");return!1},addAllObjectsMatchingFilterToSelection:function(a,b){}};tracing.tracks.ObjectInstanceTrack.register("memory::Heap",a);return{HeapInstanceTrack:a}});"use strict";base.requireStylesheet("tracing.tracks.counter_track");
 base.require("tracing.tracks.heading_track");base.require("tracing.color_scheme");base.require("ui");
 base.exportTo("tracing.tracks",function(){var d=tracing.getColorPalette(),b=ui.define("counter-track",tracing.tracks.HeadingTrack);b.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("counter-track");this.selectedSamples_={};this.categoryFilter_=new tracing.Filter},decorateHit:function(a){},get counter(){return this.counter_},set counter(a){this.counter_=a;this.heading=a.name+": "},get categoryFilter(){return this.categoryFilter_},
 set categoryFilter(a){this.categoryFilter_=a},get selectedSamples(){return this.selectedSamples_},draw:function(a,b,e){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,e)}},drawSlices_:function(a,b){var e=this.context(),f=window.devicePixelRatio||1,f=this.getBoundingClientRect().height*f,g=this.counter_,h=this.viewport,k=h.xViewVectorToWorld(1),l=h.xViewVectorToWorld(1);e.save();h.applyTransformToCanvas(e);for(var h=g.numSeries,m=g.numSamples,n=base.findLowIndexInSortedArray(g.timestamps,
-function(a){return a},a),n=0<n-1?n-1:0,p=f/g.maxTotal,q=g.numSeries-1;0<=q;q--){e.fillStyle=d[g.series[q].color];e.beginPath();for(var t=n-1,v=0<=t?g.timestamps[t]-l:-1,w=f,s=!1;;){var r=t+1;if(r>=m){e.lineTo(v,w);e.lineTo(v+8*k,w);e.lineTo(v+8*k,f);break}var u=g.timestamps[r],x=g.totals[r*h+q],x=f-p*x;if(u>b){e.lineTo(u,w);e.lineTo(u,f);break}if(r+1<m&&(t=g.timestamps[r+1],t-v<=l&&t<b)){t=r;continue}s||(e.moveTo(a,f),s=!0);u-v<l&&(u=v+l);e.lineTo(u,w);e.lineTo(u,x);t=r;v=u;w=x}e.closePath();e.fill()}e.fillStyle=
-"rgba(255, 0, 0, 1)";for(r in this.selectedSamples_)if(this.selectedSamples_[r])for(u=g.timestamps[r],q=g.numSeries-1;0<=q;q--)x=g.totals[r*h+q],x=f-p*x,e.fillRect(u-k,x-1,3*k,3);e.restore()},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,e,d){function g(a,b){return b===h.timestamps.length-1?0:h.timestamps[b+1]-h.timestamps[b]}var h=this.counter_;a=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},g,a);for(b=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},
+function(a){return a},a),n=0<n-1?n-1:0,p=f/g.maxTotal,q=g.numSeries-1;0<=q;q--){e.fillStyle=d[g.series[q].color];e.beginPath();for(var s=n-1,u=0<=s?g.timestamps[s]-l:-1,w=f,t=!1;;){s+=1;if(s>=m){e.lineTo(u,w);e.lineTo(u+8*k,w);e.lineTo(u+8*k,f);break}var r=g.timestamps[s],v=g.totals[s*h+q],v=f-p*v;if(r>b){e.lineTo(r,w);e.lineTo(r,f);break}if(s+1<m){var x=g.timestamps[s+1];if(x-u<=l&&x<b)continue}t||(e.moveTo(a,f),t=!0);r-u<l&&(r=u+l);e.lineTo(r,w);e.lineTo(r,v);u=r;w=v}e.closePath();e.fill()}e.fillStyle=
+"rgba(255, 0, 0, 1)";for(s in this.selectedSamples_)if(this.selectedSamples_[s])for(r=g.timestamps[s],q=g.numSeries-1;0<=q;q--)v=g.totals[s*h+q],v=f-p*v,e.fillRect(r-k,v-1,3*k,3);e.restore()},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,e,d){function g(a,b){return b===h.timestamps.length-1?0:h.timestamps[b+1]-h.timestamps[b]}var h=this.counter_;a=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},g,a);for(b=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},
 g,b);a<=b;a++)0>a||a>=h.timestamps.length||(e=d.addCounterSample(this,this.counter,a),this.decorateHit(e))},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{CounterTrack:b}});"use strict";base.requireStylesheet("tracing.tracks.spacing_track");base.require("tracing.tracks.heading_track");
 base.exportTo("tracing.tracks",function(){var d=ui.define("spacing-track",tracing.tracks.HeadingTrack);d.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(b){tracing.tracks.HeadingTrack.prototype.decorate.call(this,b);this.classList.add("spacing-track")},draw:function(b,a,c){},addAllObjectsMatchingFilterToSelection:function(b,a){}};return{SpacingTrack:d}});"use strict";base.require("base.sorted_array_utils");base.require("tracing.tracks.container_track");base.require("ui");
 base.exportTo("tracing.tracks",function(){var d=ui.define("slice-group-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("slice-group-track");this.heading_=this.tooltip_=""},get group(){return this.group_},set group(b){this.group_=b;this.updateContents_()},get heading(){return this.heading_},set heading(b){this.heading_=b;this.updateContents_()},
@@ -451,8 +456,8 @@
 this.thread_.cpuSlices&&(b=new tracing.tracks.SliceTrack(this.viewport),b.categoryFilter=this.categoryFilter,b.heading="",b.height="4px",b.decorateHit=function(a){a.thread=this.thread_},b.slices=this.thread_.cpuSlices,b.hasVisibleContent&&this.appendChild(b));this.thread_.sliceGroup.length&&(b=new tracing.tracks.SliceGroupTrack(this.viewport),b.categoryFilter=this.categoryFilter,b.heading=this.thread_.userFriendlyName,b.tooltip=this.thread_.userFriendlyDetails,b.decorateHit=function(a){a.thread=this.thread_},
 b.group=this.thread_.sliceGroup,b.hasVisibleContent&&this.appendChild(b))}},collapsedDidChange:function(b){if(b){b=parseInt(this.tracks[0].height);for(var a=0;a<this.tracks.length;++a)2<b?this.tracks[a].height=Math.floor(b)+"px":this.tracks[a].style.display="none",b*=.5}else for(a=0;a<this.tracks.length;++a)this.tracks[a].height=this.tracks[0].height,this.tracks[a].style.display=""}};return{ThreadTrack:d}});"use strict";base.require("ui");base.require("base.settings");
 base.exportTo("ui",function(){function d(a){var b=document.createElement("span");a&&(a.className&&(b.className=a.className),a.textContent&&(b.textContent=a.textContent),a.parent&&a.parent.appendChild(b));return b}var b=1;return{createSpan:d,createDiv:function(a){var b=document.createElement("div");a&&(a.className&&(b.className=a.className),a.parent&&a.parent.appendChild(b));return b},createScopedStyle:function(a){var b=document.createElement("style");b.scoped=!0;b.innerHTML=a;return b},createSelector:function(a,
-b,e,d,g){function h(d){d=n.selectedOptions[0].targetPropertyValue;base.Settings.set(e,d);a[b]=d}for(var k,l=0;l<g.length;l++){var m=g[l];if(m.value==d){k=l;break}}if(void 0===k)throw Error("defaultValue must be in the items list");var n=document.createElement("select");n.addEventListener("change",h);for(l=0;l<g.length;l++){var m=g[l],p=document.createElement("option");p.textContent=m.label;p.targetPropertyValue=m.value;n.appendChild(p)}a.__lookupSetter__("selectedIndex");n.__defineGetter__("selectedValue",
-function(a){return n.children[n.selectedIndex].targetPropertyValue});n.__defineSetter__("selectedValue",function(a){for(var b=0;b<n.children.length;b++)if(n.children[b].targetPropertyValue==a){n.selectedIndex=b;h();return}throw Error("Not a valid value");});g=base.Settings.get(e,d);m=!1;for(l=0;l<n.children.length;l++)if(n.children[l].targetPropertyValue==g){m=!0;a[b]=g;n.selectedIndex=l;break}m||(n.selectedIndex=k,a[b]=d);return n},createCheckBox:function(a,c,e,f,g){function h(){base.Settings.set(e,
+b,d,f,g){function h(f){f=n.selectedOptions[0].targetPropertyValue;base.Settings.set(d,f);a[b]=f}for(var k,l=0;l<g.length;l++){var m=g[l];if(m.value==f){k=l;break}}if(void 0===k)throw Error("defaultValue must be in the items list");var n=document.createElement("select");n.addEventListener("change",h);for(l=0;l<g.length;l++){var m=g[l],p=document.createElement("option");p.textContent=m.label;p.targetPropertyValue=m.value;n.appendChild(p)}a.__lookupSetter__("selectedIndex");n.__defineGetter__("selectedValue",
+function(a){return n.children[n.selectedIndex].targetPropertyValue});n.__defineSetter__("selectedValue",function(a){for(var b=0;b<n.children.length;b++)if(n.children[b].targetPropertyValue==a){n.selectedIndex=b;h();return}throw Error("Not a valid value");});g=base.Settings.get(d,f);m=!1;for(l=0;l<n.children.length;l++)if(n.children[l].targetPropertyValue==g){m=!0;a[b]=g;n.selectedIndex=l;break}m||(n.selectedIndex=k,a[b]=f);return n},createCheckBox:function(a,c,e,f,g){function h(){base.Settings.set(e,
 k.checked);a[c]=k.checked}var k=document.createElement("input");k.type="checkbox";f=base.Settings.get(e,f);k.checked=!!f;a[c]=f;k.addEventListener("change",h);f="#checkbox-"+b++;var l=d({className:"labeled-checkbox"});k.setAttribute("id",f);var m=document.createElement("label");m.textContent=g;m.setAttribute("for",f);l.appendChild(k);l.appendChild(m);l.__defineSetter__("checked",function(a){k.checked=!!a;h()});l.__defineGetter__("checked",function(){return k.checked});return l}}});"use strict";base.require("tcmalloc.heap_instance_track");
 base.require("tracing.analysis.object_snapshot_view");base.require("tracing.analysis.object_instance_view");base.require("tracing.tracks.container_track");base.require("tracing.tracks.counter_track");base.require("tracing.tracks.object_instance_track");base.require("tracing.tracks.spacing_track");base.require("tracing.tracks.thread_track");base.require("tracing.trace_model_settings");base.require("tracing.filter");base.require("ui");base.require("ui.dom_helpers");base.requireStylesheet("tracing.tracks.process_track_base");
 base.exportTo("tracing.tracks",function(){var d=tracing.analysis.ObjectSnapshotView,b=tracing.analysis.ObjectInstanceView,a=tracing.TraceModelSettings,c=tracing.tracks.SpacingTrack,e=ui.define("process-track-base",tracing.tracks.ContainerTrack);e.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(a){tracing.tracks.ContainerTrack.prototype.decorate.call(this,a);this.processBase_=void 0;this.classList.add("process-track-base");this.classList.add("expanded");this.expandEl_=
@@ -463,10 +468,10 @@
 !n||g.push(q))}0!==g.length&&(c=tracing.tracks.ObjectInstanceTrack.getTrackConstructor(c),c||(c=tracing.tracks.ObjectInstanceTrack),c=new c(this.viewport),c.categoryFilter=this.categoryFilter_,c.objectInstances=g,this.appendChild(c),h=!0)},this);h&&this.appendChild(new c(this.viewport))},appendCounterTracks_:function(){var a=base.dictionaryValues(this.processBase.counters).filter(this.categoryFilter.matchCounter,this.categoryFilter);a.sort(tracing.trace_model.Counter.compare);a.forEach(function(a){var b=
 new tracing.tracks.CounterTrack(this.viewport);b.categoryFilter=this.categoryFilter_;b.counter=a;this.appendChild(b);this.appendChild(new c(this.viewport))}.bind(this))},appendThreadTracks_:function(){var a=base.dictionaryValues(this.processBase.threads).filter(function(a){return this.categoryFilter_.matchThread(a)},this);a.sort(tracing.trace_model.Thread.compare);a.forEach(function(a){var b=new tracing.tracks.ThreadTrack(this.viewport);b.categoryFilter=this.categoryFilter_;b.thread=a;b.hasVisibleContent&&
 (this.appendChild(b),this.appendChild(new c(this.viewport)))}.bind(this))}};return{ProcessTrackBase:e}});"use strict";base.require("tracing.tracks.process_track_base");base.require("tracing.tracks.cpu_track");base.require("tracing.tracks.spacing_track");
-base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=tracing.tracks.SpacingTrack,a=ui.define("kernel-track",d);a.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},set kernel(a){this.processBase=a},get kernel(){return this.processBase},willAppendTracks_:function(){var a=this.categoryFilter,e=base.dictionaryValues(this.kernel.cpus);e.sort(tracing.trace_model.Cpu.compare);for(var d=!1,g=0;g<e.length;++g){var h=
-e[g];if(!a.matchCpu(h))return;var k=new tracing.tracks.CpuTrack(this.viewport);k.categoryFilter=a;k.cpu=h;k.hasVisibleContent&&(this.appendChild(k),d=!0)}d&&this.appendChild(new b(this.viewport))}};return{KernelTrack:a}});"use strict";base.require("tracing.tracks.process_track_base");
-base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=ui.define("process-track",d);b.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},drawTrack:function(a){switch(a){case tracing.tracks.DrawType.INSTANT_EVENT:if(!this.processBase.instantEvents||0===this.processBase.instantEvents.length)break;var b=this.context();if(void 0===b)break;b.save();var e=this.setupCanvasForDraw_();this.drawInstantEvents_(this.processBase.instantEvents,
-e.left,e.right);b.restore()}tracing.tracks.ContainerTrack.prototype.drawTrack.call(this,a)},set process(a){this.processBase=a},get process(){return this.processBase},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,e,d){base.iterateOverIntersectingIntervals(this.processBase.instantEvents,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=d.addSlice(this,a);this.decorateHit(a)}.bind(this));tracing.tracks.ContainerTrack.prototype.addIntersectingItemsInRangeToSelectionInWorldSpace.apply(this,
+base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=tracing.tracks.SpacingTrack,a=ui.define("kernel-track",d);a.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},set kernel(a){this.processBase=a},get kernel(){return this.processBase},willAppendTracks_:function(){var a=this.categoryFilter,d=base.dictionaryValues(this.kernel.cpus);d.sort(tracing.trace_model.Cpu.compare);for(var f=!1,g=0;g<d.length;++g){var h=
+d[g];if(!a.matchCpu(h))return;var k=new tracing.tracks.CpuTrack(this.viewport);k.categoryFilter=a;k.cpu=h;k.hasVisibleContent&&(this.appendChild(k),f=!0)}f&&this.appendChild(new b(this.viewport))}};return{KernelTrack:a}});"use strict";base.require("tracing.tracks.process_track_base");
+base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=ui.define("process-track",d);b.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},drawTrack:function(a){switch(a){case tracing.tracks.DrawType.INSTANT_EVENT:if(!this.processBase.instantEvents||0===this.processBase.instantEvents.length)break;var b=this.context();if(void 0===b)break;b.save();var d=this.setupCanvasForDraw_();this.drawInstantEvents_(this.processBase.instantEvents,
+d.left,d.right);b.restore()}tracing.tracks.ContainerTrack.prototype.drawTrack.call(this,a)},set process(a){this.processBase=a},get process(){return this.processBase},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,f){base.iterateOverIntersectingIntervals(this.processBase.instantEvents,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=f.addSlice(this,a);this.decorateHit(a)}.bind(this));tracing.tracks.ContainerTrack.prototype.addIntersectingItemsInRangeToSelectionInWorldSpace.apply(this,
 arguments)}};return{ProcessTrack:b}});"use strict";base.requireStylesheet("tracing.tracks.trace_model_track");base.require("base.measuring_stick");base.require("tracing.tracks.container_track");base.require("tracing.tracks.kernel_track");base.require("tracing.tracks.process_track");base.require("ui");
 base.exportTo("tracing.tracks",function(){var d=ui.define("trace-model-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("model-track")},detach:function(){tracing.tracks.ContainerTrack.prototype.detach.call(this)},get model(){return this.model_},set model(b){this.model_=b;this.updateContents_()},get hasVisibleContent(){return 0<this.children.length},
 applyCategoryFilter_:function(){this.updateContents_()},updateContents_:function(){this.textContent="";if(this.model_&&this.categoryFilter){var b=this.categoryFilter;this.appendKernelTrack_();var a=this.model_.getAllProcesses();a.sort(tracing.trace_model.Process.compare);for(var c=0;c<a.length;++c){var d=a[c];if(!b.matchProcess(d))break;var f=new tracing.tracks.ProcessTrack(this.viewport);f.categoryFilter=b;f.process=d;f.hasVisibleContent&&this.appendChild(f)}}},appendKernelTrack_:function(){if(this.categoryFilter.matchProcess(this.model.kernel)){var b=
diff --git a/trace-viewer/src/tracing/importer/linux_perf/disk_parser.js b/trace-viewer/src/tracing/importer/linux_perf/disk_parser.js
index 5f70786..4081768 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/disk_parser.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/disk_parser.js
@@ -20,10 +20,22 @@
   function DiskParser(importer) {
     Parser.call(this, importer);
 
+    importer.registerEventHandler('f2fs_write_begin',
+        DiskParser.prototype.f2fsWriteBeginEvent.bind(this));
+    importer.registerEventHandler('f2fs_write_end',
+        DiskParser.prototype.f2fsWriteEndEvent.bind(this));
+    importer.registerEventHandler('f2fs_sync_file_enter',
+        DiskParser.prototype.f2fsSyncFileEnterEvent.bind(this));
+    importer.registerEventHandler('f2fs_sync_file_exit',
+        DiskParser.prototype.f2fsSyncFileExitEvent.bind(this));
     importer.registerEventHandler('ext4_sync_file_enter',
         DiskParser.prototype.ext4SyncFileEnterEvent.bind(this));
     importer.registerEventHandler('ext4_sync_file_exit',
         DiskParser.prototype.ext4SyncFileExitEvent.bind(this));
+    importer.registerEventHandler('ext4_da_write_begin',
+        DiskParser.prototype.ext4WriteBeginEvent.bind(this));
+    importer.registerEventHandler('ext4_da_write_end',
+        DiskParser.prototype.ext4WriteEndEvent.bind(this));
     importer.registerEventHandler('block_rq_issue',
         DiskParser.prototype.blockRqIssueEvent.bind(this));
     importer.registerEventHandler('block_rq_complete',
@@ -68,6 +80,114 @@
     /**
      * Parses events and sets up state in the importer.
      */
+    f2fsWriteBeginEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
+      var event = /dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), flags = (\d+)/.
+          exec(eventBase.details);
+      if (!event)
+        return false;
+      var device = event[1];
+      var inode = parseInt(event[2]);
+      var pos = parseInt(event[3]);
+      var len = parseInt(event[4]);
+      var key = device + '-' + inode + '-' + pos + '-' + len;
+      this.openAsyncSlice(ts, "f2fs", eventBase.threadName, eventBase.pid,
+          key, "f2fs_write");
+      return true;
+    },
+
+    f2fsWriteEndEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
+      var event = /dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), copied = (\d+)/.
+          exec(eventBase.details);
+      if (!event)
+        return false;
+
+      var device = event[1];
+      var inode = parseInt(event[2]);
+      var pos = parseInt(event[3]);
+      var len = parseInt(event[4]);
+      var error = parseInt(event[5]) !== len;
+      var key = device + '-' + inode + '-' + pos + '-' + len;
+      this.closeAsyncSlice(ts, 'f2fs', eventBase.threadName, eventBase.pid,
+          key, {
+            device: device,
+            inode: inode,
+            error: error
+          });
+      return true;
+    },
+
+    ext4WriteBeginEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
+      var event = /dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) flags (\d+)/.
+          exec(eventBase.details);
+      if (!event)
+        return false;
+      var device = event[1];
+      var inode = parseInt(event[2]);
+      var pos = parseInt(event[3]);
+      var len = parseInt(event[4]);
+      var key = device + '-' + inode + '-' + pos + '-' + len;
+      this.openAsyncSlice(ts, "ext4", eventBase.threadName, eventBase.pid,
+          key, "ext4_write");
+      return true;
+    },
+
+    ext4WriteEndEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
+      var event = /dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) copied (\d+)/.
+          exec(eventBase.details);
+      if (!event)
+        return false;
+
+      var device = event[1];
+      var inode = parseInt(event[2]);
+      var pos = parseInt(event[3]);
+      var len = parseInt(event[4]);
+      var error = parseInt(event[5]) !== len;
+      var key = device + '-' + inode + '-' + pos + '-' + len;
+      this.closeAsyncSlice(ts, 'ext4', eventBase.threadName, eventBase.pid,
+          key, {
+            device: device,
+            inode: inode,
+            error: error
+          });
+      return true;
+    },
+
+    f2fsSyncFileEnterEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
+      var event = new RegExp(
+          'dev = \\((\\d+,\\d+)\\), ino = (\\d+), pino = (\\d+), i_mode = (\\S+), ' +
+          'i_size = (\\d+), i_nlink = (\\d+), i_blocks = (\\d+), i_advise = (\\d+)').
+          exec(eventBase.details);
+      if (!event)
+        return false;
+
+      var device = event[1];
+      var inode = parseInt(event[2]);
+      var key = device + '-' + inode;
+      this.openAsyncSlice(ts, 'f2fs', eventBase.threadName, eventBase.pid,
+          key, 'fsync');
+      return true;
+    },
+
+    f2fsSyncFileExitEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
+      var event = new RegExp('dev = \\((\\d+,\\d+)\\), ino = (\\d+), checkpoint is (\\S+), ' +
+          'datasync = (\\d+), ret = (\\d+)').
+          exec(eventBase.details.replace("not needed", "not_needed"));
+      if (!event)
+        return false;
+
+      var device = event[1];
+      var inode = parseInt(event[2]);
+      var error = parseInt(event[5]);
+      var key = device + '-' + inode;
+      this.closeAsyncSlice(ts, 'f2fs', eventBase.threadName, eventBase.pid,
+          key, {
+            device: device,
+            inode: inode,
+            error: error
+          });
+      return true;
+    },
+
     ext4SyncFileEnterEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
       var event = /dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.
           exec(eventBase.details);
diff --git a/trace-viewer/src/tracing/importer/linux_perf/disk_parser_test.js b/trace-viewer/src/tracing/importer/linux_perf/disk_parser_test.js
index f6717fb..ea746e4 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/disk_parser_test.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/disk_parser_test.js
@@ -13,6 +13,11 @@
       // NB: spliced from different traces; mismatched timestamps don't matter
       'AsyncTask #2-18830 [000] ...1 154578.668286: ext4_sync_file_enter: ' +
           'dev 259,1 ino 81993 parent 81906 datasync 1',
+      'Binder_A-3179 [001] ...1  1354.510088: f2fs_sync_file_enter: ' +
+          'dev = (259,14), ino = 4882, pino = 313, i_mode = 0x81b0, i_size = ' +
+          '25136, i_nlink = 1, i_blocks = 8, i_advise = 0x0',
+      'Binder_A-3179 [001] ...1  1354.514013: f2fs_sync_file_exit: ' +
+          'dev = (259,14), ino = 4882, checkpoint is not needed, datasync = 1, ret = 0',
       'mmcqd/0-81    [000] d..2 154578.668390: block_rq_issue: ' +
           '179,0 WS 0 () 3427120 + 16 [mmcqd/0]',
       'mmcqd/0-81    [000] d..2 154578.669181: block_rq_complete: ' +
@@ -30,13 +35,20 @@
       'mmcqd/0-81    [000] d..2 154578.877345: block_rq_complete: ' +
           '179,0 R () 3255256 + 8 [0]',
       'mmcqd/0-81    [000] d..2 154578.877466: block_rq_complete: ' +
-          '179,0 R () 3255288 + 8 [0]'
+          '179,0 R () 3255288 + 8 [0]',
+      'ContactsProvide-1184 [000] ...1 66.613719: f2fs_write_begin: ' +
+          'dev = (253,2), ino = 3342, pos = 0, len = 75, flags = 0',
+      'ContactsProvide-1184 [000] ...1 66.613733: f2fs_write_end: ' +
+          'dev = (253,2), ino = 3342, pos = 0, len = 75, copied = 75'
     ];
     var m = new tracing.TraceModel(lines.join('\n'), false);
-    assertEquals(0, m.importErrors.length);
+    assertFalse(m.hasImportWarnings);
 
     var blockThread = undefined;
     var ext4Thread = undefined;
+    var f2fsSyncThread = undefined;
+    var f2fsWriteThread = undefined;
+
     m.getAllThreads().forEach(function(t) {
       switch (t.name) {
         case 'block:mmcqd/0':
@@ -45,15 +57,23 @@
         case 'ext4:AsyncTask #2':
           ext4Thread = t;
           break;
+        case 'f2fs:Binder_A':
+          f2fsSyncThread = t;
+          break;
+        case 'f2fs:ContactsProvide':
+          f2fsWriteThread = t;
+          break;
         default:
           throw new unittest.TestError('Unexpected thread named ' + t.name);
       }
     });
+
     assertNotUndefined(blockThread);
     assertNotUndefined(ext4Thread);
+    assertNotUndefined(f2fsSyncThread);
+    assertNotUndefined(f2fsWriteThread);
 
     assertEquals(4, blockThread.asyncSliceGroup.length);
-
     var slice = blockThread.asyncSliceGroup.slices[0];
     assertEquals('block', slice.category);
     assertEquals('write sync', slice.title);
@@ -61,7 +81,6 @@
     assertEquals(0, slice.args.error);
     assertEquals(16, slice.args.numSectors);
     assertEquals(3427120, slice.args.sector);
-
     assertEquals(1, ext4Thread.asyncSliceGroup.length);
 
     slice = ext4Thread.asyncSliceGroup.slices[0];
@@ -70,5 +89,21 @@
     assertEquals('259,1', slice.args.device);
     assertEquals(0, slice.args.error);
     assertEquals(81993, slice.args.inode);
+    assertEquals(1, f2fsSyncThread.asyncSliceGroup.length);
+
+    slice = f2fsSyncThread.asyncSliceGroup.slices[0];
+    assertEquals('f2fs', slice.category);
+    assertEquals('fsync', slice.title);
+    assertEquals('259,14', slice.args.device);
+    assertEquals(0, slice.args.error);
+    assertEquals(4882, slice.args.inode);
+    assertEquals(1, f2fsWriteThread.asyncSliceGroup.length);
+
+    slice = f2fsWriteThread.asyncSliceGroup.slices[0];
+    assertEquals('f2fs', slice.category);
+    assertEquals('f2fs_write', slice.title);
+    assertEquals('253,2', slice.args.device);
+    assertEquals(3342, slice.args.inode);
+    assertEquals(false, slice.args.error);
   });
 });