@workflow/web-shared 5.0.0-beta.37 → 5.0.0-beta.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +10 -10
- package/dist/components/index.d.ts +4 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +4 -5
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +32 -8
- package/dist/components/sidebar/attributes-block.js +3 -3
- package/dist/components/sidebar/copyable-data-block.js +2 -2
- package/dist/components/sidebar/entity-detail-panel.js +3 -3
- package/dist/components/sidebar/events-list.js +2 -2
- package/dist/components/stream-viewer-skeleton.d.ts +2 -0
- package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/stream-viewer-skeleton.js +12 -0
- package/dist/components/stream-viewer.d.ts +1 -1
- package/dist/components/stream-viewer.d.ts.map +1 -1
- package/dist/components/stream-viewer.js +9 -26
- package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/copy-button.js +27 -0
- package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
- package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel.js +122 -0
- package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/draggable-border.js +140 -0
- package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/event-list.js +47 -0
- package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
- package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
- package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/minimap.js +337 -0
- package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/pane-constants.js +16 -0
- package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/span-markers.js +85 -0
- package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/split-pane.js +41 -0
- package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/timeline.js +321 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
- package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/use-element-width.js +25 -0
- package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/use-row-window.js +107 -0
- package/dist/components/trace-viewer/context.d.ts +14 -182
- package/dist/components/trace-viewer/context.d.ts.map +1 -1
- package/dist/components/trace-viewer/context.js +44 -351
- package/dist/components/trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/trace-viewer/icons.js +15 -0
- package/dist/components/trace-viewer/search.d.ts.map +1 -0
- package/dist/components/trace-viewer/search.js +134 -0
- package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
- package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +306 -356
- package/dist/components/trace-viewer/types.d.ts +2 -211
- package/dist/components/trace-viewer/types.d.ts.map +1 -1
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/trace-viewer/utils.js +430 -0
- package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +3 -3
- package/dist/components/trace-viewer.d.ts.map +1 -0
- package/dist/components/trace-viewer.js +21 -0
- package/dist/components/ui/alert.js +2 -2
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +3 -3
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/card.js +3 -3
- package/dist/components/ui/error-card.js +2 -2
- package/dist/components/ui/error-stack-block.js +4 -4
- package/dist/components/ui/kbd.js +3 -3
- package/dist/components/ui/timestamp-tooltip.js +3 -3
- package/dist/components/workflow-traces/trace-span-construction.d.ts +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +1 -1
- package/dist/lib/trace-builder.d.ts +1 -1
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +1 -1
- package/dist/lib/trace-types.d.ts +54 -0
- package/dist/lib/trace-types.d.ts.map +1 -0
- package/dist/lib/trace-types.js +2 -0
- package/package.json +6 -6
- package/src/components/event-list-view.tsx +12 -9
- package/src/components/index.ts +4 -5
- package/src/components/sidebar/attribute-panel.tsx +46 -8
- package/src/components/sidebar/attributes-block.tsx +2 -2
- package/src/components/sidebar/copyable-data-block.tsx +1 -1
- package/src/components/sidebar/entity-detail-panel.tsx +3 -3
- package/src/components/sidebar/events-list.tsx +1 -1
- package/src/components/stream-viewer-skeleton.tsx +34 -0
- package/src/components/stream-viewer.tsx +34 -106
- package/src/components/{new-trace-viewer → trace-viewer}/components/event-list.tsx +1 -1
- package/src/components/{new-trace-viewer → trace-viewer}/components/minimap.tsx +1 -4
- package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.tsx +2 -5
- package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.tsx +1 -1
- package/src/components/trace-viewer/context.tsx +63 -656
- package/src/components/trace-viewer/trace-viewer.tsx +563 -531
- package/src/components/trace-viewer/types.ts +2 -234
- package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +2 -2
- package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +5 -5
- package/src/components/ui/alert.tsx +1 -1
- package/src/components/ui/button.tsx +3 -3
- package/src/components/ui/card.tsx +2 -9
- package/src/components/ui/error-card.tsx +3 -3
- package/src/components/ui/error-stack-block.tsx +3 -3
- package/src/components/ui/kbd.tsx +2 -2
- package/src/components/ui/timestamp-tooltip.tsx +4 -4
- package/src/components/workflow-traces/trace-span-construction.ts +1 -1
- package/src/lib/trace-builder.ts +1 -1
- package/src/lib/trace-types.ts +56 -0
- package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
- package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/detail-panel-width.js +0 -67
- package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/detail-panel.js +0 -122
- package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/draggable-border.js +0 -140
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.js +0 -47
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
- package/dist/components/new-trace-viewer/components/minimap.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/minimap.js +0 -337
- package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/pane-constants.js +0 -16
- package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/span-markers.js +0 -85
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/split-pane.js +0 -41
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.js +0 -321
- package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +0 -55
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +0 -26
- package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/use-element-width.js +0 -25
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/use-row-window.js +0 -107
- package/dist/components/new-trace-viewer/context.d.ts +0 -17
- package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/context.js +0 -48
- package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/icons.js +0 -15
- package/dist/components/new-trace-viewer/search.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/search.js +0 -134
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -11
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +0 -336
- package/dist/components/new-trace-viewer/types.d.ts +0 -3
- package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/types.js +0 -2
- package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/utils.js +0 -430
- package/dist/components/run-trace-view.d.ts +0 -23
- package/dist/components/run-trace-view.d.ts.map +0 -1
- package/dist/components/run-trace-view.js +0 -11
- package/dist/components/trace-viewer/components/map.d.ts +0 -8
- package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/map.js +0 -162
- package/dist/components/trace-viewer/components/markers.d.ts +0 -23
- package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/markers.js +0 -416
- package/dist/components/trace-viewer/components/node.d.ts +0 -35
- package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/node.js +0 -286
- package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
- package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js +0 -9
- package/dist/components/trace-viewer/components/search.d.ts +0 -3
- package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/search.js +0 -25
- package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
- package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js +0 -137
- package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
- package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
- package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
- package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js +0 -445
- package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
- package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js +0 -108
- package/dist/components/trace-viewer/components/ui.d.ts +0 -28
- package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/ui.js +0 -39
- package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
- package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js +0 -29
- package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
- package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
- package/dist/components/trace-viewer/index.d.ts +0 -5
- package/dist/components/trace-viewer/index.d.ts.map +0 -1
- package/dist/components/trace-viewer/index.js +0 -4
- package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
- package/dist/components/trace-viewer/util/constants.d.ts +0 -9
- package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/constants.js +0 -9
- package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
- package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
- package/dist/components/trace-viewer/util/tree.d.ts +0 -13
- package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/tree.js +0 -227
- package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
- package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
- package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
- package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
- package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
- package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
- package/dist/components/trace-viewer/worker.d.ts +0 -2
- package/dist/components/trace-viewer/worker.d.ts.map +0 -1
- package/dist/components/trace-viewer/worker.js +0 -109
- package/dist/components/trace-viewer-new.d.ts.map +0 -1
- package/dist/components/trace-viewer-new.js +0 -21
- package/dist/components/workflow-trace-view.d.ts +0 -39
- package/dist/components/workflow-trace-view.d.ts.map +0 -1
- package/dist/components/workflow-trace-view.js +0 -690
- package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
- package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js +0 -86
- package/src/components/new-trace-viewer/context.tsx +0 -93
- package/src/components/new-trace-viewer/trace-viewer.tsx +0 -632
- package/src/components/new-trace-viewer/types.ts +0 -2
- package/src/components/run-trace-view.tsx +0 -80
- package/src/components/trace-viewer/components/map.tsx +0 -226
- package/src/components/trace-viewer/components/markers.tsx +0 -612
- package/src/components/trace-viewer/components/node.tsx +0 -506
- package/src/components/trace-viewer/components/search-input.tsx +0 -52
- package/src/components/trace-viewer/components/search.tsx +0 -47
- package/src/components/trace-viewer/components/span-content.tsx +0 -247
- package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
- package/src/components/trace-viewer/components/span-segments.ts +0 -585
- package/src/components/trace-viewer/components/span-strategies.ts +0 -205
- package/src/components/trace-viewer/components/ui.tsx +0 -156
- package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
- package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
- package/src/components/trace-viewer/index.tsx +0 -4
- package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
- package/src/components/trace-viewer/util/constants.ts +0 -8
- package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
- package/src/components/trace-viewer/util/tree.ts +0 -277
- package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
- package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
- package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
- package/src/components/trace-viewer/worker.ts +0 -131
- package/src/components/workflow-trace-view.tsx +0 -1166
- package/src/components/workflow-traces/trace-colors.ts +0 -112
- package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/draggable-border.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/event-list.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/minimap.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/pane-constants.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/span-markers.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/split-pane.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/use-element-width.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/use-row-window.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/search.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/utils.d.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.test.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel.tsx +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/draggable-border.tsx +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +1 -1
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/pane-constants.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/span-markers.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/split-pane.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/use-element-width.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/use-row-window.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/search.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/utils.test.ts +0 -0
- /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
import { formatDuration, formatDurationPrecise, getHighResInMs, } from '../trace-viewer/util/timing';
|
|
2
|
-
export function computeRootBounds(spans) {
|
|
3
|
-
let minStart = Number.POSITIVE_INFINITY;
|
|
4
|
-
let maxEnd = Number.NEGATIVE_INFINITY;
|
|
5
|
-
for (const span of spans) {
|
|
6
|
-
const s = getHighResInMs(span.startTime);
|
|
7
|
-
const e = getHighResInMs(span.endTime);
|
|
8
|
-
if (s < minStart)
|
|
9
|
-
minStart = s;
|
|
10
|
-
if (e > maxEnd)
|
|
11
|
-
maxEnd = e;
|
|
12
|
-
}
|
|
13
|
-
if (!Number.isFinite(minStart) || !Number.isFinite(maxEnd)) {
|
|
14
|
-
return { startTime: 0, endTime: 1, duration: 1 };
|
|
15
|
-
}
|
|
16
|
-
const duration = Math.max(maxEnd - minStart, 1);
|
|
17
|
-
return { startTime: minStart, endTime: maxEnd, duration };
|
|
18
|
-
}
|
|
19
|
-
export function getSpanDurationMs(span) {
|
|
20
|
-
return Math.max(0, getHighResInMs(span.endTime) - getHighResInMs(span.startTime));
|
|
21
|
-
}
|
|
22
|
-
export function isSpanErrored(span) {
|
|
23
|
-
const workflowStatus = span.attributes.data
|
|
24
|
-
?.status;
|
|
25
|
-
return span.status.code === 2 || workflowStatus === 'failed';
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Clamp a candidate viewport to the root extent. The requested duration is
|
|
29
|
-
* preserved where possible (clamped to [minDurationMs, root duration]), then
|
|
30
|
-
* the window is shifted back inside the root bounds.
|
|
31
|
-
*/
|
|
32
|
-
export function clampViewportToRoot(next, rootStart, rootEnd, minDurationMs) {
|
|
33
|
-
const rootDuration = Math.max(rootEnd - rootStart, minDurationMs);
|
|
34
|
-
const duration = Math.min(rootDuration, Math.max(minDurationMs, next.end - next.start));
|
|
35
|
-
const maxStart = rootEnd - duration;
|
|
36
|
-
const start = Math.min(Math.max(next.start, rootStart), maxStart);
|
|
37
|
-
return { start, end: start + duration };
|
|
38
|
-
}
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
// Wheel gestures — shared between the timeline and the minimap
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
/** Convert a wheel delta to pixel units (line-mode deltas arrive in lines). */
|
|
43
|
-
export function wheelDeltaToPixels(delta, deltaMode) {
|
|
44
|
-
return deltaMode === 1 ? delta * 16 : delta;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Exponential zoom factor for a wheel gesture. Coarse mouse-wheel steps are
|
|
48
|
-
* damped harder than trackpad pinches so both feel similar.
|
|
49
|
-
*/
|
|
50
|
-
export function wheelZoomScaleFactor(event) {
|
|
51
|
-
const dy = wheelDeltaToPixels(event.deltaY, event.deltaMode);
|
|
52
|
-
const isMouseWheel = event.deltaMode === 1 || Math.abs(event.deltaY) >= 50;
|
|
53
|
-
return 2 ** (dy / (isMouseWheel ? 200 : 60));
|
|
54
|
-
}
|
|
55
|
-
const NICE_INTERVALS = [
|
|
56
|
-
1, 2, 5, 10, 20, 50, 100, 200, 500, 1_000, 2_000, 5_000, 10_000, 20_000,
|
|
57
|
-
50_000, 100_000, 200_000, 500_000, 1_000_000, 2_000_000, 5_000_000,
|
|
58
|
-
10_000_000, 20_000_000, 50_000_000, 100_000_000, 200_000_000, 500_000_000,
|
|
59
|
-
1_000_000_000, 2_000_000_000, 5_000_000_000,
|
|
60
|
-
];
|
|
61
|
-
const MAX_MARKERS = 8;
|
|
62
|
-
const MS_IN_SECOND = 1000;
|
|
63
|
-
function pickInterval(viewDuration, maxTicks) {
|
|
64
|
-
for (const interval of NICE_INTERVALS) {
|
|
65
|
-
if (viewDuration / interval <= maxTicks)
|
|
66
|
-
return interval;
|
|
67
|
-
}
|
|
68
|
-
return NICE_INTERVALS[NICE_INTERVALS.length - 1];
|
|
69
|
-
}
|
|
70
|
-
export function computeTimeMarkers(viewDuration, offset) {
|
|
71
|
-
if (viewDuration <= 0)
|
|
72
|
-
return [];
|
|
73
|
-
const maxTicks = 6;
|
|
74
|
-
const interval = pickInterval(viewDuration, maxTicks);
|
|
75
|
-
// Sub-second steps need fractional labels, or ticks past 1s collide as
|
|
76
|
-
// duplicate whole seconds ("…1s, 2s, 2s, 3s"). Scale decimals to the step.
|
|
77
|
-
const fractionDigits = interval >= MS_IN_SECOND
|
|
78
|
-
? 0
|
|
79
|
-
: Math.ceil(-Math.log10(interval / MS_IN_SECOND));
|
|
80
|
-
const firstTick = Math.ceil(offset / interval) * interval;
|
|
81
|
-
const markers = [];
|
|
82
|
-
for (let t = firstTick; t <= offset + viewDuration; t += interval) {
|
|
83
|
-
const position = (t - offset) / viewDuration;
|
|
84
|
-
if (position < -0.01 || position > 1.01)
|
|
85
|
-
continue;
|
|
86
|
-
markers.push({
|
|
87
|
-
position: Math.min(Math.max(position, 0), 1),
|
|
88
|
-
label: fractionDigits === 0
|
|
89
|
-
? formatDuration(Math.abs(t), true)
|
|
90
|
-
: formatDurationPrecise(Math.abs(t), fractionDigits),
|
|
91
|
-
value: t,
|
|
92
|
-
});
|
|
93
|
-
if (markers.length >= MAX_MARKERS)
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
return markers;
|
|
97
|
-
}
|
|
98
|
-
/** Project an absolute time onto the viewport as a clamped [0, 1] fraction. */
|
|
99
|
-
function toViewportFrac(ms, viewStart, range) {
|
|
100
|
-
return Math.min(Math.max((ms - viewStart) / range, 0), 1);
|
|
101
|
-
}
|
|
102
|
-
export function computeSpanGaps(spans, viewStart, viewEnd) {
|
|
103
|
-
const range = viewEnd - viewStart;
|
|
104
|
-
if (range <= 0)
|
|
105
|
-
return [];
|
|
106
|
-
const gaps = [];
|
|
107
|
-
for (let i = 0; i < spans.length - 1; i++) {
|
|
108
|
-
const endTime = getHighResInMs(spans[i].endTime);
|
|
109
|
-
const startTime = getHighResInMs(spans[i + 1].startTime);
|
|
110
|
-
const gapMs = startTime - endTime;
|
|
111
|
-
if (gapMs <= 0)
|
|
112
|
-
continue;
|
|
113
|
-
const leftFrac = toViewportFrac(endTime, viewStart, range);
|
|
114
|
-
const rightFrac = toViewportFrac(startTime, viewStart, range);
|
|
115
|
-
if (rightFrac - leftFrac < 0.001)
|
|
116
|
-
continue;
|
|
117
|
-
gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });
|
|
118
|
-
}
|
|
119
|
-
return gaps;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Measure the temporal delta between an anchor (selected) span and a hovered
|
|
123
|
-
* span for the Alt+hover measurement overlay. Ordering the two spans by start
|
|
124
|
-
* time (E = earlier-starting, L = later-starting), the measurement runs to
|
|
125
|
-
* L's start from E's end when the spans are disjoint ("how long after E ended
|
|
126
|
-
* did L start"), or from E's start when they overlap ("how long after E
|
|
127
|
-
* started did L start"). Fractions are clamped to the viewport like
|
|
128
|
-
* `computeSpanGaps`; `deltaMs` is always the true duration. Returns null when
|
|
129
|
-
* the measurement lies entirely outside the viewport.
|
|
130
|
-
*/
|
|
131
|
-
export function computeSpanDelta(anchor, hovered, viewStart, viewEnd) {
|
|
132
|
-
const range = viewEnd - viewStart;
|
|
133
|
-
if (range <= 0)
|
|
134
|
-
return null;
|
|
135
|
-
const anchorStart = getHighResInMs(anchor.startTime);
|
|
136
|
-
const hoveredStart = getHighResInMs(hovered.startTime);
|
|
137
|
-
const anchorIsEarlier = anchorStart <= hoveredStart;
|
|
138
|
-
const earlierStart = anchorIsEarlier ? anchorStart : hoveredStart;
|
|
139
|
-
const earlierEnd = getHighResInMs(anchorIsEarlier ? anchor.endTime : hovered.endTime);
|
|
140
|
-
const laterStart = anchorIsEarlier ? hoveredStart : anchorStart;
|
|
141
|
-
const originMs = earlierEnd <= laterStart ? earlierEnd : earlierStart;
|
|
142
|
-
const deltaMs = laterStart - originMs;
|
|
143
|
-
// Entirely outside the viewport. Compared in time-space (not clamped
|
|
144
|
-
// fractions) so a zero-delta point sitting exactly on a viewport edge —
|
|
145
|
-
// e.g. the root span selected at default zoom — still renders.
|
|
146
|
-
if (laterStart < viewStart || originMs > viewEnd) {
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
const originFrac = toViewportFrac(originMs, viewStart, range);
|
|
150
|
-
const laterFrac = toViewportFrac(laterStart, viewStart, range);
|
|
151
|
-
const hoveredEnd = getHighResInMs(hovered.endTime);
|
|
152
|
-
return {
|
|
153
|
-
deltaMs,
|
|
154
|
-
anchorFrac: anchorIsEarlier ? originFrac : laterFrac,
|
|
155
|
-
hoveredFrac: anchorIsEarlier ? laterFrac : originFrac,
|
|
156
|
-
anchorEdge: anchorIsEarlier && earlierEnd <= laterStart ? 'end' : 'start',
|
|
157
|
-
hoveredOffscreen: hoveredStart > viewEnd ? 'right' : hoveredEnd < viewStart ? 'left' : null,
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
// ---------------------------------------------------------------------------
|
|
161
|
-
// Resource colors
|
|
162
|
-
// ---------------------------------------------------------------------------
|
|
163
|
-
export const RESOURCE_COLORS = {
|
|
164
|
-
run: {
|
|
165
|
-
bg: 'var(--ds-blue-200)',
|
|
166
|
-
border: 'var(--ds-blue-500)',
|
|
167
|
-
errorBg: 'var(--ds-red-200)',
|
|
168
|
-
errorBorder: 'var(--ds-red-500)',
|
|
169
|
-
},
|
|
170
|
-
step: {
|
|
171
|
-
bg: 'var(--ds-green-200)',
|
|
172
|
-
border: 'var(--ds-green-500)',
|
|
173
|
-
errorBg: 'var(--ds-red-200)',
|
|
174
|
-
errorBorder: 'var(--ds-red-500)',
|
|
175
|
-
},
|
|
176
|
-
// Passive spans (hooks) stay gray — matches event-list icons and the minimap.
|
|
177
|
-
hook: {
|
|
178
|
-
bg: 'var(--ds-gray-200)',
|
|
179
|
-
border: 'var(--ds-gray-500)',
|
|
180
|
-
errorBg: 'var(--ds-red-200)',
|
|
181
|
-
errorBorder: 'var(--ds-red-500)',
|
|
182
|
-
},
|
|
183
|
-
sleep: {
|
|
184
|
-
bg: 'var(--ds-purple-200)',
|
|
185
|
-
border: 'var(--ds-purple-500)',
|
|
186
|
-
errorBg: 'var(--ds-red-200)',
|
|
187
|
-
errorBorder: 'var(--ds-red-500)',
|
|
188
|
-
},
|
|
189
|
-
default: {
|
|
190
|
-
bg: 'var(--ds-gray-200)',
|
|
191
|
-
border: 'var(--ds-gray-500)',
|
|
192
|
-
errorBg: 'var(--ds-red-200)',
|
|
193
|
-
errorBorder: 'var(--ds-red-500)',
|
|
194
|
-
},
|
|
195
|
-
};
|
|
196
|
-
export function getResourceColor(resource) {
|
|
197
|
-
return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;
|
|
198
|
-
}
|
|
199
|
-
function clampFraction(value) {
|
|
200
|
-
return Math.max(0, Math.min(1, value));
|
|
201
|
-
}
|
|
202
|
-
function timeToFraction(time, spanStart, spanDuration) {
|
|
203
|
-
if (spanDuration <= 0)
|
|
204
|
-
return 0;
|
|
205
|
-
return clampFraction((time - spanStart) / spanDuration);
|
|
206
|
-
}
|
|
207
|
-
function sortedEventMarks(events, relevantNames) {
|
|
208
|
-
return events
|
|
209
|
-
.filter((e) => relevantNames.includes(e.name))
|
|
210
|
-
.map((e) => ({ time: getHighResInMs(e.timestamp), type: e.name }))
|
|
211
|
-
.sort((a, b) => a.time - b.time);
|
|
212
|
-
}
|
|
213
|
-
function computeStepSegmentsFromSpan(startMs, duration, events) {
|
|
214
|
-
const segments = [];
|
|
215
|
-
if (duration <= 0)
|
|
216
|
-
return segments;
|
|
217
|
-
const marks = sortedEventMarks(events, [
|
|
218
|
-
'step_started',
|
|
219
|
-
'step_retrying',
|
|
220
|
-
'step_failed',
|
|
221
|
-
'step_completed',
|
|
222
|
-
]);
|
|
223
|
-
if (marks.length === 0) {
|
|
224
|
-
segments.push({ startFraction: 0, endFraction: 1, status: 'queued' });
|
|
225
|
-
return segments;
|
|
226
|
-
}
|
|
227
|
-
const firstFraction = timeToFraction(marks[0].time, startMs, duration);
|
|
228
|
-
if (firstFraction > 0.001) {
|
|
229
|
-
segments.push({
|
|
230
|
-
startFraction: 0,
|
|
231
|
-
endFraction: firstFraction,
|
|
232
|
-
status: 'queued',
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
for (let i = 0; i < marks.length; i++) {
|
|
236
|
-
const mark = marks[i];
|
|
237
|
-
const markFrac = timeToFraction(mark.time, startMs, duration);
|
|
238
|
-
const nextMark = marks[i + 1];
|
|
239
|
-
const nextFrac = nextMark
|
|
240
|
-
? timeToFraction(nextMark.time, startMs, duration)
|
|
241
|
-
: 1;
|
|
242
|
-
if (mark.type === 'step_started') {
|
|
243
|
-
if (i === marks.length - 1) {
|
|
244
|
-
segments.push({
|
|
245
|
-
startFraction: markFrac,
|
|
246
|
-
endFraction: 1,
|
|
247
|
-
status: 'succeeded',
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
const nextType = nextMark.type;
|
|
252
|
-
const attemptStatus = nextType === 'step_retrying' || nextType === 'step_failed'
|
|
253
|
-
? 'failed'
|
|
254
|
-
: nextType === 'step_completed'
|
|
255
|
-
? 'succeeded'
|
|
256
|
-
: 'retrying';
|
|
257
|
-
segments.push({
|
|
258
|
-
startFraction: markFrac,
|
|
259
|
-
endFraction: nextFrac,
|
|
260
|
-
status: attemptStatus,
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
else if (mark.type === 'step_retrying') {
|
|
265
|
-
segments.push({
|
|
266
|
-
startFraction: markFrac,
|
|
267
|
-
endFraction: nextFrac,
|
|
268
|
-
status: 'retrying',
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
else if (mark.type === 'step_failed') {
|
|
272
|
-
if (markFrac < 0.999) {
|
|
273
|
-
segments.push({
|
|
274
|
-
startFraction: markFrac,
|
|
275
|
-
endFraction: 1,
|
|
276
|
-
status: 'failed',
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
return segments;
|
|
282
|
-
}
|
|
283
|
-
function computeHookSegmentsFromSpan(startMs, duration, events) {
|
|
284
|
-
const segments = [];
|
|
285
|
-
if (duration <= 0)
|
|
286
|
-
return segments;
|
|
287
|
-
const disposed = sortedEventMarks(events, ['hook_disposed'])[0];
|
|
288
|
-
const disposedFrac = disposed
|
|
289
|
-
? timeToFraction(disposed.time, startMs, duration)
|
|
290
|
-
: null;
|
|
291
|
-
const waitingEnd = disposedFrac ?? 1;
|
|
292
|
-
if (waitingEnd > 0.001) {
|
|
293
|
-
segments.push({
|
|
294
|
-
startFraction: 0,
|
|
295
|
-
endFraction: waitingEnd,
|
|
296
|
-
status: 'waiting',
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
if (disposedFrac !== null && disposedFrac < 0.999) {
|
|
300
|
-
segments.push({
|
|
301
|
-
startFraction: disposedFrac,
|
|
302
|
-
endFraction: 1,
|
|
303
|
-
status: 'succeeded',
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
return segments;
|
|
307
|
-
}
|
|
308
|
-
function computeSleepSegmentsFromSpan(_startMs, duration, _events) {
|
|
309
|
-
if (duration <= 0)
|
|
310
|
-
return [];
|
|
311
|
-
return [{ startFraction: 0, endFraction: 1, status: 'sleeping' }];
|
|
312
|
-
}
|
|
313
|
-
function runSegmentStatus(runStatus) {
|
|
314
|
-
if (runStatus === 'failed')
|
|
315
|
-
return 'failed';
|
|
316
|
-
if (runStatus === 'pending')
|
|
317
|
-
return 'pending';
|
|
318
|
-
if (runStatus === 'running')
|
|
319
|
-
return 'running';
|
|
320
|
-
return 'completed';
|
|
321
|
-
}
|
|
322
|
-
function computeRunSegmentsFromSpan(startMs, duration, activeStartMs, events, attributes) {
|
|
323
|
-
const segments = [];
|
|
324
|
-
if (duration <= 0)
|
|
325
|
-
return segments;
|
|
326
|
-
const sorted = [...events]
|
|
327
|
-
.map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
|
|
328
|
-
.sort((a, b) => a.time - b.time);
|
|
329
|
-
const runData = attributes?.data;
|
|
330
|
-
const runStatus = runData?.status;
|
|
331
|
-
const hasRunCreated = sorted.some((e) => e.name === 'run_created');
|
|
332
|
-
if (!hasRunCreated) {
|
|
333
|
-
return computeV1RunSegments(startMs, duration, activeStartMs, runStatus);
|
|
334
|
-
}
|
|
335
|
-
const failedEvent = sorted.find((e) => e.name === 'run_failed');
|
|
336
|
-
let cursor = 0;
|
|
337
|
-
if (activeStartMs !== undefined && activeStartMs > startMs) {
|
|
338
|
-
const queuedFrac = timeToFraction(activeStartMs, startMs, duration);
|
|
339
|
-
if (queuedFrac > 0.001) {
|
|
340
|
-
segments.push({
|
|
341
|
-
startFraction: 0,
|
|
342
|
-
endFraction: queuedFrac,
|
|
343
|
-
status: 'queued',
|
|
344
|
-
});
|
|
345
|
-
cursor = queuedFrac;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
segments.push({
|
|
349
|
-
startFraction: cursor,
|
|
350
|
-
endFraction: 1,
|
|
351
|
-
status: failedEvent ? 'failed' : runSegmentStatus(runStatus),
|
|
352
|
-
});
|
|
353
|
-
return segments;
|
|
354
|
-
}
|
|
355
|
-
function computeV1RunSegments(startMs, duration, activeStartMs, runStatus) {
|
|
356
|
-
const segments = [];
|
|
357
|
-
let cursor = 0;
|
|
358
|
-
if (activeStartMs !== undefined && activeStartMs > startMs) {
|
|
359
|
-
const queuedFrac = timeToFraction(activeStartMs, startMs, duration);
|
|
360
|
-
if (queuedFrac > 0.001) {
|
|
361
|
-
segments.push({
|
|
362
|
-
startFraction: 0,
|
|
363
|
-
endFraction: queuedFrac,
|
|
364
|
-
status: 'queued',
|
|
365
|
-
});
|
|
366
|
-
cursor = queuedFrac;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
segments.push({
|
|
370
|
-
startFraction: cursor,
|
|
371
|
-
endFraction: 1,
|
|
372
|
-
status: runSegmentStatus(runStatus),
|
|
373
|
-
});
|
|
374
|
-
return segments;
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Compute event-based segments for a span. Dispatches on `span.resource`
|
|
378
|
-
* to the appropriate resource-type-specific segment builder.
|
|
379
|
-
* Returns an empty array for generic (non-workflow) spans.
|
|
380
|
-
*/
|
|
381
|
-
export function computeSpanSegments(span) {
|
|
382
|
-
const startMs = getHighResInMs(span.startTime);
|
|
383
|
-
const duration = getSpanDurationMs(span);
|
|
384
|
-
const activeStartMs = span.activeStartTime
|
|
385
|
-
? getHighResInMs(span.activeStartTime)
|
|
386
|
-
: undefined;
|
|
387
|
-
switch (span.resource) {
|
|
388
|
-
case 'step':
|
|
389
|
-
return computeStepSegmentsFromSpan(startMs, duration, span.events);
|
|
390
|
-
case 'hook':
|
|
391
|
-
return computeHookSegmentsFromSpan(startMs, duration, span.events);
|
|
392
|
-
case 'sleep':
|
|
393
|
-
return computeSleepSegmentsFromSpan(startMs, duration, span.events);
|
|
394
|
-
case 'run':
|
|
395
|
-
return computeRunSegmentsFromSpan(startMs, duration, activeStartMs, span.events, span.attributes);
|
|
396
|
-
default:
|
|
397
|
-
return [];
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
// `hook_received` = a resumption; `attr_set` = attributes written mid-span.
|
|
401
|
-
const MARKER_EVENT_NAMES = ['hook_received', 'attr_set'];
|
|
402
|
-
export function computeSpanMarkers(span) {
|
|
403
|
-
return sortedEventMarks(span.events, MARKER_EVENT_NAMES).map((mark) => ({
|
|
404
|
-
timeMs: mark.time,
|
|
405
|
-
}));
|
|
406
|
-
}
|
|
407
|
-
/** Partition markers outside `[visibleStartMs, visibleEndMs]` by side. */
|
|
408
|
-
export function computeOffscreenMarkers(markers, visibleStartMs, visibleEndMs) {
|
|
409
|
-
let leftCount = 0;
|
|
410
|
-
let rightCount = 0;
|
|
411
|
-
let nearestLeft = Number.NEGATIVE_INFINITY;
|
|
412
|
-
let nearestRight = Number.POSITIVE_INFINITY;
|
|
413
|
-
for (const { timeMs } of markers) {
|
|
414
|
-
if (timeMs < visibleStartMs) {
|
|
415
|
-
leftCount++;
|
|
416
|
-
if (timeMs > nearestLeft)
|
|
417
|
-
nearestLeft = timeMs;
|
|
418
|
-
}
|
|
419
|
-
else if (timeMs > visibleEndMs) {
|
|
420
|
-
rightCount++;
|
|
421
|
-
if (timeMs < nearestRight)
|
|
422
|
-
nearestRight = timeMs;
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
return {
|
|
426
|
-
left: leftCount > 0 ? { count: leftCount, nearestMs: nearestLeft } : null,
|
|
427
|
-
right: rightCount > 0 ? { count: rightCount, nearestMs: nearestRight } : null,
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGNBQWMsR0FDZixNQUFNLDZCQUE2QixDQUFDO0FBYXJDLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFFdEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsUUFBUTtZQUFFLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsTUFBTTtZQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFB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RUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN6RSxLQUFLLEVBQ0gsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtLQUN6RSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGZvcm1hdER1cmF0aW9uLFxuICBmb3JtYXREdXJhdGlvblByZWNpc2UsXG4gIGdldEhpZ2hSZXNJbk1zLFxufSBmcm9tICcuLi90cmFjZS12aWV3ZXIvdXRpbC90aW1pbmcnO1xuaW1wb3J0IHR5cGUgeyBTcGFuLCBTcGFuRXZlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSb290IGJvdW5kc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdEJvdW5kcyB7XG4gIHN0YXJ0VGltZTogbnVtYmVyO1xuICBlbmRUaW1lOiBudW1iZXI7XG4gIGR1cmF0aW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUm9vdEJvdW5kcyhzcGFuczogU3BhbltdKTogUm9vdEJvdW5kcyB7XG4gIGxldCBtaW5TdGFydCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgbGV0IG1heEVuZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICBmb3IgKGNvbnN0IHNwYW4gb2Ygc3BhbnMpIHtcbiAgICBjb25zdCBzID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICAgIGNvbnN0IGUgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLmVuZFRpbWUpO1xuICAgIGlmIChzIDwgbWluU3RhcnQpIG1pblN0YXJ0ID0gcztcbiAgICBpZiAoZSA+IG1heEVuZCkgbWF4RW5kID0gZTtcbiAgfVxuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG1pblN0YXJ0KSB8fCAhTnVtYmVyLmlzRmluaXRlKG1heEVuZCkpIHtcbiAgICByZXR1cm4geyBzdGFydFRpbWU6IDAsIGVuZFRpbWU6IDEsIGR1cmF0aW9uOiAxIH07XG4gIH1cblxuICBjb25zdCBkdXJhdGlvbiA9IE1hdGgubWF4KG1heEVuZCAtIG1pblN0YXJ0LCAxKTtcbiAgcmV0dXJuIHsgc3RhcnRUaW1lOiBtaW5TdGFydCwgZW5kVGltZTogbWF4RW5kLCBkdXJhdGlvbiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhbkR1cmF0aW9uTXMoc3BhbjogU3Bhbik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChcbiAgICAwLFxuICAgIGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSkgLSBnZXRIaWdoUmVzSW5NcyhzcGFuLnN0YXJ0VGltZSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhbkVycm9yZWQoc3BhbjogU3Bhbik6IGJvb2xlYW4ge1xuICBjb25zdCB3b3JrZmxvd1N0YXR1cyA9IChzcGFuLmF0dHJpYnV0ZXMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA/LnN0YXR1cyBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzcGFuLnN0YXR1cy5jb2RlID09PSAyIHx8IHdvcmtmbG93U3RhdHVzID09PSAnZmFpbGVkJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBWaWV3cG9ydFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlld3BvcnRSYW5nZSB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENsYW1wIGEgY2FuZGlkYXRlIHZpZXdwb3J0IHRvIHRoZSByb290IGV4dGVudC4gVGhlIHJlcXVlc3RlZCBkdXJhdGlvbiBpc1xuICogcHJlc2VydmVkIHdoZXJlIHBvc3NpYmxlIChjbGFtcGVkIHRvIFttaW5EdXJhdGlvbk1zLCByb290IGR1cmF0aW9uXSksIHRoZW5cbiAqIHRoZSB3aW5kb3cgaXMgc2hpZnRlZCBiYWNrIGluc2lkZSB0aGUgcm9vdCBib3VuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcFZpZXdwb3J0VG9Sb290KFxuICBuZXh0OiBWaWV3cG9ydFJhbmdlLFxuICByb290U3RhcnQ6IG51bWJlcixcbiAgcm9vdEVuZDogbnVtYmVyLFxuICBtaW5EdXJhdGlvbk1zOiBudW1iZXJcbik6IFZpZXdwb3J0UmFuZ2Uge1xuICBjb25zdCByb290RHVyYXRpb24gPSBNYXRoLm1heChyb290RW5kIC0gcm9vdFN0YXJ0LCBtaW5EdXJhdGlvbk1zKTtcbiAgY29uc3QgZHVyYXRpb24gPSBNYXRoLm1pbihcbiAgICByb290RHVyYXRpb24sXG4gICAgTWF0aC5tYXgobWluRHVyYXRpb25NcywgbmV4dC5lbmQgLSBuZXh0LnN0YXJ0KVxuICApO1xuICBjb25zdCBtYXhTdGFydCA9IHJvb3RFbmQgLSBkdXJhdGlvbjtcbiAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihNYXRoLm1heChuZXh0LnN0YXJ0LCByb290U3RhcnQpLCBtYXhTdGFydCk7XG4gIHJldHVybiB7IHN0YXJ0LCBlbmQ6IHN0YXJ0ICsgZHVyYXRpb24gfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXaGVlbCBnZXN0dXJlcyDigJQgc2hhcmVkIGJldHdlZW4gdGhlIHRpbWVsaW5lIGFuZCB0aGUgbWluaW1hcFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDb252ZXJ0IGEgd2hlZWwgZGVsdGEgdG8gcGl4ZWwgdW5pdHMgKGxpbmUtbW9kZSBkZWx0YXMgYXJyaXZlIGluIGxpbmVzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGVlbERlbHRhVG9QaXhlbHMoZGVsdGE6IG51bWJlciwgZGVsdGFNb2RlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gZGVsdGFNb2RlID09PSAxID8gZGVsdGEgKiAxNiA6IGRlbHRhO1xufVxuXG4vKipcbiAqIEV4cG9uZW50aWFsIHpvb20gZmFjdG9yIGZvciBhIHdoZWVsIGdlc3R1cmUuIENvYXJzZSBtb3VzZS13aGVlbCBzdGVwcyBhcmVcbiAqIGRhbXBlZCBoYXJkZXIgdGhhbiB0cmFja3BhZCBwaW5jaGVzIHNvIGJvdGggZmVlbCBzaW1pbGFyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hlZWxab29tU2NhbGVGYWN0b3IoZXZlbnQ6IHtcbiAgZGVsdGFZOiBudW1iZXI7XG4gIGRlbHRhTW9kZTogbnVtYmVyO1xufSk6IG51bWJlciB7XG4gIGNvbnN0IGR5ID0gd2hlZWxEZWx0YVRvUGl4ZWxzKGV2ZW50LmRlbHRhWSwgZXZlbnQuZGVsdGFNb2RlKTtcbiAgY29uc3QgaXNNb3VzZVdoZWVsID0gZXZlbnQuZGVsdGFNb2RlID09PSAxIHx8IE1hdGguYWJzKGV2ZW50LmRlbHRhWSkgPj0gNTA7XG4gIHJldHVybiAyICoqIChkeSAvIChpc01vdXNlV2hlZWwgPyAyMDAgOiA2MCkpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWUgbWFya2Vyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZU1hcmtlciB7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXI7XG59XG5cbmNvbnN0IE5JQ0VfSU5URVJWQUxTID0gW1xuICAxLCAyLCA1LCAxMCwgMjAsIDUwLCAxMDAsIDIwMCwgNTAwLCAxXzAwMCwgMl8wMDAsIDVfMDAwLCAxMF8wMDAsIDIwXzAwMCxcbiAgNTBfMDAwLCAxMDBfMDAwLCAyMDBfMDAwLCA1MDBfMDAwLCAxXzAwMF8wMDAsIDJfMDAwXzAwMCwgNV8wMDBfMDAwLFxuICAxMF8wMDBfMDAwLCAyMF8wMDBfMDAwLCA1MF8wMDBfMDAwLCAxMDBfMDAwXzAwMCwgMjAwXzAwMF8wMDAsIDUwMF8wMDBfMDAwLFxuICAxXzAwMF8wMDBfMDAwLCAyXzAwMF8wMDBfMDAwLCA1XzAwMF8wMDBfMDAwLFxuXTtcblxuY29uc3QgTUFYX01BUktFUlMgPSA4O1xuXG5jb25zdCBNU19JTl9TRUNPTkQgPSAxMDAwO1xuXG5mdW5jdGlvbiBwaWNrSW50ZXJ2YWwodmlld0R1cmF0aW9uOiBudW1iZXIsIG1heFRpY2tzOiBudW1iZXIpOiBudW1iZXIge1xuICBmb3IgKGNvbnN0IGludGVydmFsIG9mIE5JQ0VfSU5URVJWQUxTKSB7XG4gICAgaWYgKHZpZXdEdXJhdGlvbiAvIGludGVydmFsIDw9IG1heFRpY2tzKSByZXR1cm4gaW50ZXJ2YWw7XG4gIH1cbiAgcmV0dXJuIE5JQ0VfSU5URVJWQUxTW05JQ0VfSU5URVJWQUxTLmxlbmd0aCAtIDFdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVRpbWVNYXJrZXJzKFxuICB2aWV3RHVyYXRpb246IG51bWJlcixcbiAgb2Zmc2V0OiBudW1iZXJcbik6IFRpbWVNYXJrZXJbXSB7XG4gIGlmICh2aWV3RHVyYXRpb24gPD0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IG1heFRpY2tzID0gNjtcbiAgY29uc3QgaW50ZXJ2YWwgPSBwaWNrSW50ZXJ2YWwodmlld0R1cmF0aW9uLCBtYXhUaWNrcyk7XG5cbiAgLy8gU3ViLXNlY29uZCBzdGVwcyBuZWVkIGZyYWN0aW9uYWwgbGFiZWxzLCBvciB0aWNrcyBwYXN0IDFzIGNvbGxpZGUgYXNcbiAgLy8gZHVwbGljYXRlIHdob2xlIHNlY29uZHMgKFwi4oCmMXMsIDJzLCAycywgM3NcIikuIFNjYWxlIGRlY2ltYWxzIHRvIHRoZSBzdGVwLlxuICBjb25zdCBmcmFjdGlvbkRpZ2l0cyA9XG4gICAgaW50ZXJ2YWwgPj0gTVNfSU5fU0VDT05EXG4gICAgICA/IDBcbiAgICAgIDogTWF0aC5jZWlsKC1NYXRoLmxvZzEwKGludGVydmFsIC8gTVNfSU5fU0VDT05EKSk7XG5cbiAgY29uc3QgZmlyc3RUaWNrID0gTWF0aC5jZWlsKG9mZnNldCAvIGludGVydmFsKSAqIGludGVydmFsO1xuICBjb25zdCBtYXJrZXJzOiBUaW1lTWFya2VyW10gPSBbXTtcblxuICBmb3IgKGxldCB0ID0gZmlyc3RUaWNrOyB0IDw9IG9mZnNldCArIHZpZXdEdXJhdGlvbjsgdCArPSBpbnRlcnZhbCkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gKHQgLSBvZmZzZXQpIC8gdmlld0R1cmF0aW9uO1xuICAgIGlmIChwb3NpdGlvbiA8IC0wLjAxIHx8IHBvc2l0aW9uID4gMS4wMSkgY29udGludWU7XG4gICAgbWFya2Vycy5wdXNoKHtcbiAgICAgIHBvc2l0aW9uOiBNYXRoLm1pbihNYXRoLm1heChwb3NpdGlvbiwgMCksIDEpLFxuICAgICAgbGFiZWw6XG4gICAgICAgIGZyYWN0aW9uRGlnaXRzID09PSAwXG4gICAgICAgICAgPyBmb3JtYXREdXJhdGlvbihNYXRoLmFicyh0KSwgdHJ1ZSlcbiAgICAgICAgICA6IGZvcm1hdER1cmF0aW9uUHJlY2lzZShNYXRoLmFicyh0KSwgZnJhY3Rpb25EaWdpdHMpLFxuICAgICAgdmFsdWU6IHQsXG4gICAgfSk7XG4gICAgaWYgKG1hcmtlcnMubGVuZ3RoID49IE1BWF9NQVJLRVJTKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBtYXJrZXJzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNwYW4gZ2FwcyDigJQgdGltZSBkZWx0YXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBzcGFucyAoQWx0LWtleSBvdmVybGF5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BhbkdhcCB7XG4gIGdhcE1zOiBudW1iZXI7XG4gIGxlZnRGcmFjOiBudW1iZXI7XG4gIHJpZ2h0RnJhYzogbnVtYmVyO1xuICByb3dJbmRleDogbnVtYmVyO1xufVxuXG4vKiogUHJvamVjdCBhbiBhYnNvbHV0ZSB0aW1lIG9udG8gdGhlIHZpZXdwb3J0IGFzIGEgY2xhbXBlZCBbMCwgMV0gZnJhY3Rpb24uICovXG5mdW5jdGlvbiB0b1ZpZXdwb3J0RnJhYyhtczogbnVtYmVyLCB2aWV3U3RhcnQ6IG51bWJlciwgcmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCgobXMgLSB2aWV3U3RhcnQpIC8gcmFuZ2UsIDApLCAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTcGFuR2FwcyhcbiAgc3BhbnM6IFNwYW5bXSxcbiAgdmlld1N0YXJ0OiBudW1iZXIsXG4gIHZpZXdFbmQ6IG51bWJlclxuKTogU3BhbkdhcFtdIHtcbiAgY29uc3QgcmFuZ2UgPSB2aWV3RW5kIC0gdmlld1N0YXJ0O1xuICBpZiAocmFuZ2UgPD0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGdhcHM6IFNwYW5HYXBbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGVuZFRpbWUgPSBnZXRIaWdoUmVzSW5NcyhzcGFuc1tpXS5lbmRUaW1lKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBnZXRIaWdoUmVzSW5NcyhzcGFuc1tpICsgMV0uc3RhcnRUaW1lKTtcbiAgICBjb25zdCBnYXBNcyA9IHN0YXJ0VGltZSAtIGVuZFRpbWU7XG4gICAgaWYgKGdhcE1zIDw9IDApIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbGVmdEZyYWMgPSB0b1ZpZXdwb3J0RnJhYyhlbmRUaW1lLCB2aWV3U3RhcnQsIHJhbmdlKTtcbiAgICBjb25zdCByaWdodEZyYWMgPSB0b1ZpZXdwb3J0RnJhYyhzdGFydFRpbWUsIHZpZXdTdGFydCwgcmFuZ2UpO1xuICAgIGlmIChyaWdodEZyYWMgLSBsZWZ0RnJhYyA8IDAuMDAxKSBjb250aW51ZTtcblxuICAgIGdhcHMucHVzaCh7IGdhcE1zLCBsZWZ0RnJhYywgcmlnaHRGcmFjLCByb3dJbmRleDogaSB9KTtcbiAgfVxuICByZXR1cm4gZ2Fwcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTcGFuRGVsdGEge1xuICAvKiogVHJ1ZSBtZWFzdXJlZCB0aW1lIGJldHdlZW4gdGhlIHR3byBzcGFucywgdW5hZmZlY3RlZCBieSBjbGFtcGluZy4gKi9cbiAgZGVsdGFNczogbnVtYmVyO1xuICAvKiogVmlld3BvcnQtY2xhbXBlZCBmcmFjdGlvbiBvZiB0aGUgYW5jaG9yIHNwYW4ncyBtZWFzdXJlZCBlZGdlLiAqL1xuICBhbmNob3JGcmFjOiBudW1iZXI7XG4gIC8qKiBWaWV3cG9ydC1jbGFtcGVkIGZyYWN0aW9uIG9mIHRoZSBob3ZlcmVkIHNwYW4ncyBtZWFzdXJlZCBlZGdlLiAqL1xuICBob3ZlcmVkRnJhYzogbnVtYmVyO1xuICAvKipcbiAgICogV2hpY2ggZWRnZSBvZiB0aGUgYW5jaG9yIHNwYW4gdGhlIG1lYXN1cmVtZW50IHJ1bnMgZnJvbTogaXRzIGVuZCB3aGVuIHRoZVxuICAgKiBzcGFucyBhcmUgZGlzam9pbnQgYW5kIHRoZSBhbmNob3IgY29tZXMgZmlyc3QsIG90aGVyd2lzZSBpdHMgc3RhcnQuXG4gICAqL1xuICBhbmNob3JFZGdlOiAnc3RhcnQnIHwgJ2VuZCc7XG4gIC8qKlxuICAgKiBTZXQgd2hlbiB0aGUgaG92ZXJlZCBzcGFuIGxpZXMgZW50aXJlbHkgb3V0c2lkZSB0aGUgdmlld3BvcnQgb24gb25lIHNpZGUsXG4gICAqIGkuZS4gaXRzIHJvdyByZW5kZXJzIGFuIG9mZi1zY3JlZW4gYXJyb3cgdGhlIGxpbmUgc2hvdWxkIHN0b3Agc2hvcnQgb2YuXG4gICAqL1xuICBob3ZlcmVkT2Zmc2NyZWVuOiAnbGVmdCcgfCAncmlnaHQnIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBNZWFzdXJlIHRoZSB0ZW1wb3JhbCBkZWx0YSBiZXR3ZWVuIGFuIGFuY2hvciAoc2VsZWN0ZWQpIHNwYW4gYW5kIGEgaG92ZXJlZFxuICogc3BhbiBmb3IgdGhlIEFsdCtob3ZlciBtZWFzdXJlbWVudCBvdmVybGF5LiBPcmRlcmluZyB0aGUgdHdvIHNwYW5zIGJ5IHN0YXJ0XG4gKiB0aW1lIChFID0gZWFybGllci1zdGFydGluZywgTCA9IGxhdGVyLXN0YXJ0aW5nKSwgdGhlIG1lYXN1cmVtZW50IHJ1bnMgdG9cbiAqIEwncyBzdGFydCBmcm9tIEUncyBlbmQgd2hlbiB0aGUgc3BhbnMgYXJlIGRpc2pvaW50IChcImhvdyBsb25nIGFmdGVyIEUgZW5kZWRcbiAqIGRpZCBMIHN0YXJ0XCIpLCBvciBmcm9tIEUncyBzdGFydCB3aGVuIHRoZXkgb3ZlcmxhcCAoXCJob3cgbG9uZyBhZnRlciBFXG4gKiBzdGFydGVkIGRpZCBMIHN0YXJ0XCIpLiBGcmFjdGlvbnMgYXJlIGNsYW1wZWQgdG8gdGhlIHZpZXdwb3J0IGxpa2VcbiAqIGBjb21wdXRlU3BhbkdhcHNgOyBgZGVsdGFNc2AgaXMgYWx3YXlzIHRoZSB0cnVlIGR1cmF0aW9uLiBSZXR1cm5zIG51bGwgd2hlblxuICogdGhlIG1lYXN1cmVtZW50IGxpZXMgZW50aXJlbHkgb3V0c2lkZSB0aGUgdmlld3BvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3BhbkRlbHRhKFxuICBhbmNob3I6IFNwYW4sXG4gIGhvdmVyZWQ6IFNwYW4sXG4gIHZpZXdTdGFydDogbnVtYmVyLFxuICB2aWV3RW5kOiBudW1iZXJcbik6IFNwYW5EZWx0YSB8IG51bGwge1xuICBjb25zdCByYW5nZSA9IHZpZXdFbmQgLSB2aWV3U3RhcnQ7XG4gIGlmIChyYW5nZSA8PSAwKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBhbmNob3JTdGFydCA9IGdldEhpZ2hSZXNJbk1zKGFuY2hvci5zdGFydFRpbWUpO1xuICBjb25zdCBob3ZlcmVkU3RhcnQgPSBnZXRIaWdoUmVzSW5Ncyhob3ZlcmVkLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGFuY2hvcklzRWFybGllciA9IGFuY2hvclN0YXJ0IDw9IGhvdmVyZWRTdGFydDtcbiAgY29uc3QgZWFybGllclN0YXJ0ID0gYW5jaG9ySXNFYXJsaWVyID8gYW5jaG9yU3RhcnQgOiBob3ZlcmVkU3RhcnQ7XG4gIGNvbnN0IGVhcmxpZXJFbmQgPSBnZXRIaWdoUmVzSW5NcyhcbiAgICBhbmNob3JJc0VhcmxpZXIgPyBhbmNob3IuZW5kVGltZSA6IGhvdmVyZWQuZW5kVGltZVxuICApO1xuICBjb25zdCBsYXRlclN0YXJ0ID0gYW5jaG9ySXNFYXJsaWVyID8gaG92ZXJlZFN0YXJ0IDogYW5jaG9yU3RhcnQ7XG5cbiAgY29uc3Qgb3JpZ2luTXMgPSBlYXJsaWVyRW5kIDw9IGxhdGVyU3RhcnQgPyBlYXJsaWVyRW5kIDogZWFybGllclN0YXJ0O1xuICBjb25zdCBkZWx0YU1zID0gbGF0ZXJTdGFydCAtIG9yaWdpbk1zO1xuXG4gIC8vIEVudGlyZWx5IG91dHNpZGUgdGhlIHZpZXdwb3J0LiBDb21wYXJlZCBpbiB0aW1lLXNwYWNlIChub3QgY2xhbXBlZFxuICAvLyBmcmFjdGlvbnMpIHNvIGEgemVyby1kZWx0YSBwb2ludCBzaXR0aW5nIGV4YWN0bHkgb24gYSB2aWV3cG9ydCBlZGdlIOKAlFxuICAvLyBlLmcuIHRoZSByb290IHNwYW4gc2VsZWN0ZWQgYXQgZGVmYXVsdCB6b29tIOKAlCBzdGlsbCByZW5kZXJzLlxuICBpZiAobGF0ZXJTdGFydCA8IHZpZXdTdGFydCB8fCBvcmlnaW5NcyA+IHZpZXdFbmQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbkZyYWMgPSB0b1ZpZXdwb3J0RnJhYyhvcmlnaW5Ncywgdmlld1N0YXJ0LCByYW5nZSk7XG4gIGNvbnN0IGxhdGVyRnJhYyA9IHRvVmlld3BvcnRGcmFjKGxhdGVyU3RhcnQsIHZpZXdTdGFydCwgcmFuZ2UpO1xuXG4gIGNvbnN0IGhvdmVyZWRFbmQgPSBnZXRIaWdoUmVzSW5Ncyhob3ZlcmVkLmVuZFRpbWUpO1xuXG4gIHJldHVybiB7XG4gICAgZGVsdGFNcyxcbiAgICBhbmNob3JGcmFjOiBhbmNob3JJc0VhcmxpZXIgPyBvcmlnaW5GcmFjIDogbGF0ZXJGcmFjLFxuICAgIGhvdmVyZWRGcmFjOiBhbmNob3JJc0VhcmxpZXIgPyBsYXRlckZyYWMgOiBvcmlnaW5GcmFjLFxuICAgIGFuY2hvckVkZ2U6IGFuY2hvcklzRWFybGllciAmJiBlYXJsaWVyRW5kIDw9IGxhdGVyU3RhcnQgPyAnZW5kJyA6ICdzdGFydCcsXG4gICAgaG92ZXJlZE9mZnNjcmVlbjpcbiAgICAgIGhvdmVyZWRTdGFydCA+IHZpZXdFbmQgPyAncmlnaHQnIDogaG92ZXJlZEVuZCA8IHZpZXdTdGFydCA/ICdsZWZ0JyA6IG51bGwsXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVzb3VyY2UgY29sb3JzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IFJFU09VUkNFX0NPTE9SUzogUmVjb3JkPFxuICBzdHJpbmcsXG4gIHtcbiAgICBiZzogc3RyaW5nO1xuICAgIGJvcmRlcjogc3RyaW5nO1xuICAgIGVycm9yQmc/OiBzdHJpbmc7XG4gICAgZXJyb3JCb3JkZXI/OiBzdHJpbmc7XG4gIH1cbj4gPSB7XG4gIHJ1bjoge1xuICAgIGJnOiAndmFyKC0tZHMtYmx1ZS0yMDApJyxcbiAgICBib3JkZXI6ICd2YXIoLS1kcy1ibHVlLTUwMCknLFxuICAgIGVycm9yQmc6ICd2YXIoLS1kcy1yZWQtMjAwKScsXG4gICAgZXJyb3JCb3JkZXI6ICd2YXIoLS1kcy1yZWQtNTAwKScsXG4gIH0sXG4gIHN0ZXA6IHtcbiAgICBiZzogJ3ZhcigtLWRzLWdyZWVuLTIwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLWdyZWVuLTUwMCknLFxuICAgIGVycm9yQmc6ICd2YXIoLS1kcy1yZWQtMjAwKScsXG4gICAgZXJyb3JCb3JkZXI6ICd2YXIoLS1kcy1yZWQtNTAwKScsXG4gIH0sXG4gIC8vIFBhc3NpdmUgc3BhbnMgKGhvb2tzKSBzdGF5IGdyYXkg4oCUIG1hdGNoZXMgZXZlbnQtbGlzdCBpY29ucyBhbmQgdGhlIG1pbmltYXAuXG4gIGhvb2s6IHtcbiAgICBiZzogJ3ZhcigtLWRzLWdyYXktMjAwKScsXG4gICAgYm9yZGVyOiAndmFyKC0tZHMtZ3JheS01MDApJyxcbiAgICBlcnJvckJnOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgIGVycm9yQm9yZGVyOiAndmFyKC0tZHMtcmVkLTUwMCknLFxuICB9LFxuICBzbGVlcDoge1xuICAgIGJnOiAndmFyKC0tZHMtcHVycGxlLTIwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLXB1cnBsZS01MDApJyxcbiAgICBlcnJvckJnOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgIGVycm9yQm9yZGVyOiAndmFyKC0tZHMtcmVkLTUwMCknLFxuICB9LFxuICBkZWZhdWx0OiB7XG4gICAgYmc6ICd2YXIoLS1kcy1ncmF5LTIwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLWdyYXktNTAwKScsXG4gICAgZXJyb3JCZzogJ3ZhcigtLWRzLXJlZC0yMDApJyxcbiAgICBlcnJvckJvcmRlcjogJ3ZhcigtLWRzLXJlZC01MDApJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNvdXJjZUNvbG9yKHJlc291cmNlOiBzdHJpbmcpOiB7XG4gIGJnOiBzdHJpbmc7XG4gIGJvcmRlcjogc3RyaW5nO1xuICBlcnJvckJnPzogc3RyaW5nO1xuICBlcnJvckJvcmRlcj86IHN0cmluZztcbn0ge1xuICByZXR1cm4gUkVTT1VSQ0VfQ09MT1JTW3Jlc291cmNlXSA/PyBSRVNPVVJDRV9DT0xPUlMuZGVmYXVsdDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTcGFuIHNlZ21lbnRzIOKAlCBzcGxpdCBhIHRpbWVsaW5lIGJhciBpbnRvIGNvbG9yZWQgc2VjdGlvbnMgYnkgZXZlbnQgc3RhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBTZWdtZW50U3RhdHVzID1cbiAgfCAncXVldWVkJ1xuICB8ICdwZW5kaW5nJ1xuICB8ICdydW5uaW5nJ1xuICB8ICdjb21wbGV0ZWQnXG4gIHwgJ2ZhaWxlZCdcbiAgfCAncmV0cnlpbmcnXG4gIHwgJ3N1Y2NlZWRlZCdcbiAgfCAnd2FpdGluZydcbiAgfCAnc2xlZXBpbmcnXG4gIHwgJ3JlY2VpdmVkJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50IHtcbiAgc3RhcnRGcmFjdGlvbjogbnVtYmVyO1xuICBlbmRGcmFjdGlvbjogbnVtYmVyO1xuICBzdGF0dXM6IFNlZ21lbnRTdGF0dXM7XG59XG5cbmZ1bmN0aW9uIGNsYW1wRnJhY3Rpb24odmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiB0aW1lVG9GcmFjdGlvbihcbiAgdGltZTogbnVtYmVyLFxuICBzcGFuU3RhcnQ6IG51bWJlcixcbiAgc3BhbkR1cmF0aW9uOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGlmIChzcGFuRHVyYXRpb24gPD0gMCkgcmV0dXJuIDA7XG4gIHJldHVybiBjbGFtcEZyYWN0aW9uKCh0aW1lIC0gc3BhblN0YXJ0KSAvIHNwYW5EdXJhdGlvbik7XG59XG5cbmludGVyZmFjZSBFdmVudE1hcmsge1xuICB0aW1lOiBudW1iZXI7XG4gIHR5cGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gc29ydGVkRXZlbnRNYXJrcyhcbiAgZXZlbnRzOiBTcGFuRXZlbnRbXSxcbiAgcmVsZXZhbnROYW1lczogc3RyaW5nW11cbik6IEV2ZW50TWFya1tdIHtcbiAgcmV0dXJuIGV2ZW50c1xuICAgIC5maWx0ZXIoKGUpID0+IHJlbGV2YW50TmFtZXMuaW5jbHVkZXMoZS5uYW1lKSlcbiAgICAubWFwKChlKSA9PiAoeyB0aW1lOiBnZXRIaWdoUmVzSW5NcyhlLnRpbWVzdGFtcCksIHR5cGU6IGUubmFtZSB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS50aW1lIC0gYi50aW1lKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0ZXBTZWdtZW50c0Zyb21TcGFuKFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGV2ZW50czogU3BhbkV2ZW50W11cbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBzZWdtZW50cztcblxuICBjb25zdCBtYXJrcyA9IHNvcnRlZEV2ZW50TWFya3MoZXZlbnRzLCBbXG4gICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgXSk7XG5cbiAgaWYgKG1hcmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHNlZ21lbnRzLnB1c2goeyBzdGFydEZyYWN0aW9uOiAwLCBlbmRGcmFjdGlvbjogMSwgc3RhdHVzOiAncXVldWVkJyB9KTtcbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH1cblxuICBjb25zdCBmaXJzdEZyYWN0aW9uID0gdGltZVRvRnJhY3Rpb24obWFya3NbMF0udGltZSwgc3RhcnRNcywgZHVyYXRpb24pO1xuICBpZiAoZmlyc3RGcmFjdGlvbiA+IDAuMDAxKSB7XG4gICAgc2VnbWVudHMucHVzaCh7XG4gICAgICBzdGFydEZyYWN0aW9uOiAwLFxuICAgICAgZW5kRnJhY3Rpb246IGZpcnN0RnJhY3Rpb24sXG4gICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1hcmsgPSBtYXJrc1tpXTtcbiAgICBjb25zdCBtYXJrRnJhYyA9IHRpbWVUb0ZyYWN0aW9uKG1hcmsudGltZSwgc3RhcnRNcywgZHVyYXRpb24pO1xuICAgIGNvbnN0IG5leHRNYXJrID0gbWFya3NbaSArIDFdO1xuICAgIGNvbnN0IG5leHRGcmFjID0gbmV4dE1hcmtcbiAgICAgID8gdGltZVRvRnJhY3Rpb24obmV4dE1hcmsudGltZSwgc3RhcnRNcywgZHVyYXRpb24pXG4gICAgICA6IDE7XG5cbiAgICBpZiAobWFyay50eXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgaWYgKGkgPT09IG1hcmtzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgICAgc3RhcnRGcmFjdGlvbjogbWFya0ZyYWMsXG4gICAgICAgICAgZW5kRnJhY3Rpb246IDEsXG4gICAgICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXh0VHlwZSA9IG5leHRNYXJrLnR5cGU7XG4gICAgICAgIGNvbnN0IGF0dGVtcHRTdGF0dXM6IFNlZ21lbnRTdGF0dXMgPVxuICAgICAgICAgIG5leHRUeXBlID09PSAnc3RlcF9yZXRyeWluZycgfHwgbmV4dFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgIDogbmV4dFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgPyAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgICA6ICdyZXRyeWluZyc7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0RnJhY3Rpb246IG1hcmtGcmFjLFxuICAgICAgICAgIGVuZEZyYWN0aW9uOiBuZXh0RnJhYyxcbiAgICAgICAgICBzdGF0dXM6IGF0dGVtcHRTdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWFyay50eXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICBzdGFydEZyYWN0aW9uOiBtYXJrRnJhYyxcbiAgICAgICAgZW5kRnJhY3Rpb246IG5leHRGcmFjLFxuICAgICAgICBzdGF0dXM6ICdyZXRyeWluZycsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcmsudHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJykge1xuICAgICAgaWYgKG1hcmtGcmFjIDwgMC45OTkpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgICAgc3RhcnRGcmFjdGlvbjogbWFya0ZyYWMsXG4gICAgICAgICAgZW5kRnJhY3Rpb246IDEsXG4gICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlSG9va1NlZ21lbnRzRnJvbVNwYW4oXG4gIHN0YXJ0TXM6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgZXZlbnRzOiBTcGFuRXZlbnRbXVxuKTogU2VnbWVudFtdIHtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuICBpZiAoZHVyYXRpb24gPD0gMCkgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGNvbnN0IGRpc3Bvc2VkID0gc29ydGVkRXZlbnRNYXJrcyhldmVudHMsIFsnaG9va19kaXNwb3NlZCddKVswXTtcbiAgY29uc3QgZGlzcG9zZWRGcmFjID0gZGlzcG9zZWRcbiAgICA/IHRpbWVUb0ZyYWN0aW9uKGRpc3Bvc2VkLnRpbWUsIHN0YXJ0TXMsIGR1cmF0aW9uKVxuICAgIDogbnVsbDtcblxuICBjb25zdCB3YWl0aW5nRW5kID0gZGlzcG9zZWRGcmFjID8/IDE7XG4gIGlmICh3YWl0aW5nRW5kID4gMC4wMDEpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICBlbmRGcmFjdGlvbjogd2FpdGluZ0VuZCxcbiAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRpc3Bvc2VkRnJhYyAhPT0gbnVsbCAmJiBkaXNwb3NlZEZyYWMgPCAwLjk5OSkge1xuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogZGlzcG9zZWRGcmFjLFxuICAgICAgZW5kRnJhY3Rpb246IDEsXG4gICAgICBzdGF0dXM6ICdzdWNjZWVkZWQnLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU2xlZXBTZWdtZW50c0Zyb21TcGFuKFxuICBfc3RhcnRNczogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICBfZXZlbnRzOiBTcGFuRXZlbnRbXVxuKTogU2VnbWVudFtdIHtcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBbXTtcbiAgcmV0dXJuIFt7IHN0YXJ0RnJhY3Rpb246IDAsIGVuZEZyYWN0aW9uOiAxLCBzdGF0dXM6ICdzbGVlcGluZycgfV07XG59XG5cbmZ1bmN0aW9uIHJ1blNlZ21lbnRTdGF0dXMocnVuU3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBTZWdtZW50U3RhdHVzIHtcbiAgaWYgKHJ1blN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHJldHVybiAnZmFpbGVkJztcbiAgaWYgKHJ1blN0YXR1cyA9PT0gJ3BlbmRpbmcnKSByZXR1cm4gJ3BlbmRpbmcnO1xuICBpZiAocnVuU3RhdHVzID09PSAncnVubmluZycpIHJldHVybiAncnVubmluZyc7XG4gIHJldHVybiAnY29tcGxldGVkJztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVJ1blNlZ21lbnRzRnJvbVNwYW4oXG4gIHN0YXJ0TXM6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgYWN0aXZlU3RhcnRNczogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBldmVudHM6IFNwYW5FdmVudFtdLFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogU2VnbWVudFtdIHtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuICBpZiAoZHVyYXRpb24gPD0gMCkgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5ldmVudHNdXG4gICAgLm1hcCgoZSkgPT4gKHsgbmFtZTogZS5uYW1lLCB0aW1lOiBnZXRIaWdoUmVzSW5NcyhlLnRpbWVzdGFtcCkgfSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEudGltZSAtIGIudGltZSk7XG5cbiAgY29uc3QgcnVuRGF0YSA9IGF0dHJpYnV0ZXM/LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJ1blN0YXR1cyA9IHJ1bkRhdGE/LnN0YXR1cyBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgaGFzUnVuQ3JlYXRlZCA9IHNvcnRlZC5zb21lKChlKSA9PiBlLm5hbWUgPT09ICdydW5fY3JlYXRlZCcpO1xuXG4gIGlmICghaGFzUnVuQ3JlYXRlZCkge1xuICAgIHJldHVybiBjb21wdXRlVjFSdW5TZWdtZW50cyhzdGFydE1zLCBkdXJhdGlvbiwgYWN0aXZlU3RhcnRNcywgcnVuU3RhdHVzKTtcbiAgfVxuXG4gIGNvbnN0IGZhaWxlZEV2ZW50ID0gc29ydGVkLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gJ3J1bl9mYWlsZWQnKTtcblxuICBsZXQgY3Vyc29yID0gMDtcbiAgaWYgKGFjdGl2ZVN0YXJ0TXMgIT09IHVuZGVmaW5lZCAmJiBhY3RpdmVTdGFydE1zID4gc3RhcnRNcykge1xuICAgIGNvbnN0IHF1ZXVlZEZyYWMgPSB0aW1lVG9GcmFjdGlvbihhY3RpdmVTdGFydE1zLCBzdGFydE1zLCBkdXJhdGlvbik7XG4gICAgaWYgKHF1ZXVlZEZyYWMgPiAwLjAwMSkge1xuICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICAgIGVuZEZyYWN0aW9uOiBxdWV1ZWRGcmFjLFxuICAgICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgfSk7XG4gICAgICBjdXJzb3IgPSBxdWV1ZWRGcmFjO1xuICAgIH1cbiAgfVxuXG4gIHNlZ21lbnRzLnB1c2goe1xuICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICBlbmRGcmFjdGlvbjogMSxcbiAgICBzdGF0dXM6IGZhaWxlZEV2ZW50ID8gJ2ZhaWxlZCcgOiBydW5TZWdtZW50U3RhdHVzKHJ1blN0YXR1cyksXG4gIH0pO1xuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVYxUnVuU2VnbWVudHMoXG4gIHN0YXJ0TXM6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgYWN0aXZlU3RhcnRNczogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBydW5TdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogU2VnbWVudFtdIHtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuXG4gIGxldCBjdXJzb3IgPSAwO1xuICBpZiAoYWN0aXZlU3RhcnRNcyAhPT0gdW5kZWZpbmVkICYmIGFjdGl2ZVN0YXJ0TXMgPiBzdGFydE1zKSB7XG4gICAgY29uc3QgcXVldWVkRnJhYyA9IHRpbWVUb0ZyYWN0aW9uKGFjdGl2ZVN0YXJ0TXMsIHN0YXJ0TXMsIGR1cmF0aW9uKTtcbiAgICBpZiAocXVldWVkRnJhYyA+IDAuMDAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogMCxcbiAgICAgICAgZW5kRnJhY3Rpb246IHF1ZXVlZEZyYWMsXG4gICAgICAgIHN0YXR1czogJ3F1ZXVlZCcsXG4gICAgICB9KTtcbiAgICAgIGN1cnNvciA9IHF1ZXVlZEZyYWM7XG4gICAgfVxuICB9XG5cbiAgc2VnbWVudHMucHVzaCh7XG4gICAgc3RhcnRGcmFjdGlvbjogY3Vyc29yLFxuICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgIHN0YXR1czogcnVuU2VnbWVudFN0YXR1cyhydW5TdGF0dXMpLFxuICB9KTtcblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8qKlxuICogQ29tcHV0ZSBldmVudC1iYXNlZCBzZWdtZW50cyBmb3IgYSBzcGFuLiBEaXNwYXRjaGVzIG9uIGBzcGFuLnJlc291cmNlYFxuICogdG8gdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlLXR5cGUtc3BlY2lmaWMgc2VnbWVudCBidWlsZGVyLlxuICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBmb3IgZ2VuZXJpYyAobm9uLXdvcmtmbG93KSBzcGFucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTcGFuU2VnbWVudHMoc3BhbjogU3Bhbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHN0YXJ0TXMgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGR1cmF0aW9uID0gZ2V0U3BhbkR1cmF0aW9uTXMoc3Bhbik7XG4gIGNvbnN0IGFjdGl2ZVN0YXJ0TXMgPSBzcGFuLmFjdGl2ZVN0YXJ0VGltZVxuICAgID8gZ2V0SGlnaFJlc0luTXMoc3Bhbi5hY3RpdmVTdGFydFRpbWUpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgc3dpdGNoIChzcGFuLnJlc291cmNlKSB7XG4gICAgY2FzZSAnc3RlcCc6XG4gICAgICByZXR1cm4gY29tcHV0ZVN0ZXBTZWdtZW50c0Zyb21TcGFuKHN0YXJ0TXMsIGR1cmF0aW9uLCBzcGFuLmV2ZW50cyk7XG4gICAgY2FzZSAnaG9vayc6XG4gICAgICByZXR1cm4gY29tcHV0ZUhvb2tTZWdtZW50c0Zyb21TcGFuKHN0YXJ0TXMsIGR1cmF0aW9uLCBzcGFuLmV2ZW50cyk7XG4gICAgY2FzZSAnc2xlZXAnOlxuICAgICAgcmV0dXJuIGNvbXB1dGVTbGVlcFNlZ21lbnRzRnJvbVNwYW4oc3RhcnRNcywgZHVyYXRpb24sIHNwYW4uZXZlbnRzKTtcbiAgICBjYXNlICdydW4nOlxuICAgICAgcmV0dXJuIGNvbXB1dGVSdW5TZWdtZW50c0Zyb21TcGFuKFxuICAgICAgICBzdGFydE1zLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgYWN0aXZlU3RhcnRNcyxcbiAgICAgICAgc3Bhbi5ldmVudHMsXG4gICAgICAgIHNwYW4uYXR0cmlidXRlc1xuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3BhbiBtYXJrZXJzIOKAlCBwb2ludC1pbi10aW1lIGV2ZW50cyByZW5kZXJlZCBhcyB0aWNrcyBvbiB0b3Agb2YgYSBiYXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYW5NYXJrZXIge1xuICB0aW1lTXM6IG51bWJlcjtcbn1cblxuLy8gYGhvb2tfcmVjZWl2ZWRgID0gYSByZXN1bXB0aW9uOyBgYXR0cl9zZXRgID0gYXR0cmlidXRlcyB3cml0dGVuIG1pZC1zcGFuLlxuY29uc3QgTUFSS0VSX0VWRU5UX05BTUVTID0gWydob29rX3JlY2VpdmVkJywgJ2F0dHJfc2V0J107XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3Bhbk1hcmtlcnMoc3BhbjogU3Bhbik6IFNwYW5NYXJrZXJbXSB7XG4gIHJldHVybiBzb3J0ZWRFdmVudE1hcmtzKHNwYW4uZXZlbnRzLCBNQVJLRVJfRVZFTlRfTkFNRVMpLm1hcCgobWFyaykgPT4gKHtcbiAgICB0aW1lTXM6IG1hcmsudGltZSxcbiAgfSkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9mZnNjcmVlblNpZGUge1xuICBjb3VudDogbnVtYmVyO1xuICAvKiogTmVhcmVzdCBvZmYtc2NyZWVuIG1hcmtlciDigJQgdGhlIG9uZSBhIHJldmVhbCBqdW1wcyB0by4gKi9cbiAgbmVhcmVzdE1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2Zmc2NyZWVuTWFya2VycyB7XG4gIGxlZnQ6IE9mZnNjcmVlblNpZGUgfCBudWxsO1xuICByaWdodDogT2Zmc2NyZWVuU2lkZSB8IG51bGw7XG59XG5cbi8qKiBQYXJ0aXRpb24gbWFya2VycyBvdXRzaWRlIGBbdmlzaWJsZVN0YXJ0TXMsIHZpc2libGVFbmRNc11gIGJ5IHNpZGUuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU9mZnNjcmVlbk1hcmtlcnMoXG4gIG1hcmtlcnM6IFNwYW5NYXJrZXJbXSxcbiAgdmlzaWJsZVN0YXJ0TXM6IG51bWJlcixcbiAgdmlzaWJsZUVuZE1zOiBudW1iZXJcbik6IE9mZnNjcmVlbk1hcmtlcnMge1xuICBsZXQgbGVmdENvdW50ID0gMDtcbiAgbGV0IHJpZ2h0Q291bnQgPSAwO1xuICBsZXQgbmVhcmVzdExlZnQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGxldCBuZWFyZXN0UmlnaHQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgeyB0aW1lTXMgfSBvZiBtYXJrZXJzKSB7XG4gICAgaWYgKHRpbWVNcyA8IHZpc2libGVTdGFydE1zKSB7XG4gICAgICBsZWZ0Q291bnQrKztcbiAgICAgIGlmICh0aW1lTXMgPiBuZWFyZXN0TGVmdCkgbmVhcmVzdExlZnQgPSB0aW1lTXM7XG4gICAgfSBlbHNlIGlmICh0aW1lTXMgPiB2aXNpYmxlRW5kTXMpIHtcbiAgICAgIHJpZ2h0Q291bnQrKztcbiAgICAgIGlmICh0aW1lTXMgPCBuZWFyZXN0UmlnaHQpIG5lYXJlc3RSaWdodCA9IHRpbWVNcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBsZWZ0Q291bnQgPiAwID8geyBjb3VudDogbGVmdENvdW50LCBuZWFyZXN0TXM6IG5lYXJlc3RMZWZ0IH0gOiBudWxsLFxuICAgIHJpZ2h0OlxuICAgICAgcmlnaHRDb3VudCA+IDAgPyB7IGNvdW50OiByaWdodENvdW50LCBuZWFyZXN0TXM6IG5lYXJlc3RSaWdodCB9IDogbnVsbCxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { Event, Hook, WorkflowRun } from '@workflow/world';
|
|
2
|
-
import type { FetchSpanDetail } from './sidebar/use-selected-span-detail';
|
|
3
|
-
interface RunTraceViewProps {
|
|
4
|
-
run: WorkflowRun;
|
|
5
|
-
events: Event[];
|
|
6
|
-
isLoading?: boolean;
|
|
7
|
-
error?: Error | null;
|
|
8
|
-
fetchSpanDetail: FetchSpanDetail;
|
|
9
|
-
onWakeUpSleep?: (runId: string, correlationId: string) => Promise<{
|
|
10
|
-
stoppedCount: number;
|
|
11
|
-
}>;
|
|
12
|
-
onResolveHook?: (hookToken: string, payload: unknown, hook?: Hook) => Promise<void>;
|
|
13
|
-
onCancelRun?: (runId: string) => Promise<void>;
|
|
14
|
-
onStreamClick?: (streamId: string) => void;
|
|
15
|
-
onRunClick?: (runId: string) => void;
|
|
16
|
-
onLoadMoreSpans?: () => void | Promise<void>;
|
|
17
|
-
hasMoreSpans?: boolean;
|
|
18
|
-
isLoadingMoreSpans?: boolean;
|
|
19
|
-
showSeparateEventOccurrenceTimestamps?: boolean;
|
|
20
|
-
}
|
|
21
|
-
export declare function RunTraceView({ run, events, isLoading, error, fetchSpanDetail, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onRunClick, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans, showSeparateEventOccurrenceTimestamps, }: RunTraceViewProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=run-trace-view.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-trace-view.d.ts","sourceRoot":"","sources":["../../src/components/run-trace-view.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAG1E,UAAU,iBAAiB;IACzB,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qCAAqC,CAAC,EAAE,OAAO,CAAC;CACjD;AAED,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,qCAAqC,GACtC,EAAE,iBAAiB,2CAiCnB"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { AlertCircle } from 'lucide-react';
|
|
4
|
-
import { WorkflowTraceViewer } from './workflow-trace-view';
|
|
5
|
-
export function RunTraceView({ run, events, isLoading, error, fetchSpanDetail, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onRunClick, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans, showSeparateEventOccurrenceTimestamps, }) {
|
|
6
|
-
if (error && !run) {
|
|
7
|
-
return (_jsxs("div", { className: "m-4", children: [_jsx(AlertCircle, { className: "h-4 w-4" }), _jsx("p", { children: "Error loading workflow run" }), _jsx("p", { children: error.message })] }));
|
|
8
|
-
}
|
|
9
|
-
return (_jsx("div", { className: "w-full h-full relative", children: _jsx(WorkflowTraceViewer, { error: error, events: events, run: run, isLoading: isLoading, fetchSpanDetail: fetchSpanDetail, onWakeUpSleep: onWakeUpSleep, onResolveHook: onResolveHook, onCancelRun: onCancelRun, onStreamClick: onStreamClick, onRunClick: onRunClick, onLoadMoreSpans: onLoadMoreSpans, hasMoreSpans: hasMoreSpans, isLoadingMoreSpans: isLoadingMoreSpans, showSeparateEventOccurrenceTimestamps: showSeparateEventOccurrenceTimestamps }) }));
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLXRyYWNlLXZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9ydW4tdHJhY2Utdmlldy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUdiLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUEwQjVELE1BQU0sVUFBVSxZQUFZLENBQUMsRUFDM0IsR0FBRyxFQUNILE1BQU0sRUFDTixTQUFTLEVBQ1QsS0FBSyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsYUFBYSxFQUNiLFdBQVcsRUFDWCxhQUFhLEVBQ2IsVUFBVSxFQUNWLGVBQWUsRUFDZixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLHFDQUFxQyxHQUNuQjtJQUNsQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBQyxLQUFLLGFBQ2xCLEtBQUMsV0FBVyxJQUFDLFNBQVMsRUFBQyxTQUFTLEdBQUcsRUFDbkMscURBQWlDLEVBQ2pDLHNCQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUssSUFDbEIsQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FDTCxjQUFLLFNBQVMsRUFBQyx3QkFBd0IsWUFDckMsS0FBQyxtQkFBbUIsSUFDbEIsS0FBSyxFQUFFLEtBQUssRUFDWixNQUFNLEVBQUUsTUFBTSxFQUNkLEdBQUcsRUFBRSxHQUFHLEVBQ1IsU0FBUyxFQUFFLFNBQVMsRUFDcEIsZUFBZSxFQUFFLGVBQWUsRUFDaEMsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsV0FBVyxFQUFFLFdBQVcsRUFDeEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsVUFBVSxFQUFFLFVBQVUsRUFDdEIsZUFBZSxFQUFFLGVBQWUsRUFDaEMsWUFBWSxFQUFFLFlBQVksRUFDMUIsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQ3RDLHFDQUFxQyxFQUNuQyxxQ0FBcUMsR0FFdkMsR0FDRSxDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBIb29rLCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBBbGVydENpcmNsZSB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEZldGNoU3BhbkRldGFpbCB9IGZyb20gJy4vc2lkZWJhci91c2Utc2VsZWN0ZWQtc3Bhbi1kZXRhaWwnO1xuaW1wb3J0IHsgV29ya2Zsb3dUcmFjZVZpZXdlciB9IGZyb20gJy4vd29ya2Zsb3ctdHJhY2Utdmlldyc7XG5cbmludGVyZmFjZSBSdW5UcmFjZVZpZXdQcm9wcyB7XG4gIHJ1bjogV29ya2Zsb3dSdW47XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gIGZldGNoU3BhbkRldGFpbDogRmV0Y2hTcGFuRGV0YWlsO1xuICBvbldha2VVcFNsZWVwPzogKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx7IHN0b3BwZWRDb3VudDogbnVtYmVyIH0+O1xuICBvblJlc29sdmVIb29rPzogKFxuICAgIGhvb2tUb2tlbjogc3RyaW5nLFxuICAgIHBheWxvYWQ6IHVua25vd24sXG4gICAgaG9vaz86IEhvb2tcbiAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBvbkNhbmNlbFJ1bj86IChydW5JZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBvblN0cmVhbUNsaWNrPzogKHN0cmVhbUlkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uUnVuQ2xpY2s/OiAocnVuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25Mb2FkTW9yZVNwYW5zPzogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIGhhc01vcmVTcGFucz86IGJvb2xlYW47XG4gIGlzTG9hZGluZ01vcmVTcGFucz86IGJvb2xlYW47XG4gIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVuVHJhY2VWaWV3KHtcbiAgcnVuLFxuICBldmVudHMsXG4gIGlzTG9hZGluZyxcbiAgZXJyb3IsXG4gIGZldGNoU3BhbkRldGFpbCxcbiAgb25XYWtlVXBTbGVlcCxcbiAgb25SZXNvbHZlSG9vayxcbiAgb25DYW5jZWxSdW4sXG4gIG9uU3RyZWFtQ2xpY2ssXG4gIG9uUnVuQ2xpY2ssXG4gIG9uTG9hZE1vcmVTcGFucyxcbiAgaGFzTW9yZVNwYW5zLFxuICBpc0xvYWRpbmdNb3JlU3BhbnMsXG4gIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHMsXG59OiBSdW5UcmFjZVZpZXdQcm9wcykge1xuICBpZiAoZXJyb3IgJiYgIXJ1bikge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm0tNFwiPlxuICAgICAgICA8QWxlcnRDaXJjbGUgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICAgIDxwPkVycm9yIGxvYWRpbmcgd29ya2Zsb3cgcnVuPC9wPlxuICAgICAgICA8cD57ZXJyb3IubWVzc2FnZX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgcmVsYXRpdmVcIj5cbiAgICAgIDxXb3JrZmxvd1RyYWNlVmlld2VyXG4gICAgICAgIGVycm9yPXtlcnJvcn1cbiAgICAgICAgZXZlbnRzPXtldmVudHN9XG4gICAgICAgIHJ1bj17cnVufVxuICAgICAgICBpc0xvYWRpbmc9e2lzTG9hZGluZ31cbiAgICAgICAgZmV0Y2hTcGFuRGV0YWlsPXtmZXRjaFNwYW5EZXRhaWx9XG4gICAgICAgIG9uV2FrZVVwU2xlZXA9e29uV2FrZVVwU2xlZXB9XG4gICAgICAgIG9uUmVzb2x2ZUhvb2s9e29uUmVzb2x2ZUhvb2t9XG4gICAgICAgIG9uQ2FuY2VsUnVuPXtvbkNhbmNlbFJ1bn1cbiAgICAgICAgb25TdHJlYW1DbGljaz17b25TdHJlYW1DbGlja31cbiAgICAgICAgb25SdW5DbGljaz17b25SdW5DbGlja31cbiAgICAgICAgb25Mb2FkTW9yZVNwYW5zPXtvbkxvYWRNb3JlU3BhbnN9XG4gICAgICAgIGhhc01vcmVTcGFucz17aGFzTW9yZVNwYW5zfVxuICAgICAgICBpc0xvYWRpbmdNb3JlU3BhbnM9e2lzTG9hZGluZ01vcmVTcGFuc31cbiAgICAgICAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcz17XG4gICAgICAgICAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wc1xuICAgICAgICB9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type MutableRefObject } from 'react';
|
|
2
|
-
import type { VisibleSpan } from '../types';
|
|
3
|
-
export declare const MiniMap: import("react").MemoExoticComponent<({ timelineRef, rows, scale, }: {
|
|
4
|
-
timelineRef: MutableRefObject<HTMLDivElement | null>;
|
|
5
|
-
rows: VisibleSpan[][];
|
|
6
|
-
scale: number;
|
|
7
|
-
}) => import("react/jsx-runtime").JSX.Element>;
|
|
8
|
-
//# sourceMappingURL=map.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/map.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAMtB,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA4B5C,eAAO,MAAM,OAAO,sEAIjB;IACD,WAAW,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACrD,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,6CAmLC,CAAC"}
|