@workflow/web-shared 5.0.0-beta.4 → 5.0.0-beta.40
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 +5 -13
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +46 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +235 -97
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +8 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -4
- package/dist/components/sidebar/attribute-panel.d.ts +4 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +173 -119
- package/dist/components/sidebar/attributes-block.d.ts +40 -0
- package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
- package/dist/components/sidebar/attributes-block.js +140 -0
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +17 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +37 -71
- package/dist/components/sidebar/events-list.d.ts +6 -2
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +77 -63
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
- package/dist/components/sidebar/sidebar-data-context.js +1 -1
- package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
- package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
- package/dist/components/sidebar/span-detail-merge.js +92 -0
- package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
- package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
- package/dist/components/sidebar/use-selected-span-detail.js +93 -0
- 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 +34 -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 +14 -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 +31 -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 +10 -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/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +1 -1
- 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 +14 -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 +14 -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 +46 -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 +10 -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 +42 -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/timeline.module.css +46 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts +5 -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-shortcut-helper.module.css +20 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts +2 -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 +8 -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 +34 -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 +19 -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/util/timing.d.ts +2 -2
- package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
- package/dist/components/trace-viewer/util/timing.js +3 -3
- package/dist/components/trace-viewer/utils.d.ts +111 -0
- 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} +7 -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 +3 -3
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +46 -0
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/card.js +4 -4
- package/dist/components/ui/collapsible.d.ts +46 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +66 -0
- package/dist/components/ui/context-card.d.ts +47 -0
- package/dist/components/ui/context-card.d.ts.map +1 -0
- package/dist/components/ui/context-card.js +471 -0
- package/dist/components/ui/data-inspector.d.ts +7 -6
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +232 -99
- package/dist/components/ui/data-inspector.styles.d.ts +29 -0
- package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
- package/dist/components/ui/data-inspector.styles.js +95 -0
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +3 -3
- package/dist/components/ui/error-stack-block.d.ts +17 -10
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +49 -30
- package/dist/components/ui/icon-button.d.ts +19 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +29 -0
- package/dist/components/ui/kbd.d.ts +10 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +25 -0
- package/dist/components/ui/load-more-button.js +1 -1
- package/dist/components/ui/menu-dropdown.js +1 -1
- package/dist/components/ui/skeleton.js +2 -2
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
- package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
- package/dist/components/ui/timestamp-tooltip.js +80 -132
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +12 -0
- package/dist/components/workflow-traces/event-colors.d.ts +2 -1
- package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
- package/dist/components/workflow-traces/event-colors.js +15 -7
- package/dist/components/workflow-traces/trace-span-construction.d.ts +6 -3
- package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +71 -30
- package/dist/components/workflow-traces/trace-time-utils.js +1 -1
- package/dist/hooks/use-dark-mode.js +1 -1
- package/dist/hooks/use-intersection-observer.d.ts +17 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/hooks/use-intersection-observer.js +29 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
- package/dist/hooks/use-load-more-on-scroll.js +28 -0
- package/dist/hooks/use-reduced-motion.d.ts +10 -0
- package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
- package/dist/hooks/use-reduced-motion.js +29 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/lib/cn.d.ts +10 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +83 -0
- package/dist/lib/event-analysis.d.ts +1 -1
- package/dist/lib/event-analysis.d.ts.map +1 -1
- package/dist/lib/event-analysis.js +3 -2
- package/dist/lib/event-materialization.d.ts +1 -1
- package/dist/lib/event-materialization.d.ts.map +1 -1
- package/dist/lib/event-materialization.js +29 -21
- package/dist/lib/exact-event-search-id.d.ts +25 -0
- package/dist/lib/exact-event-search-id.d.ts.map +1 -0
- package/dist/lib/exact-event-search-id.js +39 -0
- package/dist/lib/hydration.d.ts +17 -2
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +194 -23
- package/dist/lib/stream-display.js +1 -1
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.d.ts +17 -5
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +32 -14
- 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/dist/lib/utils.d.ts +14 -2
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +46 -6
- package/dist/lib/zstd-browser-decoder.d.ts +7 -0
- package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
- package/dist/lib/zstd-browser-decoder.js +41 -0
- package/dist/styles.css +210 -139
- package/package.json +11 -8
- package/src/components/event-list-view.tsx +385 -123
- package/src/components/index.ts +14 -8
- package/src/components/sidebar/attribute-panel.tsx +331 -282
- package/src/components/sidebar/attributes-block.tsx +326 -0
- package/src/components/sidebar/copyable-data-block.tsx +50 -28
- package/src/components/sidebar/entity-detail-panel.tsx +92 -126
- package/src/components/sidebar/events-list.tsx +197 -179
- package/src/components/sidebar/sidebar-data-context.tsx +11 -11
- package/src/components/sidebar/span-detail-merge.ts +134 -0
- package/src/components/sidebar/use-selected-span-detail.ts +146 -0
- 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/copy-button.tsx +2 -2
- package/src/components/trace-viewer/components/detail-panel-width.test.ts +123 -0
- package/src/components/trace-viewer/components/detail-panel-width.ts +76 -0
- package/src/components/trace-viewer/components/detail-panel.tsx +273 -0
- package/src/components/trace-viewer/components/draggable-border.tsx +216 -0
- package/src/components/trace-viewer/components/event-list.tsx +144 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +8 -8
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +1 -1
- package/src/components/trace-viewer/components/minimap.tsx +556 -0
- package/src/components/trace-viewer/components/pane-constants.ts +19 -0
- package/src/components/trace-viewer/components/span-markers.tsx +173 -0
- package/src/components/trace-viewer/components/split-pane.tsx +141 -0
- package/src/components/trace-viewer/components/timeline.module.css +46 -0
- package/src/components/trace-viewer/components/timeline.tsx +850 -0
- package/src/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
- package/src/components/trace-viewer/components/trace-shortcut-helper.tsx +116 -0
- package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
- package/src/components/trace-viewer/components/use-element-width.ts +29 -0
- package/src/components/trace-viewer/components/use-row-window.ts +140 -0
- package/src/components/trace-viewer/context.tsx +63 -656
- package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +2 -2
- package/src/components/trace-viewer/search.ts +178 -0
- package/src/components/trace-viewer/trace-viewer.tsx +563 -531
- package/src/components/trace-viewer/types.ts +2 -234
- package/src/components/trace-viewer/util/timing.ts +2 -2
- package/src/components/trace-viewer/utils.test.ts +458 -0
- package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +271 -50
- package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +24 -18
- package/src/components/ui/alert.tsx +2 -2
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/card.tsx +3 -10
- package/src/components/ui/collapsible.tsx +219 -0
- package/src/components/ui/context-card.tsx +784 -0
- package/src/components/ui/data-inspector.styles.ts +96 -0
- package/src/components/ui/data-inspector.tsx +501 -204
- package/src/components/ui/error-card.tsx +4 -4
- package/src/components/ui/error-stack-block.tsx +84 -55
- package/src/components/ui/icon-button.tsx +53 -0
- package/src/components/ui/kbd.tsx +43 -0
- package/src/components/ui/skeleton.tsx +1 -1
- package/src/components/ui/timestamp-tooltip.tsx +132 -194
- package/src/components/ui/tooltip.tsx +47 -0
- package/src/components/workflow-traces/event-colors.ts +15 -11
- package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
- package/src/components/workflow-traces/trace-span-construction.ts +97 -32
- package/src/hooks/use-intersection-observer.ts +57 -0
- package/src/hooks/use-load-more-on-scroll.ts +49 -0
- package/src/hooks/use-reduced-motion.ts +34 -0
- package/src/index.ts +10 -4
- package/src/lib/cn.ts +93 -0
- package/src/lib/event-analysis.ts +6 -4
- package/src/lib/event-materialization.ts +35 -21
- package/src/lib/exact-event-search-id.ts +67 -0
- package/src/lib/hydration.ts +210 -30
- package/src/lib/trace-builder.ts +43 -19
- package/src/lib/trace-types.ts +56 -0
- package/src/lib/utils.test.ts +33 -0
- package/src/lib/utils.ts +53 -6
- package/src/lib/zstd-browser-decoder.ts +42 -0
- package/src/styles.css +210 -139
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/event-list-view.js.map +0 -1
- package/dist/components/hook-actions.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- 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/copy-button.js.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.d.ts +0 -8
- 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 -38
- package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
- 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/copy-selection.js.map +0 -1
- 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/middle-truncate.js.map +0 -1
- 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/truncate.js.map +0 -1
- 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/middle-truncate/use-middle-truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/split-pane.d.ts +0 -14
- 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 -99
- package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.d.ts +0 -31
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.js +0 -138
- package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
- package/dist/components/new-trace-viewer/context.d.ts +0 -15
- package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/context.js +0 -47
- package/dist/components/new-trace-viewer/context.js.map +0 -1
- package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
- package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/detail-panel.js +0 -12
- package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
- 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/icons.js.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -8
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +0 -349
- package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/new-trace-viewer/types.d.ts +0 -1
- 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/types.js.map +0 -1
- package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
- package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/util/constants.js +0 -2
- package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
- package/dist/components/new-trace-viewer/utils.d.ts +0 -42
- package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/utils.js +0 -305
- package/dist/components/new-trace-viewer/utils.js.map +0 -1
- package/dist/components/run-trace-view.d.ts +0 -25
- package/dist/components/run-trace-view.d.ts.map +0 -1
- package/dist/components/run-trace-view.js +0 -11
- package/dist/components/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.d.ts +0 -14
- package/dist/components/sidebar/detail-card.d.ts.map +0 -1
- package/dist/components/sidebar/detail-card.js +0 -20
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- 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/map.js.map +0 -1
- 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/markers.js.map +0 -1
- 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 -285
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- 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-input.js.map +0 -1
- 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/search.js.map +0 -1
- 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-content.js.map +0 -1
- 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-detail-panel.js.map +0 -1
- 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-segments.js.map +0 -1
- 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/span-strategies.js.map +0 -1
- 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/ui.js.map +0 -1
- 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-button.js.map +0 -1
- 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/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- 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/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
- package/dist/components/trace-viewer/types.js.map +0 -1
- 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/constants.js.map +0 -1
- 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/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- 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/tree.js.map +0 -1
- 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-immediate-style.js.map +0 -1
- 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-streaming-spans.js.map +0 -1
- 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/util/use-trackpad-zoom.js.map +0 -1
- 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/worker.js.map +0 -1
- package/dist/components/trace-viewer-new.d.ts.map +0 -1
- package/dist/components/trace-viewer-new.js +0 -23
- package/dist/components/trace-viewer-new.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.d.ts +0 -95
- package/dist/components/ui/inspector-theme.d.ts.map +0 -1
- package/dist/components/ui/inspector-theme.js +0 -82
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.d.ts +0 -40
- package/dist/components/workflow-trace-view.d.ts.map +0 -1
- package/dist/components/workflow-trace-view.js +0 -695
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- 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 -87
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/event-analysis.js.map +0 -1
- package/dist/lib/event-materialization.js.map +0 -1
- package/dist/lib/hydration.js.map +0 -1
- package/dist/lib/stream-display.js.map +0 -1
- package/dist/lib/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
- package/src/components/new-trace-viewer/components/event-list.tsx +0 -116
- package/src/components/new-trace-viewer/components/split-pane.tsx +0 -185
- package/src/components/new-trace-viewer/components/timeline.tsx +0 -382
- package/src/components/new-trace-viewer/context.tsx +0 -92
- package/src/components/new-trace-viewer/detail-panel.tsx +0 -58
- package/src/components/new-trace-viewer/trace-viewer.tsx +0 -645
- package/src/components/new-trace-viewer/types.ts +0 -0
- package/src/components/new-trace-viewer/util/constants.ts +0 -0
- package/src/components/run-trace-view.tsx +0 -84
- package/src/components/sidebar/detail-card.tsx +0 -65
- 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 -505
- 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/ui/inspector-theme.ts +0 -110
- package/src/components/workflow-trace-view.tsx +0 -1171
- 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/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/use-middle-truncate.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +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/use-middle-truncate.ts +0 -0
- /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
|
@@ -4,11 +4,15 @@ import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
|
|
|
4
4
|
import { Check, ChevronRight, Copy } from 'lucide-react';
|
|
5
5
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
6
6
|
import { Virtuoso } from 'react-virtuoso';
|
|
7
|
+
import { looksLikeWorkflowIdSearchInput, parseExactWorkflowSearchId, } from '../lib/exact-event-search-id';
|
|
7
8
|
import { isEncryptedMarker } from '../lib/hydration';
|
|
8
|
-
import {
|
|
9
|
+
import { useToast } from '../lib/toast';
|
|
9
10
|
import { formatDuration } from '../lib/utils';
|
|
11
|
+
import { AttrSetEventBlock } from './sidebar/attributes-block';
|
|
12
|
+
import { ContextCardProvider } from './ui/context-card';
|
|
10
13
|
import { DataInspector, DecryptClickContext } from './ui/data-inspector';
|
|
11
|
-
import {
|
|
14
|
+
import { DecryptButton } from './ui/decrypt-button';
|
|
15
|
+
import { ErrorStackBlock, isStructuredError, } from './ui/error-stack-block';
|
|
12
16
|
import { LoadMoreButton } from './ui/load-more-button';
|
|
13
17
|
import { MenuDropdown } from './ui/menu-dropdown';
|
|
14
18
|
import { Skeleton } from './ui/skeleton';
|
|
@@ -42,6 +46,18 @@ function formatEventTime(date) {
|
|
|
42
46
|
'.' +
|
|
43
47
|
date.getMilliseconds().toString().padStart(3, '0'));
|
|
44
48
|
}
|
|
49
|
+
function parseEventDate(value) {
|
|
50
|
+
if (value == null)
|
|
51
|
+
return null;
|
|
52
|
+
const date = value instanceof Date ? value : new Date(String(value));
|
|
53
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
54
|
+
}
|
|
55
|
+
function getEffectiveEventDate(event) {
|
|
56
|
+
return parseEventDate(event.occurredAt) ?? new Date(event.createdAt);
|
|
57
|
+
}
|
|
58
|
+
function getEffectiveEventTime(event) {
|
|
59
|
+
return getEffectiveEventDate(event).getTime();
|
|
60
|
+
}
|
|
45
61
|
function formatEventType(eventType) {
|
|
46
62
|
return eventType
|
|
47
63
|
.split('_')
|
|
@@ -67,6 +83,10 @@ function getStatusDotColor(eventType) {
|
|
|
67
83
|
if (eventType === 'step_retrying') {
|
|
68
84
|
return 'var(--ds-amber-700)';
|
|
69
85
|
}
|
|
86
|
+
// Attribute changes → teal
|
|
87
|
+
if (eventType === 'attr_set') {
|
|
88
|
+
return 'var(--ds-teal-900)';
|
|
89
|
+
}
|
|
70
90
|
// Completed/succeeded → green
|
|
71
91
|
if (eventType === 'step_completed' ||
|
|
72
92
|
eventType === 'run_completed' ||
|
|
@@ -112,33 +132,46 @@ function buildNameMaps(events, run) {
|
|
|
112
132
|
* created ↔ started (queued) and started ↔ completed/failed/cancelled (ran).
|
|
113
133
|
* Also computes run-level durations under the key '__run__'.
|
|
114
134
|
*/
|
|
115
|
-
function buildDurationMap(events) {
|
|
135
|
+
export function buildDurationMap(events) {
|
|
136
|
+
// Process events in chronological order so the result doesn't depend on
|
|
137
|
+
// the caller's sort direction. Retried steps emit multiple `step_started`
|
|
138
|
+
// events for the same correlationId; the queued duration must be measured
|
|
139
|
+
// against the first one, not the last.
|
|
140
|
+
const chronological = [...events].sort((a, b) => getEffectiveEventTime(a) - getEffectiveEventTime(b));
|
|
116
141
|
const createdTimes = new Map();
|
|
142
|
+
const firstStartedTimes = new Map();
|
|
117
143
|
const startedTimes = new Map();
|
|
118
144
|
const durations = new Map();
|
|
119
|
-
for (const event of
|
|
120
|
-
const ts =
|
|
145
|
+
for (const event of chronological) {
|
|
146
|
+
const ts = getEffectiveEventTime(event);
|
|
121
147
|
const key = event.correlationId ?? '__run__';
|
|
122
148
|
const type = event.eventType;
|
|
123
149
|
// Track created times (first event for each correlation)
|
|
124
150
|
if (type === 'step_created' || type === 'run_created') {
|
|
125
|
-
createdTimes.
|
|
151
|
+
if (!createdTimes.has(key)) {
|
|
152
|
+
createdTimes.set(key, ts);
|
|
153
|
+
}
|
|
126
154
|
}
|
|
127
155
|
// Track started times & compute queued duration
|
|
128
156
|
if (type === 'step_started' ||
|
|
129
157
|
type === 'run_started' ||
|
|
130
158
|
type === 'workflow_started') {
|
|
131
159
|
startedTimes.set(key, ts);
|
|
132
|
-
//
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
160
|
+
// The queued duration is anchored on the first start event only —
|
|
161
|
+
// subsequent step_started events come from retries.
|
|
162
|
+
if (!firstStartedTimes.has(key)) {
|
|
163
|
+
firstStartedTimes.set(key, ts);
|
|
164
|
+
// If no explicit created event was seen, use the started time as created
|
|
165
|
+
if (!createdTimes.has(key)) {
|
|
166
|
+
createdTimes.set(key, ts);
|
|
167
|
+
}
|
|
168
|
+
const createdAt = createdTimes.get(key);
|
|
169
|
+
const info = durations.get(key) ?? {};
|
|
170
|
+
if (createdAt !== undefined) {
|
|
171
|
+
info.queued = ts - createdAt;
|
|
172
|
+
}
|
|
173
|
+
durations.set(key, info);
|
|
140
174
|
}
|
|
141
|
-
durations.set(key, info);
|
|
142
175
|
}
|
|
143
176
|
// Compute ran duration on terminal events
|
|
144
177
|
if (type === 'step_completed' ||
|
|
@@ -178,7 +211,10 @@ function isRunLevel(eventType) {
|
|
|
178
211
|
eventType === 'run_cancelled' ||
|
|
179
212
|
eventType === 'workflow_started' ||
|
|
180
213
|
eventType === 'workflow_completed' ||
|
|
181
|
-
eventType === 'workflow_failed'
|
|
214
|
+
eventType === 'workflow_failed' ||
|
|
215
|
+
// attr_set carries a dedup correlationId rather than a child entity ID,
|
|
216
|
+
// so it groups and labels with the run itself.
|
|
217
|
+
eventType === 'attr_set');
|
|
182
218
|
}
|
|
183
219
|
// ──────────────────────────────────────────────────────────────────────────
|
|
184
220
|
// Tree gutter — fixed-width, shows branch lines only for the selected group
|
|
@@ -314,7 +350,7 @@ function deepParseJson(value) {
|
|
|
314
350
|
return value;
|
|
315
351
|
}
|
|
316
352
|
/**
|
|
317
|
-
* Extracts a structured error
|
|
353
|
+
* Extracts a structured error from event data, if present.
|
|
318
354
|
* Returns the error object to render with ErrorStackBlock, or null if not applicable.
|
|
319
355
|
*/
|
|
320
356
|
function extractStructuredError(data, eventType) {
|
|
@@ -324,10 +360,10 @@ function extractStructuredError(data, eventType) {
|
|
|
324
360
|
return null;
|
|
325
361
|
const record = data;
|
|
326
362
|
// Check the nested `error` field first (the StructuredError)
|
|
327
|
-
if (
|
|
363
|
+
if (isStructuredError(record.error))
|
|
328
364
|
return record.error;
|
|
329
|
-
// Some error formats put the stack at the top level of eventData
|
|
330
|
-
if (
|
|
365
|
+
// Some error formats put the message/stack at the top level of eventData.
|
|
366
|
+
if (isStructuredError(record))
|
|
331
367
|
return record;
|
|
332
368
|
return null;
|
|
333
369
|
}
|
|
@@ -367,7 +403,24 @@ function PayloadBlock({ data, eventType, }) {
|
|
|
367
403
|
if (structuredError) {
|
|
368
404
|
return (_jsx("div", { className: "p-2", children: _jsx(ErrorStackBlock, { value: structuredError }) }));
|
|
369
405
|
}
|
|
370
|
-
|
|
406
|
+
// Attribute changes — render the changed keys and the writer instead of
|
|
407
|
+
// the raw JSON payload.
|
|
408
|
+
if (eventType === 'attr_set') {
|
|
409
|
+
return _jsx(AttrSetEventBlock, { data: cleaned });
|
|
410
|
+
}
|
|
411
|
+
// Cancellation reason — render the free-text reason as a readable line
|
|
412
|
+
// instead of a raw JSON payload (the only field run_cancelled carries).
|
|
413
|
+
if (eventType === 'run_cancelled') {
|
|
414
|
+
const cancelReason = cleaned != null &&
|
|
415
|
+
typeof cleaned === 'object' &&
|
|
416
|
+
typeof cleaned.cancelReason === 'string'
|
|
417
|
+
? cleaned.cancelReason
|
|
418
|
+
: null;
|
|
419
|
+
if (cancelReason) {
|
|
420
|
+
return (_jsxs("div", { className: "p-2 text-label-12", style: { color: 'var(--ds-gray-1000)' }, children: [_jsx("span", { style: { color: 'var(--ds-gray-900)' }, children: "Reason: " }), _jsx("span", { className: "whitespace-pre-wrap break-words", children: cancelReason })] }));
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return (_jsxs("div", { className: "relative group/payload", children: [_jsx("div", { className: "overflow-x-auto p-2 text-[11px]", style: { color: 'var(--ds-gray-1000)' }, children: _jsx(DataInspector, { data: cleaned, expandLevel: 2 }) }), _jsx("button", { type: "button", onClick: handleCopy, className: "absolute bottom-2 right-2 opacity-0 group-hover/payload:opacity-100 transition-opacity flex items-center gap-1 px-2 py-1 rounded-md text-button-12 hover:bg-[var(--ds-gray-alpha-200)]", style: { ...BUTTON_RESET_STYLE, color: 'var(--ds-gray-700)' }, "aria-label": "Copy payload", children: copied ? (_jsxs(_Fragment, { children: [_jsx(Check, { className: "h-3 w-3", style: { color: 'var(--ds-green-700)' } }), _jsx("span", { style: { color: 'var(--ds-green-700)' }, children: "Copied" })] })) : (_jsxs(_Fragment, { children: [_jsx(Copy, { className: "h-3 w-3" }), _jsx("span", { children: "Copy" })] })) })] }));
|
|
371
424
|
}
|
|
372
425
|
// ──────────────────────────────────────────────────────────────────────────
|
|
373
426
|
// Sort options for the events list
|
|
@@ -376,7 +429,7 @@ const SORT_OPTIONS = [
|
|
|
376
429
|
{ value: 'desc', label: 'Newest' },
|
|
377
430
|
{ value: 'asc', label: 'Oldest' },
|
|
378
431
|
];
|
|
379
|
-
function RowsSkeleton() {
|
|
432
|
+
function RowsSkeleton({ showSeparateEventOccurrenceTimestamps = false, }) {
|
|
380
433
|
return (_jsx("div", { className: "flex-1 overflow-hidden", children: Array.from({ length: 16 }, (_, i) => (_jsxs("div", { className: "flex items-center gap-0", style: { height: 40 }, children: [_jsxs("div", { className: "relative flex-shrink-0 self-stretch flex items-center", style: { width: GUTTER_WIDTH }, children: [_jsx("div", { style: {
|
|
381
434
|
position: 'absolute',
|
|
382
435
|
left: 8,
|
|
@@ -388,9 +441,9 @@ function RowsSkeleton() {
|
|
|
388
441
|
height: i % 4 === 0 ? 8 : 6,
|
|
389
442
|
borderRadius: '50%',
|
|
390
443
|
marginLeft: i % 4 === 0 ? 5 : 6,
|
|
391
|
-
} })] }), _jsx("div", { className: "w-5 flex-shrink-0 flex items-center justify-center", children: _jsx(Skeleton, { className: "w-5 h-5", style: { borderRadius: 4 } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '70%' } }) }), _jsxs("div", { className: "min-w-0 px-4 flex items-center gap-1.5", style: { flex: '2 1 0%' }, children: [_jsx(Skeleton, { className: "flex-shrink-0", style: { width: 6, height: 6, borderRadius: '50%' } }), _jsx(Skeleton, { className: "h-3", style: { width: '60%' } })] }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '50%' } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '3 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '75%' } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '3 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '75%' } }) })] }, i))) }));
|
|
444
|
+
} })] }), _jsx("div", { className: "w-5 flex-shrink-0 flex items-center justify-center", children: _jsx(Skeleton, { className: "w-5 h-5", style: { borderRadius: 4 } }) }), showSeparateEventOccurrenceTimestamps && (_jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '70%' } }) })), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '70%' } }) }), _jsxs("div", { className: "min-w-0 px-4 flex items-center gap-1.5", style: { flex: '2 1 0%' }, children: [_jsx(Skeleton, { className: "flex-shrink-0", style: { width: 6, height: 6, borderRadius: '50%' } }), _jsx(Skeleton, { className: "h-3", style: { width: '60%' } })] }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '50%' } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '3 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '75%' } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '3 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: '75%' } }) })] }, i))) }));
|
|
392
445
|
}
|
|
393
|
-
function EventRow({ event, index, isFirst, isLast, isExpanded, onToggleExpand, activeGroupKey, selectedGroupKey, selectedGroupRange, correlationNameMap, workflowName, durationMap, onSelectGroup, onHoverGroup, onLoadEventData, cachedEventData, onCacheEventData, encryptionKey, onEncryptedDataDetected, }) {
|
|
446
|
+
export function EventRow({ event, index, isFirst, isLast, isExpanded, onToggleExpand, activeGroupKey, selectedGroupKey, selectedGroupRange, correlationNameMap, workflowName, durationMap, onSelectGroup, onHoverGroup, onLoadEventData, cachedEventData, onCacheEventData, encryptionKey, onEncryptedDataDetected, suppressGroupDimming = false, showSeparateEventOccurrenceTimestamps = false, }) {
|
|
394
447
|
const [isLoading, setIsLoading] = useState(false);
|
|
395
448
|
const [loadedEventData, setLoadedEventData] = useState(cachedEventData);
|
|
396
449
|
const [loadError, setLoadError] = useState(null);
|
|
@@ -409,6 +462,10 @@ function EventRow({ event, index, isFirst, isLast, isExpanded, onToggleExpand, a
|
|
|
409
462
|
: (event.correlationId ?? undefined);
|
|
410
463
|
const statusDotColor = getStatusDotColor(event.eventType);
|
|
411
464
|
const createdAt = new Date(event.createdAt);
|
|
465
|
+
const occurredAt = parseEventDate(event.occurredAt);
|
|
466
|
+
const displayedCreatedAt = showSeparateEventOccurrenceTimestamps
|
|
467
|
+
? createdAt
|
|
468
|
+
: getEffectiveEventDate(event);
|
|
412
469
|
const hasExistingEventData = 'eventData' in event && event.eventData != null;
|
|
413
470
|
const isRun = isRunLevel(event.eventType);
|
|
414
471
|
const eventName = isRun
|
|
@@ -420,7 +477,7 @@ function EventRow({ event, index, isFirst, isLast, isExpanded, onToggleExpand, a
|
|
|
420
477
|
const durationInfo = durationKey ? durationMap.get(durationKey) : undefined;
|
|
421
478
|
const hasActive = activeGroupKey !== undefined;
|
|
422
479
|
const isRelated = rowGroupKey !== undefined && rowGroupKey === activeGroupKey;
|
|
423
|
-
const isDimmed = hasActive && !isRelated;
|
|
480
|
+
const isDimmed = hasActive && !isRelated && !suppressGroupDimming;
|
|
424
481
|
const isPulsing = hasActive && isRelated;
|
|
425
482
|
// Gutter state derived from selectedGroupRange
|
|
426
483
|
const showBranch = hasActive && isRelated && !isRun;
|
|
@@ -526,12 +583,12 @@ function EventRow({ event, index, isFirst, isLast, isExpanded, onToggleExpand, a
|
|
|
526
583
|
return (_jsxs("div", { "data-event-id": event.eventId, onMouseEnter: () => onHoverGroup(rowGroupKey), onMouseLeave: () => onHoverGroup(undefined), children: [_jsxs("div", { role: "button", tabIndex: 0, onClick: handleRowClick, onKeyDown: (e) => {
|
|
527
584
|
if (e.key === 'Enter' || e.key === ' ')
|
|
528
585
|
handleRowClick();
|
|
529
|
-
}, className: "w-full text-left flex items-center gap-0 text-
|
|
586
|
+
}, className: "w-full text-left flex items-center gap-0 text-label-13 hover:bg-[var(--ds-gray-alpha-100)] transition-colors cursor-pointer", style: { minHeight: 40 }, children: [_jsx(TreeGutter, { isFirst: isFirst, isLast: isLast && !isExpanded, isRunLevel: isRun, statusDotColor: statusDotColor, pulse: isPulsing, hasSelection: hasActive, showBranch: showBranch, showLaneLine: showLaneLine, isLaneStart: isLaneStart, isLaneEnd: isLaneEnd }), _jsxs("div", { className: "flex items-center flex-1 min-w-0", style: { opacity: contentOpacity, transition: 'opacity 150ms' }, children: [_jsx("div", { className: "flex items-center justify-center w-5 h-5 flex-shrink-0 rounded", style: {
|
|
530
587
|
border: '1px solid var(--ds-gray-400)',
|
|
531
588
|
}, children: _jsx(ChevronRight, { className: "h-3 w-3 transition-transform", style: {
|
|
532
589
|
color: 'var(--ds-gray-900)',
|
|
533
590
|
transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',
|
|
534
|
-
} }) }), _jsx("div", { className: "tabular-nums min-w-0 px-4", style: { color: 'var(--ds-gray-900)', flex: '2 1 0%' }, children: _jsx(TimestampTooltip, { date:
|
|
591
|
+
} }) }), showSeparateEventOccurrenceTimestamps && (_jsx("div", { className: "tabular-nums min-w-0 px-4", style: { color: 'var(--ds-gray-900)', flex: '2 1 0%' }, children: occurredAt ? (_jsx(TimestampTooltip, { date: occurredAt, children: _jsx("span", { children: formatEventTime(occurredAt) }) })) : ('-') })), _jsx("div", { className: "tabular-nums min-w-0 px-4", style: { color: 'var(--ds-gray-900)', flex: '2 1 0%' }, children: _jsx(TimestampTooltip, { date: displayedCreatedAt, children: _jsx("span", { children: formatEventTime(displayedCreatedAt) }) }) }), _jsx("div", { className: "font-medium min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsxs("span", { className: "inline-flex items-center gap-1.5", style: { color: 'var(--ds-gray-900)' }, children: [_jsxs("span", { style: {
|
|
535
592
|
position: 'relative',
|
|
536
593
|
display: 'inline-flex',
|
|
537
594
|
width: 6,
|
|
@@ -555,20 +612,21 @@ function EventRow({ event, index, isFirst, isLast, isExpanded, onToggleExpand, a
|
|
|
555
612
|
opacity: contentOpacity,
|
|
556
613
|
transition: 'opacity 150ms',
|
|
557
614
|
}, children: [(durationInfo?.queued !== undefined ||
|
|
558
|
-
durationInfo?.ran !== undefined) && (_jsxs("div", { className: "px-2 pb-1.5 text-
|
|
559
|
-
durationInfo.queued > 0 && (_jsxs("span", { children: ["Queued for", ' ', _jsx("span", { className: "font-mono tabular-nums", children: formatDuration(durationInfo.queued) })] })), durationInfo.ran !== undefined && (_jsxs("span", { children: ["Ran for", ' ', _jsx("span", { className: "font-mono tabular-nums", children: formatDuration(durationInfo.ran) })] }))] })), displayPayload != null ? (_jsx(PayloadBlock, { data: displayPayload, eventType: event.eventType })) : loadError ? (_jsx("div", { className: "rounded-md border p-3 text-
|
|
615
|
+
durationInfo?.ran !== undefined) && (_jsxs("div", { className: "px-2 pb-1.5 text-label-12 flex gap-3", style: { color: 'var(--ds-gray-900)' }, children: [durationInfo.queued !== undefined &&
|
|
616
|
+
durationInfo.queued > 0 && (_jsxs("span", { children: ["Queued for", ' ', _jsx("span", { className: "font-mono tabular-nums", children: formatDuration(durationInfo.queued) })] })), durationInfo.ran !== undefined && (_jsxs("span", { children: ["Ran for", ' ', _jsx("span", { className: "font-mono tabular-nums", children: formatDuration(durationInfo.ran) })] }))] })), displayPayload != null ? (_jsx(PayloadBlock, { data: displayPayload, eventType: event.eventType })) : loadError ? (_jsx("div", { className: "rounded-md border p-3 text-label-12", style: {
|
|
560
617
|
borderColor: 'var(--ds-red-400)',
|
|
561
618
|
backgroundColor: 'var(--ds-red-100)',
|
|
562
619
|
color: 'var(--ds-red-900)',
|
|
563
620
|
}, children: loadError })) : isLoading ||
|
|
564
621
|
(loadedEventData === null &&
|
|
565
622
|
!hasAttemptedLoad &&
|
|
566
|
-
event.correlationId) ? (_jsxs("div", { className: "flex flex-col gap-2 p-3", children: [_jsx(Skeleton, { className: "h-3", style: { width: '75%' } }), _jsx(Skeleton, { className: "h-3", style: { width: '50%' } }), _jsx(Skeleton, { className: "h-3", style: { width: '60%' } })] })) : (_jsx("div", { className: "p-2 text-
|
|
623
|
+
event.correlationId) ? (_jsxs("div", { className: "flex flex-col gap-2 p-3", children: [_jsx(Skeleton, { className: "h-3", style: { width: '75%' } }), _jsx(Skeleton, { className: "h-3", style: { width: '50%' } }), _jsx(Skeleton, { className: "h-3", style: { width: '60%' } })] })) : (_jsx("div", { className: "p-2 text-label-12", style: { color: 'var(--ds-gray-900)' }, children: "No data" }))] })] }))] }));
|
|
567
624
|
}
|
|
568
625
|
// ──────────────────────────────────────────────────────────────────────────
|
|
569
626
|
// Main component
|
|
570
627
|
// ──────────────────────────────────────────────────────────────────────────
|
|
571
|
-
|
|
628
|
+
function EventListViewInner({ events, run, onLoadEventData, hasMoreEvents = false, isLoadingMoreEvents = false, onLoadMoreEvents, encryptionKey, isLoading = false, sortOrder: sortOrderProp, onSortOrderChange, onDecrypt, isDecrypting = false, hasEncryptedData: hasEncryptedDataProp = false, onExactIdSearch, showSeparateEventOccurrenceTimestamps = false, }) {
|
|
629
|
+
const toast = useToast();
|
|
572
630
|
const [internalSortOrder, setInternalSortOrder] = useState('asc');
|
|
573
631
|
const effectiveSortOrder = sortOrderProp ?? internalSortOrder;
|
|
574
632
|
const handleSortOrderChange = useCallback((order) => {
|
|
@@ -579,24 +637,35 @@ export function EventListView({ events, run, onLoadEventData, hasMoreEvents = fa
|
|
|
579
637
|
setInternalSortOrder(order);
|
|
580
638
|
}
|
|
581
639
|
}, [onSortOrderChange]);
|
|
640
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
641
|
+
const [searchResults, setSearchResults] = useState(null);
|
|
642
|
+
const [searchResultsTruncated, setSearchResultsTruncated] = useState(false);
|
|
643
|
+
const [searchError, setSearchError] = useState(null);
|
|
644
|
+
const [searchLoading, setSearchLoading] = useState(false);
|
|
645
|
+
const [searchNotFound, setSearchNotFound] = useState(false);
|
|
646
|
+
const searchRequestRef = useRef(0);
|
|
647
|
+
const virtuosoRef = useRef(null);
|
|
648
|
+
const parsedSearchId = useMemo(() => parseExactWorkflowSearchId(searchQuery), [searchQuery]);
|
|
649
|
+
const isExactSearchActive = searchResults !== null;
|
|
582
650
|
const sortedEvents = useMemo(() => {
|
|
583
|
-
|
|
651
|
+
const sourceEvents = isExactSearchActive ? searchResults : (events ?? []);
|
|
652
|
+
if (sourceEvents.length === 0)
|
|
584
653
|
return [];
|
|
585
654
|
const dir = effectiveSortOrder === 'desc' ? -1 : 1;
|
|
586
|
-
return [...
|
|
587
|
-
|
|
588
|
-
}, [events, effectiveSortOrder]);
|
|
655
|
+
return [...sourceEvents].sort((a, b) => dir * (getEffectiveEventTime(a) - getEffectiveEventTime(b)));
|
|
656
|
+
}, [events, effectiveSortOrder, isExactSearchActive, searchResults]);
|
|
589
657
|
// Detect encrypted fields across all loaded events (inline eventData).
|
|
590
658
|
const hasEncryptedInlineData = useMemo(() => {
|
|
591
|
-
|
|
659
|
+
const sourceEvents = isExactSearchActive ? searchResults : events;
|
|
660
|
+
if (!sourceEvents)
|
|
592
661
|
return false;
|
|
593
|
-
for (const event of
|
|
662
|
+
for (const event of sourceEvents) {
|
|
594
663
|
const ed = event.eventData;
|
|
595
664
|
if (hasEncryptedValues(ed))
|
|
596
665
|
return true;
|
|
597
666
|
}
|
|
598
667
|
return false;
|
|
599
|
-
}, [events]);
|
|
668
|
+
}, [events, isExactSearchActive, searchResults]);
|
|
600
669
|
// Tracks whether any expanded row's lazy-loaded data contained encrypted markers.
|
|
601
670
|
// Set to true by EventRow via onEncryptedDataDetected; never reset (sticky).
|
|
602
671
|
const [foundEncryptedInLazyData, setFoundEncryptedInLazyData] = useState(false);
|
|
@@ -604,7 +673,7 @@ export function EventListView({ events, run, onLoadEventData, hasMoreEvents = fa
|
|
|
604
673
|
setFoundEncryptedInLazyData(true);
|
|
605
674
|
}, []);
|
|
606
675
|
const hasEncryptedData = hasEncryptedDataProp || hasEncryptedInlineData || foundEncryptedInLazyData;
|
|
607
|
-
const { correlationNameMap, workflowName } = useMemo(() => buildNameMaps(events ?? null, run ?? null), [events, run]);
|
|
676
|
+
const { correlationNameMap, workflowName } = useMemo(() => buildNameMaps(isExactSearchActive ? searchResults : (events ?? null), run ?? null), [events, isExactSearchActive, run, searchResults]);
|
|
608
677
|
const durationMap = useMemo(() => buildDurationMap(sortedEvents), [sortedEvents]);
|
|
609
678
|
const [selectedGroupKey, setSelectedGroupKey] = useState(undefined);
|
|
610
679
|
const [hoveredGroupKey, setHoveredGroupKey] = useState(undefined);
|
|
@@ -682,61 +751,112 @@ export function EventListView({ events, run, onLoadEventData, hasMoreEvents = fa
|
|
|
682
751
|
}
|
|
683
752
|
return first >= 0 ? { first, last } : null;
|
|
684
753
|
}, [activeGroupKey, sortedEvents]);
|
|
685
|
-
const [searchQuery, setSearchQuery] = useState('');
|
|
686
|
-
const virtuosoRef = useRef(null);
|
|
687
|
-
const searchIndex = useMemo(() => {
|
|
688
|
-
const entries = [];
|
|
689
|
-
for (let i = 0; i < sortedEvents.length; i++) {
|
|
690
|
-
const ev = sortedEvents[i];
|
|
691
|
-
const isRun = isRunLevel(ev.eventType);
|
|
692
|
-
const name = isRun
|
|
693
|
-
? (workflowName ?? '')
|
|
694
|
-
: ev.correlationId
|
|
695
|
-
? (correlationNameMap.get(ev.correlationId) ?? '')
|
|
696
|
-
: '';
|
|
697
|
-
entries.push({
|
|
698
|
-
fields: [
|
|
699
|
-
ev.eventId,
|
|
700
|
-
ev.correlationId ?? '',
|
|
701
|
-
ev.eventType,
|
|
702
|
-
formatEventType(ev.eventType),
|
|
703
|
-
name,
|
|
704
|
-
].map((f) => f.toLowerCase()),
|
|
705
|
-
groupKey: ev.correlationId ?? (isRun ? '__run__' : undefined),
|
|
706
|
-
eventId: ev.eventId,
|
|
707
|
-
index: i,
|
|
708
|
-
});
|
|
709
|
-
}
|
|
710
|
-
return entries;
|
|
711
|
-
}, [sortedEvents, correlationNameMap, workflowName]);
|
|
712
754
|
useEffect(() => {
|
|
713
|
-
const
|
|
714
|
-
if (!
|
|
755
|
+
const trimmed = searchQuery.trim();
|
|
756
|
+
if (!trimmed) {
|
|
757
|
+
searchRequestRef.current += 1;
|
|
758
|
+
setSearchResults(null);
|
|
759
|
+
setSearchResultsTruncated(false);
|
|
760
|
+
setSearchError(null);
|
|
761
|
+
setSearchLoading(false);
|
|
762
|
+
setSearchNotFound(false);
|
|
715
763
|
setSelectedGroupKey(undefined);
|
|
716
764
|
return;
|
|
717
765
|
}
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
766
|
+
const parsed = parseExactWorkflowSearchId(trimmed);
|
|
767
|
+
if (!parsed || !onExactIdSearch) {
|
|
768
|
+
setSearchResults(null);
|
|
769
|
+
setSearchLoading(false);
|
|
770
|
+
setSearchNotFound(false);
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
const requestId = ++searchRequestRef.current;
|
|
774
|
+
setSearchLoading(true);
|
|
775
|
+
setSearchNotFound(false);
|
|
776
|
+
setSearchError(null);
|
|
777
|
+
const abortController = new AbortController();
|
|
778
|
+
const timer = setTimeout(() => {
|
|
779
|
+
void (async () => {
|
|
780
|
+
try {
|
|
781
|
+
const results = await onExactIdSearch(parsed.id, parsed.kind, abortController.signal);
|
|
782
|
+
if (abortController.signal.aborted ||
|
|
783
|
+
searchRequestRef.current !== requestId) {
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
if (results.status === 'error') {
|
|
787
|
+
setSearchResults([]);
|
|
788
|
+
setSearchResultsTruncated(false);
|
|
789
|
+
setSearchNotFound(false);
|
|
790
|
+
setSearchError(results.message);
|
|
791
|
+
setSelectedGroupKey(undefined);
|
|
792
|
+
return;
|
|
727
793
|
}
|
|
794
|
+
if (results.status === 'not_found' ||
|
|
795
|
+
(results.status === 'ok' && results.events.length === 0)) {
|
|
796
|
+
setSearchResults([]);
|
|
797
|
+
setSearchResultsTruncated(false);
|
|
798
|
+
setSearchNotFound(true);
|
|
799
|
+
setSearchError(null);
|
|
800
|
+
setSelectedGroupKey(undefined);
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
setSearchResults(results.events);
|
|
804
|
+
setSearchResultsTruncated(Boolean(results.truncated));
|
|
805
|
+
setSearchNotFound(false);
|
|
806
|
+
setSearchError(null);
|
|
807
|
+
setSelectedGroupKey(parsed.kind === 'event'
|
|
808
|
+
? (() => {
|
|
809
|
+
const first = results.events[0];
|
|
810
|
+
if (!first)
|
|
811
|
+
return undefined;
|
|
812
|
+
return isRunLevel(first.eventType)
|
|
813
|
+
? '__run__'
|
|
814
|
+
: (first.correlationId ?? undefined);
|
|
815
|
+
})()
|
|
816
|
+
: parsed.id);
|
|
817
|
+
virtuosoRef.current?.scrollToIndex({
|
|
818
|
+
index: 0,
|
|
819
|
+
align: 'start',
|
|
820
|
+
behavior: 'smooth',
|
|
821
|
+
});
|
|
728
822
|
}
|
|
729
|
-
|
|
823
|
+
catch {
|
|
824
|
+
if (abortController.signal.aborted ||
|
|
825
|
+
searchRequestRef.current !== requestId) {
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
setSearchResults([]);
|
|
829
|
+
setSearchResultsTruncated(false);
|
|
830
|
+
setSearchNotFound(false);
|
|
831
|
+
setSearchError('Failed to search events. Try again.');
|
|
832
|
+
setSelectedGroupKey(undefined);
|
|
833
|
+
}
|
|
834
|
+
finally {
|
|
835
|
+
if (searchRequestRef.current === requestId &&
|
|
836
|
+
!abortController.signal.aborted) {
|
|
837
|
+
setSearchLoading(false);
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
})();
|
|
841
|
+
}, 300);
|
|
842
|
+
return () => {
|
|
843
|
+
clearTimeout(timer);
|
|
844
|
+
abortController.abort();
|
|
845
|
+
};
|
|
846
|
+
}, [searchQuery, onExactIdSearch]);
|
|
847
|
+
const handleSearchKeyDown = useCallback((event) => {
|
|
848
|
+
if (event.key !== 'Enter') {
|
|
849
|
+
return;
|
|
730
850
|
}
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
});
|
|
851
|
+
const trimmed = searchQuery.trim();
|
|
852
|
+
if (!trimmed ||
|
|
853
|
+
parseExactWorkflowSearchId(trimmed) ||
|
|
854
|
+
!onExactIdSearch ||
|
|
855
|
+
!looksLikeWorkflowIdSearchInput(trimmed)) {
|
|
856
|
+
return;
|
|
738
857
|
}
|
|
739
|
-
|
|
858
|
+
toast.info('Enter a full step ID, wait ID, hook ID, or event ID');
|
|
859
|
+
}, [searchQuery, onExactIdSearch, toast]);
|
|
740
860
|
// Track whether we've ever had events to distinguish initial load from refetch
|
|
741
861
|
const hasHadEventsRef = useRef(false);
|
|
742
862
|
if (sortedEvents.length > 0) {
|
|
@@ -747,9 +867,6 @@ export function EventListView({ events, run, onLoadEventData, hasMoreEvents = fa
|
|
|
747
867
|
if (isInitialLoad) {
|
|
748
868
|
return (_jsxs("div", { className: "h-full flex flex-col overflow-hidden", children: [_jsx("div", { style: { padding: 6 }, children: _jsx(Skeleton, { style: { height: 40, borderRadius: 6 } }) }), _jsxs("div", { className: "flex items-center gap-0 h-10 border-b flex-shrink-0", style: { borderColor: 'var(--ds-gray-alpha-200)' }, children: [_jsx("div", { className: "flex-shrink-0", style: { width: GUTTER_WIDTH } }), _jsx("div", { className: "w-5 flex-shrink-0" }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: 40 } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: 72 } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: 44 } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '3 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: 92 } }) }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '3 1 0%' }, children: _jsx(Skeleton, { className: "h-3", style: { width: 60 } }) })] }), _jsx(RowsSkeleton, {})] }));
|
|
749
869
|
}
|
|
750
|
-
if (!isLoading && (!events || events.length === 0)) {
|
|
751
|
-
return (_jsx("div", { className: "flex items-center justify-center h-full text-sm", style: { color: 'var(--ds-gray-700)' }, children: "No events found" }));
|
|
752
|
-
}
|
|
753
870
|
return (_jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting } : undefined, children: _jsxs("div", { className: "h-full flex flex-col overflow-hidden", children: [_jsx("style", { children: `@keyframes workflow-dot-pulse{0%{transform:scale(1);opacity:.7}70%,100%{transform:scale(2.2);opacity:0}}` }), _jsxs("div", { style: {
|
|
754
871
|
padding: 6,
|
|
755
872
|
backgroundColor: 'var(--ds-background-100)',
|
|
@@ -773,7 +890,9 @@ export function EventListView({ events, run, onLoadEventData, hasMoreEvents = fa
|
|
|
773
890
|
justifyContent: 'center',
|
|
774
891
|
color: 'var(--ds-gray-800)',
|
|
775
892
|
flexShrink: 0,
|
|
776
|
-
}, children: _jsxs("svg", { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", focusable: "false", children: [_jsx("circle", { cx: "7", cy: "7", r: "4.5", stroke: "currentColor", strokeWidth: "1.5" }), _jsx("path", { d: "M11.5 11.5L14 14", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" })] }) }), _jsx("input", { type: "search", placeholder: "Search by
|
|
893
|
+
}, children: _jsxs("svg", { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", focusable: "false", children: [_jsx("circle", { cx: "7", cy: "7", r: "4.5", stroke: "currentColor", strokeWidth: "1.5" }), _jsx("path", { d: "M11.5 11.5L14 14", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" })] }) }), _jsx("input", { type: "search", placeholder: "Search by step ID, wait ID, hook ID, or event ID\u2026", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), onKeyDown: handleSearchKeyDown, disabled: !onExactIdSearch, title: onExactIdSearch
|
|
894
|
+
? undefined
|
|
895
|
+
: 'Exact ID search is unavailable in this view.', style: {
|
|
777
896
|
marginLeft: -16,
|
|
778
897
|
paddingInline: 12,
|
|
779
898
|
fontFamily: 'inherit',
|
|
@@ -783,22 +902,41 @@ export function EventListView({ events, run, onLoadEventData, hasMoreEvents = fa
|
|
|
783
902
|
outline: 'none',
|
|
784
903
|
height: 40,
|
|
785
904
|
width: '100%',
|
|
786
|
-
|
|
905
|
+
opacity: onExactIdSearch ? 1 : 0.5,
|
|
906
|
+
cursor: onExactIdSearch ? 'text' : 'not-allowed',
|
|
907
|
+
} })] }), _jsx(MenuDropdown, { options: SORT_OPTIONS, value: effectiveSortOrder, onChange: handleSortOrderChange }), (hasEncryptedData || encryptionKey) && onDecrypt && (_jsx(DecryptButton, { decrypted: !!encryptionKey, loading: isDecrypting, onClick: onDecrypt }))] }), _jsxs("div", { className: "flex items-center gap-0 text-label-13 font-medium h-10 border-b flex-shrink-0", style: {
|
|
787
908
|
borderColor: 'var(--ds-gray-alpha-200)',
|
|
788
909
|
color: 'var(--ds-gray-900)',
|
|
789
910
|
backgroundColor: 'var(--ds-background-100)',
|
|
790
|
-
}, children: [_jsx("div", { className: "flex-shrink-0", style: { width: GUTTER_WIDTH } }), _jsx("div", { className: "w-5 flex-shrink-0" }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: "
|
|
791
|
-
|
|
911
|
+
}, children: [_jsx("div", { className: "flex-shrink-0", style: { width: GUTTER_WIDTH } }), _jsx("div", { className: "w-5 flex-shrink-0" }), showSeparateEventOccurrenceTimestamps && (_jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: "Occurred" })), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: "Created" }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: "Event Type" }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '2 1 0%' }, children: "Name" }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '3 1 0%' }, children: "Correlation ID" }), _jsx("div", { className: "min-w-0 px-4", style: { flex: '3 1 0%' }, children: "Event ID" })] }), isRefetching || searchLoading ? (_jsx(RowsSkeleton, { showSeparateEventOccurrenceTimestamps: showSeparateEventOccurrenceTimestamps })) : sortedEvents.length === 0 ? (_jsx("div", { className: "flex flex-1 items-center justify-center px-6 text-center text-copy-14", style: { color: 'var(--ds-gray-700)' }, children: searchNotFound && searchQuery.trim()
|
|
912
|
+
? `No events found for ${searchQuery.trim()}`
|
|
913
|
+
: searchError
|
|
914
|
+
? searchError
|
|
915
|
+
: parsedSearchId && searchQuery.trim() && !onExactIdSearch
|
|
916
|
+
? 'Exact ID search is unavailable in this view.'
|
|
917
|
+
: 'No events found' })) : (_jsx(Virtuoso, { ref: virtuosoRef, totalCount: sortedEvents.length, overscan: 20, defaultItemHeight: 40, endReached: () => {
|
|
918
|
+
if (isExactSearchActive ||
|
|
919
|
+
!hasMoreEvents ||
|
|
920
|
+
isLoadingMoreEvents) {
|
|
792
921
|
return;
|
|
793
922
|
}
|
|
794
923
|
void onLoadMoreEvents?.();
|
|
795
924
|
}, itemContent: (index) => {
|
|
796
925
|
const ev = sortedEvents[index];
|
|
797
|
-
return (_jsx(EventRow, { event: ev, index: index, isFirst: index === 0, isLast: index === sortedEvents.length - 1, isExpanded: expandedEventIds.has(ev.eventId), onToggleExpand: toggleEventExpanded, activeGroupKey: activeGroupKey, selectedGroupKey: selectedGroupKey, selectedGroupRange: selectedGroupRange, correlationNameMap: correlationNameMap, workflowName: workflowName, durationMap: durationMap, onSelectGroup: onSelectGroup, onHoverGroup: onHoverGroup, onLoadEventData: onLoadEventData, cachedEventData: eventDataCacheRef.current.get(ev.eventId) ?? null, onCacheEventData: cacheEventData, encryptionKey: encryptionKey, onEncryptedDataDetected: handleEncryptedDataDetected }));
|
|
798
|
-
}, style: { flex: 1, minHeight: 0 } })), _jsxs("div", { className: "relative flex-shrink-0 flex items-center h-10 border-t px-4 text-
|
|
926
|
+
return (_jsx(EventRow, { event: ev, index: index, isFirst: index === 0, isLast: index === sortedEvents.length - 1, isExpanded: expandedEventIds.has(ev.eventId), onToggleExpand: toggleEventExpanded, activeGroupKey: activeGroupKey, selectedGroupKey: selectedGroupKey, selectedGroupRange: selectedGroupRange, correlationNameMap: correlationNameMap, workflowName: workflowName, durationMap: durationMap, onSelectGroup: onSelectGroup, onHoverGroup: onHoverGroup, onLoadEventData: onLoadEventData, cachedEventData: eventDataCacheRef.current.get(ev.eventId) ?? null, onCacheEventData: cacheEventData, encryptionKey: encryptionKey, onEncryptedDataDetected: handleEncryptedDataDetected, suppressGroupDimming: isExactSearchActive, showSeparateEventOccurrenceTimestamps: showSeparateEventOccurrenceTimestamps }));
|
|
927
|
+
}, style: { flex: 1, minHeight: 0 } })), _jsxs("div", { className: "relative flex-shrink-0 flex items-center h-10 border-t px-4 text-label-12", style: {
|
|
799
928
|
borderColor: 'var(--ds-gray-alpha-200)',
|
|
800
929
|
color: 'var(--ds-gray-900)',
|
|
801
930
|
backgroundColor: 'var(--ds-background-100)',
|
|
802
|
-
}, children: [
|
|
931
|
+
}, children: [_jsx("span", { children: isExactSearchActive
|
|
932
|
+
? searchError
|
|
933
|
+
? searchError
|
|
934
|
+
: searchNotFound
|
|
935
|
+
? `No events found for ${searchQuery.trim()}`
|
|
936
|
+
: `${sortedEvents.length} event${sortedEvents.length !== 1 ? 's' : ''} for ${searchQuery.trim()}${searchResultsTruncated ? ' (results may be truncated)' : ''}`
|
|
937
|
+
: `${sortedEvents.length} event${sortedEvents.length !== 1 ? 's' : ''} loaded` }), !isExactSearchActive && hasMoreEvents && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none", children: _jsx("div", { className: "pointer-events-auto", children: _jsx(LoadMoreButton, { loading: isLoadingMoreEvents, onClick: () => void onLoadMoreEvents?.() }) }) }))] })] }) }));
|
|
938
|
+
}
|
|
939
|
+
export function EventListView(props) {
|
|
940
|
+
return (_jsx(ContextCardProvider, { children: _jsx(EventListViewInner, { ...props }) }));
|
|
803
941
|
}
|
|
804
|
-
//# sourceMappingURL=event-list-view.js.map
|
|
942
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbGlzdC12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvZXZlbnQtbGlzdC12aWV3LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTlFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQU16RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFHTCw4QkFBOEIsRUFDOUIsMEJBQTBCLEdBQzNCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUNMLGVBQWUsRUFDZixpQkFBaUIsR0FFbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFv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Q25LLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLFNBQVMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEdBQzNFLEVBQ04sQ0FBQyxtQkFBbUIsSUFBSSxhQUFhLElBQUksQ0FDeEMsY0FBSyxTQUFTLEVBQUMsdUVBQXVFLFlBQ3BGLGNBQUssU0FBUyxFQUFDLHFCQUFxQixZQUNsQyxLQUFDLGNBQWMsSUFDYixPQUFPLEVBQUUsbUJBQW1CLEVBQzVCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLGdCQUFnQixFQUFFLEVBQUUsR0FDeEMsR0FDRSxHQUNGLENBQ1AsSUFDRyxJQUNGLEdBQ3VCLENBQ2hDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFzQjtJQUNsRCxPQUFPLENBQ0wsS0FBQyxtQkFBbUIsY0FDbEIsS0FBQyxrQkFBa0IsT0FBSyxLQUFLLEdBQUksR0FDYixDQUN2QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgcGFyc2VTdGVwTmFtZSwgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBDaGVjaywgQ2hldnJvblJpZ2h0LCBDb3B5IH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgS2V5Ym9hcmRFdmVudCBhcyBSZWFjdEtleWJvYXJkRXZlbnQsXG4gIE1vdXNlRXZlbnQgYXMgUmVhY3RNb3VzZUV2ZW50LFxuICBSZWFjdE5vZGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBWaXJ0dW9zbywgdHlwZSBWaXJ0dW9zb0hhbmRsZSB9IGZyb20gJ3JlYWN0LXZpcnR1b3NvJztcbmltcG9ydCB7XG4gIHR5cGUgRXhhY3RJZFNlYXJjaFJlc3VsdCxcbiAgdHlwZSBFeGFjdFdvcmtmbG93U2VhcmNoSWRLaW5kLFxuICBsb29rc0xpa2VXb3JrZmxvd0lkU2VhcmNoSW5wdXQsXG4gIHBhcnNlRXhhY3RXb3JrZmxvd1NlYXJjaElkLFxufSBmcm9tICcuLi9saWIvZXhhY3QtZXZlbnQtc2VhcmNoLWlkJztcbmltcG9ydCB7IGlzRW5jcnlwdGVkTWFya2VyIH0gZnJvbSAnLi4vbGliL2h5ZHJhdGlvbic7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJy4uL2xpYi90b2FzdCc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4uL2xpYi91dGlscyc7XG5pbXBvcnQgeyBBdHRyU2V0RXZlbnRCbG9jayB9IGZyb20gJy4vc2lkZWJhci9hdHRyaWJ1dGVzLWJsb2NrJztcbmltcG9ydCB7IENvbnRleHRDYXJkUHJvdmlkZXIgfSBmcm9tICcuL3VpL2NvbnRleHQtY2FyZCc7XG5pbXBvcnQgeyBEYXRhSW5zcGVjdG9yLCBEZWNyeXB0Q2xpY2tDb250ZXh0IH0gZnJvbSAnLi91aS9kYXRhLWluc3BlY3Rvcic7XG5pbXBvcnQgeyBEZWNyeXB0QnV0dG9uIH0gZnJvbSAnLi91aS9kZWNyeXB0LWJ1dHRvbic7XG5pbXBvcnQge1xuICBFcnJvclN0YWNrQmxvY2ssXG4gIGlzU3RydWN0dXJlZEVycm9yLFxuICB0eXBlIFN0cnVjdHVyZWRFcnJvclJlY29yZCxcbn0gZnJvbSAnLi91aS9lcnJvci1zdGFjay1ibG9jayc7XG5pbXBvcnQgeyBMb2FkTW9yZUJ1dHRvbiB9IGZyb20gJy4vdWkvbG9hZC1tb3JlLWJ1dHRvbic7XG5pbXBvcnQgeyBNZW51RHJvcGRvd24gfSBmcm9tICcuL3VpL21lbnUtZHJvcGRvd24nO1xuaW1wb3J0IHsgU2tlbGV0b24gfSBmcm9tICcuL3VpL3NrZWxldG9uJztcbmltcG9ydCB7IFRpbWVzdGFtcFRvb2x0aXAgfSBmcm9tICcuL3VpL3RpbWVzdGFtcC10b29sdGlwJztcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB3aG9zZSBldmVudERhdGEgY29udGFpbnMgYW4gZXJyb3IgZmllbGQgd2l0aCBhIFN0cnVjdHVyZWRFcnJvci5cbiAqL1xuY29uc3QgRVJST1JfRVZFTlRfVFlQRVMgPSBuZXcgU2V0KFtcbiAgJ3N0ZXBfZmFpbGVkJyxcbiAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAncnVuX2ZhaWxlZCcsXG4gICd3b3JrZmxvd19mYWlsZWQnLFxuXSk7XG5cbmNvbnN0IEJVVFRPTl9SRVNFVF9TVFlMRTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgYXBwZWFyYW5jZTogJ25vbmUnLFxuICBXZWJraXRBcHBlYXJhbmNlOiAnbm9uZScsXG4gIGJvcmRlcjogJ25vbmUnLFxuICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxufTtcbmNvbnN0IERPVF9QVUxTRV9BTklNQVRJT04gPVxuICAnd29ya2Zsb3ctZG90LXB1bHNlIDEuMjVzIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpIGluZmluaXRlJztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBIZWxwZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gZm9ybWF0RXZlbnRUaW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgc2Vjb25kOiAnMi1kaWdpdCcsXG4gICAgICBob3VyMTI6IGZhbHNlLFxuICAgIH0pICtcbiAgICAnLicgK1xuICAgIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCAnMCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXZlbnREYXRlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB8IG51bGwge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgZGF0ZSA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUoU3RyaW5nKHZhbHVlKSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbnVsbCA6IGRhdGU7XG59XG5cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUV2ZW50RGF0ZShcbiAgZXZlbnQ6IFBpY2s8RXZlbnQsICdjcmVhdGVkQXQnIHwgJ29jY3VycmVkQXQnPlxuKTogRGF0ZSB7XG4gIHJldHVybiBwYXJzZUV2ZW50RGF0ZShldmVudC5vY2N1cnJlZEF0KSA/PyBuZXcgRGF0ZShldmVudC5jcmVhdGVkQXQpO1xufVxuXG5mdW5jdGlvbiBnZXRFZmZlY3RpdmVFdmVudFRpbWUoXG4gIGV2ZW50OiBQaWNrPEV2ZW50LCAnY3JlYXRlZEF0JyB8ICdvY2N1cnJlZEF0Jz5cbik6IG51bWJlciB7XG4gIHJldHVybiBnZXRFZmZlY3RpdmVFdmVudERhdGUoZXZlbnQpLmdldFRpbWUoKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RXZlbnRUeXBlKGV2ZW50VHlwZTogRXZlbnRbJ2V2ZW50VHlwZSddKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV2ZW50VHlwZVxuICAgIC5zcGxpdCgnXycpXG4gICAgLm1hcCgod29yZDogc3RyaW5nKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKSlcbiAgICAuam9pbignICcpO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEV2ZW50IHR5cGUg4oaSIHN0YXR1cyBjb2xvciAoc21hbGwgZG90IG9ubHkpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFJldHVybnMgYSBDU1MgY29sb3IgdXNpbmcgR2Vpc3QgZGVzaWduIHRva2VucyBmb3IgdGhlIHN0YXR1cyBkb3QuICovXG5mdW5jdGlvbiBnZXRTdGF0dXNEb3RDb2xvcihldmVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEZhaWxlZCDihpIgcmVkXG4gIGlmIChcbiAgICBldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcgfHxcbiAgICBldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gJ3dvcmtmbG93X2ZhaWxlZCdcbiAgKSB7XG4gICAgcmV0dXJuICd2YXIoLS1kcy1yZWQtNzAwKSc7XG4gIH1cbiAgLy8gQ2FuY2VsbGVkIOKGkiBhbWJlclxuICBpZiAoZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpIHtcbiAgICByZXR1cm4gJ3ZhcigtLWRzLWFtYmVyLTcwMCknO1xuICB9XG4gIC8vIFJldHJ5aW5nIOKGkiBhbWJlclxuICBpZiAoZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICByZXR1cm4gJ3ZhcigtLWRzLWFtYmVyLTcwMCknO1xuICB9XG4gIC8vIEF0dHJpYnV0ZSBjaGFuZ2VzIOKGkiB0ZWFsXG4gIGlmIChldmVudFR5cGUgPT09ICdhdHRyX3NldCcpIHtcbiAgICByZXR1cm4gJ3ZhcigtLWRzLXRlYWwtOTAwKSc7XG4gIH1cbiAgLy8gQ29tcGxldGVkL3N1Y2NlZWRlZCDihpIgZ3JlZW5cbiAgaWYgKFxuICAgIGV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgZXZlbnRUeXBlID09PSAnd29ya2Zsb3dfY29tcGxldGVkJyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnIHx8XG4gICAgZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnXG4gICkge1xuICAgIHJldHVybiAndmFyKC0tZHMtZ3JlZW4tNzAwKSc7XG4gIH1cbiAgLy8gU3RhcnRlZC9ydW5uaW5nIOKGkiBibHVlXG4gIGlmIChcbiAgICBldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnIHx8XG4gICAgZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgZXZlbnRUeXBlID09PSAnd29ya2Zsb3dfc3RhcnRlZCcgfHxcbiAgICBldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJ1xuICApIHtcbiAgICByZXR1cm4gJ3ZhcigtLWRzLWJsdWUtNzAwKSc7XG4gIH1cbiAgLy8gQ3JlYXRlZC9wZW5kaW5nIOKGkiBncmF5XG4gIHJldHVybiAndmFyKC0tZHMtZ3JheS02MDApJztcbn1cblxuLyoqXG4gKiBCdWlsZCBhIG1hcCBmcm9tIGNvcnJlbGF0aW9uSWQgKHN0ZXBJZCkg4oaSIGRpc3BsYXkgbmFtZSB1c2luZyBzdGVwX2NyZWF0ZWRcbiAqIGV2ZW50cywgYW5kIHBhcnNlIHRoZSB3b3JrZmxvdyBuYW1lIGZyb20gdGhlIHJ1bi5cbiAqL1xuZnVuY3Rpb24gYnVpbGROYW1lTWFwcyhcbiAgZXZlbnRzOiBFdmVudFtdIHwgbnVsbCxcbiAgcnVuOiBXb3JrZmxvd1J1biB8IG51bGxcbik6IHtcbiAgY29ycmVsYXRpb25OYW1lTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICB3b3JrZmxvd05hbWU6IHN0cmluZyB8IG51bGw7XG59IHtcbiAgY29uc3QgY29ycmVsYXRpb25OYW1lTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAvLyBNYXAgc3RlcCBjb3JyZWxhdGlvbklkICg9IHN0ZXBJZCkg4oaSIHBhcnNlZCBzdGVwIG5hbWUgZnJvbSBzdGVwX2NyZWF0ZWQgZXZlbnRzXG4gIGlmIChldmVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgJiYgZXZlbnQuY29ycmVsYXRpb25JZCkge1xuICAgICAgICBjb25zdCBzdGVwTmFtZSA9IGV2ZW50LmV2ZW50RGF0YT8uc3RlcE5hbWUgPz8gJyc7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlU3RlcE5hbWUoU3RyaW5nKHN0ZXBOYW1lKSk7XG4gICAgICAgIGNvcnJlbGF0aW9uTmFtZU1hcC5zZXQoXG4gICAgICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBwYXJzZWQ/LnNob3J0TmFtZSA/PyBzdGVwTmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlIHdvcmtmbG93IG5hbWUgZnJvbSBydW5cbiAgY29uc3Qgd29ya2Zsb3dOYW1lID0gcnVuPy53b3JrZmxvd05hbWVcbiAgICA/IChwYXJzZVdvcmtmbG93TmFtZShydW4ud29ya2Zsb3dOYW1lKT8uc2hvcnROYW1lID8/IHJ1bi53b3JrZmxvd05hbWUpXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiB7IGNvcnJlbGF0aW9uTmFtZU1hcCwgd29ya2Zsb3dOYW1lIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVyYXRpb25JbmZvIHtcbiAgLyoqIFRpbWUgZnJvbSBjcmVhdGVkIOKGkiBzdGFydGVkIChtcykgKi9cbiAgcXVldWVkPzogbnVtYmVyO1xuICAvKiogVGltZSBmcm9tIHN0YXJ0ZWQg4oaSIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkIChtcykgKi9cbiAgcmFuPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgbWFwIGZyb20gY29ycmVsYXRpb25JZCDihpIgZHVyYXRpb24gaW5mbyBieSBkaWZmaW5nXG4gKiBjcmVhdGVkIOKGlCBzdGFydGVkIChxdWV1ZWQpIGFuZCBzdGFydGVkIOKGlCBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGxlZCAocmFuKS5cbiAqIEFsc28gY29tcHV0ZXMgcnVuLWxldmVsIGR1cmF0aW9ucyB1bmRlciB0aGUga2V5ICdfX3J1bl9fJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRHVyYXRpb25NYXAoZXZlbnRzOiBFdmVudFtdKTogTWFwPHN0cmluZywgRHVyYXRpb25JbmZvPiB7XG4gIC8vIFByb2Nlc3MgZXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgc28gdGhlIHJlc3VsdCBkb2Vzbid0IGRlcGVuZCBvblxuICAvLyB0aGUgY2FsbGVyJ3Mgc29ydCBkaXJlY3Rpb24uIFJldHJpZWQgc3RlcHMgZW1pdCBtdWx0aXBsZSBgc3RlcF9zdGFydGVkYFxuICAvLyBldmVudHMgZm9yIHRoZSBzYW1lIGNvcnJlbGF0aW9uSWQ7IHRoZSBxdWV1ZWQgZHVyYXRpb24gbXVzdCBiZSBtZWFzdXJlZFxuICAvLyBhZ2FpbnN0IHRoZSBmaXJzdCBvbmUsIG5vdCB0aGUgbGFzdC5cbiAgY29uc3QgY2hyb25vbG9naWNhbCA9IFsuLi5ldmVudHNdLnNvcnQoXG4gICAgKGEsIGIpID0+IGdldEVmZmVjdGl2ZUV2ZW50VGltZShhKSAtIGdldEVmZmVjdGl2ZUV2ZW50VGltZShiKVxuICApO1xuXG4gIGNvbnN0IGNyZWF0ZWRUaW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGNvbnN0IGZpcnN0U3RhcnRlZFRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgY29uc3Qgc3RhcnRlZFRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgY29uc3QgZHVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIER1cmF0aW9uSW5mbz4oKTtcblxuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGNocm9ub2xvZ2ljYWwpIHtcbiAgICBjb25zdCB0cyA9IGdldEVmZmVjdGl2ZUV2ZW50VGltZShldmVudCk7XG4gICAgY29uc3Qga2V5ID0gZXZlbnQuY29ycmVsYXRpb25JZCA/PyAnX19ydW5fXyc7XG4gICAgY29uc3QgdHlwZTogc3RyaW5nID0gZXZlbnQuZXZlbnRUeXBlO1xuXG4gICAgLy8gVHJhY2sgY3JlYXRlZCB0aW1lcyAoZmlyc3QgZXZlbnQgZm9yIGVhY2ggY29ycmVsYXRpb24pXG4gICAgaWYgKHR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnIHx8IHR5cGUgPT09ICdydW5fY3JlYXRlZCcpIHtcbiAgICAgIGlmICghY3JlYXRlZFRpbWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNyZWF0ZWRUaW1lcy5zZXQoa2V5LCB0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgc3RhcnRlZCB0aW1lcyAmIGNvbXB1dGUgcXVldWVkIGR1cmF0aW9uXG4gICAgaWYgKFxuICAgICAgdHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcgfHxcbiAgICAgIHR5cGUgPT09ICdydW5fc3RhcnRlZCcgfHxcbiAgICAgIHR5cGUgPT09ICd3b3JrZmxvd19zdGFydGVkJ1xuICAgICkge1xuICAgICAgc3RhcnRlZFRpbWVzLnNldChrZXksIHRzKTtcbiAgICAgIC8vIFRoZSBxdWV1ZWQgZHVyYXRpb24gaXMgYW5jaG9yZWQgb24gdGhlIGZpcnN0IHN0YXJ0IGV2ZW50IG9ubHkg4oCUXG4gICAgICAvLyBzdWJzZXF1ZW50IHN0ZXBfc3RhcnRlZCBldmVudHMgY29tZSBmcm9tIHJldHJpZXMuXG4gICAgICBpZiAoIWZpcnN0U3RhcnRlZFRpbWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGZpcnN0U3RhcnRlZFRpbWVzLnNldChrZXksIHRzKTtcbiAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgY3JlYXRlZCBldmVudCB3YXMgc2VlbiwgdXNlIHRoZSBzdGFydGVkIHRpbWUgYXMgY3JlYXRlZFxuICAgICAgICBpZiAoIWNyZWF0ZWRUaW1lcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNyZWF0ZWRUaW1lcy5zZXQoa2V5LCB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gY3JlYXRlZFRpbWVzLmdldChrZXkpO1xuICAgICAgICBjb25zdCBpbmZvID0gZHVyYXRpb25zLmdldChrZXkpID8/IHt9O1xuICAgICAgICBpZiAoY3JlYXRlZEF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmZvLnF1ZXVlZCA9IHRzIC0gY3JlYXRlZEF0O1xuICAgICAgICB9XG4gICAgICAgIGR1cmF0aW9ucy5zZXQoa2V5LCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIHJhbiBkdXJhdGlvbiBvbiB0ZXJtaW5hbCBldmVudHNcbiAgICBpZiAoXG4gICAgICB0eXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICB0eXBlID09PSAnc3RlcF9mYWlsZWQnIHx8XG4gICAgICB0eXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgIHR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgdHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnIHx8XG4gICAgICB0eXBlID09PSAnd29ya2Zsb3dfY29tcGxldGVkJyB8fFxuICAgICAgdHlwZSA9PT0gJ3dvcmtmbG93X2ZhaWxlZCcgfHxcbiAgICAgIHR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcgfHxcbiAgICAgIHR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJ1xuICAgICkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gc3RhcnRlZFRpbWVzLmdldChrZXkpO1xuICAgICAgY29uc3QgaW5mbyA9IGR1cmF0aW9ucy5nZXQoa2V5KSA/PyB7fTtcbiAgICAgIGlmIChzdGFydGVkQXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmZvLnJhbiA9IHRzIC0gc3RhcnRlZEF0O1xuICAgICAgfVxuICAgICAgZHVyYXRpb25zLnNldChrZXksIGluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkdXJhdGlvbnM7XG59XG5cbi8qKiBDaGVjayBpZiBhIGxvYWRlZCBldmVudERhdGEgb2JqZWN0IGNvbnRhaW5zIGFueSBlbmNyeXB0ZWQgbWFya2VyIHZhbHVlcy4gKi9cbmZ1bmN0aW9uIGhhc0VuY3J5cHRlZFZhbHVlcyhkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LnZhbHVlcyhkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWwpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzUnVuTGV2ZWwoZXZlbnRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgfHxcbiAgICBldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgfHxcbiAgICBldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcgfHxcbiAgICBldmVudFR5cGUgPT09ICd3b3JrZmxvd19zdGFydGVkJyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gJ3dvcmtmbG93X2NvbXBsZXRlZCcgfHxcbiAgICBldmVudFR5cGUgPT09ICd3b3JrZmxvd19mYWlsZWQnIHx8XG4gICAgLy8gYXR0cl9zZXQgY2FycmllcyBhIGRlZHVwIGNvcnJlbGF0aW9uSWQgcmF0aGVyIHRoYW4gYSBjaGlsZCBlbnRpdHkgSUQsXG4gICAgLy8gc28gaXQgZ3JvdXBzIGFuZCBsYWJlbHMgd2l0aCB0aGUgcnVuIGl0c2VsZi5cbiAgICBldmVudFR5cGUgPT09ICdhdHRyX3NldCdcbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUcmVlIGd1dHRlciDigJQgZml4ZWQtd2lkdGgsIHNob3dzIGJyYW5jaCBsaW5lcyBvbmx5IGZvciB0aGUgc2VsZWN0ZWQgZ3JvdXBcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogRml4ZWQgZ3V0dGVyIHdpZHRoOiAyMHB4IHJvb3QgYXJlYSArIDE2cHggZm9yIG9uZSBicmFuY2ggbGFuZSAqL1xuY29uc3QgR1VUVEVSX1dJRFRIID0gMzY7XG4vKiogWCBwb3NpdGlvbiBvZiB0aGUgc2luZ2xlIGJyYW5jaCBsYW5lIGxpbmUgKi9cbmNvbnN0IExBTkVfWCA9IDIwO1xuY29uc3QgUk9PVF9MSU5FX0NPTE9SID0gJ3ZhcigtLWRzLWdyYXktNTAwKSc7XG5cbmZ1bmN0aW9uIFRyZWVHdXR0ZXIoe1xuICBpc0ZpcnN0LFxuICBpc0xhc3QsXG4gIGlzUnVuTGV2ZWw6IGlzUnVuLFxuICBzdGF0dXNEb3RDb2xvcixcbiAgcHVsc2UgPSBmYWxzZSxcbiAgaGFzU2VsZWN0aW9uLFxuICBzaG93QnJhbmNoLFxuICBzaG93TGFuZUxpbmUsXG4gIGlzTGFuZVN0YXJ0LFxuICBpc0xhbmVFbmQsXG4gIGNvbnRpbnVhdGlvbk9ubHkgPSBmYWxzZSxcbn06IHtcbiAgaXNGaXJzdDogYm9vbGVhbjtcbiAgaXNMYXN0OiBib29sZWFuO1xuICBpc1J1bkxldmVsOiBib29sZWFuO1xuICBzdGF0dXNEb3RDb2xvcj86IHN0cmluZztcbiAgcHVsc2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciBhbnkgZ3JvdXAgaXMgY3VycmVudGx5IGFjdGl2ZSAoc2VsZWN0ZWQgb3IgaG92ZXJlZCkgKi9cbiAgaGFzU2VsZWN0aW9uOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byBzaG93IGEgaG9yaXpvbnRhbCBicmFuY2ggbGluZSBmb3IgdGhpcyByb3cgKGV2ZW50IGJlbG9uZ3MgdG8gYWN0aXZlIGdyb3VwKSAqL1xuICBzaG93QnJhbmNoOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdmVydGljYWwgbGFuZSBsaW5lIHBhc3NlcyB0aHJvdWdoIHRoaXMgcm93ICovXG4gIHNob3dMYW5lTGluZTogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHZlcnRpY2FsIGxhbmUgbGluZSBzdGFydHMgYXQgdGhpcyByb3cgKHRvcCBjbGlwcGVkIHRvIDUwJSkgKi9cbiAgaXNMYW5lU3RhcnQ6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSB2ZXJ0aWNhbCBsYW5lIGxpbmUgZW5kcyBhdCB0aGlzIHJvdyAoYm90dG9tIGNsaXBwZWQgdG8gNTAlKSAqL1xuICBpc0xhbmVFbmQ6IGJvb2xlYW47XG4gIGNvbnRpbnVhdGlvbk9ubHk/OiBib29sZWFuO1xufSkge1xuICBjb25zdCBkb3RTaXplID0gaXNSdW4gPyA4IDogNjtcbiAgY29uc3QgZG90TGVmdCA9IGlzUnVuID8gNSA6IDY7XG4gIGNvbnN0IGRvdE9wYWNpdHkgPSBoYXNTZWxlY3Rpb24gJiYgIXNob3dCcmFuY2ggJiYgIWlzUnVuID8gMC4zIDogMTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGZsZXgtc2hyaW5rLTAgc2VsZi1zdHJldGNoXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHdpZHRoOiBHVVRURVJfV0lEVEgsXG4gICAgICAgIG1pbkhlaWdodDogY29udGludWF0aW9uT25seSA/IDAgOiB1bmRlZmluZWQsXG4gICAgICB9fVxuICAgID5cbiAgICAgIHsvKiBSb290IHZlcnRpY2FsIGxpbmUgKGxlZnRtb3N0LCBhbHdheXMgdmlzaWJsZSkgKi99XG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgbGVmdDogOCxcbiAgICAgICAgICB0b3A6IGNvbnRpbnVhdGlvbk9ubHkgPyAwIDogaXNGaXJzdCA/ICc1MCUnIDogMCxcbiAgICAgICAgICBib3R0b206IGNvbnRpbnVhdGlvbk9ubHkgPyAwIDogaXNMYXN0ID8gJzUwJScgOiAwLFxuICAgICAgICAgIHdpZHRoOiAyLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogUk9PVF9MSU5FX0NPTE9SLFxuICAgICAgICAgIHpJbmRleDogMCxcbiAgICAgICAgfX1cbiAgICAgIC8+XG5cbiAgICAgIHshY29udGludWF0aW9uT25seSAmJiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgey8qIFN0YXR1cyBkb3Qgb24gdGhlIHJvb3QgbGluZSBmb3IgZXZlcnkgZXZlbnQgKi99XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgIGxlZnQ6IGRvdExlZnQsXG4gICAgICAgICAgICAgIHRvcDogJzUwJScsXG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUwJSknLFxuICAgICAgICAgICAgICB3aWR0aDogZG90U2l6ZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBkb3RTaXplLFxuICAgICAgICAgICAgICB6SW5kZXg6IDIsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsvKiBPcGFxdWUgYmFja2Ryb3AgZW5zdXJlcyBndXR0ZXIgbGluZXMgbmV2ZXIgdmlzdWFsbHkgY3V0IHRocm91Z2ggZG90cyAqL31cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWJhY2tncm91bmQtMTAwKScsXG4gICAgICAgICAgICAgICAgekluZGV4OiAwLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtwdWxzZSAmJiAoXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzUwJScsXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHN0YXR1c0RvdENvbG9yLFxuICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMC43NSAqIGRvdE9wYWNpdHksXG4gICAgICAgICAgICAgICAgICBhbmltYXRpb246IERPVF9QVUxTRV9BTklNQVRJT04sXG4gICAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogc3RhdHVzRG90Q29sb3IsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogZG90T3BhY2l0eSxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnb3BhY2l0eSAxNTBtcycsXG4gICAgICAgICAgICAgICAgekluZGV4OiAyLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBIb3Jpem9udGFsIGJyYW5jaCBmcm9tIHJvb3QgdG8gZ3V0dGVyIGVkZ2UgKHNlbGVjdGVkIGdyb3VwIGV2ZW50cyBvbmx5KSAqL31cbiAgICAgICAgICB7c2hvd0JyYW5jaCAmJiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgbGVmdDogOSxcbiAgICAgICAgICAgICAgICB0b3A6ICc1MCUnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBHVVRURVJfV0lEVEggLSA5LFxuICAgICAgICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFJPT1RfTElORV9DT0xPUixcbiAgICAgICAgICAgICAgICB6SW5kZXg6IDAsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvPlxuICAgICAgKX1cblxuICAgICAgey8qIFZlcnRpY2FsIGxhbmUgbGluZSBjb25uZWN0aW5nIHRoZSBzZWxlY3RlZCBncm91cCdzIGV2ZW50cyAqL31cbiAgICAgIHtzaG93TGFuZUxpbmUgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgbGVmdDogTEFORV9YLFxuICAgICAgICAgICAgdG9wOiBjb250aW51YXRpb25Pbmx5ID8gMCA6IGlzTGFuZVN0YXJ0ID8gJzUwJScgOiAwLFxuICAgICAgICAgICAgYm90dG9tOiBjb250aW51YXRpb25Pbmx5ID8gMCA6IGlzTGFuZUVuZCA/ICc1MCUnIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAyLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBST09UX0xJTkVfQ09MT1IsXG4gICAgICAgICAgICB6SW5kZXg6IDAsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29weWFibGUgY2VsbCDigJQgc2hvd3MgYSBjb3B5IGJ1dHRvbiBvbiBob3ZlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIENvcHlhYmxlQ2VsbCh7XG4gIHZhbHVlLFxuICBjbGFzc05hbWUsXG4gIHN0eWxlOiBzdHlsZVByb3AsXG59OiB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgc3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IFtjb3BpZWQsIHNldENvcGllZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IHJlc2V0Q29waWVkVGltZW91dFJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmVzZXRDb3BpZWRUaW1lb3V0UmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChyZXNldENvcGllZFRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNvcHkgPSB1c2VDYWxsYmFjayhcbiAgICAoZTogUmVhY3RNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRDb3BpZWQodHJ1ZSk7XG4gICAgICAgIGlmIChyZXNldENvcGllZFRpbWVvdXRSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmVzZXRDb3BpZWRUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlc2V0Q29waWVkVGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHNldENvcGllZChmYWxzZSk7XG4gICAgICAgICAgcmVzZXRDb3BpZWRUaW1lb3V0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9LCAxNTAwKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3ZhbHVlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAvY29weSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSBtaW4tdy0wIHB4LTQgJHtjbGFzc05hbWUgPz8gJyd9YH1cbiAgICAgIHN0eWxlPXtzdHlsZVByb3B9XG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwib3ZlcmZsb3ctaGlkZGVuIHRleHQtZWxsaXBzaXMgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAge3ZhbHVlIHx8ICctJ31cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHt2YWx1ZSA/IChcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNvcHl9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMCBvcGFjaXR5LTAgZ3JvdXAtaG92ZXIvY29weTpvcGFjaXR5LTEwMCB0cmFuc2l0aW9uLW9wYWNpdHkgcC0wLjUgcm91bmRlZCBob3ZlcjpiZy1bdmFyKC0tZHMtZ3JheS1hbHBoYS0yMDApXVwiXG4gICAgICAgICAgc3R5bGU9e0JVVFRPTl9SRVNFVF9TVFlMRX1cbiAgICAgICAgICBhcmlhLWxhYmVsPXtgQ29weSAke3ZhbHVlfWB9XG4gICAgICAgID5cbiAgICAgICAgICB7Y29waWVkID8gKFxuICAgICAgICAgICAgPENoZWNrXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMyB3LTNcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyZWVuLTcwMCknIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8Q29weSBjbGFzc05hbWU9XCJoLTMgdy0zXCIgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknIH19IC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IHBhcnNlIHN0cmluZ2lmaWVkIEpTT04gdmFsdWVzIHNvIGVzY2FwZWQgc2xhc2hlcyAvIHF1b3RlcyBhcmUgY2xlYW5lZCB1cCAqL1xuZnVuY3Rpb24gZGVlcFBhcnNlSnNvbih2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgaWYgKFxuICAgICAgKHRyaW1tZWQuc3RhcnRzV2l0aCgneycpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ30nKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1snKSAmJiB0cmltbWVkLmVuZHNXaXRoKCddJykpIHx8XG4gICAgICAodHJpbW1lZC5zdGFydHNXaXRoKCdcIicpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ1wiJykpXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVlcFBhcnNlSnNvbihKU09OLnBhcnNlKHRyaW1tZWQpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKGRlZXBQYXJzZUpzb24pO1xuICB9XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gUHJlc2VydmUgb2JqZWN0cyB3aXRoIGN1c3RvbSBjb25zdHJ1Y3RvcnMgKGUuZy4sIGVuY3J5cHRlZCBtYXJrZXJzLFxuICAgIC8vIGNsYXNzIGluc3RhbmNlIHJlZnMpIOKAlCBkb24ndCBkZXN0cnVjdHVyZSB0aGVtIGludG8gcGxhaW4gb2JqZWN0c1xuICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdFtrXSA9IGRlZXBQYXJzZUpzb24odik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgc3RydWN0dXJlZCBlcnJvciBmcm9tIGV2ZW50IGRhdGEsIGlmIHByZXNlbnQuXG4gKiBSZXR1cm5zIHRoZSBlcnJvciBvYmplY3QgdG8gcmVuZGVyIHdpdGggRXJyb3JTdGFja0Jsb2NrLCBvciBudWxsIGlmIG5vdCBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBleHRyYWN0U3RydWN0dXJlZEVycm9yKFxuICBkYXRhOiB1bmtub3duLFxuICBldmVudFR5cGU/OiBzdHJpbmdcbik6IFN0cnVjdHVyZWRFcnJvclJlY29yZCB8IG51bGwge1xuICBpZiAoIWV2ZW50VHlwZSB8fCAhRVJST1JfRVZFTlRfVFlQRVMuaGFzKGV2ZW50VHlwZSkpIHJldHVybiBudWxsO1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8vIENoZWNrIHRoZSBuZXN0ZWQgYGVycm9yYCBmaWVsZCBmaXJzdCAodGhlIFN0cnVjdHVyZWRFcnJvcilcbiAgaWYgKGlzU3RydWN0dXJlZEVycm9yKHJlY29yZC5lcnJvcikpIHJldHVybiByZWNvcmQuZXJyb3I7XG4gIC8vIFNvbWUgZXJyb3IgZm9ybWF0cyBwdXQgdGhlIG1lc3NhZ2Uvc3RhY2sgYXQgdGhlIHRvcCBsZXZlbCBvZiBldmVudERhdGEuXG4gIGlmIChpc1N0cnVjdHVyZWRFcnJvcihyZWNvcmQpKSByZXR1cm4gcmVjb3JkO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gUGF5bG9hZEJsb2NrKHtcbiAgZGF0YSxcbiAgZXZlbnRUeXBlLFxufToge1xuICBkYXRhOiB1bmtub3duO1xuICBldmVudFR5cGU/OiBzdHJpbmc7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3Qgc3RydWN0dXJlZEVycm9yID0gdXNlTWVtbyhcbiAgICAoKSA9PiBleHRyYWN0U3RydWN0dXJlZEVycm9yKGRhdGEsIGV2ZW50VHlwZSksXG4gICAgW2RhdGEsIGV2ZW50VHlwZV1cbiAgKTtcblxuICBjb25zdCBbY29waWVkLCBzZXRDb3BpZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCByZXNldENvcGllZFRpbWVvdXRSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGNsZWFuZWQgPSB1c2VNZW1vKCgpID0+IGRlZXBQYXJzZUpzb24oZGF0YSksIFtkYXRhXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJlc2V0Q29waWVkVGltZW91dFJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmVzZXRDb3BpZWRUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNsZWFuZWQsIG51bGwsIDIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFN0cmluZyhjbGVhbmVkKTtcbiAgICB9XG4gIH0sIFtjbGVhbmVkXSk7XG5cbiAgY29uc3QgaGFuZGxlQ29weSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChmb3JtYXR0ZWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRDb3BpZWQodHJ1ZSk7XG4gICAgICAgIGlmIChyZXNldENvcGllZFRpbWVvdXRSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmVzZXRDb3BpZWRUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlc2V0Q29waWVkVGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHNldENvcGllZChmYWxzZSk7XG4gICAgICAgICAgcmVzZXRDb3BpZWRUaW1lb3V0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9LCAxNTAwKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW2Zvcm1hdHRlZF1cbiAgKTtcblxuICBpZiAoc3RydWN0dXJlZEVycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0yXCI+XG4gICAgICAgIDxFcnJvclN0YWNrQmxvY2sgdmFsdWU9e3N0cnVjdHVyZWRFcnJvcn0gLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICAvLyBBdHRyaWJ1dGUgY2hhbmdlcyDigJQgcmVuZGVyIHRoZSBjaGFuZ2VkIGtleXMgYW5kIHRoZSB3cml0ZXIgaW5zdGVhZCBvZlxuICAvLyB0aGUgcmF3IEpTT04gcGF5bG9hZC5cbiAgaWYgKGV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgIHJldHVybiA8QXR0clNldEV2ZW50QmxvY2sgZGF0YT17Y2xlYW5lZH0gLz47XG4gIH1cblxuICAvLyBDYW5jZWxsYXRpb24gcmVhc29uIOKAlCByZW5kZXIgdGhlIGZyZWUtdGV4dCByZWFzb24gYXMgYSByZWFkYWJsZSBsaW5lXG4gIC8vIGluc3RlYWQgb2YgYSByYXcgSlNPTiBwYXlsb2FkICh0aGUgb25seSBmaWVsZCBydW5fY2FuY2VsbGVkIGNhcnJpZXMpLlxuICBpZiAoZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpIHtcbiAgICBjb25zdCBjYW5jZWxSZWFzb24gPVxuICAgICAgY2xlYW5lZCAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgY2xlYW5lZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiAoY2xlYW5lZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY2FuY2VsUmVhc29uID09PSAnc3RyaW5nJ1xuICAgICAgICA/ICgoY2xlYW5lZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY2FuY2VsUmVhc29uIGFzIHN0cmluZylcbiAgICAgICAgOiBudWxsO1xuICAgIGlmIChjYW5jZWxSZWFzb24pIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJwLTIgdGV4dC1sYWJlbC0xMlwiXG4gICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMDApJyB9fVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTkwMCknIH19PlJlYXNvbjogPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIj5cbiAgICAgICAgICAgIHtjYW5jZWxSZWFzb259XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGdyb3VwL3BheWxvYWRcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwib3ZlcmZsb3cteC1hdXRvIHAtMiB0ZXh0LVsxMXB4XVwiXG4gICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICAgID5cbiAgICAgICAgPERhdGFJbnNwZWN0b3IgZGF0YT17Y2xlYW5lZH0gZXhwYW5kTGV2ZWw9ezJ9IC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNvcHl9XG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGJvdHRvbS0yIHJpZ2h0LTIgb3BhY2l0eS0wIGdyb3VwLWhvdmVyL3BheWxvYWQ6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5IGZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTIgcHktMSByb3VuZGVkLW1kIHRleHQtYnV0dG9uLTEyIGhvdmVyOmJnLVt2YXIoLS1kcy1ncmF5LWFscGhhLTIwMCldXCJcbiAgICAgICAgc3R5bGU9e3sgLi4uQlVUVE9OX1JFU0VUX1NUWUxFLCBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScgfX1cbiAgICAgICAgYXJpYS1sYWJlbD1cIkNvcHkgcGF5bG9hZFwiXG4gICAgICA+XG4gICAgICAgIHtjb3BpZWQgPyAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxDaGVja1xuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTMgdy0zXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmVlbi03MDApJyB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JlZW4tNzAwKScgfX0+Q29waWVkPC9zcGFuPlxuICAgICAgICAgIDwvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICA8Q29weSBjbGFzc05hbWU9XCJoLTMgdy0zXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPkNvcHk8L3NwYW4+XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTb3J0IG9wdGlvbnMgZm9yIHRoZSBldmVudHMgbGlzdFxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IFNPUlRfT1BUSU9OUyA9IFtcbiAgeyB2YWx1ZTogJ2Rlc2MnIGFzIGNvbnN0LCBsYWJlbDogJ05ld2VzdCcgfSxcbiAgeyB2YWx1ZTogJ2FzYycgYXMgY29uc3QsIGxhYmVsOiAnT2xkZXN0JyB9LFxuXTtcblxuZnVuY3Rpb24gUm93c1NrZWxldG9uKHtcbiAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcyA9IGZhbHNlLFxufToge1xuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzPzogYm9vbGVhbjtcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIHtBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNiB9LCAoXywgaSkgPT4gKFxuICAgICAgICA8ZGl2IGtleT17aX0gY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTBcIiBzdHlsZT17eyBoZWlnaHQ6IDQwIH19PlxuICAgICAgICAgIHsvKiBHdXR0ZXIgYXJlYSAqL31cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4LXNocmluay0wIHNlbGYtc3RyZXRjaCBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICBzdHlsZT17eyB3aWR0aDogR1VUVEVSX1dJRFRIIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIFZlcnRpY2FsIGxpbmUgc2tlbGV0b24gKi99XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgbGVmdDogOCxcbiAgICAgICAgICAgICAgICB0b3A6IGkgPT09IDAgPyAnNTAlJyA6IDAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAyLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiIHN0eWxlPXt7IGJvcmRlclJhZGl1czogMSB9fSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7LyogRG90IHNrZWxldG9uICovfVxuICAgICAgICAgICAgPFNrZWxldG9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIHdpZHRoOiBpICUgNCA9PT0gMCA/IDggOiA2LFxuICAgICAgICAgICAgICAgIGhlaWdodDogaSAlIDQgPT09IDAgPyA4IDogNixcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IGkgJSA0ID09PSAwID8gNSA6IDYsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHsvKiBDaGV2cm9uIHBsYWNlaG9sZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy01IGZsZXgtc2hyaW5rLTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJ3LTUgaC01XCIgc3R5bGU9e3sgYm9yZGVyUmFkaXVzOiA0IH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3Nob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHMgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wIHB4LTRcIiBzdHlsZT17eyBmbGV4OiAnMiAxIDAlJyB9fT5cbiAgICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtM1wiIHN0eWxlPXt7IHdpZHRoOiAnNzAlJyB9fSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7LyogQ3JlYXRlZCAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTAgcHgtNFwiIHN0eWxlPXt7IGZsZXg6ICcyIDEgMCUnIH19PlxuICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtM1wiIHN0eWxlPXt7IHdpZHRoOiAnNzAlJyB9fSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHsvKiBFdmVudCBUeXBlICovfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1pbi13LTAgcHgtNCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41XCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGZsZXg6ICcyIDEgMCUnIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFNrZWxldG9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgICBzdHlsZT17eyB3aWR0aDogNiwgaGVpZ2h0OiA2LCBib3JkZXJSYWRpdXM6ICc1MCUnIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtM1wiIHN0eWxlPXt7IHdpZHRoOiAnNjAlJyB9fSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHsvKiBOYW1lICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzIgMSAwJScgfX0+XG4gICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC0zXCIgc3R5bGU9e3sgd2lkdGg6ICc1MCUnIH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgey8qIENvcnJlbGF0aW9uIElEICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzMgMSAwJScgfX0+XG4gICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC0zXCIgc3R5bGU9e3sgd2lkdGg6ICc3NSUnIH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgey8qIEV2ZW50IElEICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzMgMSAwJScgfX0+XG4gICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC0zXCIgc3R5bGU9e3sgd2lkdGg6ICc3NSUnIH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRXZlbnQgcm93XG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEV2ZW50c0xpc3RQcm9wcyB7XG4gIGV2ZW50czogRXZlbnRbXSB8IG51bGw7XG4gIHJ1bj86IFdvcmtmbG93UnVuIHwgbnVsbDtcbiAgb25Mb2FkRXZlbnREYXRhPzogKGV2ZW50OiBFdmVudCkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIGhhc01vcmVFdmVudHM/OiBib29sZWFuO1xuICBpc0xvYWRpbmdNb3JlRXZlbnRzPzogYm9vbGVhbjtcbiAgb25Mb2FkTW9yZUV2ZW50cz86ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAvKiogV2hlbiBwcm92aWRlZCwgc2lnbmFscyB0aGF0IGRlY3J5cHRpb24gaXMgYWN0aXZlICh0cmlnZ2VycyByZS1sb2FkIG9mIGV4cGFuZGVkIGV2ZW50cykgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG4gIC8qKiBXaGVuIHRydWUsIHNob3dzIGEgbG9hZGluZyBzdGF0ZSBpbnN0ZWFkIG9mIFwiTm8gZXZlbnRzIGZvdW5kXCIgZm9yIGVtcHR5IGxpc3RzICovXG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIC8qKiBTb3J0IG9yZGVyIGZvciBldmVudHMuIERlZmF1bHRzIHRvICdhc2MnLiAqL1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgc29ydCBvcmRlci4gV2hlbiBwcm92aWRlZCwgdGhlIHNvcnQgZHJvcGRvd24gaXMgc2hvd25cbiAgICogIGFuZCB0aGUgcGFyZW50IGlzIGV4cGVjdGVkIHRvIHJlZmV0Y2ggZnJvbSB0aGUgQVBJIHdpdGggdGhlIG5ldyBvcmRlci4gKi9cbiAgb25Tb3J0T3JkZXJDaGFuZ2U/OiAob3JkZXI6ICdhc2MnIHwgJ2Rlc2MnKSA9PiB2b2lkO1xuICAvKiogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBEZWNyeXB0IGJ1dHRvbi4gKi9cbiAgb25EZWNyeXB0PzogKCkgPT4gdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIGVuY3J5cHRpb24ga2V5IGlzIGN1cnJlbnRseSBiZWluZyBmZXRjaGVkLiAqL1xuICBpc0RlY3J5cHRpbmc/OiBib29sZWFuO1xuICAvKiogUnVuLWxldmVsIGhpbnQ6IHRoZSBydW4gY29udGFpbnMgZW5jcnlwdGVkIGRhdGEgKGZyb20gcHJvYmUpLiAqL1xuICBoYXNFbmNyeXB0ZWREYXRhPzogYm9vbGVhbjtcbiAgLyoqIEZldGNoIGV2ZW50cyBmb3IgYW4gZXhhY3QgY29ycmVsYXRpb24gb3IgZXZlbnQgSUQuICovXG4gIG9uRXhhY3RJZFNlYXJjaD86IChcbiAgICBpZDogc3RyaW5nLFxuICAgIGtpbmQ6IEV4YWN0V29ya2Zsb3dTZWFyY2hJZEtpbmQsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWxcbiAgKSA9PiBQcm9taXNlPEV4YWN0SWRTZWFyY2hSZXN1bHQ+O1xuICAvKiogU2hvdyBvY2N1cnJlZEF0IHNlcGFyYXRlbHkgaW5zdGVhZCBvZiBmb2xkaW5nIGl0IGludG8gdGhlIENyZWF0ZWQgdGltZXN0YW1wLiAqL1xuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50Um93KHtcbiAgZXZlbnQsXG4gIGluZGV4LFxuICBpc0ZpcnN0LFxuICBpc0xhc3QsXG4gIGlzRXhwYW5kZWQsXG4gIG9uVG9nZ2xlRXhwYW5kLFxuICBhY3RpdmVHcm91cEtleSxcbiAgc2VsZWN0ZWRHcm91cEtleSxcbiAgc2VsZWN0ZWRHcm91cFJhbmdlLFxuICBjb3JyZWxhdGlvbk5hbWVNYXAsXG4gIHdvcmtmbG93TmFtZSxcbiAgZHVyYXRpb25NYXAsXG4gIG9uU2VsZWN0R3JvdXAsXG4gIG9uSG92ZXJHcm91cCxcbiAgb25Mb2FkRXZlbnREYXRhLFxuICBjYWNoZWRFdmVudERhdGEsXG4gIG9uQ2FjaGVFdmVudERhdGEsXG4gIGVuY3J5cHRpb25LZXksXG4gIG9uRW5jcnlwdGVkRGF0YURldGVjdGVkLFxuICBzdXBwcmVzc0dyb3VwRGltbWluZyA9IGZhbHNlLFxuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzID0gZmFsc2UsXG59OiB7XG4gIGV2ZW50OiBFdmVudDtcbiAgaW5kZXg6IG51bWJlcjtcbiAgaXNGaXJzdDogYm9vbGVhbjtcbiAgaXNMYXN0OiBib29sZWFuO1xuICBpc0V4cGFuZGVkOiBib29sZWFuO1xuICBvblRvZ2dsZUV4cGFuZDogKGV2ZW50SWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgYWN0aXZlR3JvdXBLZXk/OiBzdHJpbmc7XG4gIHNlbGVjdGVkR3JvdXBLZXk/OiBzdHJpbmc7XG4gIHNlbGVjdGVkR3JvdXBSYW5nZTogeyBmaXJzdDogbnVtYmVyOyBsYXN0OiBudW1iZXIgfSB8IG51bGw7XG4gIGNvcnJlbGF0aW9uTmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1hcDogTWFwPHN0cmluZywgRHVyYXRpb25JbmZvPjtcbiAgb25TZWxlY3RHcm91cDogKGdyb3VwS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIG9uSG92ZXJHcm91cDogKGdyb3VwS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIG9uTG9hZEV2ZW50RGF0YT86IChldmVudDogRXZlbnQpID0+IFByb21pc2U8dW5rbm93biB8IG51bGw+O1xuICBjYWNoZWRFdmVudERhdGE6IHVua25vd24gfCBudWxsO1xuICBvbkNhY2hlRXZlbnREYXRhOiAoZXZlbnRJZDogc3RyaW5nLCBkYXRhOiB1bmtub3duKSA9PiB2b2lkO1xuICBlbmNyeXB0aW9uS2V5PzogVWludDhBcnJheTtcbiAgb25FbmNyeXB0ZWREYXRhRGV0ZWN0ZWQ/OiAoKSA9PiB2b2lkO1xuICAvKiogRXhhY3QtSUQgc2VhcmNoIHJlc3VsdHMgc2hvdWxkIG5vdCBkaW0gdW5yZWxhdGVkIHJvd3MuICovXG4gIHN1cHByZXNzR3JvdXBEaW1taW5nPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgb2NjdXJyZWRBdCBzZXBhcmF0ZWx5IGluc3RlYWQgb2YgZm9sZGluZyBpdCBpbnRvIHRoZSBDcmVhdGVkIHRpbWVzdGFtcC4gKi9cbiAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcz86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtsb2FkZWRFdmVudERhdGEsIHNldExvYWRlZEV2ZW50RGF0YV0gPSB1c2VTdGF0ZTx1bmtub3duIHwgbnVsbD4oXG4gICAgY2FjaGVkRXZlbnREYXRhXG4gICk7XG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2hhc0F0dGVtcHRlZExvYWQsIHNldEhhc0F0dGVtcHRlZExvYWRdID0gdXNlU3RhdGUoXG4gICAgY2FjaGVkRXZlbnREYXRhICE9PSBudWxsXG4gICk7XG5cbiAgLy8gTm90aWZ5IHBhcmVudCBpZiBjYWNoZWQgZGF0YSBoYXMgZW5jcnlwdGVkIG1hcmtlcnMgb24gbW91bnRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICBjYWNoZWRFdmVudERhdGEgIT09IG51bGwgJiZcbiAgICAgICFlbmNyeXB0aW9uS2V5ICYmXG4gICAgICBoYXNFbmNyeXB0ZWRWYWx1ZXMoY2FjaGVkRXZlbnREYXRhKVxuICAgICkge1xuICAgICAgb25FbmNyeXB0ZWREYXRhRGV0ZWN0ZWQ/LigpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICBjb25zdCByb3dHcm91cEtleSA9IGlzUnVuTGV2ZWwoZXZlbnQuZXZlbnRUeXBlKVxuICAgID8gJ19fcnVuX18nXG4gICAgOiAoZXZlbnQuY29ycmVsYXRpb25JZCA/PyB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHN0YXR1c0RvdENvbG9yID0gZ2V0U3RhdHVzRG90Q29sb3IoZXZlbnQuZXZlbnRUeXBlKTtcbiAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoZXZlbnQuY3JlYXRlZEF0KTtcbiAgY29uc3Qgb2NjdXJyZWRBdCA9IHBhcnNlRXZlbnREYXRlKGV2ZW50Lm9jY3VycmVkQXQpO1xuICBjb25zdCBkaXNwbGF5ZWRDcmVhdGVkQXQgPSBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzXG4gICAgPyBjcmVhdGVkQXRcbiAgICA6IGdldEVmZmVjdGl2ZUV2ZW50RGF0ZShldmVudCk7XG4gIGNvbnN0IGhhc0V4aXN0aW5nRXZlbnREYXRhID0gJ2V2ZW50RGF0YScgaW4gZXZlbnQgJiYgZXZlbnQuZXZlbnREYXRhICE9IG51bGw7XG4gIGNvbnN0IGlzUnVuID0gaXNSdW5MZXZlbChldmVudC5ldmVudFR5cGUpO1xuICBjb25zdCBldmVudE5hbWUgPSBpc1J1blxuICAgID8gKHdvcmtmbG93TmFtZSA/PyAnLScpXG4gICAgOiBldmVudC5jb3JyZWxhdGlvbklkXG4gICAgICA/IChjb3JyZWxhdGlvbk5hbWVNYXAuZ2V0KGV2ZW50LmNvcnJlbGF0aW9uSWQpID8/ICctJylcbiAgICAgIDogJy0nO1xuXG4gIGNvbnN0IGR1cmF0aW9uS2V5ID0gZXZlbnQuY29ycmVsYXRpb25JZCA/PyAoaXNSdW4gPyAnX19ydW5fXycgOiAnJyk7XG4gIGNvbnN0IGR1cmF0aW9uSW5mbyA9IGR1cmF0aW9uS2V5ID8gZHVyYXRpb25NYXAuZ2V0KGR1cmF0aW9uS2V5KSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBoYXNBY3RpdmUgPSBhY3RpdmVHcm91cEtleSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBpc1JlbGF0ZWQgPSByb3dHcm91cEtleSAhPT0gdW5kZWZpbmVkICYmIHJvd0dyb3VwS2V5ID09PSBhY3RpdmVHcm91cEtleTtcbiAgY29uc3QgaXNEaW1tZWQgPSBoYXNBY3RpdmUgJiYgIWlzUmVsYXRlZCAmJiAhc3VwcHJlc3NHcm91cERpbW1pbmc7XG4gIGNvbnN0IGlzUHVsc2luZyA9IGhhc0FjdGl2ZSAmJiBpc1JlbGF0ZWQ7XG5cbiAgLy8gR3V0dGVyIHN0YXRlIGRlcml2ZWQgZnJvbSBzZWxlY3RlZEdyb3VwUmFuZ2VcbiAgY29uc3Qgc2hvd0JyYW5jaCA9IGhhc0FjdGl2ZSAmJiBpc1JlbGF0ZWQgJiYgIWlzUnVuO1xuICBjb25zdCBzaG93TGFuZUxpbmUgPVxuICAgIHNlbGVjdGVkR3JvdXBSYW5nZSAhPT0gbnVsbCAmJlxuICAgIGluZGV4ID49IHNlbGVjdGVkR3JvdXBSYW5nZS5maXJzdCAmJlxuICAgIGluZGV4IDw9IHNlbGVjdGVkR3JvdXBSYW5nZS5sYXN0O1xuICBjb25zdCBpc0xhbmVTdGFydCA9XG4gICAgc2VsZWN0ZWRHcm91cFJhbmdlICE9PSBudWxsICYmIGluZGV4ID09PSBzZWxlY3RlZEdyb3VwUmFuZ2UuZmlyc3Q7XG4gIGNvbnN0IGlzTGFuZUVuZCA9XG4gICAgc2VsZWN0ZWRHcm91cFJhbmdlICE9PSBudWxsICYmIGluZGV4ID09PSBzZWxlY3RlZEdyb3VwUmFuZ2UubGFzdDtcblxuICBjb25zdCBsb2FkRXZlbnREZXRhaWxzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmIChsb2FkZWRFdmVudERhdGEgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNhY2hlZEV2ZW50RGF0YSAhPT0gbnVsbCkge1xuICAgICAgc2V0TG9hZGVkRXZlbnREYXRhKGNhY2hlZEV2ZW50RGF0YSk7XG4gICAgICBzZXRIYXNBdHRlbXB0ZWRMb2FkKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICBzZXRMb2FkRXJyb3IobnVsbCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghb25Mb2FkRXZlbnREYXRhKSB7XG4gICAgICAgIHNldExvYWRFcnJvcignRXZlbnQgZGV0YWlscyB1bmF2YWlsYWJsZScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgb25Mb2FkRXZlbnREYXRhKGV2ZW50KTtcbiAgICAgIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRMb2FkZWRFdmVudERhdGEoZGF0YSk7XG4gICAgICAgIG9uQ2FjaGVFdmVudERhdGEoZXZlbnQuZXZlbnRJZCwgZGF0YSk7XG4gICAgICAgIGlmICghZW5jcnlwdGlvbktleSAmJiBoYXNFbmNyeXB0ZWRWYWx1ZXMoZGF0YSkpIHtcbiAgICAgICAgICBvbkVuY3J5cHRlZERhdGFEZXRlY3RlZD8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNldExvYWRFcnJvcihcbiAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdGYWlsZWQgdG8gbG9hZCBldmVudCBkZXRhaWxzJ1xuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIHNldEhhc0F0dGVtcHRlZExvYWQodHJ1ZSk7XG4gICAgfVxuICB9LCBbXG4gICAgZXZlbnQsXG4gICAgbG9hZGVkRXZlbnREYXRhLFxuICAgIGlzTG9hZGluZyxcbiAgICBvbkxvYWRFdmVudERhdGEsXG4gICAgb25DYWNoZUV2ZW50RGF0YSxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIG9uRW5jcnlwdGVkRGF0YURldGVjdGVkLFxuICAgIGNhY2hlZEV2ZW50RGF0YSxcbiAgXSk7XG5cbiAgLy8gQXV0by1sb2FkIGV2ZW50IGRhdGEgd2hlbiByZW1vdW50aW5nIGluIGV4cGFuZGVkIHN0YXRlIHdpdGhvdXQgY2FjaGVkIGRhdGFcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzRXhwYW5kZWQgfHwgaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZvaWQgbG9hZEV2ZW50RGV0YWlscygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuXG4gIC8vIFdoZW4gZW5jcnlwdGlvbiBrZXkgY2hhbmdlcyBhbmQgdGhpcyBldmVudCB3YXMgcHJldmlvdXNseSBsb2FkZWQsXG4gIC8vIHJlLWxvYWQgdG8gZ2V0IGRlY3J5cHRlZCBkYXRhXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGVuY3J5cHRpb25LZXkgJiYgaGFzQXR0ZW1wdGVkTG9hZCAmJiBvbkxvYWRFdmVudERhdGEpIHtcbiAgICAgIHNldExvYWRlZEV2ZW50RGF0YShudWxsKTtcbiAgICAgIHNldEhhc0F0dGVtcHRlZExvYWQoZmFsc2UpO1xuICAgICAgb25Mb2FkRXZlbnREYXRhKGV2ZW50KVxuICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2V0TG9hZGVkRXZlbnREYXRhKGRhdGEpO1xuICAgICAgICAgICAgb25DYWNoZUV2ZW50RGF0YShldmVudC5ldmVudElkLCBkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0SGFzQXR0ZW1wdGVkTG9hZCh0cnVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBzZXRIYXNBdHRlbXB0ZWRMb2FkKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZW5jcnlwdGlvbktleV0pO1xuXG4gIGNvbnN0IGhhbmRsZVJvd0NsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIG9uU2VsZWN0R3JvdXAocm93R3JvdXBLZXkgPT09IHNlbGVjdGVkR3JvdXBLZXkgPyB1bmRlZmluZWQgOiByb3dHcm91cEtleSk7XG4gICAgb25Ub2dnbGVFeHBhbmQoZXZlbnQuZXZlbnRJZCk7XG4gICAgaWYgKCFpc0V4cGFuZGVkKSB7XG4gICAgICB2b2lkIGxvYWRFdmVudERldGFpbHMoKTtcbiAgICB9XG4gIH0sIFtcbiAgICBzZWxlY3RlZEdyb3VwS2V5LFxuICAgIHJvd0dyb3VwS2V5LFxuICAgIG9uU2VsZWN0R3JvdXAsXG4gICAgb25Ub2dnbGVFeHBhbmQsXG4gICAgZXZlbnQuZXZlbnRJZCxcbiAgICBpc0V4cGFuZGVkLFxuICAgIGxvYWRFdmVudERldGFpbHMsXG4gIF0pO1xuXG4gIGNvbnN0IG1lcmdlZEV2ZW50RGF0YSA9XG4gICAgbG9hZGVkRXZlbnREYXRhID8/XG4gICAgKGhhc0V4aXN0aW5nRXZlbnREYXRhXG4gICAgICA/IChldmVudCBhcyBFdmVudCAmIHsgZXZlbnREYXRhOiB1bmtub3duIH0pLmV2ZW50RGF0YVxuICAgICAgOiBudWxsKTtcblxuICBjb25zdCBkaXNwbGF5UGF5bG9hZCA9IGlzTG9hZGluZyA/IGxvYWRlZEV2ZW50RGF0YSA6IG1lcmdlZEV2ZW50RGF0YTtcblxuICBjb25zdCBjb250ZW50T3BhY2l0eSA9IGlzRGltbWVkID8gMC4zIDogMTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtZXZlbnQtaWQ9e2V2ZW50LmV2ZW50SWR9XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IG9uSG92ZXJHcm91cChyb3dHcm91cEtleSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IG9uSG92ZXJHcm91cCh1bmRlZmluZWQpfVxuICAgID5cbiAgICAgIHsvKiBSb3cgKi99XG4gICAgICA8ZGl2XG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICB0YWJJbmRleD17MH1cbiAgICAgICAgb25DbGljaz17aGFuZGxlUm93Q2xpY2t9XG4gICAgICAgIG9uS2V5RG93bj17KGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykgaGFuZGxlUm93Q2xpY2soKTtcbiAgICAgICAgfX1cbiAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHRleHQtbGVmdCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMCB0ZXh0LWxhYmVsLTEzIGhvdmVyOmJnLVt2YXIoLS1kcy1ncmF5LWFscGhhLTEwMCldIHRyYW5zaXRpb24tY29sb3JzIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiA0MCB9fVxuICAgICAgPlxuICAgICAgICA8VHJlZUd1dHRlclxuICAgICAgICAgIGlzRmlyc3Q9e2lzRmlyc3R9XG4gICAgICAgICAgaXNMYXN0PXtpc0xhc3QgJiYgIWlzRXhwYW5kZWR9XG4gICAgICAgICAgaXNSdW5MZXZlbD17aXNSdW59XG4gICAgICAgICAgc3RhdHVzRG90Q29sb3I9e3N0YXR1c0RvdENvbG9yfVxuICAgICAgICAgIHB1bHNlPXtpc1B1bHNpbmd9XG4gICAgICAgICAgaGFzU2VsZWN0aW9uPXtoYXNBY3RpdmV9XG4gICAgICAgICAgc2hvd0JyYW5jaD17c2hvd0JyYW5jaH1cbiAgICAgICAgICBzaG93TGFuZUxpbmU9e3Nob3dMYW5lTGluZX1cbiAgICAgICAgICBpc0xhbmVTdGFydD17aXNMYW5lU3RhcnR9XG4gICAgICAgICAgaXNMYW5lRW5kPXtpc0xhbmVFbmR9XG4gICAgICAgIC8+XG5cbiAgICAgICAgey8qIENvbnRlbnQgYXJlYSDigJQgZGltcyB3aGVuIHVucmVsYXRlZCAqL31cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGZsZXgtMSBtaW4tdy0wXCJcbiAgICAgICAgICBzdHlsZT17eyBvcGFjaXR5OiBjb250ZW50T3BhY2l0eSwgdHJhbnNpdGlvbjogJ29wYWNpdHkgMTUwbXMnIH19XG4gICAgICAgID5cbiAgICAgICAgICB7LyogRXhwYW5kIGNoZXZyb24gaW5kaWNhdG9yICovfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctNSBoLTUgZmxleC1zaHJpbmstMCByb3VuZGVkXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCB2YXIoLS1kcy1ncmF5LTQwMCknLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Q2hldnJvblJpZ2h0XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMyB3LTMgdHJhbnNpdGlvbi10cmFuc2Zvcm1cIlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS05MDApJyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGlzRXhwYW5kZWQgPyAncm90YXRlKDkwZGVnKScgOiAncm90YXRlKDBkZWcpJyxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7c2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcyAmJiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRhYnVsYXItbnVtcyBtaW4tdy0wIHB4LTRcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktOTAwKScsIGZsZXg6ICcyIDEgMCUnIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtvY2N1cnJlZEF0ID8gKFxuICAgICAgICAgICAgICAgIDxUaW1lc3RhbXBUb29sdGlwIGRhdGU9e29jY3VycmVkQXR9PlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e2Zvcm1hdEV2ZW50VGltZShvY2N1cnJlZEF0KX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9UaW1lc3RhbXBUb29sdGlwPlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICctJ1xuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHsvKiBDcmVhdGVkICovfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRhYnVsYXItbnVtcyBtaW4tdy0wIHB4LTRcIlxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTkwMCknLCBmbGV4OiAnMiAxIDAlJyB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxUaW1lc3RhbXBUb29sdGlwIGRhdGU9e2Rpc3BsYXllZENyZWF0ZWRBdH0+XG4gICAgICAgICAgICAgIDxzcGFuPntmb3JtYXRFdmVudFRpbWUoZGlzcGxheWVkQ3JlYXRlZEF0KX08L3NwYW4+XG4gICAgICAgICAgICA8L1RpbWVzdGFtcFRvb2x0aXA+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogRXZlbnQgVHlwZSAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIG1pbi13LTAgcHgtNFwiIHN0eWxlPXt7IGZsZXg6ICcyIDEgMCUnIH19PlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjVcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktOTAwKScgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7aXNQdWxzaW5nICYmIChcbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgaW5zZXQ6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHN0YXR1c0RvdENvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBET1RfUFVMU0VfQU5JTUFUSU9OLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzdGF0dXNEb3RDb2xvcixcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB7Zm9ybWF0RXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSl9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogTmFtZSAqL31cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJtaW4tdy0wIHB4LTQgb3ZlcmZsb3ctaGlkZGVuIHRleHQtZWxsaXBzaXMgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgc3R5bGU9e3sgZmxleDogJzIgMSAwJScgfX1cbiAgICAgICAgICAgIHRpdGxlPXtldmVudE5hbWUgIT09ICctJyA/IGV2ZW50TmFtZSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZXZlbnROYW1lfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIENvcnJlbGF0aW9uIElEICovfVxuICAgICAgICAgIDxDb3B5YWJsZUNlbGxcbiAgICAgICAgICAgIHZhbHVlPXtldmVudC5jb3JyZWxhdGlvbklkIHx8ICcnfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9udC1tb25vXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGZsZXg6ICczIDEgMCUnIH19XG4gICAgICAgICAgLz5cblxuICAgICAgICAgIHsvKiBFdmVudCBJRCAqL31cbiAgICAgICAgICA8Q29weWFibGVDZWxsXG4gICAgICAgICAgICB2YWx1ZT17ZXZlbnQuZXZlbnRJZH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvbnQtbW9ub1wiXG4gICAgICAgICAgICBzdHlsZT17eyBmbGV4OiAnMyAxIDAlJyB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBFeHBhbmRlZCBkZXRhaWxzIOKAlCB0cmVlIGxpbmVzIGNvbnRpbnVlIHRocm91Z2ggdGhpcyBhcmVhICovfVxuICAgICAge2lzRXhwYW5kZWQgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIj5cbiAgICAgICAgICB7LyogQ29udGludWF0aW9uIGd1dHRlciDigJQgbGFuZSBsaW5lIGNvbnRpbnVlcyBpZiBub3QgYXQgbGFuZSBlbmQgKi99XG4gICAgICAgICAgPFRyZWVHdXR0ZXJcbiAgICAgICAgICAgIGlzRmlyc3Q9e2ZhbHNlfVxuICAgICAgICAgICAgaXNMYXN0PXtpc0xhc3R9XG4gICAgICAgICAgICBpc1J1bkxldmVsPXtpc1J1bn1cbiAgICAgICAgICAgIGhhc1NlbGVjdGlvbj17aGFzQWN0aXZlfVxuICAgICAgICAgICAgc2hvd0JyYW5jaD17ZmFsc2V9XG4gICAgICAgICAgICBzaG93TGFuZUxpbmU9e3Nob3dMYW5lTGluZSAmJiAhaXNMYW5lRW5kfVxuICAgICAgICAgICAgaXNMYW5lU3RhcnQ9e2ZhbHNlfVxuICAgICAgICAgICAgaXNMYW5lRW5kPXtmYWxzZX1cbiAgICAgICAgICAgIGNvbnRpbnVhdGlvbk9ubHlcbiAgICAgICAgICAvPlxuICAgICAgICAgIHsvKiBTcGFjZXIgZm9yIGNoZXZyb24gY29sdW1uICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy01IGZsZXgtc2hyaW5rLTBcIiAvPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSBteS0xLjUgbXItMyBtbC0yIHB5LTIgcm91bmRlZC1tZCBib3JkZXIgb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS1hbHBoYS0yMDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogY29udGVudE9wYWNpdHksXG4gICAgICAgICAgICAgIHRyYW5zaXRpb246ICdvcGFjaXR5IDE1MG1zJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIER1cmF0aW9uIGluZm8gKi99XG4gICAgICAgICAgICB7KGR1cmF0aW9uSW5mbz8ucXVldWVkICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgZHVyYXRpb25JbmZvPy5yYW4gIT09IHVuZGVmaW5lZCkgJiYgKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicHgtMiBwYi0xLjUgdGV4dC1sYWJlbC0xMiBmbGV4IGdhcC0zXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktOTAwKScgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtkdXJhdGlvbkluZm8ucXVldWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uSW5mby5xdWV1ZWQgPiAwICYmIChcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgUXVldWVkIGZvcnsnICd9XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vIHRhYnVsYXItbnVtc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2Zvcm1hdER1cmF0aW9uKGR1cmF0aW9uSW5mby5xdWV1ZWQpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7ZHVyYXRpb25JbmZvLnJhbiAhPT0gdW5kZWZpbmVkICYmIChcbiAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICBSYW4gZm9yeycgJ31cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vIHRhYnVsYXItbnVtc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHtmb3JtYXREdXJhdGlvbihkdXJhdGlvbkluZm8ucmFuKX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgey8qIFBheWxvYWQgKi99XG4gICAgICAgICAgICB7ZGlzcGxheVBheWxvYWQgIT0gbnVsbCA/IChcbiAgICAgICAgICAgICAgPFBheWxvYWRCbG9jayBkYXRhPXtkaXNwbGF5UGF5bG9hZH0gZXZlbnRUeXBlPXtldmVudC5ldmVudFR5cGV9IC8+XG4gICAgICAgICAgICApIDogbG9hZEVycm9yID8gKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgcC0zIHRleHQtbGFiZWwtMTJcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLXJlZC00MDApJyxcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLXJlZC0xMDApJyxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtcmVkLTkwMCknLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7bG9hZEVycm9yfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBpc0xvYWRpbmcgfHxcbiAgICAgICAgICAgICAgKGxvYWRlZEV2ZW50RGF0YSA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICFoYXNBdHRlbXB0ZWRMb2FkICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCkgPyAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBwLTNcIj5cbiAgICAgICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC0zXCIgc3R5bGU9e3sgd2lkdGg6ICc3NSUnIH19IC8+XG4gICAgICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtM1wiIHN0eWxlPXt7IHdpZHRoOiAnNTAlJyB9fSAvPlxuICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTNcIiBzdHlsZT17eyB3aWR0aDogJzYwJScgfX0gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicC0yIHRleHQtbGFiZWwtMTJcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS05MDApJyB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgTm8gZGF0YVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBNYWluIGNvbXBvbmVudFxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIEV2ZW50TGlzdFZpZXdJbm5lcih7XG4gIGV2ZW50cyxcbiAgcnVuLFxuICBvbkxvYWRFdmVudERhdGEsXG4gIGhhc01vcmVFdmVudHMgPSBmYWxzZSxcbiAgaXNMb2FkaW5nTW9yZUV2ZW50cyA9IGZhbHNlLFxuICBvbkxvYWRNb3JlRXZlbnRzLFxuICBlbmNyeXB0aW9uS2V5LFxuICBpc0xvYWRpbmcgPSBmYWxzZSxcbiAgc29ydE9yZGVyOiBzb3J0T3JkZXJQcm9wLFxuICBvblNvcnRPcmRlckNoYW5nZSxcbiAgb25EZWNyeXB0LFxuICBpc0RlY3J5cHRpbmcgPSBmYWxzZSxcbiAgaGFzRW5jcnlwdGVkRGF0YTogaGFzRW5jcnlwdGVkRGF0YVByb3AgPSBmYWxzZSxcbiAgb25FeGFjdElkU2VhcmNoLFxuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzID0gZmFsc2UsXG59OiBFdmVudHNMaXN0UHJvcHMpIHtcbiAgY29uc3QgdG9hc3QgPSB1c2VUb2FzdCgpO1xuICBjb25zdCBbaW50ZXJuYWxTb3J0T3JkZXIsIHNldEludGVybmFsU29ydE9yZGVyXSA9IHVzZVN0YXRlPCdhc2MnIHwgJ2Rlc2MnPihcbiAgICAnYXNjJ1xuICApO1xuICBjb25zdCBlZmZlY3RpdmVTb3J0T3JkZXIgPSBzb3J0T3JkZXJQcm9wID8/IGludGVybmFsU29ydE9yZGVyO1xuICBjb25zdCBoYW5kbGVTb3J0T3JkZXJDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAob3JkZXI6ICdhc2MnIHwgJ2Rlc2MnKSA9PiB7XG4gICAgICBpZiAob25Tb3J0T3JkZXJDaGFuZ2UpIHtcbiAgICAgICAgb25Tb3J0T3JkZXJDaGFuZ2Uob3JkZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SW50ZXJuYWxTb3J0T3JkZXIob3JkZXIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW29uU29ydE9yZGVyQ2hhbmdlXVxuICApO1xuXG4gIGNvbnN0IFtzZWFyY2hRdWVyeSwgc2V0U2VhcmNoUXVlcnldID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbc2VhcmNoUmVzdWx0cywgc2V0U2VhcmNoUmVzdWx0c10gPSB1c2VTdGF0ZTxFdmVudFtdIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzZWFyY2hSZXN1bHRzVHJ1bmNhdGVkLCBzZXRTZWFyY2hSZXN1bHRzVHJ1bmNhdGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3NlYXJjaEVycm9yLCBzZXRTZWFyY2hFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3NlYXJjaExvYWRpbmcsIHNldFNlYXJjaExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2VhcmNoTm90Rm91bmQsIHNldFNlYXJjaE5vdEZvdW5kXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3Qgc2VhcmNoUmVxdWVzdFJlZiA9IHVzZVJlZigwKTtcbiAgY29uc3QgdmlydHVvc29SZWYgPSB1c2VSZWY8VmlydHVvc29IYW5kbGU+KG51bGwpO1xuXG4gIGNvbnN0IHBhcnNlZFNlYXJjaElkID0gdXNlTWVtbyhcbiAgICAoKSA9PiBwYXJzZUV4YWN0V29ya2Zsb3dTZWFyY2hJZChzZWFyY2hRdWVyeSksXG4gICAgW3NlYXJjaFF1ZXJ5XVxuICApO1xuICBjb25zdCBpc0V4YWN0U2VhcmNoQWN0aXZlID0gc2VhcmNoUmVzdWx0cyAhPT0gbnVsbDtcblxuICBjb25zdCBzb3J0ZWRFdmVudHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzb3VyY2VFdmVudHMgPSBpc0V4YWN0U2VhcmNoQWN0aXZlID8gc2VhcmNoUmVzdWx0cyA6IChldmVudHMgPz8gW10pO1xuICAgIGlmIChzb3VyY2VFdmVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgZGlyID0gZWZmZWN0aXZlU29ydE9yZGVyID09PSAnZGVzYycgPyAtMSA6IDE7XG4gICAgcmV0dXJuIFsuLi5zb3VyY2VFdmVudHNdLnNvcnQoXG4gICAgICAoYSwgYikgPT4gZGlyICogKGdldEVmZmVjdGl2ZUV2ZW50VGltZShhKSAtIGdldEVmZmVjdGl2ZUV2ZW50VGltZShiKSlcbiAgICApO1xuICB9LCBbZXZlbnRzLCBlZmZlY3RpdmVTb3J0T3JkZXIsIGlzRXhhY3RTZWFyY2hBY3RpdmUsIHNlYXJjaFJlc3VsdHNdKTtcblxuICAvLyBEZXRlY3QgZW5jcnlwdGVkIGZpZWxkcyBhY3Jvc3MgYWxsIGxvYWRlZCBldmVudHMgKGlubGluZSBldmVudERhdGEpLlxuICBjb25zdCBoYXNFbmNyeXB0ZWRJbmxpbmVEYXRhID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc291cmNlRXZlbnRzID0gaXNFeGFjdFNlYXJjaEFjdGl2ZSA/IHNlYXJjaFJlc3VsdHMgOiBldmVudHM7XG4gICAgaWYgKCFzb3VyY2VFdmVudHMpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHNvdXJjZUV2ZW50cykge1xuICAgICAgY29uc3QgZWQgPSAoZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmV2ZW50RGF0YTtcbiAgICAgIGlmIChoYXNFbmNyeXB0ZWRWYWx1ZXMoZWQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbZXZlbnRzLCBpc0V4YWN0U2VhcmNoQWN0aXZlLCBzZWFyY2hSZXN1bHRzXSk7XG5cbiAgLy8gVHJhY2tzIHdoZXRoZXIgYW55IGV4cGFuZGVkIHJvdydzIGxhenktbG9hZGVkIGRhdGEgY29udGFpbmVkIGVuY3J5cHRlZCBtYXJrZXJzLlxuICAvLyBTZXQgdG8gdHJ1ZSBieSBFdmVudFJvdyB2aWEgb25FbmNyeXB0ZWREYXRhRGV0ZWN0ZWQ7IG5ldmVyIHJlc2V0IChzdGlja3kpLlxuICBjb25zdCBbZm91bmRFbmNyeXB0ZWRJbkxhenlEYXRhLCBzZXRGb3VuZEVuY3J5cHRlZEluTGF6eURhdGFdID1cbiAgICB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGhhbmRsZUVuY3J5cHRlZERhdGFEZXRlY3RlZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRGb3VuZEVuY3J5cHRlZEluTGF6eURhdGEodHJ1ZSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYXNFbmNyeXB0ZWREYXRhID1cbiAgICBoYXNFbmNyeXB0ZWREYXRhUHJvcCB8fCBoYXNFbmNyeXB0ZWRJbmxpbmVEYXRhIHx8IGZvdW5kRW5jcnlwdGVkSW5MYXp5RGF0YTtcblxuICBjb25zdCB7IGNvcnJlbGF0aW9uTmFtZU1hcCwgd29ya2Zsb3dOYW1lIH0gPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBidWlsZE5hbWVNYXBzKFxuICAgICAgICBpc0V4YWN0U2VhcmNoQWN0aXZlID8gc2VhcmNoUmVzdWx0cyA6IChldmVudHMgPz8gbnVsbCksXG4gICAgICAgIHJ1biA/PyBudWxsXG4gICAgICApLFxuICAgIFtldmVudHMsIGlzRXhhY3RTZWFyY2hBY3RpdmUsIHJ1biwgc2VhcmNoUmVzdWx0c11cbiAgKTtcblxuICBjb25zdCBkdXJhdGlvbk1hcCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gYnVpbGREdXJhdGlvbk1hcChzb3J0ZWRFdmVudHMpLFxuICAgIFtzb3J0ZWRFdmVudHNdXG4gICk7XG5cbiAgY29uc3QgW3NlbGVjdGVkR3JvdXBLZXksIHNldFNlbGVjdGVkR3JvdXBLZXldID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW2hvdmVyZWRHcm91cEtleSwgc2V0SG92ZXJlZEdyb3VwS2V5XSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IG9uU2VsZWN0R3JvdXAgPSB1c2VDYWxsYmFjaygoZ3JvdXBLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIHNldFNlbGVjdGVkR3JvdXBLZXkoZ3JvdXBLZXkpO1xuICB9LCBbXSk7XG4gIGNvbnN0IG9uSG92ZXJHcm91cCA9IHVzZUNhbGxiYWNrKChncm91cEtleTogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgc2V0SG92ZXJlZEdyb3VwS2V5KGdyb3VwS2V5KTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGFjdGl2ZUdyb3VwS2V5ID0gc2VsZWN0ZWRHcm91cEtleSA/PyBob3ZlcmVkR3JvdXBLZXk7XG5cbiAgLy8gRXhwYW5kZWQgc3RhdGUgbGlmdGVkIG91dCBvZiBFdmVudFJvdyBzbyBpdCBzdXJ2aXZlcyB2aXJ0dWFsaXphdGlvblxuICBjb25zdCBbZXhwYW5kZWRFdmVudElkcywgc2V0RXhwYW5kZWRFdmVudElkc10gPSB1c2VTdGF0ZTxTZXQ8c3RyaW5nPj4oXG4gICAgKCkgPT4gbmV3IFNldCgpXG4gICk7XG4gIGNvbnN0IHRvZ2dsZUV2ZW50RXhwYW5kZWQgPSB1c2VDYWxsYmFjaygoZXZlbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgc2V0RXhwYW5kZWRFdmVudElkcygocHJldikgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldik7XG4gICAgICBpZiAobmV4dC5oYXMoZXZlbnRJZCkpIHtcbiAgICAgICAgbmV4dC5kZWxldGUoZXZlbnRJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0LmFkZChldmVudElkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgLy8gRXZlbnQgZGF0YSBjYWNoZSDigJQgcmVmIGF2b2lkcyByZS1yZW5kZXJzIHdoZW4gY2FjaGUgdXBkYXRlc1xuICBjb25zdCBldmVudERhdGFDYWNoZVJlZiA9IHVzZVJlZjxNYXA8c3RyaW5nLCB1bmtub3duPj4obmV3IE1hcCgpKTtcbiAgY29uc3QgY2FjaGVFdmVudERhdGEgPSB1c2VDYWxsYmFjaygoZXZlbnRJZDogc3RyaW5nLCBkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgZXZlbnREYXRhQ2FjaGVSZWYuY3VycmVudC5zZXQoZXZlbnRJZCwgZGF0YSk7XG4gIH0sIFtdKTtcblxuICAvLyBMb29rdXAgZnJvbSBldmVudElkIOKGkiBncm91cEtleSBmb3IgZWZmaWNpZW50IGNvbGxhcHNlIGZpbHRlcmluZ1xuICBjb25zdCBldmVudEdyb3VwS2V5TWFwID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGV2IG9mIHNvcnRlZEV2ZW50cykge1xuICAgICAgY29uc3QgZ2sgPSBpc1J1bkxldmVsKGV2LmV2ZW50VHlwZSlcbiAgICAgICAgPyAnX19ydW5fXydcbiAgICAgICAgOiAoZXYuY29ycmVsYXRpb25JZCA/PyAnJyk7XG4gICAgICBpZiAoZ2spIG1hcC5zZXQoZXYuZXZlbnRJZCwgZ2spO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9LCBbc29ydGVkRXZlbnRzXSk7XG5cbiAgLy8gQ29sbGFwc2UgZXhwYW5kZWQgZXZlbnRzIHRoYXQgZG9uJ3QgYmVsb25nIHRvIHRoZSBuZXdseSBzZWxlY3RlZCBncm91cFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzZWxlY3RlZEdyb3VwS2V5ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBzZXRFeHBhbmRlZEV2ZW50SWRzKChwcmV2KSA9PiB7XG4gICAgICBpZiAocHJldi5zaXplID09PSAwKSByZXR1cm4gcHJldjtcbiAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50SWQgb2YgcHJldikge1xuICAgICAgICBpZiAoZXZlbnRHcm91cEtleU1hcC5nZXQoZXZlbnRJZCkgPT09IHNlbGVjdGVkR3JvdXBLZXkpIHtcbiAgICAgICAgICBuZXh0LmFkZChldmVudElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoYW5nZWQgPyBuZXh0IDogcHJldjtcbiAgICB9KTtcbiAgfSwgW3NlbGVjdGVkR3JvdXBLZXksIGV2ZW50R3JvdXBLZXlNYXBdKTtcblxuICAvLyBDb21wdXRlIHRoZSByb3ctaW5kZXggcmFuZ2UgZm9yIHRoZSBhY3RpdmUgZ3JvdXAncyBjb25uZWN0aW5nIGxhbmUgbGluZS5cbiAgLy8gT25seSBhcHBsaWVzIHRvIG5vbi1ydW4gZ3JvdXBzIChzdGVwL2hvb2svd2FpdCBjb3JyZWxhdGlvbnMpLlxuICBjb25zdCBzZWxlY3RlZEdyb3VwUmFuZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWFjdGl2ZUdyb3VwS2V5IHx8IGFjdGl2ZUdyb3VwS2V5ID09PSAnX19ydW5fXycpIHJldHVybiBudWxsO1xuICAgIGxldCBmaXJzdCA9IC0xO1xuICAgIGxldCBsYXN0ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzb3J0ZWRFdmVudHNbaV0uY29ycmVsYXRpb25JZCA9PT0gYWN0aXZlR3JvdXBLZXkpIHtcbiAgICAgICAgaWYgKGZpcnN0ID09PSAtMSkgZmlyc3QgPSBpO1xuICAgICAgICBsYXN0ID0gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpcnN0ID49IDAgPyB7IGZpcnN0LCBsYXN0IH0gOiBudWxsO1xuICB9LCBbYWN0aXZlR3JvdXBLZXksIHNvcnRlZEV2ZW50c10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNlYXJjaFF1ZXJ5LnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWQpIHtcbiAgICAgIHNlYXJjaFJlcXVlc3RSZWYuY3VycmVudCArPSAxO1xuICAgICAgc2V0U2VhcmNoUmVzdWx0cyhudWxsKTtcbiAgICAgIHNldFNlYXJjaFJlc3VsdHNUcnVuY2F0ZWQoZmFsc2UpO1xuICAgICAgc2V0U2VhcmNoRXJyb3IobnVsbCk7XG4gICAgICBzZXRTZWFyY2hMb2FkaW5nKGZhbHNlKTtcbiAgICAgIHNldFNlYXJjaE5vdEZvdW5kKGZhbHNlKTtcbiAgICAgIHNldFNlbGVjdGVkR3JvdXBLZXkodW5kZWZpbmVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUV4YWN0V29ya2Zsb3dTZWFyY2hJZCh0cmltbWVkKTtcbiAgICBpZiAoIXBhcnNlZCB8fCAhb25FeGFjdElkU2VhcmNoKSB7XG4gICAgICBzZXRTZWFyY2hSZXN1bHRzKG51bGwpO1xuICAgICAgc2V0U2VhcmNoTG9hZGluZyhmYWxzZSk7XG4gICAgICBzZXRTZWFyY2hOb3RGb3VuZChmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdElkID0gKytzZWFyY2hSZXF1ZXN0UmVmLmN1cnJlbnQ7XG4gICAgc2V0U2VhcmNoTG9hZGluZyh0cnVlKTtcbiAgICBzZXRTZWFyY2hOb3RGb3VuZChmYWxzZSk7XG4gICAgc2V0U2VhcmNoRXJyb3IobnVsbCk7XG5cbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBvbkV4YWN0SWRTZWFyY2goXG4gICAgICAgICAgICBwYXJzZWQuaWQsXG4gICAgICAgICAgICBwYXJzZWQua2luZCxcbiAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCB8fFxuICAgICAgICAgICAgc2VhcmNoUmVxdWVzdFJlZi5jdXJyZW50ICE9PSByZXF1ZXN0SWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzdWx0cy5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHNldFNlYXJjaFJlc3VsdHMoW10pO1xuICAgICAgICAgICAgc2V0U2VhcmNoUmVzdWx0c1RydW5jYXRlZChmYWxzZSk7XG4gICAgICAgICAgICBzZXRTZWFyY2hOb3RGb3VuZChmYWxzZSk7XG4gICAgICAgICAgICBzZXRTZWFyY2hFcnJvcihyZXN1bHRzLm1lc3NhZ2UpO1xuICAgICAgICAgICAgc2V0U2VsZWN0ZWRHcm91cEtleSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc3VsdHMuc3RhdHVzID09PSAnbm90X2ZvdW5kJyB8fFxuICAgICAgICAgICAgKHJlc3VsdHMuc3RhdHVzID09PSAnb2snICYmIHJlc3VsdHMuZXZlbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNldFNlYXJjaFJlc3VsdHMoW10pO1xuICAgICAgICAgICAgc2V0U2VhcmNoUmVzdWx0c1RydW5jYXRlZChmYWxzZSk7XG4gICAgICAgICAgICBzZXRTZWFyY2hOb3RGb3VuZCh0cnVlKTtcbiAgICAgICAgICAgIHNldFNlYXJjaEVycm9yKG51bGwpO1xuICAgICAgICAgICAgc2V0U2VsZWN0ZWRHcm91cEtleSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldFNlYXJjaFJlc3VsdHMocmVzdWx0cy5ldmVudHMpO1xuICAgICAgICAgIHNldFNlYXJjaFJlc3VsdHNUcnVuY2F0ZWQoQm9vbGVhbihyZXN1bHRzLnRydW5jYXRlZCkpO1xuICAgICAgICAgIHNldFNlYXJjaE5vdEZvdW5kKGZhbHNlKTtcbiAgICAgICAgICBzZXRTZWFyY2hFcnJvcihudWxsKTtcbiAgICAgICAgICBzZXRTZWxlY3RlZEdyb3VwS2V5KFxuICAgICAgICAgICAgcGFyc2VkLmtpbmQgPT09ICdldmVudCdcbiAgICAgICAgICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSByZXN1bHRzLmV2ZW50c1swXTtcbiAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaXNSdW5MZXZlbChmaXJzdC5ldmVudFR5cGUpXG4gICAgICAgICAgICAgICAgICAgID8gJ19fcnVuX18nXG4gICAgICAgICAgICAgICAgICAgIDogKGZpcnN0LmNvcnJlbGF0aW9uSWQgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICAgIDogcGFyc2VkLmlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2aXJ0dW9zb1JlZi5jdXJyZW50Py5zY3JvbGxUb0luZGV4KHtcbiAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgYWxpZ246ICdzdGFydCcsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCB8fFxuICAgICAgICAgICAgc2VhcmNoUmVxdWVzdFJlZi5jdXJyZW50ICE9PSByZXF1ZXN0SWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0U2VhcmNoUmVzdWx0cyhbXSk7XG4gICAgICAgICAgc2V0U2VhcmNoUmVzdWx0c1RydW5jYXRlZChmYWxzZSk7XG4gICAgICAgICAgc2V0U2VhcmNoTm90Rm91bmQoZmFsc2UpO1xuICAgICAgICAgIHNldFNlYXJjaEVycm9yKCdGYWlsZWQgdG8gc2VhcmNoIGV2ZW50cy4gVHJ5IGFnYWluLicpO1xuICAgICAgICAgIHNldFNlbGVjdGVkR3JvdXBLZXkodW5kZWZpbmVkKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZWFyY2hSZXF1ZXN0UmVmLmN1cnJlbnQgPT09IHJlcXVlc3RJZCAmJlxuICAgICAgICAgICAgIWFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgc2V0U2VhcmNoTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0sIDMwMCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH07XG4gIH0sIFtzZWFyY2hRdWVyeSwgb25FeGFjdElkU2VhcmNoXSk7XG5cbiAgY29uc3QgaGFuZGxlU2VhcmNoS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3RLZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpbW1lZCA9IHNlYXJjaFF1ZXJ5LnRyaW0oKTtcbiAgICAgIGlmIChcbiAgICAgICAgIXRyaW1tZWQgfHxcbiAgICAgICAgcGFyc2VFeGFjdFdvcmtmbG93U2VhcmNoSWQodHJpbW1lZCkgfHxcbiAgICAgICAgIW9uRXhhY3RJZFNlYXJjaCB8fFxuICAgICAgICAhbG9va3NMaWtlV29ya2Zsb3dJZFNlYXJjaElucHV0KHRyaW1tZWQpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0b2FzdC5pbmZvKCdFbnRlciBhIGZ1bGwgc3RlcCBJRCwgd2FpdCBJRCwgaG9vayBJRCwgb3IgZXZlbnQgSUQnKTtcbiAgICB9LFxuICAgIFtzZWFyY2hRdWVyeSwgb25FeGFjdElkU2VhcmNoLCB0b2FzdF1cbiAgKTtcblxuICAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFkIGV2ZW50cyB0byBkaXN0aW5ndWlzaCBpbml0aWFsIGxvYWQgZnJvbSByZWZldGNoXG4gIGNvbnN0IGhhc0hhZEV2ZW50c1JlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGlmIChzb3J0ZWRFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIGhhc0hhZEV2ZW50c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBpc0luaXRpYWxMb2FkID0gaXNMb2FkaW5nICYmICFoYXNIYWRFdmVudHNSZWYuY3VycmVudDtcbiAgY29uc3QgaXNSZWZldGNoaW5nID1cbiAgICBpc0xvYWRpbmcgJiYgaGFzSGFkRXZlbnRzUmVmLmN1cnJlbnQgJiYgc29ydGVkRXZlbnRzLmxlbmd0aCA9PT0gMDtcblxuICBpZiAoaXNJbml0aWFsTG9hZCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBmbGV4IGZsZXgtY29sIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICB7LyogU2tlbGV0b24gc2VhcmNoIGJhciAqL31cbiAgICAgICAgPGRpdiBzdHlsZT17eyBwYWRkaW5nOiA2IH19PlxuICAgICAgICAgIDxTa2VsZXRvbiBzdHlsZT17eyBoZWlnaHQ6IDQwLCBib3JkZXJSYWRpdXM6IDYgfX0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHsvKiBTa2VsZXRvbiBoZWFkZXIgKi99XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMCBoLTEwIGJvcmRlci1iIGZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS1hbHBoYS0yMDApJyB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wXCIgc3R5bGU9e3sgd2lkdGg6IEdVVFRFUl9XSURUSCB9fSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy01IGZsZXgtc2hyaW5rLTBcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzIgMSAwJScgfX0+XG4gICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC0zXCIgc3R5bGU9e3sgd2lkdGg6IDQwIH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wIHB4LTRcIiBzdHlsZT17eyBmbGV4OiAnMiAxIDAlJyB9fT5cbiAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTNcIiBzdHlsZT17eyB3aWR0aDogNzIgfX0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTAgcHgtNFwiIHN0eWxlPXt7IGZsZXg6ICcyIDEgMCUnIH19PlxuICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtM1wiIHN0eWxlPXt7IHdpZHRoOiA0NCB9fSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzMgMSAwJScgfX0+XG4gICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC0zXCIgc3R5bGU9e3sgd2lkdGg6IDkyIH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wIHB4LTRcIiBzdHlsZT17eyBmbGV4OiAnMyAxIDAlJyB9fT5cbiAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTNcIiBzdHlsZT17eyB3aWR0aDogNjAgfX0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxSb3dzU2tlbGV0b24gLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxEZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyXG4gICAgICB2YWx1ZT17b25EZWNyeXB0ID8geyBvbkRlY3J5cHQsIGlzRGVjcnlwdGluZyB9IDogdW5kZWZpbmVkfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIGZsZXggZmxleC1jb2wgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgIDxzdHlsZT57YEBrZXlmcmFtZXMgd29ya2Zsb3ctZG90LXB1bHNlezAle3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5Oi43fTcwJSwxMDAle3RyYW5zZm9ybTpzY2FsZSgyLjIpO29wYWNpdHk6MH19YH08L3N0eWxlPlxuICAgICAgICB7LyogU2VhcmNoIGJhciArIHNvcnQgKi99XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgcGFkZGluZzogNixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWJhY2tncm91bmQtMTAwKScsXG4gICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICBnYXA6IDYsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDYsXG4gICAgICAgICAgICAgIGJveFNoYWRvdzogJzAgMCAwIDFweCB2YXIoLS1kcy1ncmF5LWFscGhhLTQwMCknLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tZHMtYmFja2dyb3VuZC0xMDApJyxcbiAgICAgICAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgICAgICAgZmxleDogMSxcbiAgICAgICAgICAgICAgbWluV2lkdGg6IDAsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB3aWR0aDogNDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS04MDApJyxcbiAgICAgICAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgd2lkdGg9ezE2fVxuICAgICAgICAgICAgICAgIGhlaWdodD17MTZ9XG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgZm9jdXNhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICAgICAgY3g9XCI3XCJcbiAgICAgICAgICAgICAgICAgIGN5PVwiN1wiXG4gICAgICAgICAgICAgICAgICByPVwiNC41XCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgZD1cIk0xMS41IDExLjVMMTQgMTRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYnkgc3RlcCBJRCwgd2FpdCBJRCwgaG9vayBJRCwgb3IgZXZlbnQgSUTigKZcIlxuICAgICAgICAgICAgICB2YWx1ZT17c2VhcmNoUXVlcnl9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VhcmNoUXVlcnkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICBvbktleURvd249e2hhbmRsZVNlYXJjaEtleURvd259XG4gICAgICAgICAgICAgIGRpc2FibGVkPXshb25FeGFjdElkU2VhcmNofVxuICAgICAgICAgICAgICB0aXRsZT17XG4gICAgICAgICAgICAgICAgb25FeGFjdElkU2VhcmNoXG4gICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgOiAnRXhhY3QgSUQgc2VhcmNoIGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgdmlldy4nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiAtMTYsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0lubGluZTogMTIsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogJ2luaGVyaXQnLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxNCxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogb25FeGFjdElkU2VhcmNoID8gMSA6IDAuNSxcbiAgICAgICAgICAgICAgICBjdXJzb3I6IG9uRXhhY3RJZFNlYXJjaCA/ICd0ZXh0JyA6ICdub3QtYWxsb3dlZCcsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPE1lbnVEcm9wZG93blxuICAgICAgICAgICAgb3B0aW9ucz17U09SVF9PUFRJT05TfVxuICAgICAgICAgICAgdmFsdWU9e2VmZmVjdGl2ZVNvcnRPcmRlcn1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVTb3J0T3JkZXJDaGFuZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7KGhhc0VuY3J5cHRlZERhdGEgfHwgZW5jcnlwdGlvbktleSkgJiYgb25EZWNyeXB0ICYmIChcbiAgICAgICAgICAgIDxEZWNyeXB0QnV0dG9uXG4gICAgICAgICAgICAgIGRlY3J5cHRlZD17ISFlbmNyeXB0aW9uS2V5fVxuICAgICAgICAgICAgICBsb2FkaW5nPXtpc0RlY3J5cHRpbmd9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e29uRGVjcnlwdH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0wIHRleHQtbGFiZWwtMTMgZm9udC1tZWRpdW0gaC0xMCBib3JkZXItYiBmbGV4LXNocmluay0wXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LWFscGhhLTIwMCknLFxuICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTkwMCknLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtYmFja2dyb3VuZC0xMDApJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wXCIgc3R5bGU9e3sgd2lkdGg6IEdVVFRFUl9XSURUSCB9fSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy01IGZsZXgtc2hyaW5rLTBcIiAvPlxuICAgICAgICAgIHtzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzIgMSAwJScgfX0+XG4gICAgICAgICAgICAgIE9jY3VycmVkXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzIgMSAwJScgfX0+XG4gICAgICAgICAgICBDcmVhdGVkXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wIHB4LTRcIiBzdHlsZT17eyBmbGV4OiAnMiAxIDAlJyB9fT5cbiAgICAgICAgICAgIEV2ZW50IFR5cGVcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTAgcHgtNFwiIHN0eWxlPXt7IGZsZXg6ICcyIDEgMCUnIH19PlxuICAgICAgICAgICAgTmFtZVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzMgMSAwJScgfX0+XG4gICAgICAgICAgICBDb3JyZWxhdGlvbiBJRFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBweC00XCIgc3R5bGU9e3sgZmxleDogJzMgMSAwJScgfX0+XG4gICAgICAgICAgICBFdmVudCBJRFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogVmlydHVhbGl6ZWQgZXZlbnQgcm93cyBvciByZWZldGNoaW5nIHNrZWxldG9uICovfVxuICAgICAgICB7aXNSZWZldGNoaW5nIHx8IHNlYXJjaExvYWRpbmcgPyAoXG4gICAgICAgICAgPFJvd3NTa2VsZXRvblxuICAgICAgICAgICAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcz17XG4gICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogc29ydGVkRXZlbnRzLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtMSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtNiB0ZXh0LWNlbnRlciB0ZXh0LWNvcHktMTRcIlxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3NlYXJjaE5vdEZvdW5kICYmIHNlYXJjaFF1ZXJ5LnRyaW0oKVxuICAgICAgICAgICAgICA/IGBObyBldmVudHMgZm91bmQgZm9yICR7c2VhcmNoUXVlcnkudHJpbSgpfWBcbiAgICAgICAgICAgICAgOiBzZWFyY2hFcnJvclxuICAgICAgICAgICAgICAgID8gc2VhcmNoRXJyb3JcbiAgICAgICAgICAgICAgICA6IHBhcnNlZFNlYXJjaElkICYmIHNlYXJjaFF1ZXJ5LnRyaW0oKSAmJiAhb25FeGFjdElkU2VhcmNoXG4gICAgICAgICAgICAgICAgICA/ICdFeGFjdCBJRCBzZWFyY2ggaXMgdW5hdmFpbGFibGUgaW4gdGhpcyB2aWV3LidcbiAgICAgICAgICAgICAgICAgIDogJ05vIGV2ZW50cyBmb3VuZCd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFZpcnR1b3NvXG4gICAgICAgICAgICByZWY9e3ZpcnR1b3NvUmVmfVxuICAgICAgICAgICAgdG90YWxDb3VudD17c29ydGVkRXZlbnRzLmxlbmd0aH1cbiAgICAgICAgICAgIG92ZXJzY2FuPXsyMH1cbiAgICAgICAgICAgIGRlZmF1bHRJdGVtSGVpZ2h0PXs0MH1cbiAgICAgICAgICAgIGVuZFJlYWNoZWQ9eygpID0+IHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlzRXhhY3RTZWFyY2hBY3RpdmUgfHxcbiAgICAgICAgICAgICAgICAhaGFzTW9yZUV2ZW50cyB8fFxuICAgICAgICAgICAgICAgIGlzTG9hZGluZ01vcmVFdmVudHNcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZvaWQgb25Mb2FkTW9yZUV2ZW50cz8uKCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgaXRlbUNvbnRlbnQ9eyhpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGV2ID0gc29ydGVkRXZlbnRzW2luZGV4XTtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8RXZlbnRSb3dcbiAgICAgICAgICAgICAgICAgIGV2ZW50PXtldn1cbiAgICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIGlzRmlyc3Q9e2luZGV4ID09PSAwfVxuICAgICAgICAgICAgICAgICAgaXNMYXN0PXtpbmRleCA9PT0gc29ydGVkRXZlbnRzLmxlbmd0aCAtIDF9XG4gICAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXtleHBhbmRlZEV2ZW50SWRzLmhhcyhldi5ldmVudElkKX1cbiAgICAgICAgICAgICAgICAgIG9uVG9nZ2xlRXhwYW5kPXt0b2dnbGVFdmVudEV4cGFuZGVkfVxuICAgICAgICAgICAgICAgICAgYWN0aXZlR3JvdXBLZXk9e2FjdGl2ZUdyb3VwS2V5fVxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cEtleT17c2VsZWN0ZWRHcm91cEtleX1cbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBSYW5nZT17c2VsZWN0ZWRHcm91cFJhbmdlfVxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25OYW1lTWFwPXtjb3JyZWxhdGlvbk5hbWVNYXB9XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU9e3dvcmtmbG93TmFtZX1cbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTWFwPXtkdXJhdGlvbk1hcH1cbiAgICAgICAgICAgICAgICAgIG9uU2VsZWN0R3JvdXA9e29uU2VsZWN0R3JvdXB9XG4gICAgICAgICAgICAgICAgICBvbkhvdmVyR3JvdXA9e29uSG92ZXJHcm91cH1cbiAgICAgICAgICAgICAgICAgIG9uTG9hZEV2ZW50RGF0YT17b25Mb2FkRXZlbnREYXRhfVxuICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnREYXRhPXtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhQ2FjaGVSZWYuY3VycmVudC5nZXQoZXYuZXZlbnRJZCkgPz8gbnVsbFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgb25DYWNoZUV2ZW50RGF0YT17Y2FjaGVFdmVudERhdGF9XG4gICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5PXtlbmNyeXB0aW9uS2V5fVxuICAgICAgICAgICAgICAgICAgb25FbmNyeXB0ZWREYXRhRGV0ZWN0ZWQ9e2hhbmRsZUVuY3J5cHRlZERhdGFEZXRlY3RlZH1cbiAgICAgICAgICAgICAgICAgIHN1cHByZXNzR3JvdXBEaW1taW5nPXtpc0V4YWN0U2VhcmNoQWN0aXZlfVxuICAgICAgICAgICAgICAgICAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcz17XG4gICAgICAgICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHN0eWxlPXt7IGZsZXg6IDEsIG1pbkhlaWdodDogMCB9fVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIEZpeGVkIGZvb3RlciDigJQgY291bnQgKyBsb2FkIG1vcmUgKi99XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4LXNocmluay0wIGZsZXggaXRlbXMtY2VudGVyIGgtMTAgYm9yZGVyLXQgcHgtNCB0ZXh0LWxhYmVsLTEyXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LWFscGhhLTIwMCknLFxuICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTkwMCknLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtYmFja2dyb3VuZC0xMDApJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7aXNFeGFjdFNlYXJjaEFjdGl2ZVxuICAgICAgICAgICAgICA/IHNlYXJjaEVycm9yXG4gICAgICAgICAgICAgICAgPyBzZWFyY2hFcnJvclxuICAgICAgICAgICAgICAgIDogc2VhcmNoTm90Rm91bmRcbiAgICAgICAgICAgICAgICAgID8gYE5vIGV2ZW50cyBmb3VuZCBmb3IgJHtzZWFyY2hRdWVyeS50cmltKCl9YFxuICAgICAgICAgICAgICAgICAgOiBgJHtzb3J0ZWRFdmVudHMubGVuZ3RofSBldmVudCR7c29ydGVkRXZlbnRzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSBmb3IgJHtzZWFyY2hRdWVyeS50cmltKCl9JHtzZWFyY2hSZXN1bHRzVHJ1bmNhdGVkID8gJyAocmVzdWx0cyBtYXkgYmUgdHJ1bmNhdGVkKScgOiAnJ31gXG4gICAgICAgICAgICAgIDogYCR7c29ydGVkRXZlbnRzLmxlbmd0aH0gZXZlbnQke3NvcnRlZEV2ZW50cy5sZW5ndGggIT09IDEgPyAncycgOiAnJ30gbG9hZGVkYH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgeyFpc0V4YWN0U2VhcmNoQWN0aXZlICYmIGhhc01vcmVFdmVudHMgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPExvYWRNb3JlQnV0dG9uXG4gICAgICAgICAgICAgICAgICBsb2FkaW5nPXtpc0xvYWRpbmdNb3JlRXZlbnRzfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBvbkxvYWRNb3JlRXZlbnRzPy4oKX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9EZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRXZlbnRMaXN0Vmlldyhwcm9wczogRXZlbnRzTGlzdFByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPENvbnRleHRDYXJkUHJvdmlkZXI+XG4gICAgICA8RXZlbnRMaXN0Vmlld0lubmVyIHsuLi5wcm9wc30gLz5cbiAgICA8L0NvbnRleHRDYXJkUHJvdmlkZXI+XG4gICk7XG59XG4iXX0=
|