@workflow/web-shared 5.0.0-beta.38 → 5.0.0-beta.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/README.md +3 -3
  2. package/dist/components/event-list-view.d.ts.map +1 -1
  3. package/dist/components/event-list-view.js +10 -10
  4. package/dist/components/index.d.ts +3 -5
  5. package/dist/components/index.d.ts.map +1 -1
  6. package/dist/components/index.js +3 -5
  7. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  8. package/dist/components/sidebar/attribute-panel.js +32 -8
  9. package/dist/components/sidebar/attributes-block.js +3 -3
  10. package/dist/components/sidebar/copyable-data-block.js +2 -2
  11. package/dist/components/sidebar/entity-detail-panel.js +3 -3
  12. package/dist/components/sidebar/events-list.js +2 -2
  13. package/dist/components/stream-viewer.js +2 -2
  14. package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
  15. package/dist/components/trace-viewer/components/copy-button.js +27 -0
  16. package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  17. package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
  18. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
  19. package/dist/components/trace-viewer/components/detail-panel.js +122 -0
  20. package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
  21. package/dist/components/trace-viewer/components/draggable-border.js +140 -0
  22. package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
  23. package/dist/components/trace-viewer/components/event-list.js +47 -0
  24. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  25. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  26. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  27. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  28. package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  29. package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
  30. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  31. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  32. package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
  33. package/dist/components/trace-viewer/components/minimap.js +337 -0
  34. package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
  35. package/dist/components/trace-viewer/components/pane-constants.js +16 -0
  36. package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
  37. package/dist/components/trace-viewer/components/span-markers.js +85 -0
  38. package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
  39. package/dist/components/trace-viewer/components/split-pane.js +41 -0
  40. package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
  41. package/dist/components/trace-viewer/components/timeline.js +321 -0
  42. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
  44. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  45. package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
  46. package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
  47. package/dist/components/trace-viewer/components/use-element-width.js +25 -0
  48. package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/use-row-window.js +107 -0
  50. package/dist/components/trace-viewer/context.d.ts +14 -182
  51. package/dist/components/trace-viewer/context.d.ts.map +1 -1
  52. package/dist/components/trace-viewer/context.js +44 -351
  53. package/dist/components/trace-viewer/icons.d.ts.map +1 -0
  54. package/dist/components/trace-viewer/icons.js +15 -0
  55. package/dist/components/trace-viewer/search.d.ts.map +1 -0
  56. package/dist/components/trace-viewer/search.js +134 -0
  57. package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
  58. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  59. package/dist/components/trace-viewer/trace-viewer.js +306 -356
  60. package/dist/components/trace-viewer/types.d.ts +2 -211
  61. package/dist/components/trace-viewer/types.d.ts.map +1 -1
  62. package/dist/components/trace-viewer/types.js +1 -1
  63. package/dist/components/trace-viewer/utils.d.ts.map +1 -0
  64. package/dist/components/trace-viewer/utils.js +430 -0
  65. package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +3 -3
  66. package/dist/components/trace-viewer.d.ts.map +1 -0
  67. package/dist/components/trace-viewer.js +21 -0
  68. package/dist/components/ui/alert.js +2 -2
  69. package/dist/components/ui/button.d.ts +1 -1
  70. package/dist/components/ui/button.d.ts.map +1 -1
  71. package/dist/components/ui/button.js +3 -3
  72. package/dist/components/ui/card.d.ts.map +1 -1
  73. package/dist/components/ui/card.js +3 -3
  74. package/dist/components/ui/error-card.js +2 -2
  75. package/dist/components/ui/error-stack-block.js +4 -4
  76. package/dist/components/ui/kbd.js +3 -3
  77. package/dist/components/ui/timestamp-tooltip.js +3 -3
  78. package/dist/components/workflow-traces/trace-span-construction.d.ts +1 -1
  79. package/dist/components/workflow-traces/trace-span-construction.js +1 -1
  80. package/dist/lib/trace-builder.d.ts +1 -1
  81. package/dist/lib/trace-builder.d.ts.map +1 -1
  82. package/dist/lib/trace-builder.js +1 -1
  83. package/dist/lib/trace-types.d.ts +54 -0
  84. package/dist/lib/trace-types.d.ts.map +1 -0
  85. package/dist/lib/trace-types.js +2 -0
  86. package/package.json +5 -5
  87. package/src/components/event-list-view.tsx +12 -9
  88. package/src/components/index.ts +3 -5
  89. package/src/components/sidebar/attribute-panel.tsx +46 -8
  90. package/src/components/sidebar/attributes-block.tsx +2 -2
  91. package/src/components/sidebar/copyable-data-block.tsx +1 -1
  92. package/src/components/sidebar/entity-detail-panel.tsx +3 -3
  93. package/src/components/sidebar/events-list.tsx +1 -1
  94. package/src/components/stream-viewer.tsx +1 -1
  95. package/src/components/{new-trace-viewer → trace-viewer}/components/event-list.tsx +1 -1
  96. package/src/components/{new-trace-viewer → trace-viewer}/components/minimap.tsx +1 -4
  97. package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.tsx +2 -5
  98. package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.tsx +1 -1
  99. package/src/components/trace-viewer/context.tsx +63 -656
  100. package/src/components/trace-viewer/trace-viewer.tsx +563 -531
  101. package/src/components/trace-viewer/types.ts +2 -234
  102. package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +2 -2
  103. package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +5 -5
  104. package/src/components/ui/alert.tsx +1 -1
  105. package/src/components/ui/button.tsx +3 -3
  106. package/src/components/ui/card.tsx +2 -9
  107. package/src/components/ui/error-card.tsx +3 -3
  108. package/src/components/ui/error-stack-block.tsx +3 -3
  109. package/src/components/ui/kbd.tsx +2 -2
  110. package/src/components/ui/timestamp-tooltip.tsx +4 -4
  111. package/src/components/workflow-traces/trace-span-construction.ts +1 -1
  112. package/src/lib/trace-builder.ts +1 -1
  113. package/src/lib/trace-types.ts +56 -0
  114. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
  115. package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
  116. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +0 -1
  117. package/dist/components/new-trace-viewer/components/detail-panel-width.js +0 -67
  118. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +0 -1
  119. package/dist/components/new-trace-viewer/components/detail-panel.js +0 -122
  120. package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +0 -1
  121. package/dist/components/new-trace-viewer/components/draggable-border.js +0 -140
  122. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
  123. package/dist/components/new-trace-viewer/components/event-list.js +0 -47
  124. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
  125. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
  126. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
  127. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
  128. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
  129. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
  130. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
  131. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
  132. package/dist/components/new-trace-viewer/components/minimap.d.ts.map +0 -1
  133. package/dist/components/new-trace-viewer/components/minimap.js +0 -337
  134. package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +0 -1
  135. package/dist/components/new-trace-viewer/components/pane-constants.js +0 -16
  136. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +0 -1
  137. package/dist/components/new-trace-viewer/components/span-markers.js +0 -85
  138. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
  139. package/dist/components/new-trace-viewer/components/split-pane.js +0 -41
  140. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
  141. package/dist/components/new-trace-viewer/components/timeline.js +0 -321
  142. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +0 -1
  143. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +0 -55
  144. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +0 -1
  145. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +0 -26
  146. package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +0 -1
  147. package/dist/components/new-trace-viewer/components/use-element-width.js +0 -25
  148. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +0 -1
  149. package/dist/components/new-trace-viewer/components/use-row-window.js +0 -107
  150. package/dist/components/new-trace-viewer/context.d.ts +0 -17
  151. package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
  152. package/dist/components/new-trace-viewer/context.js +0 -48
  153. package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
  154. package/dist/components/new-trace-viewer/icons.js +0 -15
  155. package/dist/components/new-trace-viewer/search.d.ts.map +0 -1
  156. package/dist/components/new-trace-viewer/search.js +0 -134
  157. package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -11
  158. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
  159. package/dist/components/new-trace-viewer/trace-viewer.js +0 -336
  160. package/dist/components/new-trace-viewer/types.d.ts +0 -3
  161. package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
  162. package/dist/components/new-trace-viewer/types.js +0 -2
  163. package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
  164. package/dist/components/new-trace-viewer/utils.js +0 -430
  165. package/dist/components/run-trace-view.d.ts +0 -23
  166. package/dist/components/run-trace-view.d.ts.map +0 -1
  167. package/dist/components/run-trace-view.js +0 -11
  168. package/dist/components/trace-viewer/components/map.d.ts +0 -8
  169. package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
  170. package/dist/components/trace-viewer/components/map.js +0 -162
  171. package/dist/components/trace-viewer/components/markers.d.ts +0 -23
  172. package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
  173. package/dist/components/trace-viewer/components/markers.js +0 -416
  174. package/dist/components/trace-viewer/components/node.d.ts +0 -35
  175. package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
  176. package/dist/components/trace-viewer/components/node.js +0 -286
  177. package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
  178. package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
  179. package/dist/components/trace-viewer/components/search-input.js +0 -9
  180. package/dist/components/trace-viewer/components/search.d.ts +0 -3
  181. package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
  182. package/dist/components/trace-viewer/components/search.js +0 -25
  183. package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
  184. package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
  185. package/dist/components/trace-viewer/components/span-content.js +0 -137
  186. package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
  187. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  188. package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
  189. package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
  190. package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
  191. package/dist/components/trace-viewer/components/span-segments.js +0 -445
  192. package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
  193. package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
  194. package/dist/components/trace-viewer/components/span-strategies.js +0 -108
  195. package/dist/components/trace-viewer/components/ui.d.ts +0 -28
  196. package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
  197. package/dist/components/trace-viewer/components/ui.js +0 -39
  198. package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
  199. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
  200. package/dist/components/trace-viewer/components/zoom-button.js +0 -29
  201. package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
  202. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  203. package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
  204. package/dist/components/trace-viewer/index.d.ts +0 -5
  205. package/dist/components/trace-viewer/index.d.ts.map +0 -1
  206. package/dist/components/trace-viewer/index.js +0 -4
  207. package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
  208. package/dist/components/trace-viewer/util/constants.d.ts +0 -9
  209. package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
  210. package/dist/components/trace-viewer/util/constants.js +0 -9
  211. package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
  212. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  213. package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
  214. package/dist/components/trace-viewer/util/tree.d.ts +0 -13
  215. package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
  216. package/dist/components/trace-viewer/util/tree.js +0 -227
  217. package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
  218. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  219. package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
  220. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
  221. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  222. package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
  223. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
  224. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  225. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
  226. package/dist/components/trace-viewer/worker.d.ts +0 -2
  227. package/dist/components/trace-viewer/worker.d.ts.map +0 -1
  228. package/dist/components/trace-viewer/worker.js +0 -109
  229. package/dist/components/trace-viewer-new.d.ts.map +0 -1
  230. package/dist/components/trace-viewer-new.js +0 -21
  231. package/dist/components/workflow-trace-view.d.ts +0 -39
  232. package/dist/components/workflow-trace-view.d.ts.map +0 -1
  233. package/dist/components/workflow-trace-view.js +0 -690
  234. package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
  235. package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
  236. package/dist/components/workflow-traces/trace-colors.js +0 -86
  237. package/src/components/new-trace-viewer/context.tsx +0 -93
  238. package/src/components/new-trace-viewer/trace-viewer.tsx +0 -632
  239. package/src/components/new-trace-viewer/types.ts +0 -2
  240. package/src/components/run-trace-view.tsx +0 -80
  241. package/src/components/trace-viewer/components/map.tsx +0 -226
  242. package/src/components/trace-viewer/components/markers.tsx +0 -612
  243. package/src/components/trace-viewer/components/node.tsx +0 -506
  244. package/src/components/trace-viewer/components/search-input.tsx +0 -52
  245. package/src/components/trace-viewer/components/search.tsx +0 -47
  246. package/src/components/trace-viewer/components/span-content.tsx +0 -247
  247. package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
  248. package/src/components/trace-viewer/components/span-segments.ts +0 -585
  249. package/src/components/trace-viewer/components/span-strategies.ts +0 -205
  250. package/src/components/trace-viewer/components/ui.tsx +0 -156
  251. package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
  252. package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
  253. package/src/components/trace-viewer/index.tsx +0 -4
  254. package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
  255. package/src/components/trace-viewer/util/constants.ts +0 -8
  256. package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
  257. package/src/components/trace-viewer/util/tree.ts +0 -277
  258. package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
  259. package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
  260. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
  261. package/src/components/trace-viewer/worker.ts +0 -131
  262. package/src/components/workflow-trace-view.tsx +0 -1166
  263. package/src/components/workflow-traces/trace-colors.ts +0 -112
  264. package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
  265. package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.d.ts +0 -0
  266. package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel.d.ts +0 -0
  267. package/dist/components/{new-trace-viewer → trace-viewer}/components/draggable-border.d.ts +0 -0
  268. package/dist/components/{new-trace-viewer → trace-viewer}/components/event-list.d.ts +0 -0
  269. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
  270. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
  271. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +0 -0
  272. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
  273. package/dist/components/{new-trace-viewer → trace-viewer}/components/minimap.d.ts +0 -0
  274. package/dist/components/{new-trace-viewer → trace-viewer}/components/pane-constants.d.ts +0 -0
  275. package/dist/components/{new-trace-viewer → trace-viewer}/components/span-markers.d.ts +0 -0
  276. package/dist/components/{new-trace-viewer → trace-viewer}/components/split-pane.d.ts +0 -0
  277. package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.d.ts +0 -0
  278. package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
  279. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.d.ts +0 -0
  280. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
  281. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.d.ts +0 -0
  282. package/dist/components/{new-trace-viewer → trace-viewer}/components/use-element-width.d.ts +0 -0
  283. package/dist/components/{new-trace-viewer → trace-viewer}/components/use-row-window.d.ts +0 -0
  284. package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
  285. package/dist/components/{new-trace-viewer → trace-viewer}/search.d.ts +0 -0
  286. package/dist/components/{new-trace-viewer → trace-viewer}/utils.d.ts +0 -0
  287. package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +0 -0
  288. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.test.ts +0 -0
  289. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.ts +0 -0
  290. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel.tsx +0 -0
  291. package/src/components/{new-trace-viewer → trace-viewer}/components/draggable-border.tsx +0 -0
  292. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
  293. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +1 -1
  294. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +0 -0
  295. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
  296. /package/src/components/{new-trace-viewer → trace-viewer}/components/pane-constants.ts +0 -0
  297. /package/src/components/{new-trace-viewer → trace-viewer}/components/span-markers.tsx +0 -0
  298. /package/src/components/{new-trace-viewer → trace-viewer}/components/split-pane.tsx +0 -0
  299. /package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
  300. /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
  301. /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.tsx +0 -0
  302. /package/src/components/{new-trace-viewer → trace-viewer}/components/use-element-width.ts +0 -0
  303. /package/src/components/{new-trace-viewer → trace-viewer}/components/use-row-window.ts +0 -0
  304. /package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +0 -0
  305. /package/src/components/{new-trace-viewer → trace-viewer}/search.ts +0 -0
  306. /package/src/components/{new-trace-viewer → trace-viewer}/utils.test.ts +0 -0
  307. /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
@@ -1,137 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import styles from '../trace-viewer.module.css';
4
- import { formatDuration } from '../util/timing';
5
- import { SEGMENT_CLASS_MAP, computeSegments, } from './span-segments';
6
- // ──────────────────────────────────────────────────────────────────────────
7
- // Shared helpers
8
- // ──────────────────────────────────────────────────────────────────────────
9
- function getDuration(node) {
10
- if (node.isInstrumentationHint) {
11
- return 'Get Started';
12
- }
13
- return formatDuration(node.duration);
14
- }
15
- // ──────────────────────────────────────────────────────────────────────────
16
- // Segment rendering (shared across all workflow span types)
17
- // ──────────────────────────────────────────────────────────────────────────
18
- const SEGMENT_LABELS = {
19
- queued: 'Queued',
20
- running: '',
21
- failed: 'Failed',
22
- retrying: 'Retry wait',
23
- succeeded: 'Executed',
24
- waiting: 'Waiting',
25
- sleeping: 'Sleeping',
26
- received: 'Received',
27
- };
28
- function SegmentLayer({ segments, spanDuration, }) {
29
- if (segments.length === 0)
30
- return null;
31
- return (_jsx("div", { className: styles.segmentLayer, children: segments.map((seg, i) => {
32
- const className = styles[SEGMENT_CLASS_MAP[seg.status]];
33
- const segDuration = (seg.endFraction - seg.startFraction) * spanDuration;
34
- const label = SEGMENT_LABELS[seg.status];
35
- const style = {
36
- left: `${seg.startFraction * 100}%`,
37
- width: `${(seg.endFraction - seg.startFraction) * 100}%`,
38
- };
39
- return (_jsx("div", { className: `${styles.segment} ${String(className)}`, style: style, title: label
40
- ? `${label} ${formatDuration(segDuration)}`
41
- : formatDuration(segDuration) }, `seg-${seg.status}-${String(i)}`));
42
- }) }));
43
- }
44
- /** Build inline segment tags to render next to the span name. */
45
- function getSegmentTags(segments, spanDuration) {
46
- const tags = [];
47
- for (let i = 0; i < segments.length; i++) {
48
- const seg = segments[i];
49
- const label = SEGMENT_LABELS[seg.status];
50
- if (!label)
51
- continue; // skip "running" which has no label
52
- let segDuration = (seg.endFraction - seg.startFraction) * spanDuration;
53
- // For terminal segments (succeeded/failed) with ~0 duration,
54
- // use the preceding running segment's duration instead.
55
- if (segDuration < 1 &&
56
- (seg.status === 'succeeded' || seg.status === 'failed') &&
57
- i > 0) {
58
- const prev = segments[i - 1];
59
- if (prev.status === 'running') {
60
- segDuration = (prev.endFraction - prev.startFraction) * spanDuration;
61
- }
62
- }
63
- // Skip tags that still have no meaningful duration
64
- if (segDuration < 1)
65
- continue;
66
- tags.push({ label, duration: formatDuration(segDuration) });
67
- }
68
- return tags;
69
- }
70
- // ──────────────────────────────────────────────────────────────────────────
71
- // Text content (shared label + duration rendering)
72
- // ──────────────────────────────────────────────────────────────────────────
73
- function TextContent({ node, layout, durationMs, segmentTags, }) {
74
- const duration = node.isInstrumentationHint
75
- ? getDuration(node)
76
- : formatDuration(durationMs ?? node.duration);
77
- if (layout.isSmall && !layout.isHovered) {
78
- return null;
79
- }
80
- const showTags = segmentTags &&
81
- segmentTags.length > 0 &&
82
- (layout.isHovered || layout.width > 200);
83
- return (_jsxs(_Fragment, { children: [_jsxs("span", { className: styles.spanName, children: [node.label || node.span.name, showTags
84
- ? segmentTags.map((tag, i) => (_jsxs("span", { className: styles.segmentTag, children: [' · ', tag.label, " ", tag.duration] }, i)))
85
- : null] }), layout.isHuge ? _jsx("span", { className: styles.spanSpacer }) : null, layout.isHovered || layout.width > 128 ? (_jsx("span", { className: styles.spanDuration, children: duration })) : null] }));
86
- }
87
- // ──────────────────────────────────────────────────────────────────────────
88
- // Default content (generic OTEL spans — no segments)
89
- // ──────────────────────────────────────────────────────────────────────────
90
- function DefaultContent({ node, layout }) {
91
- return _jsx(TextContent, { node: node, layout: layout });
92
- }
93
- // ──────────────────────────────────────────────────────────────────────────
94
- // Workflow content (segments + text for workflow span types)
95
- // ──────────────────────────────────────────────────────────────────────────
96
- function WorkflowContent({ resourceType, node, layout, durationMs, }) {
97
- const spanDuration = durationMs ?? node.duration;
98
- const { segments } = computeSegments(resourceType, node);
99
- const segmentTags = getSegmentTags(segments, spanDuration);
100
- return (_jsxs(_Fragment, { children: [_jsx(SegmentLayer, { segments: segments, spanDuration: spanDuration }), _jsx(TextContent, { durationMs: spanDuration, node: node, layout: layout, segmentTags: segmentTags })] }));
101
- }
102
- // ──────────────────────────────────────────────────────────────────────────
103
- // Per-type content components
104
- // ──────────────────────────────────────────────────────────────────────────
105
- export function RunContent(props) {
106
- return _jsx(WorkflowContent, { resourceType: "run", ...props });
107
- }
108
- export function StepContent(props) {
109
- return _jsx(WorkflowContent, { resourceType: "step", ...props });
110
- }
111
- export function HookContent(props) {
112
- return _jsx(WorkflowContent, { resourceType: "hook", ...props });
113
- }
114
- export function SleepContent(props) {
115
- return _jsx(WorkflowContent, { resourceType: "sleep", ...props });
116
- }
117
- // ──────────────────────────────────────────────────────────────────────────
118
- // Dispatcher
119
- // ──────────────────────────────────────────────────────────────────────────
120
- /**
121
- * Returns the inner content for a span based on its resource type.
122
- */
123
- export function SpanContent({ resourceType, ...props }) {
124
- switch (resourceType) {
125
- case 'run':
126
- return _jsx(RunContent, { ...props });
127
- case 'step':
128
- return _jsx(StepContent, { ...props });
129
- case 'hook':
130
- return _jsx(HookContent, { ...props });
131
- case 'sleep':
132
- return _jsx(SleepContent, { ...props });
133
- default:
134
- return _jsx(DefaultContent, { ...props });
135
- }
136
- }
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1jb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvc3Bhbi1jb250ZW50LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBR2IsT0FBTyxNQUFNLE1BQU0sNEJBQTRCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFHTCxpQkFBaUIsRUFDakIsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBR3pCLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFDakIsNkVBQTZFO0FBRTdFLFNBQVMsV0FBVyxDQUFDLElBQWM7SUFDakMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsNERBQTREO0FBQzVELDZFQUE2RTtBQUU3RSxNQUFNLGNBQWMsR0FBa0M7SUFDcEQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLEVBQUU7SUFDWCxNQUFNLEVBQUUsUUFBUTtJQUNoQixRQUFRLEVBQUUsWUFBWTtJQUN0QixTQUFTLEVBQUUsVUFBVTtJQUNyQixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtJQUNwQixRQUFRLEVBQUUsVUFBVTtDQUNyQixDQUFDO0FBRUYsU0FBUyxZQUFZLENBQUMsRUFDcEIsUUFBUSxFQUNSLFlBQVksR0FJYjtJQUNDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFdkMsT0FBTyxDQUNMLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLFlBQ2hDLFFBQVEsQ0FBQyxH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RUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUF1QjtJQUNqRCxPQUFPLEtBQUMsZUFBZSxJQUFDLFlBQVksRUFBQyxNQUFNLEtBQUssS0FBSyxHQUFJLENBQUM7QUFDNUQsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBdUI7SUFDbEQsT0FBTyxLQUFDLGVBQWUsSUFBQyxZQUFZLEVBQUMsT0FBTyxLQUFLLEtBQUssR0FBSSxDQUFDO0FBQzdELENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsYUFBYTtBQUNiLDZFQUE2RTtBQUU3RTs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsRUFDMUIsWUFBWSxFQUNaLEdBQUcsS0FBSyxFQUMwQztJQUNsRCxRQUFRLFlBQVksRUFBRSxDQUFDO1FBQ3JCLEtBQUssS0FBSztZQUNSLE9BQU8sS0FBQyxVQUFVLE9BQUssS0FBSyxHQUFJLENBQUM7UUFDbkMsS0FBSyxNQUFNO1lBQ1QsT0FBTyxLQUFDLFdBQVcsT0FBSyxLQUFLLEdBQUksQ0FBQztRQUNwQyxLQUFLLE1BQU07WUFDVCxPQUFPLEtBQUMsV0FBVyxPQUFLLEtBQUssR0FBSSxDQUFDO1FBQ3BDLEtBQUssT0FBTztZQUNWLE9BQU8sS0FBQyxZQUFZLE9BQUssS0FBSyxHQUFJLENBQUM7UUFDckM7WUFDRSxPQUFPLEtBQUMsY0FBYyxPQUFLLEtBQUssR0FBSSxDQUFDO0lBQ3pDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi4vdHJhY2Utdmlld2VyLm1vZHVsZS5jc3MnO1xuaW1wb3J0IHR5cGUgeyBTcGFuTm9kZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbC90aW1pbmcnO1xuaW1wb3J0IHtcbiAgdHlwZSBTZWdtZW50LFxuICB0eXBlIFNlZ21lbnRTdGF0dXMsXG4gIFNFR01FTlRfQ0xBU1NfTUFQLFxuICBjb21wdXRlU2VnbWVudHMsXG59IGZyb20gJy4vc3Bhbi1zZWdtZW50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlVHlwZSwgU3BhbkxheW91dCB9IGZyb20gJy4vc3Bhbi1zdHJhdGVnaWVzJztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTaGFyZWQgaGVscGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIGdldER1cmF0aW9uKG5vZGU6IFNwYW5Ob2RlKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUuaXNJbnN0cnVtZW50YXRpb25IaW50KSB7XG4gICAgcmV0dXJuICdHZXQgU3RhcnRlZCc7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdER1cmF0aW9uKG5vZGUuZHVyYXRpb24pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNlZ21lbnQgcmVuZGVyaW5nIChzaGFyZWQgYWNyb3NzIGFsbCB3b3JrZmxvdyBzcGFuIHR5cGVzKVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IFNFR01FTlRfTEFCRUxTOiBSZWNvcmQ8U2VnbWVudFN0YXR1cywgc3RyaW5nPiA9IHtcbiAgcXVldWVkOiAnUXVldWVkJyxcbiAgcnVubmluZzogJycsXG4gIGZhaWxlZDogJ0ZhaWxlZCcsXG4gIHJldHJ5aW5nOiAnUmV0cnkgd2FpdCcsXG4gIHN1Y2NlZWRlZDogJ0V4ZWN1dGVkJyxcbiAgd2FpdGluZzogJ1dhaXRpbmcnLFxuICBzbGVlcGluZzogJ1NsZWVwaW5nJyxcbiAgcmVjZWl2ZWQ6ICdSZWNlaXZlZCcsXG59O1xuXG5mdW5jdGlvbiBTZWdtZW50TGF5ZXIoe1xuICBzZWdtZW50cyxcbiAgc3BhbkR1cmF0aW9uLFxufToge1xuICBzZWdtZW50czogU2VnbWVudFtdO1xuICBzcGFuRHVyYXRpb246IG51bWJlcjtcbn0pOiBSZWFjdE5vZGUge1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuc2VnbWVudExheWVyfT5cbiAgICAgIHtzZWdtZW50cy5tYXAoKHNlZywgaSkgPT4ge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPVxuICAgICAgICAgIHN0eWxlc1tTRUdNRU5UX0NMQVNTX01BUFtzZWcuc3RhdHVzXSBhcyBrZXlvZiB0eXBlb2Ygc3R5bGVzXTtcbiAgICAgICAgY29uc3Qgc2VnRHVyYXRpb24gPVxuICAgICAgICAgIChzZWcuZW5kRnJhY3Rpb24gLSBzZWcuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb247XG4gICAgICAgIGNvbnN0IGxhYmVsID0gU0VHTUVOVF9MQUJFTFNbc2VnLnN0YXR1c107XG4gICAgICAgIGNvbnN0IHN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgIGxlZnQ6IGAke3NlZy5zdGFydEZyYWN0aW9uICogMTAwfSVgLFxuICAgICAgICAgIHdpZHRoOiBgJHsoc2VnLmVuZEZyYWN0aW9uIC0gc2VnLnN0YXJ0RnJhY3Rpb24pICogMTAwfSVgLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgc2VnLSR7c2VnLnN0YXR1c30tJHtTdHJpbmcoaSl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7c3R5bGVzLnNlZ21lbnR9ICR7U3RyaW5nKGNsYXNzTmFtZSl9YH1cbiAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgICAgbGFiZWxcbiAgICAgICAgICAgICAgICA/IGAke2xhYmVsfSAke2Zvcm1hdER1cmF0aW9uKHNlZ0R1cmF0aW9uKX1gXG4gICAgICAgICAgICAgICAgOiBmb3JtYXREdXJhdGlvbihzZWdEdXJhdGlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfSl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8qKiBCdWlsZCBpbmxpbmUgc2VnbWVudCB0YWdzIHRvIHJlbmRlciBuZXh0IHRvIHRoZSBzcGFuIG5hbWUuICovXG5mdW5jdGlvbiBnZXRTZWdtZW50VGFncyhcbiAgc2VnbWVudHM6IFNlZ21lbnRbXSxcbiAgc3BhbkR1cmF0aW9uOiBudW1iZXJcbik6IHsgbGFiZWw6IHN0cmluZzsgZHVyYXRpb246IHN0cmluZyB9W10ge1xuICBjb25zdCB0YWdzOiB7IGxhYmVsOiBzdHJpbmc7IGR1cmF0aW9uOiBzdHJpbmcgfVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzZWcgPSBzZWdtZW50c1tpXTtcbiAgICBjb25zdCBsYWJlbCA9IFNFR01FTlRfTEFCRUxTW3NlZy5zdGF0dXNdO1xuICAgIGlmICghbGFiZWwpIGNvbnRpbnVlOyAvLyBza2lwIFwicnVubmluZ1wiIHdoaWNoIGhhcyBubyBsYWJlbFxuICAgIGxldCBzZWdEdXJhdGlvbiA9IChzZWcuZW5kRnJhY3Rpb24gLSBzZWcuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb247XG5cbiAgICAvLyBGb3IgdGVybWluYWwgc2VnbWVudHMgKHN1Y2NlZWRlZC9mYWlsZWQpIHdpdGggfjAgZHVyYXRpb24sXG4gICAgLy8gdXNlIHRoZSBwcmVjZWRpbmcgcnVubmluZyBzZWdtZW50J3MgZHVyYXRpb24gaW5zdGVhZC5cbiAgICBpZiAoXG4gICAgICBzZWdEdXJhdGlvbiA8IDEgJiZcbiAgICAgIChzZWcuc3RhdHVzID09PSAnc3VjY2VlZGVkJyB8fCBzZWcuc3RhdHVzID09PSAnZmFpbGVkJykgJiZcbiAgICAgIGkgPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBwcmV2ID0gc2VnbWVudHNbaSAtIDFdO1xuICAgICAgaWYgKHByZXYuc3RhdHVzID09PSAncnVubmluZycpIHtcbiAgICAgICAgc2VnRHVyYXRpb24gPSAocHJldi5lbmRGcmFjdGlvbiAtIHByZXYuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCB0YWdzIHRoYXQgc3RpbGwgaGF2ZSBubyBtZWFuaW5nZnVsIGR1cmF0aW9uXG4gICAgaWYgKHNlZ0R1cmF0aW9uIDwgMSkgY29udGludWU7XG5cbiAgICB0YWdzLnB1c2goeyBsYWJlbCwgZHVyYXRpb246IGZvcm1hdER1cmF0aW9uKHNlZ0R1cmF0aW9uKSB9KTtcbiAgfVxuICByZXR1cm4gdGFncztcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUZXh0IGNvbnRlbnQgKHNoYXJlZCBsYWJlbCArIGR1cmF0aW9uIHJlbmRlcmluZylcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBUZXh0Q29udGVudCh7XG4gIG5vZGUsXG4gIGxheW91dCxcbiAgZHVyYXRpb25NcyxcbiAgc2VnbWVudFRhZ3MsXG59OiBTcGFuQ29udGVudFByb3BzICYge1xuICBzZWdtZW50VGFncz86IHsgbGFiZWw6IHN0cmluZzsgZHVyYXRpb246IHN0cmluZyB9W107XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgZHVyYXRpb24gPSBub2RlLmlzSW5zdHJ1bWVudGF0aW9uSGludFxuICAgID8gZ2V0RHVyYXRpb24obm9kZSlcbiAgICA6IGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uTXMgPz8gbm9kZS5kdXJhdGlvbik7XG5cbiAgaWYgKGxheW91dC5pc1NtYWxsICYmICFsYXlvdXQuaXNIb3ZlcmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzaG93VGFncyA9XG4gICAgc2VnbWVudFRhZ3MgJiZcbiAgICBzZWdtZW50VGFncy5sZW5ndGggPiAwICYmXG4gICAgKGxheW91dC5pc0hvdmVyZWQgfHwgbGF5b3V0LndpZHRoID4gMjAwKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuTmFtZX0+XG4gICAgICAgIHtub2RlLmxhYmVsIHx8IG5vZGUuc3Bhbi5uYW1lfVxuICAgICAgICB7c2hvd1RhZ3NcbiAgICAgICAgICA/IHNlZ21lbnRUYWdzLm1hcCgodGFnLCBpKSA9PiAoXG4gICAgICAgICAgICAgIDxzcGFuIGtleT17aX0gY2xhc3NOYW1lPXtzdHlsZXMuc2VnbWVudFRhZ30+XG4gICAgICAgICAgICAgICAgeycgwrcgJ31cbiAgICAgICAgICAgICAgICB7dGFnLmxhYmVsfSB7dGFnLmR1cmF0aW9ufVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApKVxuICAgICAgICAgIDogbnVsbH1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHtsYXlvdXQuaXNIdWdlID8gPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuc3BhblNwYWNlcn0gLz4gOiBudWxsfVxuICAgICAge2xheW91dC5pc0hvdmVyZWQgfHwgbGF5b3V0LndpZHRoID4gMTI4ID8gKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRHVyYXRpb259PntkdXJhdGlvbn08L3NwYW4+XG4gICAgICApIDogbnVsbH1cbiAgICA8Lz5cbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb250ZW50IHByb3BzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBTcGFuQ29udGVudFByb3BzIHtcbiAgbm9kZTogU3Bhbk5vZGU7XG4gIGxheW91dDogU3BhbkxheW91dDtcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBEZWZhdWx0IGNvbnRlbnQgKGdlbmVyaWMgT1RFTCBzcGFucyDigJQgbm8gc2VnbWVudHMpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gRGVmYXVsdENvbnRlbnQoeyBub2RlLCBsYXlvdXQgfTogU3BhbkNvbnRlbnRQcm9wcyk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiA8VGV4dENvbnRlbnQgbm9kZT17bm9kZX0gbGF5b3V0PXtsYXlvdXR9IC8+O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFdvcmtmbG93IGNvbnRlbnQgKHNlZ21lbnRzICsgdGV4dCBmb3Igd29ya2Zsb3cgc3BhbiB0eXBlcylcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBXb3JrZmxvd0NvbnRlbnQoe1xuICByZXNvdXJjZVR5cGUsXG4gIG5vZGUsXG4gIGxheW91dCxcbiAgZHVyYXRpb25Ncyxcbn06IFNwYW5Db250ZW50UHJvcHMgJiB7IHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlIH0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBzcGFuRHVyYXRpb24gPSBkdXJhdGlvbk1zID8/IG5vZGUuZHVyYXRpb247XG4gIGNvbnN0IHsgc2VnbWVudHMgfSA9IGNvbXB1dGVTZWdtZW50cyhyZXNvdXJjZVR5cGUsIG5vZGUpO1xuICBjb25zdCBzZWdtZW50VGFncyA9IGdldFNlZ21lbnRUYWdzKHNlZ21lbnRzLCBzcGFuRHVyYXRpb24pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTZWdtZW50TGF5ZXIgc2VnbWVudHM9e3NlZ21lbnRzfSBzcGFuRHVyYXRpb249e3NwYW5EdXJhdGlvbn0gLz5cbiAgICAgIDxUZXh0Q29udGVudFxuICAgICAgICBkdXJhdGlvbk1zPXtzcGFuRHVyYXRpb259XG4gICAgICAgIG5vZGU9e25vZGV9XG4gICAgICAgIGxheW91dD17bGF5b3V0fVxuICAgICAgICBzZWdtZW50VGFncz17c2VnbWVudFRhZ3N9XG4gICAgICAvPlxuICAgIDwvPlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBlci10eXBlIGNvbnRlbnQgY29tcG9uZW50c1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBSdW5Db250ZW50KHByb3BzOiBTcGFuQ29udGVudFByb3BzKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIDxXb3JrZmxvd0NvbnRlbnQgcmVzb3VyY2VUeXBlPVwicnVuXCIgey4uLnByb3BzfSAvPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFN0ZXBDb250ZW50KHByb3BzOiBTcGFuQ29udGVudFByb3BzKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIDxXb3JrZmxvd0NvbnRlbnQgcmVzb3VyY2VUeXBlPVwic3RlcFwiIHsuLi5wcm9wc30gLz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIb29rQ29udGVudChwcm9wczogU3BhbkNvbnRlbnRQcm9wcyk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiA8V29ya2Zsb3dDb250ZW50IHJlc291cmNlVHlwZT1cImhvb2tcIiB7Li4ucHJvcHN9IC8+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gU2xlZXBDb250ZW50KHByb3BzOiBTcGFuQ29udGVudFByb3BzKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIDxXb3JrZmxvd0NvbnRlbnQgcmVzb3VyY2VUeXBlPVwic2xlZXBcIiB7Li4ucHJvcHN9IC8+O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIERpc3BhdGNoZXJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJldHVybnMgdGhlIGlubmVyIGNvbnRlbnQgZm9yIGEgc3BhbiBiYXNlZCBvbiBpdHMgcmVzb3VyY2UgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNwYW5Db250ZW50KHtcbiAgcmVzb3VyY2VUeXBlLFxuICAuLi5wcm9wc1xufTogU3BhbkNvbnRlbnRQcm9wcyAmIHsgcmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUgfSk6IFJlYWN0Tm9kZSB7XG4gIHN3aXRjaCAocmVzb3VyY2VUeXBlKSB7XG4gICAgY2FzZSAncnVuJzpcbiAgICAgIHJldHVybiA8UnVuQ29udGVudCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgcmV0dXJuIDxTdGVwQ29udGVudCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgJ2hvb2snOlxuICAgICAgcmV0dXJuIDxIb29rQ29udGVudCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgJ3NsZWVwJzpcbiAgICAgIHJldHVybiA8U2xlZXBDb250ZW50IHsuLi5wcm9wc30gLz47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiA8RGVmYXVsdENvbnRlbnQgey4uLnByb3BzfSAvPjtcbiAgfVxufVxuIl19
@@ -1,10 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- export declare const SpanDetailPanelBody: () => import("react/jsx-runtime").JSX.Element | null;
3
- export declare function SpanDetailPanel({ attached, }: {
4
- attached?: boolean;
5
- }): ReactNode;
6
- /**
7
- * Resizer component for the trace viewer panel.
8
- */
9
- export declare function PanelResizer(): ReactNode;
10
- //# sourceMappingURL=span-detail-panel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"span-detail-panel.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-detail-panel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAuB,SAAS,EAAE,MAAM,OAAO,CAAC;AAgH5D,eAAO,MAAM,mBAAmB,sDAoI/B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,QAAgB,GACjB,EAAE;IACD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,SAAS,CAgDZ;AAsRD;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAwExC"}
@@ -1,285 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { clsx } from 'clsx';
4
- import { Fragment, memo, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
5
- import { initialState, useCustomPanelComponent, useTraceViewer, } from '../context';
6
- import styles from '../trace-viewer.module.css';
7
- import { formatDuration } from '../util/timing';
8
- import { getSpanColorClassName } from './node';
9
- import { ButtonLink, IconChevronDown, IconCross, IconExternalSmall, Link, Note, Skeleton, } from './ui';
10
- const percentage = (n) => `${(100 * n).toFixed(3)}%`;
11
- const sortWord = (a, b) => {
12
- if (a < b) {
13
- return -1;
14
- }
15
- else if (a > b) {
16
- return 1;
17
- }
18
- return 0;
19
- };
20
- const getGroupedAttributes = (attributes) => {
21
- // Build groups of items with the same prefix
22
- const groups = {};
23
- for (const [key, value] of Object.entries(attributes)) {
24
- const dotIndex = key.indexOf('.');
25
- let prefix = '';
26
- let suffix = '';
27
- if (dotIndex !== -1) {
28
- prefix = key.substring(0, dotIndex);
29
- suffix = key.substring(dotIndex + 1);
30
- }
31
- else {
32
- suffix = key;
33
- }
34
- let group = groups[prefix];
35
- if (!group) {
36
- group = {
37
- prefix,
38
- attributes: [],
39
- };
40
- groups[prefix] = group;
41
- }
42
- group.attributes.push({
43
- key,
44
- suffix,
45
- value: String(value),
46
- });
47
- }
48
- // List and sort everything
49
- const result = Array.from(Object.values(groups)).sort((a, b) => sortWord(a.prefix, b.prefix));
50
- for (const group of result) {
51
- group.attributes.sort((a, b) => sortWord(a.suffix, b.suffix));
52
- }
53
- return result;
54
- };
55
- // biome-ignore lint/correctness/noUnusedFunctionParameters: ignored using `--suppress`
56
- const getAncestors = (_root, start) => {
57
- const result = [];
58
- if (!start)
59
- return result;
60
- for (let node = start; 'parent' in node; node = node.parent) {
61
- result.unshift(node);
62
- }
63
- return result;
64
- };
65
- export const SpanDetailPanelBody = () => {
66
- const { state: { root, selected, resourceMap, getQuickLinks }, dispatch, } = useTraceViewer();
67
- const ancestors = useMemo(() => getAncestors(root, selected), [root, selected]);
68
- const attributeGroups = useMemo(() => getGroupedAttributes(selected?.span.attributes ?? {}), [selected]);
69
- const resourceAttributeGroups = useMemo(() => {
70
- const resourceName = selected?.span.resource;
71
- if (!resourceName)
72
- return [];
73
- const resourceAttributes = resourceMap[resourceName];
74
- if (!resourceAttributes)
75
- return [];
76
- return getGroupedAttributes(resourceAttributes);
77
- }, [resourceMap, selected]);
78
- if (!selected)
79
- return null;
80
- const { span } = selected;
81
- const isEntrySpan = detectIsEntrySpan(selected);
82
- return (_jsxs(_Fragment, { children: [selected.isVercel ? _jsx(InfraSpanDescription, { node: selected }) : null, selected.isInstrumentationHint ? _jsx(InstrumentationHint, {}) : null, !selected.isInstrumentationHint && ancestors.length ? (_jsx(DetailGroup, { className: styles.ancestorGroup, name: "Location", children: ancestors.map((node) => (_jsxs("button", { className: styles.ancestorNode, onClick: () => dispatch({
83
- type: 'select',
84
- id: node.span.spanId,
85
- }), type: "button", children: [_jsxs("div", { className: styles.ancestorText, children: [_jsx("span", { className: styles.ancestorName, children: node.label || node.span.name }), _jsx("span", { className: styles.ancestorDuration, children: formatDuration(node.duration) })] }), _jsx("span", { "aria-hidden": true, className: styles.ancestorLineContainer, children: _jsx("span", { className: clsx(styles.ancestorLine, getSpanColorClassName(node)), style: {
86
- left: percentage((node.startTime - root.startTime) / root.duration),
87
- width: percentage(node.duration / root.duration),
88
- } }) })] }, `${selected.span.spanId}.${node.span.spanId}`))) })) : null, isEntrySpan ? (_jsx(EntrySpanLinks, { getQuickLinks: getQuickLinks, span: selected.span })) : null, selected.events?.length ? (_jsx(DetailGroup, { name: "Events", children: selected.events.map((event) => (_jsxs(Fragment, { children: [_jsxs("dl", { className: styles.spanDetailPanelAttribute, children: [_jsx("dt", { className: styles.spanDetailPanelAttributeKey, children: event.event.name }), _jsx("dd", { className: styles.spanDetailPanelAttributeValue, children: formatDuration(event.timestamp - root.startTime) })] }), Object.entries(event.event.attributes).map(([key, value]) => (_jsx(DetailLine, { name: `${event.event.name}.${key}`, value: value }, key)))] }, event.key))) })) : null, attributeGroups.length ? (_jsx(DetailGroup, { name: "Attributes", children: attributeGroups.map((group) => (_jsx(Fragment, { children: group.attributes.map(({ key, value }) => (_jsx(DetailLine, { name: key, value: value }, key))) }, group.prefix))) })) : null, resourceAttributeGroups.length ? (_jsx(DetailGroup, { name: "Resource", children: resourceAttributeGroups.map((group) => (_jsx(Fragment, { children: group.attributes.map(({ key, value }) => (_jsx(DetailLine, { name: key, value: value }, key))) }, group.prefix))) })) : null, selected.isInstrumentationHint ? null : (_jsxs(DetailGroup, { name: "Library", children: [_jsx(DetailLine, { name: "name", value: span.library.name }), span.library.version ? (_jsx(DetailLine, { name: "version", value: span.library.version })) : null] }))] }));
89
- };
90
- export function SpanDetailPanel({ attached = false, }) {
91
- const { state: { selected, isMobile }, dispatch, } = useTraceViewer();
92
- const customPanelComponent = useCustomPanelComponent();
93
- if (!selected)
94
- return null;
95
- const { span } = selected;
96
- return (_jsxs("div", { className: clsx(styles.spanDetailPanel, isMobile && styles.mobile), children: [attached && !isMobile ? _jsx(PanelResizer, {}) : null, _jsx("div", { className: styles.spanDetailPanelTop, children: _jsxs("div", { className: styles.spanDetailPanelTopInfo, children: [_jsx("span", { className: styles.spanDetailPanelName, title: span.name, children: span.name }), _jsxs("div", { className: styles.spanDetailPanelCorner, children: [selected.isInstrumentationHint ? null : (_jsx("span", { className: styles.spanDetailPanelDuration, children: formatDuration(selected.duration) })), _jsx("div", { className: styles.spanDetailPanelCloseVerticalRule }), _jsx("button", { "aria-label": "Close Span Details", className: styles.spanDetailPanelClose, onClick: () => dispatch({
97
- type: 'deselect',
98
- }), type: "button", children: _jsx(IconCross, { color: "gray-700", size: 20 }) })] })] }) }), _jsx("div", { className: clsx('flex gap-3', styles.spanDetailPanelBody), children: customPanelComponent || _jsx(SpanDetailPanelBody, {}) })] }));
99
- }
100
- const EXPANDED_STORAGE_KEY_PREFIX = 'vc-trace-span-exp:';
101
- function DetailGroup({ name, className = '', children, }) {
102
- const [isExpanded, setIsExpanded] = useState(() => {
103
- if (!('localStorage' in globalThis))
104
- return true;
105
- return (localStorage.getItem(`${EXPANDED_STORAGE_KEY_PREFIX}${name}`) !== '0');
106
- });
107
- const toggleExpanded = useCallback(() => {
108
- setIsExpanded((x) => {
109
- const willBeExpanded = !x;
110
- localStorage.setItem(`${EXPANDED_STORAGE_KEY_PREFIX}${name}`, String(Number(willBeExpanded)));
111
- return willBeExpanded;
112
- });
113
- }, [name]);
114
- return (_jsxs("div", { className: clsx(styles.detailGroup, isExpanded ? styles.expanded : styles.collapsed, className), children: [_jsxs("button", { className: styles.detailHeading, onClick: toggleExpanded, type: "button", children: [_jsx("span", { children: name }), _jsx(IconChevronDown, {})] }), isExpanded ? children : null] }));
115
- }
116
- const CommonHttpVerbs = new Set([
117
- 'OPTIONS',
118
- 'HEAD',
119
- 'GET',
120
- 'PUT',
121
- 'POST',
122
- 'DELETE',
123
- ]);
124
- const KnownSpans = {
125
- 'Resolve Deployment': `How long it took Vercel's routing layer to retrieve details for the deployment.`,
126
- 'Resolve Cache': `How long it took Vercel's routing layer to check for a cached function invocation.`,
127
- 'Resolve Route': `How long it took Vercel's routing layer to resolve routing rules, including redirects and rewrites.`,
128
- 'Invoke Middleware': `How long it took this middleware to start and run user code.`,
129
- 'Invoke Function': `How long it took this Vercel Function to start and run user code.`,
130
- waitUntil: `How long it took to run user code inside of waitUntil.`,
131
- 'Start VM': `How long it took to start the Virtual Machine which contains the Vercel Function.`,
132
- 'Spawn Node.js': `How long it took the Virtual Machine to start the Node.js runtime.`,
133
- 'Spawn Python': `How long it took the Virtual Machine to start the Python runtime.`,
134
- 'Init User Code': `How long it took to import the user code and run any globally-scoped code.`,
135
- };
136
- const ColdStartSpanNames = new Set([
137
- 'Start VM',
138
- 'Spawn Node.js',
139
- 'Spawn Python',
140
- 'Init User Code',
141
- ]);
142
- const getRegion = (node) => {
143
- if (!node || !('span' in node)) {
144
- return null;
145
- }
146
- const attr = node.span.attributes;
147
- const region = attr['vercel.region'] || attr['vercel.function.region'];
148
- if (region)
149
- return String(region);
150
- return null;
151
- };
152
- const getNote = (node) => {
153
- const { name } = node.span;
154
- const region = getRegion(node);
155
- const parentRegion = getRegion(node.parent);
156
- if (node.span.attributes['vercel.middleware.internal'] === 'true') {
157
- return 'The Vercel Toolbar created this middleware.';
158
- }
159
- else if (ColdStartSpanNames.has(name) ||
160
- (name === 'Invoke Function' &&
161
- node.children.some((x) => ColdStartSpanNames.has(x.span.name)))) {
162
- return 'This function encountered a cold start.';
163
- }
164
- else if (region && parentRegion && region !== parentRegion) {
165
- return 'This request was routed across regions.';
166
- }
167
- return null;
168
- };
169
- const detectIsEntrySpan = (node) => {
170
- if (!node.isVercel)
171
- return false;
172
- const { name } = node.span;
173
- const spaceIndex = name.indexOf(' ');
174
- if (spaceIndex === -1)
175
- return false;
176
- const firstWord = name.substring(0, spaceIndex);
177
- return CommonHttpVerbs.has(firstWord);
178
- };
179
- function InfraSpanDescription({ node }) {
180
- const { name } = node.span;
181
- let description = KnownSpans[name];
182
- if (!description && detectIsEntrySpan(node)) {
183
- description = `How long it took for Vercel to process the request and send the response.`;
184
- }
185
- if (!description)
186
- return null;
187
- const note = getNote(node);
188
- return (_jsx(DetailGroup, { name: "What is this?", children: _jsxs("div", { className: styles.infraSpanDescription, children: [_jsx("span", { children: description }), note ? _jsx(Note, { children: note }) : note] }) }));
189
- }
190
- const EntrySpanLinks = memo(function EntrySpanLinks({ getQuickLinks, span, }) {
191
- const links = getQuickLinks(span);
192
- if (!links.length)
193
- return null;
194
- return (_jsx(DetailGroup, { name: "Links", children: links.map(({ key, value }) => (_jsx(EntrySpanLink, { link: value, name: key }, key))) }));
195
- });
196
- function usePromise(promise) {
197
- const [_, setLatest] = useState({});
198
- const fulfilled = promise.__resolvedValue !== undefined ||
199
- promise.__rejectedValue !== undefined;
200
- useEffect(() => {
201
- if (fulfilled)
202
- return;
203
- promise
204
- .then((value) => {
205
- promise.__resolvedValue = value;
206
- })
207
- .catch((err) => {
208
- promise.__rejectedValue = err;
209
- })
210
- .finally(() => setLatest({}));
211
- }, [promise, fulfilled]);
212
- return promise.__resolvedValue;
213
- }
214
- function EntrySpanLink({ name, link: linkPromise, }) {
215
- const link = usePromise(linkPromise);
216
- return (_jsxs(Link, { as: link ? undefined : 'span', className: clsx(styles.spanDetailPanelAttribute, styles.spanDetailPanelQuickLink), href: link?.href || '', children: [_jsx("span", { className: styles.spanDetailPanelAttributeKey, children: name }), _jsx("span", { className: clsx(styles.spanDetailPanelAttributeValue, styles.spanDetailPanelQuickLinkLabel), children: link ? (_jsxs(_Fragment, { children: [link.label, link.icon || _jsx(IconExternalSmall, { color: "gray-900" })] })) : (_jsxs(_Fragment, { children: [_jsx(Skeleton, { height: 18, width: 32 + name.length * 8 }), _jsx(Skeleton, { height: 18, rounded: true, width: 18 })] })) })] }));
217
- }
218
- function InstrumentationHint() {
219
- return (_jsx(DetailGroup, { name: "What is this?", children: _jsxs("div", { className: styles.infraSpanDescription, children: [_jsx("span", { children: `You can visualize your application's spans alongside Vercel's spans in this viewer.` }), _jsx(ButtonLink, { href: "https://vercel.com/docs/session-tracing#adding-custom-spans", size: "small", target: "_blank", children: "Get Started" })] }) }));
220
- }
221
- function DetailLine({ name, value, }) {
222
- return (_jsxs("dl", { className: styles.spanDetailPanelAttribute, children: [_jsx("dt", { className: styles.spanDetailPanelAttributeKey, children: name }), _jsx("dd", { className: styles.spanDetailPanelAttributeValue, title: String(value), children: String(value) })] }));
223
- }
224
- /**
225
- * Resizer component for the trace viewer panel.
226
- */
227
- export function PanelResizer() {
228
- const { state: { panelWidth }, dispatch, } = useTraceViewer();
229
- const gestureRef = useRef({
230
- start: {
231
- x: 0,
232
- width: panelWidth,
233
- },
234
- x: 0,
235
- width: panelWidth,
236
- isHeld: false,
237
- });
238
- gestureRef.current.width = panelWidth;
239
- const onPointerDown = useCallback((event) => {
240
- if (event.pointerType !== 'mouse')
241
- return;
242
- event.preventDefault();
243
- const g = gestureRef.current;
244
- g.start.x = event.clientX;
245
- g.x = event.clientX;
246
- g.start.width = g.width;
247
- g.isHeld = true;
248
- }, []);
249
- const onDoubleClick = useCallback(() => {
250
- dispatch({
251
- type: 'setPanelWidth',
252
- width: initialState.panelWidth,
253
- });
254
- }, [dispatch]);
255
- useEffect(() => {
256
- let nextFrame = 0;
257
- const onFrame = () => {
258
- const g = gestureRef.current;
259
- const width = g.start.width + g.start.x - g.x;
260
- dispatch({
261
- type: 'setPanelWidth',
262
- width,
263
- });
264
- };
265
- const onPointerMove = (event) => {
266
- if (!gestureRef.current.isHeld)
267
- return;
268
- event.preventDefault();
269
- gestureRef.current.x = event.clientX;
270
- cancelAnimationFrame(nextFrame);
271
- nextFrame = requestAnimationFrame(onFrame);
272
- };
273
- const onPointerUp = () => {
274
- gestureRef.current.isHeld = false;
275
- };
276
- window.addEventListener('pointermove', onPointerMove);
277
- window.addEventListener('pointerup', onPointerUp);
278
- return () => {
279
- window.removeEventListener('pointermove', onPointerMove);
280
- window.removeEventListener('pointerup', onPointerUp);
281
- };
282
- }, [dispatch]);
283
- return (_jsx("div", { "aria-hidden": true, className: styles.spanDetailPanelResizer, onDoubleClick: onDoubleClick, onPointerDown: onPointerDown }));
284
- }
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1kZXRhaWwtcGFuZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90cmFjZS12aWV3ZXIvY29tcG9uZW50cy9zcGFuLWRldGFpbC1wYW5lbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUIsT0FBTyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osV0FBVyxFQUNYLFNBQVMsRUFDVCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFDTCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLGNBQWMsR0FDZixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLE1BQU0sTUFBTSw0QkFBNEIsQ0FBQztBQVNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsSUFBSSxFQUNKLElBQUksRUFDSixRQUFRLEdBQ1QsTUFBTSxNQUFNLENBQUM7QUFFZCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQWFyRSxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQVUsRUFBRTtJQUNoRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNWLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO1NBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakIsT0FBTyxDQUFDLENBQUM7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QUM7UUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQW1CLEVBQVEsRUFBRTtZQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUFFLE9BQU87WUFDdkMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDckMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLEdBQVMsRUFBRTtZQUM3QixVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRWxELE9BQU8sR0FBRyxFQUFFO1lBQ1YsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN6RCxNQUFNLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQUNKLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFZixPQUFPLENBQ0wsbUNBRUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxzQkFBc0IsRUFDeEMsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGFBQWEsR0FDNUIsQ0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHR5cGUgeyBQb2ludGVyRXZlbnRIYW5kbGVyLCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgbWVtbyxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgaW5pdGlhbFN0YXRlLFxuICB1c2VDdXN0b21QYW5lbENvbXBvbmVudCxcbiAgdXNlVHJhY2VWaWV3ZXIsXG59IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuLi90cmFjZS12aWV3ZXIubW9kdWxlLmNzcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEdldFF1aWNrTGlua3MsXG4gIFF1aWNrTGlua1ZhbHVlLFxuICBSb290Tm9kZSxcbiAgU3BhbixcbiAgU3Bhbk5vZGUsXG4gIFRyYWNlTm9kZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb24gfSBmcm9tICcuLi91dGlsL3RpbWluZyc7XG5pbXBvcnQgeyBnZXRTcGFuQ29sb3JDbGFzc05hbWUgfSBmcm9tICcuL25vZGUnO1xuaW1wb3J0IHtcbiAgQnV0dG9uTGluayxcbiAgSWNvbkNoZXZyb25Eb3duLFxuICBJY29uQ3Jvc3MsXG4gIEljb25FeHRlcm5hbFNtYWxsLFxuICBMaW5rLFxuICBOb3RlLFxuICBTa2VsZXRvbixcbn0gZnJvbSAnLi91aSc7XG5cbmNvbnN0IHBlcmNlbnRhZ2UgPSAobjogbnVtYmVyKTogc3RyaW5nID0+IGAkeygxMDAgKiBuKS50b0ZpeGVkKDMpfSVgO1xuXG5pbnRlcmZhY2UgR3JvdXBlZEF0dHJpYnV0ZSB7XG4gIHByZWZpeDogc3RyaW5nO1xuICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVbXTtcbn1cblxuaW50ZXJmYWNlIEF0dHJpYnV0ZSB7XG4gIHN1ZmZpeDogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuY29uc3Qgc29ydFdvcmQgPSAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAoYSA8IGIpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbmNvbnN0IGdldEdyb3VwZWRBdHRyaWJ1dGVzID0gKFxuICBhdHRyaWJ1dGVzOiBTcGFuWydhdHRyaWJ1dGVzJ11cbik6IEdyb3VwZWRBdHRyaWJ1dGVbXSA9PiB7XG4gIC8vIEJ1aWxkIGdyb3VwcyBvZiBpdGVtcyB3aXRoIHRoZSBzYW1lIHByZWZpeFxuICBjb25zdCBncm91cHM6IFJlY29yZDxzdHJpbmcsIEdyb3VwZWRBdHRyaWJ1dGU+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgY29uc3QgZG90SW5kZXggPSBrZXkuaW5kZXhPZignLicpO1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICBsZXQgc3VmZml4ID0gJyc7XG4gICAgaWYgKGRvdEluZGV4ICE9PSAtMSkge1xuICAgICAgcHJlZml4ID0ga2V5LnN1YnN0cmluZygwLCBkb3RJbmRleCk7XG4gICAgICBzdWZmaXggPSBrZXkuc3Vic3RyaW5nKGRvdEluZGV4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1ZmZpeCA9IGtleTtcbiAgICB9XG5cbiAgICBsZXQgZ3JvdXAgPSBncm91cHNbcHJlZml4XTtcbiAgICBpZiAoIWdyb3VwKSB7XG4gICAgICBncm91cCA9IHtcbiAgICAgICAgcHJlZml4LFxuICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgIH07XG4gICAgICBncm91cHNbcHJlZml4XSA9IGdyb3VwO1xuICAgIH1cbiAgICBncm91cC5hdHRyaWJ1dGVzLnB1c2goe1xuICAgICAga2V5LFxuICAgICAgc3VmZml4LFxuICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBMaXN0IGFuZCBzb3J0IGV2ZXJ5dGhpbmdcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkuZnJvbShPYmplY3QudmFsdWVzKGdyb3VwcykpLnNvcnQoKGEsIGIpID0+XG4gICAgc29ydFdvcmQoYS5wcmVmaXgsIGIucHJlZml4KVxuICApO1xuICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlc3VsdCkge1xuICAgIGdyb3VwLmF0dHJpYnV0ZXMuc29ydCgoYSwgYikgPT4gc29ydFdvcmQoYS5zdWZmaXgsIGIuc3VmZml4KSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL25vVW51c2VkRnVuY3Rpb25QYXJhbWV0ZXJzOiBpZ25vcmVkIHVzaW5nIGAtLXN1cHByZXNzYFxuY29uc3QgZ2V0QW5jZXN0b3JzID0gKF9yb290OiBSb290Tm9kZSwgc3RhcnQ6IFNwYW5Ob2RlIHwgbnVsbCk6IFNwYW5Ob2RlW10gPT4ge1xuICBjb25zdCByZXN1bHQ6IFNwYW5Ob2RlW10gPSBbXTtcblxuICBpZiAoIXN0YXJ0KSByZXR1cm4gcmVzdWx0O1xuXG4gIGZvciAobGV0IG5vZGU6IFRyYWNlTm9kZSA9IHN0YXJ0OyAncGFyZW50JyBpbiBub2RlOyBub2RlID0gbm9kZS5wYXJlbnQpIHtcbiAgICByZXN1bHQudW5zaGlmdChub2RlKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgU3BhbkRldGFpbFBhbmVsQm9keSA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIHN0YXRlOiB7IHJvb3QsIHNlbGVjdGVkLCByZXNvdXJjZU1hcCwgZ2V0UXVpY2tMaW5rcyB9LFxuICAgIGRpc3BhdGNoLFxuICB9ID0gdXNlVHJhY2VWaWV3ZXIoKTtcblxuICBjb25zdCBhbmNlc3RvcnMgPSB1c2VNZW1vKFxuICAgICgpID0+IGdldEFuY2VzdG9ycyhyb290LCBzZWxlY3RlZCksXG4gICAgW3Jvb3QsIHNlbGVjdGVkXVxuICApO1xuXG4gIGNvbnN0IGF0dHJpYnV0ZUdyb3VwcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZ2V0R3JvdXBlZEF0dHJpYnV0ZXMoc2VsZWN0ZWQ/LnNwYW4uYXR0cmlidXRlcyA/PyB7fSksXG4gICAgW3NlbGVjdGVkXVxuICApO1xuXG4gIGNvbnN0IHJlc291cmNlQXR0cmlidXRlR3JvdXBzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gc2VsZWN0ZWQ/LnNwYW4ucmVzb3VyY2U7XG4gICAgaWYgKCFyZXNvdXJjZU5hbWUpIHJldHVybiBbXTtcbiAgICBjb25zdCByZXNvdXJjZUF0dHJpYnV0ZXMgPSByZXNvdXJjZU1hcFtyZXNvdXJjZU5hbWVdO1xuICAgIGlmICghcmVzb3VyY2VBdHRyaWJ1dGVzKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGdldEdyb3VwZWRBdHRyaWJ1dGVzKHJlc291cmNlQXR0cmlidXRlcyk7XG4gIH0sIFtyZXNvdXJjZU1hcCwgc2VsZWN0ZWRdKTtcblxuICBpZiAoIXNlbGVjdGVkKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB7IHNwYW4gfSA9IHNlbGVjdGVkO1xuXG4gIGNvbnN0IGlzRW50cnlTcGFuID0gZGV0ZWN0SXNFbnRyeVNwYW4oc2VsZWN0ZWQpO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtzZWxlY3RlZC5pc1ZlcmNlbCA/IDxJbmZyYVNwYW5EZXNjcmlwdGlvbiBub2RlPXtzZWxlY3RlZH0gLz4gOiBudWxsfVxuICAgICAge3NlbGVjdGVkLmlzSW5zdHJ1bWVudGF0aW9uSGludCA/IDxJbnN0cnVtZW50YXRpb25IaW50IC8+IDogbnVsbH1cbiAgICAgIHshc2VsZWN0ZWQuaXNJbnN0cnVtZW50YXRpb25IaW50ICYmIGFuY2VzdG9ycy5sZW5ndGggPyAoXG4gICAgICAgIDxEZXRhaWxHcm91cCBjbGFzc05hbWU9e3N0eWxlcy5hbmNlc3Rvckdyb3VwfSBuYW1lPVwiTG9jYXRpb25cIj5cbiAgICAgICAgICB7YW5jZXN0b3JzLm1hcCgobm9kZSkgPT4gKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5hbmNlc3Rvck5vZGV9XG4gICAgICAgICAgICAgIGtleT17YCR7c2VsZWN0ZWQuc3Bhbi5zcGFuSWR9LiR7bm9kZS5zcGFuLnNwYW5JZH1gfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgICAgaWQ6IG5vZGUuc3Bhbi5zcGFuSWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5hbmNlc3RvclRleHR9PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmFuY2VzdG9yTmFtZX0+XG4gICAgICAgICAgICAgICAgICB7bm9kZS5sYWJlbCB8fCBub2RlLnNwYW4ubmFtZX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuYW5jZXN0b3JEdXJhdGlvbn0+XG4gICAgICAgICAgICAgICAgICB7Zm9ybWF0RHVyYXRpb24obm9kZS5kdXJhdGlvbil9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW4gY2xhc3NOYW1lPXtzdHlsZXMuYW5jZXN0b3JMaW5lQ29udGFpbmVyfT5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYW5jZXN0b3JMaW5lLFxuICAgICAgICAgICAgICAgICAgICBnZXRTcGFuQ29sb3JDbGFzc05hbWUobm9kZSlcbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBwZXJjZW50YWdlKFxuICAgICAgICAgICAgICAgICAgICAgIChub2RlLnN0YXJ0VGltZSAtIHJvb3Quc3RhcnRUaW1lKSAvIHJvb3QuZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHBlcmNlbnRhZ2Uobm9kZS5kdXJhdGlvbiAvIHJvb3QuZHVyYXRpb24pLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9EZXRhaWxHcm91cD5cbiAgICAgICkgOiBudWxsfVxuICAgICAge2lzRW50cnlTcGFuID8gKFxuICAgICAgICA8RW50cnlTcGFuTGlua3MgZ2V0UXVpY2tMaW5rcz17Z2V0UXVpY2tMaW5rc30gc3Bhbj17c2VsZWN0ZWQuc3Bhbn0gLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAge3NlbGVjdGVkLmV2ZW50cz8ubGVuZ3RoID8gKFxuICAgICAgICA8RGV0YWlsR3JvdXAgbmFtZT1cIkV2ZW50c1wiPlxuICAgICAgICAgIHtzZWxlY3RlZC5ldmVudHMubWFwKChldmVudCkgPT4gKFxuICAgICAgICAgICAgPEZyYWdtZW50IGtleT17ZXZlbnQua2V5fT5cbiAgICAgICAgICAgICAgPGRsIGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbEF0dHJpYnV0ZX0+XG4gICAgICAgICAgICAgICAgPGR0IGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbEF0dHJpYnV0ZUtleX0+XG4gICAgICAgICAgICAgICAgICB7ZXZlbnQuZXZlbnQubmFtZX1cbiAgICAgICAgICAgICAgICA8L2R0PlxuICAgICAgICAgICAgICAgIDxkZCBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxBdHRyaWJ1dGVWYWx1ZX0+XG4gICAgICAgICAgICAgICAgICB7Zm9ybWF0RHVyYXRpb24oZXZlbnQudGltZXN0YW1wIC0gcm9vdC5zdGFydFRpbWUpfVxuICAgICAgICAgICAgICAgIDwvZGQ+XG4gICAgICAgICAgICAgIDwvZGw+XG4gICAgICAgICAgICAgIHtPYmplY3QuZW50cmllcyhldmVudC5ldmVudC5hdHRyaWJ1dGVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKFxuICAgICAgICAgICAgICAgIDxEZXRhaWxMaW5lXG4gICAgICAgICAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICAgICAgICAgIG5hbWU9e2Ake2V2ZW50LmV2ZW50Lm5hbWV9LiR7a2V5fWB9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L0RldGFpbEdyb3VwPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7YXR0cmlidXRlR3JvdXBzLmxlbmd0aCA/IChcbiAgICAgICAgPERldGFpbEdyb3VwIG5hbWU9XCJBdHRyaWJ1dGVzXCI+XG4gICAgICAgICAge2F0dHJpYnV0ZUdyb3Vwcy5tYXAoKGdyb3VwKSA9PiAoXG4gICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtncm91cC5wcmVmaXh9PlxuICAgICAgICAgICAgICB7Z3JvdXAuYXR0cmlidXRlcy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiAoXG4gICAgICAgICAgICAgICAgPERldGFpbExpbmUga2V5PXtrZXl9IG5hbWU9e2tleX0gdmFsdWU9e3ZhbHVlfSAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvRGV0YWlsR3JvdXA+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtyZXNvdXJjZUF0dHJpYnV0ZUdyb3Vwcy5sZW5ndGggPyAoXG4gICAgICAgIDxEZXRhaWxHcm91cCBuYW1lPVwiUmVzb3VyY2VcIj5cbiAgICAgICAgICB7cmVzb3VyY2VBdHRyaWJ1dGVHcm91cHMubWFwKChncm91cCkgPT4gKFxuICAgICAgICAgICAgPEZyYWdtZW50IGtleT17Z3JvdXAucHJlZml4fT5cbiAgICAgICAgICAgICAge2dyb3VwLmF0dHJpYnV0ZXMubWFwKCh7IGtleSwgdmFsdWUgfSkgPT4gKFxuICAgICAgICAgICAgICAgIDxEZXRhaWxMaW5lIGtleT17a2V5fSBuYW1lPXtrZXl9IHZhbHVlPXt2YWx1ZX0gLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L0RldGFpbEdyb3VwPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7c2VsZWN0ZWQuaXNJbnN0cnVtZW50YXRpb25IaW50ID8gbnVsbCA6IChcbiAgICAgICAgPERldGFpbEdyb3VwIG5hbWU9XCJMaWJyYXJ5XCI+XG4gICAgICAgICAgPERldGFpbExpbmUgbmFtZT1cIm5hbWVcIiB2YWx1ZT17c3Bhbi5saWJyYXJ5Lm5hbWV9IC8+XG4gICAgICAgICAge3NwYW4ubGlicmFyeS52ZXJzaW9uID8gKFxuICAgICAgICAgICAgPERldGFpbExpbmUgbmFtZT1cInZlcnNpb25cIiB2YWx1ZT17c3Bhbi5saWJyYXJ5LnZlcnNpb259IC8+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvRGV0YWlsR3JvdXA+XG4gICAgICApfVxuICAgIDwvPlxuICApO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNwYW5EZXRhaWxQYW5lbCh7XG4gIGF0dGFjaGVkID0gZmFsc2UsXG59OiB7XG4gIGF0dGFjaGVkPzogYm9vbGVhbjtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCB7XG4gICAgc3RhdGU6IHsgc2VsZWN0ZWQsIGlzTW9iaWxlIH0sXG4gICAgZGlzcGF0Y2gsXG4gIH0gPSB1c2VUcmFjZVZpZXdlcigpO1xuICBjb25zdCBjdXN0b21QYW5lbENvbXBvbmVudCA9IHVzZUN1c3RvbVBhbmVsQ29tcG9uZW50KCk7XG5cbiAgaWYgKCFzZWxlY3RlZCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgeyBzcGFuIH0gPSBzZWxlY3RlZDtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KHN0eWxlcy5zcGFuRGV0YWlsUGFuZWwsIGlzTW9iaWxlICYmIHN0eWxlcy5tb2JpbGUpfT5cbiAgICAgIHthdHRhY2hlZCAmJiAhaXNNb2JpbGUgPyA8UGFuZWxSZXNpemVyIC8+IDogbnVsbH1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsVG9wfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxUb3BJbmZvfT5cbiAgICAgICAgICB7LyogTmFtZS9JRCBmaXJzdCAqL31cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxOYW1lfSB0aXRsZT17c3Bhbi5uYW1lfT5cbiAgICAgICAgICAgIHtzcGFuLm5hbWV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHsvKiBSaWdodCBzaWRlOiBkdXJhdGlvbiBiYWRnZSwgc2VwYXJhdG9yLCBjbG9zZSAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbENvcm5lcn0+XG4gICAgICAgICAgICB7c2VsZWN0ZWQuaXNJbnN0cnVtZW50YXRpb25IaW50ID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsRHVyYXRpb259PlxuICAgICAgICAgICAgICAgIHtmb3JtYXREdXJhdGlvbihzZWxlY3RlZC5kdXJhdGlvbil9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbENsb3NlVmVydGljYWxSdWxlfSAvPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgU3BhbiBEZXRhaWxzXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsQ2xvc2V9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8SWNvbkNyb3NzIGNvbG9yPVwiZ3JheS03MDBcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ2ZsZXggZ2FwLTMnLCBzdHlsZXMuc3BhbkRldGFpbFBhbmVsQm9keSl9PlxuICAgICAgICB7Y3VzdG9tUGFuZWxDb21wb25lbnQgfHwgPFNwYW5EZXRhaWxQYW5lbEJvZHkgLz59XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuY29uc3QgRVhQQU5ERURfU1RPUkFHRV9LRVlfUFJFRklYID0gJ3ZjLXRyYWNlLXNwYW4tZXhwOic7XG5cbmZ1bmN0aW9uIERldGFpbEdyb3VwKHtcbiAgbmFtZSxcbiAgY2xhc3NOYW1lID0gJycsXG4gIGNoaWxkcmVuLFxufToge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBbaXNFeHBhbmRlZCwgc2V0SXNFeHBhbmRlZF0gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgaWYgKCEoJ2xvY2FsU3RvcmFnZScgaW4gZ2xvYmFsVGhpcykpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAoXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgJHtFWFBBTkRFRF9TVE9SQUdFX0tFWV9QUkVGSVh9JHtuYW1lfWApICE9PSAnMCdcbiAgICApO1xuICB9KTtcblxuICBjb25zdCB0b2dnbGVFeHBhbmRlZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRJc0V4cGFuZGVkKCh4KSA9PiB7XG4gICAgICBjb25zdCB3aWxsQmVFeHBhbmRlZCA9ICF4O1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIGAke0VYUEFOREVEX1NUT1JBR0VfS0VZX1BSRUZJWH0ke25hbWV9YCxcbiAgICAgICAgU3RyaW5nKE51bWJlcih3aWxsQmVFeHBhbmRlZCkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHdpbGxCZUV4cGFuZGVkO1xuICAgIH0pO1xuICB9LCBbbmFtZV0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICBzdHlsZXMuZGV0YWlsR3JvdXAsXG4gICAgICAgIGlzRXhwYW5kZWQgPyBzdHlsZXMuZXhwYW5kZWQgOiBzdHlsZXMuY29sbGFwc2VkLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5kZXRhaWxIZWFkaW5nfVxuICAgICAgICBvbkNsaWNrPXt0b2dnbGVFeHBhbmRlZH1cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPntuYW1lfTwvc3Bhbj5cbiAgICAgICAgPEljb25DaGV2cm9uRG93biAvPlxuICAgICAgPC9idXR0b24+XG4gICAgICB7aXNFeHBhbmRlZCA/IGNoaWxkcmVuIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuY29uc3QgQ29tbW9uSHR0cFZlcmJzID0gbmV3IFNldChbXG4gICdPUFRJT05TJyxcbiAgJ0hFQUQnLFxuICAnR0VUJyxcbiAgJ1BVVCcsXG4gICdQT1NUJyxcbiAgJ0RFTEVURScsXG5dKTtcbmNvbnN0IEtub3duU3BhbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdSZXNvbHZlIERlcGxveW1lbnQnOiBgSG93IGxvbmcgaXQgdG9vayBWZXJjZWwncyByb3V0aW5nIGxheWVyIHRvIHJldHJpZXZlIGRldGFpbHMgZm9yIHRoZSBkZXBsb3ltZW50LmAsXG4gICdSZXNvbHZlIENhY2hlJzogYEhvdyBsb25nIGl0IHRvb2sgVmVyY2VsJ3Mgcm91dGluZyBsYXllciB0byBjaGVjayBmb3IgYSBjYWNoZWQgZnVuY3Rpb24gaW52b2NhdGlvbi5gLFxuICAnUmVzb2x2ZSBSb3V0ZSc6IGBIb3cgbG9uZyBpdCB0b29rIFZlcmNlbCdzIHJvdXRpbmcgbGF5ZXIgdG8gcmVzb2x2ZSByb3V0aW5nIHJ1bGVzLCBpbmNsdWRpbmcgcmVkaXJlY3RzIGFuZCByZXdyaXRlcy5gLFxuICAnSW52b2tlIE1pZGRsZXdhcmUnOiBgSG93IGxvbmcgaXQgdG9vayB0aGlzIG1pZGRsZXdhcmUgdG8gc3RhcnQgYW5kIHJ1biB1c2VyIGNvZGUuYCxcbiAgJ0ludm9rZSBGdW5jdGlvbic6IGBIb3cgbG9uZyBpdCB0b29rIHRoaXMgVmVyY2VsIEZ1bmN0aW9uIHRvIHN0YXJ0IGFuZCBydW4gdXNlciBjb2RlLmAsXG4gIHdhaXRVbnRpbDogYEhvdyBsb25nIGl0IHRvb2sgdG8gcnVuIHVzZXIgY29kZSBpbnNpZGUgb2Ygd2FpdFVudGlsLmAsXG4gICdTdGFydCBWTSc6IGBIb3cgbG9uZyBpdCB0b29rIHRvIHN0YXJ0IHRoZSBWaXJ0dWFsIE1hY2hpbmUgd2hpY2ggY29udGFpbnMgdGhlIFZlcmNlbCBGdW5jdGlvbi5gLFxuICAnU3Bhd24gTm9kZS5qcyc6IGBIb3cgbG9uZyBpdCB0b29rIHRoZSBWaXJ0dWFsIE1hY2hpbmUgdG8gc3RhcnQgdGhlIE5vZGUuanMgcnVudGltZS5gLFxuICAnU3Bhd24gUHl0aG9uJzogYEhvdyBsb25nIGl0IHRvb2sgdGhlIFZpcnR1YWwgTWFjaGluZSB0byBzdGFydCB0aGUgUHl0aG9uIHJ1bnRpbWUuYCxcbiAgJ0luaXQgVXNlciBDb2RlJzogYEhvdyBsb25nIGl0IHRvb2sgdG8gaW1wb3J0IHRoZSB1c2VyIGNvZGUgYW5kIHJ1biBhbnkgZ2xvYmFsbHktc2NvcGVkIGNvZGUuYCxcbn07XG5cbmNvbnN0IENvbGRTdGFydFNwYW5OYW1lcyA9IG5ldyBTZXQoW1xuICAnU3RhcnQgVk0nLFxuICAnU3Bhd24gTm9kZS5qcycsXG4gICdTcGF3biBQeXRob24nLFxuICAnSW5pdCBVc2VyIENvZGUnLFxuXSk7XG5cbmNvbnN0IGdldFJlZ2lvbiA9IChcbiAgbm9kZTogU3Bhbk5vZGUgfCBSb290Tm9kZSB8IG51bGwgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IG51bGwgPT4ge1xuICBpZiAoIW5vZGUgfHwgISgnc3BhbicgaW4gbm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGF0dHIgPSBub2RlLnNwYW4uYXR0cmlidXRlcztcbiAgY29uc3QgcmVnaW9uID0gYXR0clsndmVyY2VsLnJlZ2lvbiddIHx8IGF0dHJbJ3ZlcmNlbC5mdW5jdGlvbi5yZWdpb24nXTtcbiAgaWYgKHJlZ2lvbikgcmV0dXJuIFN0cmluZyhyZWdpb24pO1xuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGdldE5vdGUgPSAobm9kZTogU3Bhbk5vZGUpOiBSZWFjdE5vZGUgPT4ge1xuICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuc3BhbjtcbiAgY29uc3QgcmVnaW9uID0gZ2V0UmVnaW9uKG5vZGUpO1xuICBjb25zdCBwYXJlbnRSZWdpb24gPSBnZXRSZWdpb24obm9kZS5wYXJlbnQpO1xuXG4gIGlmIChub2RlLnNwYW4uYXR0cmlidXRlc1sndmVyY2VsLm1pZGRsZXdhcmUuaW50ZXJuYWwnXSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuICdUaGUgVmVyY2VsIFRvb2xiYXIgY3JlYXRlZCB0aGlzIG1pZGRsZXdhcmUuJztcbiAgfSBlbHNlIGlmIChcbiAgICBDb2xkU3RhcnRTcGFuTmFtZXMuaGFzKG5hbWUpIHx8XG4gICAgKG5hbWUgPT09ICdJbnZva2UgRnVuY3Rpb24nICYmXG4gICAgICBub2RlLmNoaWxkcmVuLnNvbWUoKHgpID0+IENvbGRTdGFydFNwYW5OYW1lcy5oYXMoeC5zcGFuLm5hbWUpKSlcbiAgKSB7XG4gICAgcmV0dXJuICdUaGlzIGZ1bmN0aW9uIGVuY291bnRlcmVkIGEgY29sZCBzdGFydC4nO1xuICB9IGVsc2UgaWYgKHJlZ2lvbiAmJiBwYXJlbnRSZWdpb24gJiYgcmVnaW9uICE9PSBwYXJlbnRSZWdpb24pIHtcbiAgICByZXR1cm4gJ1RoaXMgcmVxdWVzdCB3YXMgcm91dGVkIGFjcm9zcyByZWdpb25zLic7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGRldGVjdElzRW50cnlTcGFuID0gKG5vZGU6IFNwYW5Ob2RlKTogYm9vbGVhbiA9PiB7XG4gIGlmICghbm9kZS5pc1ZlcmNlbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuc3BhbjtcbiAgY29uc3Qgc3BhY2VJbmRleCA9IG5hbWUuaW5kZXhPZignICcpO1xuICBpZiAoc3BhY2VJbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZmlyc3RXb3JkID0gbmFtZS5zdWJzdHJpbmcoMCwgc3BhY2VJbmRleCk7XG4gIHJldHVybiBDb21tb25IdHRwVmVyYnMuaGFzKGZpcnN0V29yZCk7XG59O1xuXG5mdW5jdGlvbiBJbmZyYVNwYW5EZXNjcmlwdGlvbih7IG5vZGUgfTogeyBub2RlOiBTcGFuTm9kZSB9KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBuYW1lIH0gPSBub2RlLnNwYW47XG4gIGxldCBkZXNjcmlwdGlvbiA9IEtub3duU3BhbnNbbmFtZV07XG5cbiAgaWYgKCFkZXNjcmlwdGlvbiAmJiBkZXRlY3RJc0VudHJ5U3Bhbihub2RlKSkge1xuICAgIGRlc2NyaXB0aW9uID0gYEhvdyBsb25nIGl0IHRvb2sgZm9yIFZlcmNlbCB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IGFuZCBzZW5kIHRoZSByZXNwb25zZS5gO1xuICB9XG5cbiAgaWYgKCFkZXNjcmlwdGlvbikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3Qgbm90ZSA9IGdldE5vdGUobm9kZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGV0YWlsR3JvdXAgbmFtZT1cIldoYXQgaXMgdGhpcz9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5mcmFTcGFuRGVzY3JpcHRpb259PlxuICAgICAgICA8c3Bhbj57ZGVzY3JpcHRpb259PC9zcGFuPlxuICAgICAgICB7bm90ZSA/IDxOb3RlPntub3RlfTwvTm90ZT4gOiBub3RlfVxuICAgICAgPC9kaXY+XG4gICAgPC9EZXRhaWxHcm91cD5cbiAgKTtcbn1cblxuY29uc3QgRW50cnlTcGFuTGlua3MgPSBtZW1vKGZ1bmN0aW9uIEVudHJ5U3BhbkxpbmtzKHtcbiAgZ2V0UXVpY2tMaW5rcyxcbiAgc3Bhbixcbn06IHtcbiAgZ2V0UXVpY2tMaW5rczogR2V0UXVpY2tMaW5rcztcbiAgc3BhbjogU3Bhbjtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBsaW5rcyA9IGdldFF1aWNrTGlua3Moc3Bhbik7XG5cbiAgaWYgKCFsaW5rcy5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPERldGFpbEdyb3VwIG5hbWU9XCJMaW5rc1wiPlxuICAgICAge2xpbmtzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IChcbiAgICAgICAgPEVudHJ5U3Bhbkxpbmsga2V5PXtrZXl9IGxpbms9e3ZhbHVlfSBuYW1lPXtrZXl9IC8+XG4gICAgICApKX1cbiAgICA8L0RldGFpbEdyb3VwPlxuICApO1xufSk7XG5cbmludGVyZmFjZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4ge1xuICBfX3Jlc29sdmVkVmFsdWU/OiBUO1xuICBfX3JlamVjdGVkVmFsdWU/OiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiB1c2VQcm9taXNlPFQ+KHByb21pc2U6IFJlc29sdmFibGVQcm9taXNlPFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IFtfLCBzZXRMYXRlc3RdID0gdXNlU3RhdGUoe30pO1xuICBjb25zdCBmdWxmaWxsZWQgPVxuICAgIHByb21pc2UuX19yZXNvbHZlZFZhbHVlICE9PSB1bmRlZmluZWQgfHxcbiAgICBwcm9taXNlLl9fcmVqZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChmdWxmaWxsZWQpIHJldHVybjtcblxuICAgIHByb21pc2VcbiAgICAgIC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICBwcm9taXNlLl9fcmVzb2x2ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb21pc2UuX19yZWplY3RlZFZhbHVlID0gZXJyO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHNldExhdGVzdCh7fSkpO1xuICB9LCBbcHJvbWlzZSwgZnVsZmlsbGVkXSk7XG5cbiAgcmV0dXJuIHByb21pc2UuX19yZXNvbHZlZFZhbHVlO1xufVxuXG5mdW5jdGlvbiBFbnRyeVNwYW5MaW5rKHtcbiAgbmFtZSxcbiAgbGluazogbGlua1Byb21pc2UsXG59OiB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGluazogUHJvbWlzZTxRdWlja0xpbmtWYWx1ZT47XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgbGluayA9IHVzZVByb21pc2UobGlua1Byb21pc2UpO1xuXG4gIHJldHVybiAoXG4gICAgPExpbmtcbiAgICAgIGFzPXtsaW5rID8gdW5kZWZpbmVkIDogJ3NwYW4nfVxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICBzdHlsZXMuc3BhbkRldGFpbFBhbmVsQXR0cmlidXRlLFxuICAgICAgICBzdHlsZXMuc3BhbkRldGFpbFBhbmVsUXVpY2tMaW5rXG4gICAgICApfVxuICAgICAgaHJlZj17bGluaz8uaHJlZiB8fCAnJ31cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxBdHRyaWJ1dGVLZXl9PntuYW1lfTwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICBzdHlsZXMuc3BhbkRldGFpbFBhbmVsQXR0cmlidXRlVmFsdWUsXG4gICAgICAgICAgc3R5bGVzLnNwYW5EZXRhaWxQYW5lbFF1aWNrTGlua0xhYmVsXG4gICAgICAgICl9XG4gICAgICA+XG4gICAgICAgIHtsaW5rID8gKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICB7bGluay5sYWJlbH1cbiAgICAgICAgICAgIHtsaW5rLmljb24gfHwgPEljb25FeHRlcm5hbFNtYWxsIGNvbG9yPVwiZ3JheS05MDBcIiAvPn1cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFNrZWxldG9uIGhlaWdodD17MTh9IHdpZHRoPXszMiArIG5hbWUubGVuZ3RoICogOH0gLz5cbiAgICAgICAgICAgIDxTa2VsZXRvbiBoZWlnaHQ9ezE4fSByb3VuZGVkIHdpZHRoPXsxOH0gLz5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L0xpbms+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEluc3RydW1lbnRhdGlvbkhpbnQoKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8RGV0YWlsR3JvdXAgbmFtZT1cIldoYXQgaXMgdGhpcz9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5mcmFTcGFuRGVzY3JpcHRpb259PlxuICAgICAgICA8c3Bhbj57YFlvdSBjYW4gdmlzdWFsaXplIHlvdXIgYXBwbGljYXRpb24ncyBzcGFucyBhbG9uZ3NpZGUgVmVyY2VsJ3Mgc3BhbnMgaW4gdGhpcyB2aWV3ZXIuYH08L3NwYW4+XG4gICAgICAgIDxCdXR0b25MaW5rXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vdmVyY2VsLmNvbS9kb2NzL3Nlc3Npb24tdHJhY2luZyNhZGRpbmctY3VzdG9tLXNwYW5zXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgID5cbiAgICAgICAgICBHZXQgU3RhcnRlZFxuICAgICAgICA8L0J1dHRvbkxpbms+XG4gICAgICA8L2Rpdj5cbiAgICA8L0RldGFpbEdyb3VwPlxuICApO1xufVxuXG5mdW5jdGlvbiBEZXRhaWxMaW5lKHtcbiAgbmFtZSxcbiAgdmFsdWUsXG59OiB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG59KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGwgY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsQXR0cmlidXRlfT5cbiAgICAgIDxkdCBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxBdHRyaWJ1dGVLZXl9PntuYW1lfTwvZHQ+XG4gICAgICA8ZGRcbiAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsQXR0cmlidXRlVmFsdWV9XG4gICAgICAgIHRpdGxlPXtTdHJpbmcodmFsdWUpfVxuICAgICAgPlxuICAgICAgICB7U3RyaW5nKHZhbHVlKX1cbiAgICAgIDwvZGQ+XG4gICAgPC9kbD5cbiAgKTtcbn1cblxuaW50ZXJmYWNlIFJlc2l6ZUdlc3R1cmVSZWYge1xuICBzdGFydDoge1xuICAgIHg6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICB9O1xuICB4OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGlzSGVsZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXNpemVyIGNvbXBvbmVudCBmb3IgdGhlIHRyYWNlIHZpZXdlciBwYW5lbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFBhbmVsUmVzaXplcigpOiBSZWFjdE5vZGUge1xuICBjb25zdCB7XG4gICAgc3RhdGU6IHsgcGFuZWxXaWR0aCB9LFxuICAgIGRpc3BhdGNoLFxuICB9ID0gdXNlVHJhY2VWaWV3ZXIoKTtcbiAgY29uc3QgZ2VzdHVyZVJlZiA9IHVzZVJlZjxSZXNpemVHZXN0dXJlUmVmPih7XG4gICAgc3RhcnQ6IHtcbiAgICAgIHg6IDAsXG4gICAgICB3aWR0aDogcGFuZWxXaWR0aCxcbiAgICB9LFxuICAgIHg6IDAsXG4gICAgd2lkdGg6IHBhbmVsV2lkdGgsXG4gICAgaXNIZWxkOiBmYWxzZSxcbiAgfSk7XG4gIGdlc3R1cmVSZWYuY3VycmVudC53aWR0aCA9IHBhbmVsV2lkdGg7XG5cbiAgY29uc3Qgb25Qb2ludGVyRG93biA9IHVzZUNhbGxiYWNrPFBvaW50ZXJFdmVudEhhbmRsZXI+KChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5wb2ludGVyVHlwZSAhPT0gJ21vdXNlJykgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZyA9IGdlc3R1cmVSZWYuY3VycmVudDtcbiAgICBnLnN0YXJ0LnggPSBldmVudC5jbGllbnRYO1xuICAgIGcueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgZy5zdGFydC53aWR0aCA9IGcud2lkdGg7XG4gICAgZy5pc0hlbGQgPSB0cnVlO1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgb25Eb3VibGVDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnc2V0UGFuZWxXaWR0aCcsXG4gICAgICB3aWR0aDogaW5pdGlhbFN0YXRlLnBhbmVsV2lkdGgsXG4gICAgfSk7XG4gIH0sIFtkaXNwYXRjaF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IG5leHRGcmFtZSA9IDA7XG4gICAgY29uc3Qgb25GcmFtZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGcgPSBnZXN0dXJlUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB3aWR0aCA9IGcuc3RhcnQud2lkdGggKyBnLnN0YXJ0LnggLSBnLng7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6ICdzZXRQYW5lbFdpZHRoJyxcbiAgICAgICAgd2lkdGgsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWdlc3R1cmVSZWYuY3VycmVudC5pc0hlbGQpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBnZXN0dXJlUmVmLmN1cnJlbnQueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShuZXh0RnJhbWUpO1xuICAgICAgbmV4dEZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uRnJhbWUpO1xuICAgIH07XG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSAoKTogdm9pZCA9PiB7XG4gICAgICBnZXN0dXJlUmVmLmN1cnJlbnQuaXNIZWxkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblBvaW50ZXJVcCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25Qb2ludGVyVXApO1xuICAgIH07XG4gIH0sIFtkaXNwYXRjaF0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgYXJpYS1oaWRkZW5cbiAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbFJlc2l6ZXJ9XG4gICAgICBvbkRvdWJsZUNsaWNrPXtvbkRvdWJsZUNsaWNrfVxuICAgICAgb25Qb2ludGVyRG93bj17b25Qb2ludGVyRG93bn1cbiAgICAvPlxuICApO1xufVxuIl19
@@ -1,50 +0,0 @@
1
- import type { SpanNode } from '../types';
2
- import type { ResourceType } from './span-strategies';
3
- /**
4
- * Visual status of a segment within a span bar.
5
- *
6
- * - queued: Waiting to start (hatched pattern)
7
- * - running: Actively executing (solid blue)
8
- * - failed: Attempt that ended in failure (soft red)
9
- * - retrying: Waiting between retry attempts (hatched pattern)
10
- * - succeeded: Final successful attempt (soft green)
11
- * - waiting: Passive waiting, e.g. hook waiting for payload (hatched pattern)
12
- * - sleeping: Sleep in progress (soft amber)
13
- * - received: Hook received a payload (soft blue)
14
- */
15
- export type SegmentStatus = 'queued' | 'running' | 'failed' | 'retrying' | 'succeeded' | 'waiting' | 'sleeping' | 'received';
16
- export interface Segment {
17
- /** Fraction of span width where this segment starts (0–1) */
18
- startFraction: number;
19
- /** Fraction of span width where this segment ends (0–1) */
20
- endFraction: number;
21
- /** Visual status controlling color/pattern */
22
- status: SegmentStatus;
23
- }
24
- /**
25
- * A boundary between two segments, representing an event that caused
26
- * a transition. Rendered as a hoverable divider with a tooltip.
27
- */
28
- export interface SegmentBoundary {
29
- /** Fractional position along the span (0–1) */
30
- fraction: number;
31
- /** Display label for the tooltip (e.g. "step_started") */
32
- label: string;
33
- /** Formatted timestamp relative to span start */
34
- offsetMs: number;
35
- }
36
- /**
37
- * Maps a SegmentStatus to the CSS module class name to use.
38
- * These class names must exist in trace-viewer.module.css.
39
- */
40
- export declare const SEGMENT_CLASS_MAP: Record<SegmentStatus, string>;
41
- export interface SegmentResult {
42
- segments: Segment[];
43
- boundaries: SegmentBoundary[];
44
- }
45
- /**
46
- * Compute the event-based segments and boundaries for a span based on its resource type.
47
- * Returns empty arrays for 'default' (generic OTEL) spans.
48
- */
49
- export declare function computeSegments(resourceType: ResourceType, node: SpanNode): SegmentResult;
50
- //# sourceMappingURL=span-segments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"span-segments.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-segments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMtD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,UAAU,GACV,WAAW,GACX,SAAS,GACT,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,WAAW,OAAO;IACtB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAS3D,CAAC;AA8ZF,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AA0DD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,QAAQ,GACb,aAAa,CAkCf"}