@tolle_/tolle-ui 18.2.29 → 18.3.0

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 (294) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +5 -11
  2. package/esm2022/lib/accordion.component.mjs +4 -9
  3. package/esm2022/lib/alert-dialog-dynamic.component.mjs +12 -12
  4. package/esm2022/lib/alert-dialog.component.mjs +82 -64
  5. package/esm2022/lib/alert-dialog.service.mjs +38 -6
  6. package/esm2022/lib/alert.component.mjs +5 -11
  7. package/esm2022/lib/aspect-ratio.component.mjs +119 -0
  8. package/esm2022/lib/attachment.component.mjs +334 -0
  9. package/esm2022/lib/avatar-fallback.component.mjs +3 -3
  10. package/esm2022/lib/avatar.component.mjs +4 -9
  11. package/esm2022/lib/badge.component.mjs +4 -9
  12. package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
  13. package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
  14. package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
  15. package/esm2022/lib/breadcrumb.component.mjs +3 -3
  16. package/esm2022/lib/bubble.component.mjs +301 -0
  17. package/esm2022/lib/button.component.mjs +5 -11
  18. package/esm2022/lib/calendar.component.mjs +5 -11
  19. package/esm2022/lib/card.component.mjs +14 -43
  20. package/esm2022/lib/carousel/carousel.component.mjs +5 -12
  21. package/esm2022/lib/chain-of-thought.component.mjs +380 -0
  22. package/esm2022/lib/chart-pie.component.mjs +386 -0
  23. package/esm2022/lib/chart.component.mjs +1146 -0
  24. package/esm2022/lib/chart.service.mjs +555 -0
  25. package/esm2022/lib/checkbox.component.mjs +5 -11
  26. package/esm2022/lib/checkpoint.component.mjs +134 -0
  27. package/esm2022/lib/collapsible.component.mjs +4 -11
  28. package/esm2022/lib/combobox.component.mjs +372 -0
  29. package/esm2022/lib/command-dialog.component.mjs +164 -0
  30. package/esm2022/lib/command.component.mjs +514 -0
  31. package/esm2022/lib/command.service.mjs +130 -0
  32. package/esm2022/lib/confirmation.component.mjs +219 -0
  33. package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
  34. package/esm2022/lib/context-menu.component.mjs +460 -0
  35. package/esm2022/lib/context-menu.service.mjs +125 -0
  36. package/esm2022/lib/context.component.mjs +377 -0
  37. package/esm2022/lib/conversation.component.mjs +442 -0
  38. package/esm2022/lib/country-selector.component.mjs +5 -11
  39. package/esm2022/lib/data-table.component.mjs +59 -12
  40. package/esm2022/lib/date-picker.component.mjs +251 -198
  41. package/esm2022/lib/date-range-picker.component.mjs +224 -116
  42. package/esm2022/lib/date-time-picker.component.mjs +506 -0
  43. package/esm2022/lib/direction.component.mjs +79 -0
  44. package/esm2022/lib/dropdown-item.component.mjs +3 -3
  45. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  46. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  47. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  48. package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
  49. package/esm2022/lib/empty-state.component.mjs +4 -9
  50. package/esm2022/lib/field.component.mjs +394 -0
  51. package/esm2022/lib/hover-card.component.mjs +6 -16
  52. package/esm2022/lib/inline-citation.component.mjs +263 -0
  53. package/esm2022/lib/input-group.component.mjs +418 -0
  54. package/esm2022/lib/input.component.mjs +5 -11
  55. package/esm2022/lib/item.component.mjs +243 -0
  56. package/esm2022/lib/kbd.component.mjs +82 -0
  57. package/esm2022/lib/label.component.mjs +4 -9
  58. package/esm2022/lib/marker.component.mjs +135 -0
  59. package/esm2022/lib/masked-input.component.mjs +5 -11
  60. package/esm2022/lib/menubar.component.mjs +683 -0
  61. package/esm2022/lib/message-scroller.component.mjs +353 -0
  62. package/esm2022/lib/message-scroller.service.mjs +157 -0
  63. package/esm2022/lib/message.component.mjs +228 -0
  64. package/esm2022/lib/modal-ref.mjs +36 -7
  65. package/esm2022/lib/modal.component.mjs +42 -28
  66. package/esm2022/lib/modal.mjs +2 -29
  67. package/esm2022/lib/modal.service.mjs +26 -4
  68. package/esm2022/lib/model-selector.component.mjs +310 -0
  69. package/esm2022/lib/multi-select.component.mjs +155 -72
  70. package/esm2022/lib/native-select.component.mjs +201 -0
  71. package/esm2022/lib/navigation-menu.component.mjs +642 -0
  72. package/esm2022/lib/otp-group.component.mjs +3 -3
  73. package/esm2022/lib/otp-slot.component.mjs +4 -9
  74. package/esm2022/lib/otp.component.mjs +5 -11
  75. package/esm2022/lib/pagination.component.mjs +7 -10
  76. package/esm2022/lib/plan.component.mjs +335 -0
  77. package/esm2022/lib/popover-content.component.mjs +4 -9
  78. package/esm2022/lib/popover.component.mjs +15 -13
  79. package/esm2022/lib/progress.component.mjs +4 -9
  80. package/esm2022/lib/prompt-input.component.mjs +526 -0
  81. package/esm2022/lib/queue.component.mjs +280 -0
  82. package/esm2022/lib/radio-group.component.mjs +6 -13
  83. package/esm2022/lib/radio-item.component.mjs +4 -9
  84. package/esm2022/lib/range-calendar.component.mjs +5 -11
  85. package/esm2022/lib/reasoning.component.mjs +335 -0
  86. package/esm2022/lib/resizable-panel.component.mjs +5 -5
  87. package/esm2022/lib/resizable.component.mjs +219 -0
  88. package/esm2022/lib/segment.component.mjs +19 -9
  89. package/esm2022/lib/select-group.component.mjs +4 -8
  90. package/esm2022/lib/select-item.component.mjs +4 -9
  91. package/esm2022/lib/select-separator.component.mjs +4 -8
  92. package/esm2022/lib/select.component.mjs +133 -49
  93. package/esm2022/lib/separator.component.mjs +4 -9
  94. package/esm2022/lib/sheet.component.mjs +38 -56
  95. package/esm2022/lib/shimmer.component.mjs +84 -0
  96. package/esm2022/lib/sidebar.component.mjs +11 -1
  97. package/esm2022/lib/skeleton.component.mjs +4 -9
  98. package/esm2022/lib/sources.component.mjs +452 -0
  99. package/esm2022/lib/spinner.component.mjs +68 -0
  100. package/esm2022/lib/suggestion.component.mjs +207 -0
  101. package/esm2022/lib/switch.component.mjs +5 -11
  102. package/esm2022/lib/table.component.mjs +213 -0
  103. package/esm2022/lib/tabs.component.mjs +4 -11
  104. package/esm2022/lib/tag-input.component.mjs +5 -11
  105. package/esm2022/lib/task.component.mjs +359 -0
  106. package/esm2022/lib/textarea.component.mjs +5 -11
  107. package/esm2022/lib/theme.service.mjs +17 -6
  108. package/esm2022/lib/time-picker.component.mjs +923 -0
  109. package/esm2022/lib/toast.service.mjs +3 -2
  110. package/esm2022/lib/toaster.component.mjs +76 -39
  111. package/esm2022/lib/toggle-group.component.mjs +4 -9
  112. package/esm2022/lib/toggle.component.mjs +5 -11
  113. package/esm2022/lib/tool.component.mjs +462 -0
  114. package/esm2022/lib/typography.component.mjs +83 -0
  115. package/esm2022/lib/utils/color.mjs +140 -19
  116. package/esm2022/public-api.mjs +61 -1
  117. package/fesm2022/tolle-ui.mjs +16642 -1105
  118. package/fesm2022/tolle-ui.mjs.map +1 -1
  119. package/lib/alert-dialog-dynamic.component.d.ts +5 -0
  120. package/lib/alert-dialog.component.d.ts +23 -2
  121. package/lib/aspect-ratio.component.d.ts +20 -0
  122. package/lib/attachment.component.d.ts +101 -0
  123. package/lib/bubble.component.d.ts +112 -0
  124. package/lib/chain-of-thought.component.d.ts +166 -0
  125. package/lib/chart-pie.component.d.ts +108 -0
  126. package/lib/chart.component.d.ts +369 -0
  127. package/lib/chart.service.d.ts +222 -0
  128. package/lib/checkpoint.component.d.ts +51 -0
  129. package/lib/combobox.component.d.ts +90 -0
  130. package/lib/command-dialog.component.d.ts +53 -0
  131. package/lib/command.component.d.ts +189 -0
  132. package/lib/command.service.d.ts +67 -0
  133. package/lib/confirmation.component.d.ts +70 -0
  134. package/lib/context-menu-trigger.directive.d.ts +12 -0
  135. package/lib/context-menu.component.d.ts +41 -0
  136. package/lib/context-menu.service.d.ts +38 -0
  137. package/lib/context.component.d.ts +134 -0
  138. package/lib/conversation.component.d.ts +165 -0
  139. package/lib/data-table.component.d.ts +26 -1
  140. package/lib/date-picker.component.d.ts +72 -11
  141. package/lib/date-range-picker.component.d.ts +63 -6
  142. package/lib/date-time-picker.component.d.ts +119 -0
  143. package/lib/direction.component.d.ts +45 -0
  144. package/lib/field.component.d.ts +201 -0
  145. package/lib/inline-citation.component.d.ts +103 -0
  146. package/lib/input-group.component.d.ts +150 -0
  147. package/lib/item.component.d.ts +154 -0
  148. package/lib/kbd.component.d.ts +50 -0
  149. package/lib/marker.component.d.ts +58 -0
  150. package/lib/menubar.component.d.ts +247 -0
  151. package/lib/message-scroller.component.d.ts +159 -0
  152. package/lib/message-scroller.service.d.ts +73 -0
  153. package/lib/message.component.d.ts +128 -0
  154. package/lib/modal-ref.d.ts +6 -1
  155. package/lib/modal.component.d.ts +7 -4
  156. package/lib/modal.d.ts +9 -3
  157. package/lib/model-selector.component.d.ts +103 -0
  158. package/lib/multi-select.component.d.ts +66 -14
  159. package/lib/native-select.component.d.ts +57 -0
  160. package/lib/navigation-menu.component.d.ts +230 -0
  161. package/lib/plan.component.d.ts +120 -0
  162. package/lib/popover.component.d.ts +1 -0
  163. package/lib/prompt-input.component.d.ts +194 -0
  164. package/lib/queue.component.d.ts +106 -0
  165. package/lib/reasoning.component.d.ts +127 -0
  166. package/lib/resizable.component.d.ts +43 -0
  167. package/lib/segment.component.d.ts +13 -3
  168. package/lib/select.component.d.ts +37 -5
  169. package/lib/sheet.component.d.ts +3 -0
  170. package/lib/shimmer.component.d.ts +38 -0
  171. package/lib/sidebar.component.d.ts +2 -0
  172. package/lib/sources.component.d.ts +156 -0
  173. package/lib/spinner.component.d.ts +29 -0
  174. package/lib/suggestion.component.d.ts +96 -0
  175. package/lib/table.component.d.ts +106 -0
  176. package/lib/task.component.d.ts +151 -0
  177. package/lib/theme.service.d.ts +9 -0
  178. package/lib/time-picker.component.d.ts +243 -0
  179. package/lib/toast.service.d.ts +3 -1
  180. package/lib/toaster.component.d.ts +26 -9
  181. package/lib/tool.component.d.ts +158 -0
  182. package/lib/typography.component.d.ts +32 -0
  183. package/lib/utils/color.d.ts +19 -5
  184. package/package.json +3 -2
  185. package/preset.js +7 -1
  186. package/public-api.d.ts +50 -0
  187. package/registry/docs-content.json +8480 -1542
  188. package/registry/llms-full.txt +2679 -319
  189. package/registry/llms.txt +43 -4
  190. package/registry/manifest.json +9090 -1742
  191. package/registry/r/accordion-item.json +1 -1
  192. package/registry/r/accordion.json +1 -1
  193. package/registry/r/alert-dialog-dynamic.json +1 -1
  194. package/registry/r/alert-dialog.json +1 -1
  195. package/registry/r/alert.json +1 -1
  196. package/registry/r/attachment.json +23 -0
  197. package/registry/r/avatar-fallback.json +1 -1
  198. package/registry/r/avatar.json +1 -1
  199. package/registry/r/badge.json +1 -1
  200. package/registry/r/breadcrumb-item.json +1 -1
  201. package/registry/r/breadcrumb-link.json +1 -1
  202. package/registry/r/breadcrumb-separator.json +1 -1
  203. package/registry/r/breadcrumb.json +1 -1
  204. package/registry/r/bubble.json +23 -0
  205. package/registry/r/button.json +1 -1
  206. package/registry/r/calendar.json +1 -1
  207. package/registry/r/card.json +1 -1
  208. package/registry/r/carousel.json +1 -1
  209. package/registry/r/chain-of-thought.json +23 -0
  210. package/registry/r/chart-pie.json +30 -0
  211. package/registry/r/chart.json +28 -0
  212. package/registry/r/checkbox.json +1 -1
  213. package/registry/r/checkpoint.json +23 -0
  214. package/registry/r/collapsible.json +1 -1
  215. package/registry/r/combobox.json +31 -0
  216. package/registry/r/command-dialog.json +21 -0
  217. package/registry/r/command.json +26 -0
  218. package/registry/r/confirmation.json +23 -0
  219. package/registry/r/context-menu-trigger.json +1 -1
  220. package/registry/r/context-menu.json +1 -1
  221. package/registry/r/context.json +26 -0
  222. package/registry/r/conversation.json +23 -0
  223. package/registry/r/country-selector.json +1 -1
  224. package/registry/r/data-table.json +1 -1
  225. package/registry/r/date-picker.json +4 -4
  226. package/registry/r/date-range-picker.json +3 -3
  227. package/registry/r/date-time-picker.json +28 -0
  228. package/registry/r/direction.json +16 -0
  229. package/registry/r/dropdown-item.json +1 -1
  230. package/registry/r/dropdown-label.json +1 -1
  231. package/registry/r/dropdown-menu.json +1 -1
  232. package/registry/r/dropdown-separator.json +1 -1
  233. package/registry/r/dropdown-trigger.json +1 -1
  234. package/registry/r/empty-state.json +1 -1
  235. package/registry/r/field.json +23 -0
  236. package/registry/r/hover-card.json +1 -1
  237. package/registry/r/inline-citation.json +26 -0
  238. package/registry/r/input-group.json +23 -0
  239. package/registry/r/input.json +1 -1
  240. package/registry/r/item.json +23 -0
  241. package/registry/r/kbd.json +23 -0
  242. package/registry/r/label.json +1 -1
  243. package/registry/r/marker.json +23 -0
  244. package/registry/r/masked-input.json +1 -1
  245. package/registry/r/menubar.json +24 -0
  246. package/registry/r/message-scroller.json +26 -0
  247. package/registry/r/message.json +23 -0
  248. package/registry/r/modal.json +3 -3
  249. package/registry/r/model-selector.json +32 -0
  250. package/registry/r/multi-select.json +2 -2
  251. package/registry/r/native-select.json +23 -0
  252. package/registry/r/navigation-menu.json +24 -0
  253. package/registry/r/otp-group.json +1 -1
  254. package/registry/r/otp-slot.json +1 -1
  255. package/registry/r/otp.json +1 -1
  256. package/registry/r/pagination.json +3 -2
  257. package/registry/r/plan.json +23 -0
  258. package/registry/r/popover-content.json +1 -1
  259. package/registry/r/popover.json +1 -1
  260. package/registry/r/progress.json +1 -1
  261. package/registry/r/prompt-input.json +23 -0
  262. package/registry/r/queue.json +23 -0
  263. package/registry/r/radio-group.json +1 -1
  264. package/registry/r/radio-item.json +1 -1
  265. package/registry/r/range-calendar.json +1 -1
  266. package/registry/r/reasoning.json +23 -0
  267. package/registry/r/resizable-panel.json +1 -1
  268. package/registry/r/segment.json +1 -1
  269. package/registry/r/select-group.json +1 -1
  270. package/registry/r/select-item.json +1 -1
  271. package/registry/r/select-separator.json +1 -1
  272. package/registry/r/select.json +4 -3
  273. package/registry/r/separator.json +1 -1
  274. package/registry/r/sheet.json +1 -1
  275. package/registry/r/shimmer.json +23 -0
  276. package/registry/r/sidebar.json +1 -1
  277. package/registry/r/skeleton.json +1 -1
  278. package/registry/r/sources.json +23 -0
  279. package/registry/r/spinner.json +23 -0
  280. package/registry/r/suggestion.json +23 -0
  281. package/registry/r/switch.json +1 -1
  282. package/registry/r/table.json +21 -0
  283. package/registry/r/tabs.json +1 -1
  284. package/registry/r/tag-input.json +1 -1
  285. package/registry/r/task.json +23 -0
  286. package/registry/r/textarea.json +1 -1
  287. package/registry/r/time-picker.json +24 -0
  288. package/registry/r/toaster.json +2 -2
  289. package/registry/r/toggle-group.json +1 -1
  290. package/registry/r/toggle.json +1 -1
  291. package/registry/r/tool.json +23 -0
  292. package/registry/r/typography.json +23 -0
  293. package/registry/registry.json +915 -22
  294. package/theme.css +121 -8
@@ -0,0 +1,683 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Injectable, Input, Output, ViewChild, inject } from '@angular/core';
2
+ import { BehaviorSubject, Subscription } from 'rxjs';
3
+ import { computePosition, flip, shift, offset, autoUpdate } from '@floating-ui/dom';
4
+ import { cva } from 'class-variance-authority';
5
+ import { cn } from './utils/cn';
6
+ import * as i0 from "@angular/core";
7
+ let menubarMenuCounter = 0;
8
+ /**
9
+ * Coordinates the menus of a single `tolle-menubar`. Provided by
10
+ * `MenubarComponent`, injected by every descendant menu/trigger/content.
11
+ *
12
+ * The defining behaviour of a menu bar lives here: once *any* menu is open,
13
+ * hovering a different trigger switches to it immediately (`hoverEnter`), while
14
+ * hovering with everything closed does nothing.
15
+ */
16
+ export class MenubarService {
17
+ openIdSource = new BehaviorSubject(null);
18
+ /** Emits the id of the currently open menu, or `null` when all are closed. */
19
+ openId$ = this.openIdSource.asObservable();
20
+ sizeSource = new BehaviorSubject('default');
21
+ /**
22
+ * Emits the bar's size so OnPush triggers re-render when it changes. Reading
23
+ * the parent component's property directly would not mark them dirty.
24
+ */
25
+ size$ = this.sizeSource.asObservable();
26
+ /** The bar's current size scale. */
27
+ get size() {
28
+ return this.sizeSource.value;
29
+ }
30
+ setSize(size) {
31
+ if (this.sizeSource.value !== size)
32
+ this.sizeSource.next(size);
33
+ }
34
+ /** Registered menus in DOM (registration) order. */
35
+ menus = [];
36
+ /** Id of the open menu, or `null`. */
37
+ get openId() {
38
+ return this.openIdSource.value;
39
+ }
40
+ /** True while one of the bar's menus is open. */
41
+ get isAnyOpen() {
42
+ return this.openIdSource.value !== null;
43
+ }
44
+ register(menu) {
45
+ if (this.menus.indexOf(menu) === -1)
46
+ this.menus.push(menu);
47
+ }
48
+ unregister(menu) {
49
+ const i = this.menus.indexOf(menu);
50
+ if (i > -1)
51
+ this.menus.splice(i, 1);
52
+ if (this.openId === menu.id)
53
+ this.close();
54
+ }
55
+ isOpen(id) {
56
+ return this.openId === id;
57
+ }
58
+ open(id) {
59
+ if (this.openId !== id)
60
+ this.openIdSource.next(id);
61
+ }
62
+ close() {
63
+ if (this.openId !== null)
64
+ this.openIdSource.next(null);
65
+ }
66
+ toggle(id) {
67
+ if (this.openId === id)
68
+ this.close();
69
+ else
70
+ this.open(id);
71
+ }
72
+ /**
73
+ * Pointer entered a trigger. Only switches menus when the bar is already
74
+ * "active" (something open) — this is what makes a menu bar feel native.
75
+ */
76
+ hoverEnter(id) {
77
+ if (this.isAnyOpen)
78
+ this.open(id);
79
+ }
80
+ /** Moves focus to the previous/next menu, keeping the open state. */
81
+ moveMenu(delta) {
82
+ if (!this.menus.length)
83
+ return;
84
+ const current = this.menus.findIndex(m => m.id === this.openId);
85
+ const from = current > -1 ? current : this.indexOfFocusedTrigger();
86
+ const next = from < 0
87
+ ? delta > 0
88
+ ? 0
89
+ : this.menus.length - 1
90
+ : (from + delta + this.menus.length) % this.menus.length;
91
+ const target = this.menus[next];
92
+ if (this.isAnyOpen)
93
+ this.open(target.id);
94
+ target.triggerElement?.focus();
95
+ }
96
+ /** Moves focus between the enabled items of the currently open menu. */
97
+ moveItem(delta) {
98
+ const items = this.openItems();
99
+ if (!items.length)
100
+ return;
101
+ const current = items.indexOf(document.activeElement);
102
+ const next = current < 0
103
+ ? delta > 0
104
+ ? 0
105
+ : items.length - 1
106
+ : (current + delta + items.length) % items.length;
107
+ items[next].focus();
108
+ }
109
+ /** Focuses the trigger of the given menu (used when Escape closes a menu). */
110
+ focusTrigger(id) {
111
+ this.menus.find(m => m.id === id)?.triggerElement?.focus();
112
+ }
113
+ openItems() {
114
+ const content = this.menus.find(m => m.id === this.openId)?.contentElement;
115
+ if (!content)
116
+ return [];
117
+ return Array.from(content.querySelectorAll('[role="menuitem"]:not([data-disabled])'));
118
+ }
119
+ indexOfFocusedTrigger() {
120
+ const active = document.activeElement;
121
+ return this.menus.findIndex(m => !!m.triggerElement && m.triggerElement === active);
122
+ }
123
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
124
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarService });
125
+ }
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarService, decorators: [{
127
+ type: Injectable
128
+ }] });
129
+ const menubarVariants = cva('flex items-center gap-1 rounded-md border border-border bg-background shadow-sm', {
130
+ variants: {
131
+ size: {
132
+ sm: 'h-8 p-0.5',
133
+ default: 'h-10 p-1',
134
+ lg: 'h-12 p-1.5',
135
+ },
136
+ },
137
+ defaultVariants: {
138
+ size: 'default',
139
+ },
140
+ });
141
+ const menubarTriggerVariants = cva('flex select-none items-center rounded-sm font-medium outline-none transition-colors ' +
142
+ 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground ' +
143
+ 'data-[state=open]:bg-accent data-[state=open]:text-accent-foreground ' +
144
+ 'disabled:pointer-events-none disabled:opacity-50', {
145
+ variants: {
146
+ size: {
147
+ sm: 'h-7 px-2 text-xs',
148
+ default: 'h-8 px-3 text-sm',
149
+ lg: 'h-9 px-4 text-sm',
150
+ },
151
+ },
152
+ defaultVariants: {
153
+ size: 'default',
154
+ },
155
+ });
156
+ const menubarItemVariants = cva('relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors ' +
157
+ 'focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground ' +
158
+ 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50', {
159
+ variants: {
160
+ variant: {
161
+ default: 'text-popover-foreground',
162
+ destructive: 'text-destructive focus:bg-destructive/10 hover:bg-destructive/10',
163
+ },
164
+ inset: {
165
+ true: 'pl-8',
166
+ false: '',
167
+ },
168
+ },
169
+ defaultVariants: {
170
+ variant: 'default',
171
+ inset: false,
172
+ },
173
+ });
174
+ /**
175
+ * Desktop-application style menu bar.
176
+ *
177
+ * ```html
178
+ * <tolle-menubar>
179
+ * <tolle-menubar-menu>
180
+ * <tolle-menubar-trigger>File</tolle-menubar-trigger>
181
+ * <tolle-menubar-content>
182
+ * <tolle-menubar-label>Document</tolle-menubar-label>
183
+ * <tolle-menubar-item (select)="onNew()">New</tolle-menubar-item>
184
+ * <tolle-menubar-separator />
185
+ * <tolle-menubar-item variant="destructive">Delete</tolle-menubar-item>
186
+ * </tolle-menubar-content>
187
+ * </tolle-menubar-menu>
188
+ * </tolle-menubar>
189
+ * ```
190
+ * @new
191
+ */
192
+ export class MenubarComponent {
193
+ /** Height/padding scale, inherited by every trigger in the bar. @default 'default' */
194
+ size = 'default';
195
+ /** Extra Tailwind classes merged onto the bar via `cn()` (last-wins). */
196
+ class = '';
197
+ /** Emitted with the id of the menu that opened, or `null` when the bar closes. */
198
+ openChange = new EventEmitter();
199
+ service = inject(MenubarService);
200
+ host = inject(ElementRef);
201
+ sub = new Subscription();
202
+ listening = false;
203
+ get computedClass() {
204
+ return cn(menubarVariants({ size: this.size }), this.class);
205
+ }
206
+ ngOnChanges() {
207
+ // Push size into the service so OnPush triggers get told about it.
208
+ this.service.setSize(this.size ?? 'default');
209
+ }
210
+ ngOnInit() {
211
+ this.service.setSize(this.size ?? 'default');
212
+ this.sub.add(this.service.openId$.subscribe(id => {
213
+ this.openChange.emit(id);
214
+ if (id !== null)
215
+ this.startListening();
216
+ else
217
+ this.stopListening();
218
+ }));
219
+ }
220
+ onKeydown(event) {
221
+ switch (event.key) {
222
+ case 'ArrowRight':
223
+ event.preventDefault();
224
+ this.service.moveMenu(1);
225
+ break;
226
+ case 'ArrowLeft':
227
+ event.preventDefault();
228
+ this.service.moveMenu(-1);
229
+ break;
230
+ case 'ArrowDown':
231
+ if (!this.service.isAnyOpen)
232
+ break;
233
+ event.preventDefault();
234
+ this.service.moveItem(1);
235
+ break;
236
+ case 'ArrowUp':
237
+ if (!this.service.isAnyOpen)
238
+ break;
239
+ event.preventDefault();
240
+ this.service.moveItem(-1);
241
+ break;
242
+ case 'Escape': {
243
+ const openId = this.service.openId;
244
+ if (openId === null)
245
+ break;
246
+ event.preventDefault();
247
+ this.service.close();
248
+ this.service.focusTrigger(openId);
249
+ break;
250
+ }
251
+ default:
252
+ break;
253
+ }
254
+ }
255
+ // Capture phase so nested containers that stopPropagation() on their root
256
+ // (modal, sheet) cannot prevent the outside click from reaching us.
257
+ outsideClick = (event) => {
258
+ if (!this.host.nativeElement.contains(event.target))
259
+ this.service.close();
260
+ };
261
+ startListening() {
262
+ if (this.listening)
263
+ return;
264
+ this.listening = true;
265
+ document.addEventListener('pointerdown', this.outsideClick, true);
266
+ }
267
+ stopListening() {
268
+ if (!this.listening)
269
+ return;
270
+ this.listening = false;
271
+ document.removeEventListener('pointerdown', this.outsideClick, true);
272
+ }
273
+ ngOnDestroy() {
274
+ this.sub.unsubscribe();
275
+ this.stopListening();
276
+ }
277
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
278
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarComponent, isStandalone: true, selector: "tolle-menubar", inputs: { size: "size", class: "class" }, outputs: { openChange: "openChange" }, host: { attributes: { "role": "menubar" }, listeners: { "keydown": "onKeydown($event)" }, properties: { "class": "computedClass" } }, providers: [MenubarService], usesOnChanges: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
279
+ }
280
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarComponent, decorators: [{
281
+ type: Component,
282
+ args: [{
283
+ selector: 'tolle-menubar',
284
+ standalone: true,
285
+ imports: [],
286
+ providers: [MenubarService],
287
+ changeDetection: ChangeDetectionStrategy.OnPush,
288
+ host: {
289
+ role: 'menubar',
290
+ '[class]': 'computedClass',
291
+ '(keydown)': 'onKeydown($event)',
292
+ },
293
+ template: `<ng-content></ng-content>`,
294
+ }]
295
+ }], propDecorators: { size: [{
296
+ type: Input
297
+ }], class: [{
298
+ type: Input
299
+ }], openChange: [{
300
+ type: Output
301
+ }] } });
302
+ /** A single menu in the bar — wraps one trigger and its content panel. */
303
+ export class MenubarMenuComponent {
304
+ /** Explicit id for the menu; one is generated when omitted. */
305
+ id = `tolle-menubar-menu-${menubarMenuCounter++}`;
306
+ triggerElement = null;
307
+ contentElement = null;
308
+ service = inject(MenubarService);
309
+ get triggerId() {
310
+ return `${this.id}-trigger`;
311
+ }
312
+ get isOpen() {
313
+ return this.service.isOpen(this.id);
314
+ }
315
+ ngOnInit() {
316
+ this.service.register(this);
317
+ }
318
+ ngOnDestroy() {
319
+ this.service.unregister(this);
320
+ }
321
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
322
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarMenuComponent, isStandalone: true, selector: "tolle-menubar-menu", inputs: { id: "id" }, host: { attributes: { "role": "none" }, properties: { "class": "'relative inline-flex'" } }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
323
+ }
324
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarMenuComponent, decorators: [{
325
+ type: Component,
326
+ args: [{
327
+ selector: 'tolle-menubar-menu',
328
+ standalone: true,
329
+ imports: [],
330
+ changeDetection: ChangeDetectionStrategy.OnPush,
331
+ // Presentational so the menubar "owns" the trigger's menuitem role directly
332
+ // even though this wrapper element sits in between.
333
+ host: { role: 'none', '[class]': "'relative inline-flex'" },
334
+ template: `<ng-content></ng-content>`,
335
+ }]
336
+ }], propDecorators: { id: [{
337
+ type: Input
338
+ }] } });
339
+ /** Button that opens its menu on click, and on hover once the bar is active. */
340
+ export class MenubarTriggerComponent {
341
+ /**
342
+ * Angular writes a bound `class` input through its styling path, which does
343
+ * not mark an OnPush component dirty — without this hook the component keeps
344
+ * rendering the class it was born with.
345
+ */
346
+ ngOnChanges() {
347
+ this.cdr.markForCheck();
348
+ }
349
+ /** Prevents the menu from opening. @default false */
350
+ disabled = false;
351
+ /** Overrides the size inherited from `tolle-menubar`. */
352
+ size;
353
+ /** Extra Tailwind classes merged onto the trigger via `cn()` (last-wins). */
354
+ class = '';
355
+ menu = inject(MenubarMenuComponent);
356
+ service = inject(MenubarService);
357
+ cdr = inject(ChangeDetectorRef);
358
+ sub = new Subscription();
359
+ constructor() {
360
+ this.sub.add(this.service.openId$.subscribe(() => this.cdr.markForCheck()));
361
+ // The bar's size is not an input of this component, so nothing else would
362
+ // mark an OnPush trigger dirty when it changes.
363
+ this.sub.add(this.service.size$.subscribe(() => this.cdr.markForCheck()));
364
+ }
365
+ set triggerRef(ref) {
366
+ this.menu.triggerElement = ref?.nativeElement ?? null;
367
+ }
368
+ get isOpen() {
369
+ return this.menu.isOpen;
370
+ }
371
+ get computedClass() {
372
+ return cn(menubarTriggerVariants({ size: this.size ?? this.service.size }), this.class);
373
+ }
374
+ onClick() {
375
+ if (this.disabled)
376
+ return;
377
+ this.service.toggle(this.menu.id);
378
+ }
379
+ onMouseEnter() {
380
+ if (this.disabled)
381
+ return;
382
+ this.service.hoverEnter(this.menu.id);
383
+ }
384
+ ngOnDestroy() {
385
+ this.sub.unsubscribe();
386
+ }
387
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
388
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarTriggerComponent, isStandalone: true, selector: "tolle-menubar-trigger", inputs: { disabled: "disabled", size: "size", class: "class" }, host: { attributes: { "role": "none" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
389
+ <button
390
+ #trigger
391
+ type="button"
392
+ role="menuitem"
393
+ [id]="menu.triggerId"
394
+ [disabled]="disabled"
395
+ aria-haspopup="menu"
396
+ [attr.aria-expanded]="isOpen"
397
+ [attr.aria-controls]="isOpen ? menu.id + '-content' : null"
398
+ [attr.data-state]="isOpen ? 'open' : 'closed'"
399
+ [class]="computedClass"
400
+ (click)="onClick()"
401
+ (mouseenter)="onMouseEnter()"
402
+ >
403
+ <ng-content></ng-content>
404
+ </button>
405
+ `, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
406
+ }
407
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarTriggerComponent, decorators: [{
408
+ type: Component,
409
+ args: [{ selector: 'tolle-menubar-trigger', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: { role: 'none' }, template: `
410
+ <button
411
+ #trigger
412
+ type="button"
413
+ role="menuitem"
414
+ [id]="menu.triggerId"
415
+ [disabled]="disabled"
416
+ aria-haspopup="menu"
417
+ [attr.aria-expanded]="isOpen"
418
+ [attr.aria-controls]="isOpen ? menu.id + '-content' : null"
419
+ [attr.data-state]="isOpen ? 'open' : 'closed'"
420
+ [class]="computedClass"
421
+ (click)="onClick()"
422
+ (mouseenter)="onMouseEnter()"
423
+ >
424
+ <ng-content></ng-content>
425
+ </button>
426
+ `, styles: [":host{display:block}\n"] }]
427
+ }], ctorParameters: () => [], propDecorators: { disabled: [{
428
+ type: Input
429
+ }], size: [{
430
+ type: Input
431
+ }], class: [{
432
+ type: Input
433
+ }], triggerRef: [{
434
+ type: ViewChild,
435
+ args: ['trigger']
436
+ }] } });
437
+ /** The dropdown panel of a menu. Rendered only while its menu is open. */
438
+ export class MenubarContentComponent {
439
+ /**
440
+ * Angular writes a bound `class` input through its styling path, which does
441
+ * not mark an OnPush component dirty — without this hook the component keeps
442
+ * rendering the class it was born with.
443
+ */
444
+ ngOnChanges() {
445
+ this.cdr.markForCheck();
446
+ }
447
+ /** Preferred side of the trigger to render on; flips when space is tight. @default 'bottom-start' */
448
+ placement = 'bottom-start';
449
+ /** Gap in pixels between the trigger and the panel. @default 4 */
450
+ sideOffset = 4;
451
+ /** Extra Tailwind classes merged onto the panel via `cn()` (last-wins). */
452
+ class = '';
453
+ menu = inject(MenubarMenuComponent);
454
+ service = inject(MenubarService);
455
+ cdr = inject(ChangeDetectorRef);
456
+ sub;
457
+ cleanup;
458
+ constructor() {
459
+ this.sub = this.service.openId$.subscribe(() => this.cdr.markForCheck());
460
+ }
461
+ set panelRef(ref) {
462
+ const el = ref?.nativeElement ?? null;
463
+ this.menu.contentElement = el;
464
+ this.stopPositioning();
465
+ if (el)
466
+ this.startPositioning(el);
467
+ }
468
+ get isOpen() {
469
+ return this.menu.isOpen;
470
+ }
471
+ get computedClass() {
472
+ return cn('z-[1000] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1', 'text-popover-foreground shadow-md animate-in fade-in zoom-in-95', this.class);
473
+ }
474
+ startPositioning(panel) {
475
+ const trigger = this.menu.triggerElement;
476
+ if (!trigger)
477
+ return;
478
+ this.cleanup = autoUpdate(trigger, panel, () => {
479
+ computePosition(trigger, panel, {
480
+ strategy: 'fixed',
481
+ placement: this.placement,
482
+ middleware: [offset(this.sideOffset), flip(), shift({ padding: 8 })],
483
+ }).then(({ x, y }) => {
484
+ Object.assign(panel.style, { left: `${x}px`, top: `${y}px` });
485
+ });
486
+ });
487
+ }
488
+ stopPositioning() {
489
+ this.cleanup?.();
490
+ this.cleanup = undefined;
491
+ }
492
+ ngOnDestroy() {
493
+ this.sub.unsubscribe();
494
+ this.stopPositioning();
495
+ }
496
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
497
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MenubarContentComponent, isStandalone: true, selector: "tolle-menubar-content", inputs: { placement: "placement", sideOffset: "sideOffset", class: "class" }, viewQueries: [{ propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
498
+ @if (isOpen) {
499
+ <div
500
+ #panel
501
+ role="menu"
502
+ aria-orientation="vertical"
503
+ [id]="menu.id + '-content'"
504
+ [attr.aria-labelledby]="menu.triggerId"
505
+ data-state="open"
506
+ [class]="computedClass"
507
+ style="position: fixed; top: 0; left: 0;"
508
+ >
509
+ <ng-content></ng-content>
510
+ </div>
511
+ }
512
+ `, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
513
+ }
514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarContentComponent, decorators: [{
515
+ type: Component,
516
+ args: [{ selector: 'tolle-menubar-content', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: `
517
+ @if (isOpen) {
518
+ <div
519
+ #panel
520
+ role="menu"
521
+ aria-orientation="vertical"
522
+ [id]="menu.id + '-content'"
523
+ [attr.aria-labelledby]="menu.triggerId"
524
+ data-state="open"
525
+ [class]="computedClass"
526
+ style="position: fixed; top: 0; left: 0;"
527
+ >
528
+ <ng-content></ng-content>
529
+ </div>
530
+ }
531
+ `, styles: [":host{display:block}\n"] }]
532
+ }], ctorParameters: () => [], propDecorators: { placement: [{
533
+ type: Input
534
+ }], sideOffset: [{
535
+ type: Input
536
+ }], class: [{
537
+ type: Input
538
+ }], panelRef: [{
539
+ type: ViewChild,
540
+ args: ['panel']
541
+ }] } });
542
+ /** A selectable row inside a menu. Closes the bar when activated. */
543
+ export class MenubarItemComponent {
544
+ cdr = inject(ChangeDetectorRef);
545
+ /**
546
+ * Angular writes a bound `class` input through its styling path, which does
547
+ * not mark an OnPush component dirty — without this hook the component keeps
548
+ * rendering the class it was born with.
549
+ */
550
+ ngOnChanges() {
551
+ this.cdr.markForCheck();
552
+ }
553
+ /** Visual style of the item. @default 'default' */
554
+ variant = 'default';
555
+ /** Adds left padding so the label lines up with items that have icons. @default false */
556
+ inset = false;
557
+ /** Blocks activation and dims the item. @default false */
558
+ disabled = false;
559
+ /** Extra Tailwind classes merged onto the item via `cn()` (last-wins). */
560
+ class = '';
561
+ /** Emitted when the item is clicked or activated with Enter/Space. */
562
+ select = new EventEmitter();
563
+ service = inject(MenubarService);
564
+ get computedClass() {
565
+ return cn(menubarItemVariants({ variant: this.variant, inset: this.inset }), this.class);
566
+ }
567
+ activate(event) {
568
+ if (this.disabled)
569
+ return;
570
+ event.preventDefault();
571
+ this.select.emit(event);
572
+ this.service.close();
573
+ }
574
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
575
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarItemComponent, isStandalone: true, selector: "tolle-menubar-item", inputs: { variant: "variant", inset: "inset", disabled: "disabled", class: "class" }, outputs: { select: "select" }, usesOnChanges: true, ngImport: i0, template: `
576
+ <div
577
+ role="menuitem"
578
+ [attr.tabindex]="disabled ? null : -1"
579
+ [attr.data-disabled]="disabled ? '' : null"
580
+ [attr.aria-disabled]="disabled || null"
581
+ [class]="computedClass"
582
+ (click)="activate($event)"
583
+ (keydown.enter)="activate($event)"
584
+ (keydown.space)="activate($event)"
585
+ >
586
+ <ng-content select="[prefix]"></ng-content>
587
+ <span class="flex-1 truncate"><ng-content></ng-content></span>
588
+ <ng-content select="[shortcut]"></ng-content>
589
+ </div>
590
+ `, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
591
+ }
592
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarItemComponent, decorators: [{
593
+ type: Component,
594
+ args: [{ selector: 'tolle-menubar-item', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: `
595
+ <div
596
+ role="menuitem"
597
+ [attr.tabindex]="disabled ? null : -1"
598
+ [attr.data-disabled]="disabled ? '' : null"
599
+ [attr.aria-disabled]="disabled || null"
600
+ [class]="computedClass"
601
+ (click)="activate($event)"
602
+ (keydown.enter)="activate($event)"
603
+ (keydown.space)="activate($event)"
604
+ >
605
+ <ng-content select="[prefix]"></ng-content>
606
+ <span class="flex-1 truncate"><ng-content></ng-content></span>
607
+ <ng-content select="[shortcut]"></ng-content>
608
+ </div>
609
+ `, styles: [":host{display:block}\n"] }]
610
+ }], propDecorators: { variant: [{
611
+ type: Input
612
+ }], inset: [{
613
+ type: Input
614
+ }], disabled: [{
615
+ type: Input
616
+ }], class: [{
617
+ type: Input
618
+ }], select: [{
619
+ type: Output
620
+ }] } });
621
+ /** A non-interactive heading inside a menu. */
622
+ export class MenubarLabelComponent {
623
+ cdr = inject(ChangeDetectorRef);
624
+ /**
625
+ * Angular writes a bound `class` input through its styling path, which does
626
+ * not mark an OnPush component dirty — without this hook the component keeps
627
+ * rendering the class it was born with.
628
+ */
629
+ ngOnChanges() {
630
+ this.cdr.markForCheck();
631
+ }
632
+ /** Adds left padding so the label lines up with items that have icons. @default false */
633
+ inset = false;
634
+ /** Extra Tailwind classes merged onto the label via `cn()` (last-wins). */
635
+ class = '';
636
+ cn = cn;
637
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
638
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarLabelComponent, isStandalone: true, selector: "tolle-menubar-label", inputs: { inset: "inset", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
639
+ <div
640
+ [class]="cn('px-2 py-1.5 text-xs font-semibold text-muted-foreground', inset ? 'pl-8' : '', class)"
641
+ >
642
+ <ng-content></ng-content>
643
+ </div>
644
+ `, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
645
+ }
646
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarLabelComponent, decorators: [{
647
+ type: Component,
648
+ args: [{ selector: 'tolle-menubar-label', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: `
649
+ <div
650
+ [class]="cn('px-2 py-1.5 text-xs font-semibold text-muted-foreground', inset ? 'pl-8' : '', class)"
651
+ >
652
+ <ng-content></ng-content>
653
+ </div>
654
+ `, styles: [":host{display:block}\n"] }]
655
+ }], propDecorators: { inset: [{
656
+ type: Input
657
+ }], class: [{
658
+ type: Input
659
+ }] } });
660
+ /** A horizontal rule between groups of menu items. */
661
+ export class MenubarSeparatorComponent {
662
+ cdr = inject(ChangeDetectorRef);
663
+ /**
664
+ * Angular writes a bound `class` input through its styling path, which does
665
+ * not mark an OnPush component dirty — without this hook the component keeps
666
+ * rendering the class it was born with.
667
+ */
668
+ ngOnChanges() {
669
+ this.cdr.markForCheck();
670
+ }
671
+ /** Extra Tailwind classes merged onto the separator via `cn()` (last-wins). */
672
+ class = '';
673
+ cn = cn;
674
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
675
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarSeparatorComponent, isStandalone: true, selector: "tolle-menubar-separator", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div role="separator" aria-orientation="horizontal" [class]="cn('-mx-1 my-1 h-px bg-border', class)"></div>`, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
676
+ }
677
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarSeparatorComponent, decorators: [{
678
+ type: Component,
679
+ args: [{ selector: 'tolle-menubar-separator', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div role="separator" aria-orientation="horizontal" [class]="cn('-mx-1 my-1 h-px bg-border', class)"></div>`, styles: [":host{display:block}\n"] }]
680
+ }], propDecorators: { class: [{
681
+ type: Input
682
+ }] } });
683
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL21lbnViYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1TCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFlaEMsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFM0I7Ozs7Ozs7R0FPRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBQ2pCLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDaEUsOEVBQThFO0lBQ3JFLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRTVDLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBMEIsU0FBUyxDQUFDLENBQUM7SUFDN0U7OztPQUdHO0lBQ00sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFaEQsb0NBQW9DO0lBQ3BDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUE2QjtR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S0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7O0FBSVIsc0RBQXNEO0FBU3RELE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsK0VBQStFO0lBQ3RFLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDRCxFQUFFLEdBQUcsRUFBRSxDQUFDO3dHQWRoQix5QkFBeUI7NEZBQXpCLHlCQUF5QixvSUFGMUIsNkdBQTZHOzs0RkFFNUcseUJBQXlCO2tCQVJyQyxTQUFTOytCQUNFLHlCQUF5QixjQUV2QixJQUFJLFdBQ1AsRUFBRSxtQkFDTSx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLDZHQUE2Rzs4QkFlOUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb21wdXRlUG9zaXRpb24sIGZsaXAsIHNoaWZ0LCBvZmZzZXQsIGF1dG9VcGRhdGUgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuLyoqXG4gKiBDb250cmFjdCBhIGB0b2xsZS1tZW51YmFyLW1lbnVgIGZ1bGZpbHMgc28gYE1lbnViYXJTZXJ2aWNlYCBjYW4gZHJpdmUgZm9jdXMgYW5kXG4gKiBrZXlib2FyZCBuYXZpZ2F0aW9uIHdpdGhvdXQgaW1wb3J0aW5nIHRoZSBjb21wb25lbnQgKHdoaWNoIHdvdWxkIGJlIGNpcmN1bGFyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW51YmFyTWVudVJlZiB7XG4gIC8qKiBTdGFibGUgaWQsIHVuaXF1ZSBwZXIgbWVudSBpbnN0YW5jZS4gKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBtZW51J3MgdHJpZ2dlciBidXR0b24sIG9uY2UgcmVuZGVyZWQuICovXG4gIHRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIC8qKiBUaGUgbWVudSdzIG9wZW4gcGFuZWwsIG9yIGBudWxsYCB3aGlsZSBjbG9zZWQuICovXG4gIGNvbnRlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmxldCBtZW51YmFyTWVudUNvdW50ZXIgPSAwO1xuXG4vKipcbiAqIENvb3JkaW5hdGVzIHRoZSBtZW51cyBvZiBhIHNpbmdsZSBgdG9sbGUtbWVudWJhcmAuIFByb3ZpZGVkIGJ5XG4gKiBgTWVudWJhckNvbXBvbmVudGAsIGluamVjdGVkIGJ5IGV2ZXJ5IGRlc2NlbmRhbnQgbWVudS90cmlnZ2VyL2NvbnRlbnQuXG4gKlxuICogVGhlIGRlZmluaW5nIGJlaGF2aW91ciBvZiBhIG1lbnUgYmFyIGxpdmVzIGhlcmU6IG9uY2UgKmFueSogbWVudSBpcyBvcGVuLFxuICogaG92ZXJpbmcgYSBkaWZmZXJlbnQgdHJpZ2dlciBzd2l0Y2hlcyB0byBpdCBpbW1lZGlhdGVseSAoYGhvdmVyRW50ZXJgKSwgd2hpbGVcbiAqIGhvdmVyaW5nIHdpdGggZXZlcnl0aGluZyBjbG9zZWQgZG9lcyBub3RoaW5nLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTWVudWJhclNlcnZpY2Uge1xuICBwcml2YXRlIG9wZW5JZFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBFbWl0cyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBvcGVuIG1lbnUsIG9yIGBudWxsYCB3aGVuIGFsbCBhcmUgY2xvc2VkLiAqL1xuICByZWFkb25seSBvcGVuSWQkID0gdGhpcy5vcGVuSWRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBzaXplU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDwnc20nIHwgJ2RlZmF1bHQnIHwgJ2xnJz4oJ2RlZmF1bHQnKTtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBiYXIncyBzaXplIHNvIE9uUHVzaCB0cmlnZ2VycyByZS1yZW5kZXIgd2hlbiBpdCBjaGFuZ2VzLiBSZWFkaW5nXG4gICAqIHRoZSBwYXJlbnQgY29tcG9uZW50J3MgcHJvcGVydHkgZGlyZWN0bHkgd291bGQgbm90IG1hcmsgdGhlbSBkaXJ0eS5cbiAgICovXG4gIHJlYWRvbmx5IHNpemUkID0gdGhpcy5zaXplU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBUaGUgYmFyJ3MgY3VycmVudCBzaXplIHNjYWxlLiAqL1xuICBnZXQgc2l6ZSgpOiAnc20nIHwgJ2RlZmF1bHQnIHwgJ2xnJyB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZVNvdXJjZS52YWx1ZTtcbiAgfVxuXG4gIHNldFNpemUoc2l6ZTogJ3NtJyB8ICdkZWZhdWx0JyB8ICdsZycpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaXplU291cmNlLnZhbHVlICE9PSBzaXplKSB0aGlzLnNpemVTb3VyY2UubmV4dChzaXplKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlcmVkIG1lbnVzIGluIERPTSAocmVnaXN0cmF0aW9uKSBvcmRlci4gKi9cbiAgcHJpdmF0ZSBtZW51czogTWVudWJhck1lbnVSZWZbXSA9IFtdO1xuXG4gIC8qKiBJZCBvZiB0aGUgb3BlbiBtZW51LCBvciBgbnVsbGAuICovXG4gIGdldCBvcGVuSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3BlbklkU291cmNlLnZhbHVlO1xuICB9XG5cbiAgLyoqIFRydWUgd2hpbGUgb25lIG9mIHRoZSBiYXIncyBtZW51cyBpcyBvcGVuLiAqL1xuICBnZXQgaXNBbnlPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wZW5JZFNvdXJjZS52YWx1ZSAhPT0gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKG1lbnU6IE1lbnViYXJNZW51UmVmKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVudXMuaW5kZXhPZihtZW51KSA9PT0gLTEpIHRoaXMubWVudXMucHVzaChtZW51KTtcbiAgfVxuXG4gIHVucmVnaXN0ZXIobWVudTogTWVudWJhck1lbnVSZWYpOiB2b2lkIHtcbiAgICBjb25zdCBpID0gdGhpcy5tZW51cy5pbmRleE9mKG1lbnUpO1xuICAgIGlmIChpID4gLTEpIHRoaXMubWVudXMuc3BsaWNlKGksIDEpO1xuICAgIGlmICh0aGlzLm9wZW5JZCA9PT0gbWVudS5pZCkgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgaXNPcGVuKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuSWQgPT09IGlkO1xuICB9XG5cbiAgb3BlbihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlbklkICE9PSBpZCkgdGhpcy5vcGVuSWRTb3VyY2UubmV4dChpZCk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuSWQgIT09IG51bGwpIHRoaXMub3BlbklkU291cmNlLm5leHQobnVsbCk7XG4gIH1cblxuICB0b2dnbGUoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW5JZCA9PT0gaWQpIHRoaXMuY2xvc2UoKTtcbiAgICBlbHNlIHRoaXMub3BlbihpZCk7XG4gIH1cblxuICAvKipcbiAgICogUG9pbnRlciBlbnRlcmVkIGEgdHJpZ2dlci4gT25seSBzd2l0Y2hlcyBtZW51cyB3aGVuIHRoZSBiYXIgaXMgYWxyZWFkeVxuICAgKiBcImFjdGl2ZVwiIChzb21ldGhpbmcgb3Blbikg4oCUIHRoaXMgaXMgd2hhdCBtYWtlcyBhIG1lbnUgYmFyIGZlZWwgbmF0aXZlLlxuICAgKi9cbiAgaG92ZXJFbnRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNBbnlPcGVuKSB0aGlzLm9wZW4oaWQpO1xuICB9XG5cbiAgLyoqIE1vdmVzIGZvY3VzIHRvIHRoZSBwcmV2aW91cy9uZXh0IG1lbnUsIGtlZXBpbmcgdGhlIG9wZW4gc3RhdGUuICovXG4gIG1vdmVNZW51KGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWVudXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubWVudXMuZmluZEluZGV4KG0gPT4gbS5pZCA9PT0gdGhpcy5vcGVuSWQpO1xuICAgIGNvbnN0IGZyb20gPSBjdXJyZW50ID4gLTEgPyBjdXJyZW50IDogdGhpcy5pbmRleE9mRm9jdXNlZFRyaWdnZXIoKTtcbiAgICBjb25zdCBuZXh0ID1cbiAgICAgIGZyb20gPCAwXG4gICAgICAgID8gZGVsdGEgPiAwXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLm1lbnVzLmxlbmd0aCAtIDFcbiAgICAgICAgOiAoZnJvbSArIGRlbHRhICsgdGhpcy5tZW51cy5sZW5ndGgpICUgdGhpcy5tZW51cy5sZW5ndGg7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tZW51c1tuZXh0XTtcbiAgICBpZiAodGhpcy5pc0FueU9wZW4pIHRoaXMub3Blbih0YXJnZXQuaWQpO1xuICAgIHRhcmdldC50cmlnZ2VyRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlcyBmb2N1cyBiZXR3ZWVuIHRoZSBlbmFibGVkIGl0ZW1zIG9mIHRoZSBjdXJyZW50bHkgb3BlbiBtZW51LiAqL1xuICBtb3ZlSXRlbShkZWx0YTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLm9wZW5JdGVtcygpO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudCA9IGl0ZW1zLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgY29uc3QgbmV4dCA9XG4gICAgICBjdXJyZW50IDwgMFxuICAgICAgICA/IGRlbHRhID4gMFxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogaXRlbXMubGVuZ3RoIC0gMVxuICAgICAgICA6IChjdXJyZW50ICsgZGVsdGEgKyBpdGVtcy5sZW5ndGgpICUgaXRlbXMubGVuZ3RoO1xuICAgIGl0ZW1zW25leHRdLmZvY3VzKCk7XG4gIH1cblxuICAvKiogRm9jdXNlcyB0aGUgdHJpZ2dlciBvZiB0aGUgZ2l2ZW4gbWVudSAodXNlZCB3aGVuIEVzY2FwZSBjbG9zZXMgYSBtZW51KS4gKi9cbiAgZm9jdXNUcmlnZ2VyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVzLmZpbmQobSA9PiBtLmlkID09PSBpZCk/LnRyaWdnZXJFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuSXRlbXMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMubWVudXMuZmluZChtID0+IG0uaWQgPT09IHRoaXMub3BlbklkKT8uY29udGVudEVsZW1lbnQ7XG4gICAgaWYgKCFjb250ZW50KSByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdbcm9sZT1cIm1lbnVpdGVtXCJdOm5vdChbZGF0YS1kaXNhYmxlZF0pJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmRleE9mRm9jdXNlZFRyaWdnZXIoKTogbnVtYmVyIHtcbiAgICBjb25zdCBhY3RpdmUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiB0aGlzLm1lbnVzLmZpbmRJbmRleChtID0+ICEhbS50cmlnZ2VyRWxlbWVudCAmJiBtLnRyaWdnZXJFbGVtZW50ID09PSBhY3RpdmUpO1xuICB9XG59XG5cbmNvbnN0IG1lbnViYXJWYXJpYW50cyA9IGN2YShcbiAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCBzaGFkb3ctc20nLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHNpemU6IHtcbiAgICAgICAgc206ICdoLTggcC0wLjUnLFxuICAgICAgICBkZWZhdWx0OiAnaC0xMCBwLTEnLFxuICAgICAgICBsZzogJ2gtMTIgcC0xLjUnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIE1lbnViYXJQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgbWVudWJhclZhcmlhbnRzPjtcblxuY29uc3QgbWVudWJhclRyaWdnZXJWYXJpYW50cyA9IGN2YShcbiAgJ2ZsZXggc2VsZWN0LW5vbmUgaXRlbXMtY2VudGVyIHJvdW5kZWQtc20gZm9udC1tZWRpdW0gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzICcgK1xuICAgICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOmJnLWFjY2VudCBmb2N1cy12aXNpYmxlOnRleHQtYWNjZW50LWZvcmVncm91bmQgJyArXG4gICAgJ2RhdGEtW3N0YXRlPW9wZW5dOmJnLWFjY2VudCBkYXRhLVtzdGF0ZT1vcGVuXTp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kICcgK1xuICAgICdkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHNpemU6IHtcbiAgICAgICAgc206ICdoLTcgcHgtMiB0ZXh0LXhzJyxcbiAgICAgICAgZGVmYXVsdDogJ2gtOCBweC0zIHRleHQtc20nLFxuICAgICAgICBsZzogJ2gtOSBweC00IHRleHQtc20nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIE1lbnViYXJUcmlnZ2VyUHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIG1lbnViYXJUcmlnZ2VyVmFyaWFudHM+O1xuXG5jb25zdCBtZW51YmFySXRlbVZhcmlhbnRzID0gY3ZhKFxuICAncmVsYXRpdmUgZmxleCB3LWZ1bGwgY3Vyc29yLWRlZmF1bHQgc2VsZWN0LW5vbmUgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc20gcHgtMiBweS0xLjUgdGV4dC1zbSBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMgJyArXG4gICAgJ2ZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kICcgK1xuICAgICdkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCcsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OiAndGV4dC1wb3BvdmVyLWZvcmVncm91bmQnLFxuICAgICAgICBkZXN0cnVjdGl2ZTogJ3RleHQtZGVzdHJ1Y3RpdmUgZm9jdXM6YmctZGVzdHJ1Y3RpdmUvMTAgaG92ZXI6YmctZGVzdHJ1Y3RpdmUvMTAnLFxuICAgICAgfSxcbiAgICAgIGluc2V0OiB7XG4gICAgICAgIHRydWU6ICdwbC04JyxcbiAgICAgICAgZmFsc2U6ICcnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgdmFyaWFudDogJ2RlZmF1bHQnLFxuICAgICAgaW5zZXQ6IGZhbHNlLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIE1lbnViYXJJdGVtUHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIG1lbnViYXJJdGVtVmFyaWFudHM+O1xuXG4vKipcbiAqIERlc2t0b3AtYXBwbGljYXRpb24gc3R5bGUgbWVudSBiYXIuXG4gKlxuICogYGBgaHRtbFxuICogPHRvbGxlLW1lbnViYXI+XG4gKiAgIDx0b2xsZS1tZW51YmFyLW1lbnU+XG4gKiAgICAgPHRvbGxlLW1lbnViYXItdHJpZ2dlcj5GaWxlPC90b2xsZS1tZW51YmFyLXRyaWdnZXI+XG4gKiAgICAgPHRvbGxlLW1lbnViYXItY29udGVudD5cbiAqICAgICAgIDx0b2xsZS1tZW51YmFyLWxhYmVsPkRvY3VtZW50PC90b2xsZS1tZW51YmFyLWxhYmVsPlxuICogICAgICAgPHRvbGxlLW1lbnViYXItaXRlbSAoc2VsZWN0KT1cIm9uTmV3KClcIj5OZXc8L3RvbGxlLW1lbnViYXItaXRlbT5cbiAqICAgICAgIDx0b2xsZS1tZW51YmFyLXNlcGFyYXRvciAvPlxuICogICAgICAgPHRvbGxlLW1lbnViYXItaXRlbSB2YXJpYW50PVwiZGVzdHJ1Y3RpdmVcIj5EZWxldGU8L3RvbGxlLW1lbnViYXItaXRlbT5cbiAqICAgICA8L3RvbGxlLW1lbnViYXItY29udGVudD5cbiAqICAgPC90b2xsZS1tZW51YmFyLW1lbnU+XG4gKiA8L3RvbGxlLW1lbnViYXI+XG4gKiBgYGBcbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtbWVudWJhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBwcm92aWRlcnM6IFtNZW51YmFyU2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgcm9sZTogJ21lbnViYXInLFxuICAgICdbY2xhc3NdJzogJ2NvbXB1dGVkQ2xhc3MnLFxuICAgICcoa2V5ZG93biknOiAnb25LZXlkb3duKCRldmVudCknLFxuICB9LFxuICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxufSlcbmV4cG9ydCBjbGFzcyBNZW51YmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8qKiBIZWlnaHQvcGFkZGluZyBzY2FsZSwgaW5oZXJpdGVkIGJ5IGV2ZXJ5IHRyaWdnZXIgaW4gdGhlIGJhci4gQGRlZmF1bHQgJ2RlZmF1bHQnICovXG4gIEBJbnB1dCgpIHNpemU6IE1lbnViYXJQcm9wc1snc2l6ZSddID0gJ2RlZmF1bHQnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgYmFyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2l0aCB0aGUgaWQgb2YgdGhlIG1lbnUgdGhhdCBvcGVuZWQsIG9yIGBudWxsYCB3aGVuIHRoZSBiYXIgY2xvc2VzLiAqL1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChNZW51YmFyU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGxpc3RlbmluZyA9IGZhbHNlO1xuXG4gIGdldCBjb21wdXRlZENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKG1lbnViYXJWYXJpYW50cyh7IHNpemU6IHRoaXMuc2l6ZSB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyBQdXNoIHNpemUgaW50byB0aGUgc2VydmljZSBzbyBPblB1c2ggdHJpZ2dlcnMgZ2V0IHRvbGQgYWJvdXQgaXQuXG4gICAgdGhpcy5zZXJ2aWNlLnNldFNpemUodGhpcy5zaXplID8/ICdkZWZhdWx0Jyk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2Uuc2V0U2l6ZSh0aGlzLnNpemUgPz8gJ2RlZmF1bHQnKTtcbiAgICB0aGlzLnN1Yi5hZGQoXG4gICAgICB0aGlzLnNlcnZpY2Uub3BlbklkJC5zdWJzY3JpYmUoaWQgPT4ge1xuICAgICAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdChpZCk7XG4gICAgICAgIGlmIChpZCAhPT0gbnVsbCkgdGhpcy5zdGFydExpc3RlbmluZygpO1xuICAgICAgICBlbHNlIHRoaXMuc3RvcExpc3RlbmluZygpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLm1vdmVNZW51KDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VydmljZS5tb3ZlTWVudSgtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2UuaXNBbnlPcGVuKSBicmVhaztcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLm1vdmVJdGVtKDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBpZiAoIXRoaXMuc2VydmljZS5pc0FueU9wZW4pIGJyZWFrO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlcnZpY2UubW92ZUl0ZW0oLTEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6IHtcbiAgICAgICAgY29uc3Qgb3BlbklkID0gdGhpcy5zZXJ2aWNlLm9wZW5JZDtcbiAgICAgICAgaWYgKG9wZW5JZCA9PT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VydmljZS5jbG9zZSgpO1xuICAgICAgICB0aGlzLnNlcnZpY2UuZm9jdXNUcmlnZ2VyKG9wZW5JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FwdHVyZSBwaGFzZSBzbyBuZXN0ZWQgY29udGFpbmVycyB0aGF0IHN0b3BQcm9wYWdhdGlvbigpIG9uIHRoZWlyIHJvb3RcbiAgLy8gKG1vZGFsLCBzaGVldCkgY2Fubm90IHByZXZlbnQgdGhlIG91dHNpZGUgY2xpY2sgZnJvbSByZWFjaGluZyB1cy5cbiAgcHJpdmF0ZSBvdXRzaWRlQ2xpY2sgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHRoaXMuc2VydmljZS5jbG9zZSgpO1xuICB9O1xuXG4gIHByaXZhdGUgc3RhcnRMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nKSByZXR1cm47XG4gICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vdXRzaWRlQ2xpY2ssIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wTGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5saXN0ZW5pbmcpIHJldHVybjtcbiAgICB0aGlzLmxpc3RlbmluZyA9IGZhbHNlO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vdXRzaWRlQ2xpY2ssIHRydWUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnN0b3BMaXN0ZW5pbmcoKTtcbiAgfVxufVxuXG4vKiogQSBzaW5nbGUgbWVudSBpbiB0aGUgYmFyIOKAlCB3cmFwcyBvbmUgdHJpZ2dlciBhbmQgaXRzIGNvbnRlbnQgcGFuZWwuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1tZW51YmFyLW1lbnUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIC8vIFByZXNlbnRhdGlvbmFsIHNvIHRoZSBtZW51YmFyIFwib3duc1wiIHRoZSB0cmlnZ2VyJ3MgbWVudWl0ZW0gcm9sZSBkaXJlY3RseVxuICAvLyBldmVuIHRob3VnaCB0aGlzIHdyYXBwZXIgZWxlbWVudCBzaXRzIGluIGJldHdlZW4uXG4gIGhvc3Q6IHsgcm9sZTogJ25vbmUnLCAnW2NsYXNzXSc6IFwiJ3JlbGF0aXZlIGlubGluZS1mbGV4J1wiIH0sXG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJNZW51Q29tcG9uZW50IGltcGxlbWVudHMgTWVudWJhck1lbnVSZWYsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIEV4cGxpY2l0IGlkIGZvciB0aGUgbWVudTsgb25lIGlzIGdlbmVyYXRlZCB3aGVuIG9taXR0ZWQuICovXG4gIEBJbnB1dCgpIGlkID0gYHRvbGxlLW1lbnViYXItbWVudS0ke21lbnViYXJNZW51Q291bnRlcisrfWA7XG5cbiAgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGNvbnRlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoTWVudWJhclNlcnZpY2UpO1xuXG4gIGdldCB0cmlnZ2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pZH0tdHJpZ2dlcmA7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaXNPcGVuKHRoaXMuaWQpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnJlZ2lzdGVyKHRoaXMpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnVucmVnaXN0ZXIodGhpcyk7XG4gIH1cbn1cblxuLyoqIEJ1dHRvbiB0aGF0IG9wZW5zIGl0cyBtZW51IG9uIGNsaWNrLCBhbmQgb24gaG92ZXIgb25jZSB0aGUgYmFyIGlzIGFjdGl2ZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1lbnViYXItdHJpZ2dlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyByb2xlOiAnbm9uZScgfSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uXG4gICAgICAjdHJpZ2dlclxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgW2lkXT1cIm1lbnUudHJpZ2dlcklkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBhcmlhLWhhc3BvcHVwPVwibWVudVwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImlzT3BlbiA/IG1lbnUuaWQgKyAnLWNvbnRlbnQnIDogbnVsbFwiXG4gICAgICBbYXR0ci5kYXRhLXN0YXRlXT1cImlzT3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnXCJcbiAgICAgIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCJcbiAgICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwib25Nb3VzZUVudGVyKClcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgTWVudWJhclRyaWdnZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBQcmV2ZW50cyB0aGUgbWVudSBmcm9tIG9wZW5pbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKiBPdmVycmlkZXMgdGhlIHNpemUgaW5oZXJpdGVkIGZyb20gYHRvbGxlLW1lbnViYXJgLiAqL1xuICBASW5wdXQoKSBzaXplPzogTWVudWJhclRyaWdnZXJQcm9wc1snc2l6ZSddO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdHJpZ2dlciB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBtZW51ID0gaW5qZWN0KE1lbnViYXJNZW51Q29tcG9uZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlID0gaW5qZWN0KE1lbnViYXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN1Yi5hZGQodGhpcy5zZXJ2aWNlLm9wZW5JZCQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKSk7XG4gICAgLy8gVGhlIGJhcidzIHNpemUgaXMgbm90IGFuIGlucHV0IG9mIHRoaXMgY29tcG9uZW50LCBzbyBub3RoaW5nIGVsc2Ugd291bGRcbiAgICAvLyBtYXJrIGFuIE9uUHVzaCB0cmlnZ2VyIGRpcnR5IHdoZW4gaXQgY2hhbmdlcy5cbiAgICB0aGlzLnN1Yi5hZGQodGhpcy5zZXJ2aWNlLnNpemUkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSkpO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicpIHNldCB0cmlnZ2VyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm1lbnUudHJpZ2dlckVsZW1lbnQgPSByZWY/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lbnUuaXNPcGVuO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBjb21wdXRlZENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKG1lbnViYXJUcmlnZ2VyVmFyaWFudHMoeyBzaXplOiB0aGlzLnNpemUgPz8gdGhpcy5zZXJ2aWNlLnNpemUgfSksIHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLnNlcnZpY2UudG9nZ2xlKHRoaXMubWVudS5pZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5zZXJ2aWNlLmhvdmVyRW50ZXIodGhpcy5tZW51LmlkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuLyoqIFRoZSBkcm9wZG93biBwYW5lbCBvZiBhIG1lbnUuIFJlbmRlcmVkIG9ubHkgd2hpbGUgaXRzIG1lbnUgaXMgb3Blbi4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1lbnViYXItY29udGVudCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKGlzT3Blbikge1xuICAgICAgPGRpdlxuICAgICAgICAjcGFuZWxcbiAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICBhcmlhLW9yaWVudGF0aW9uPVwidmVydGljYWxcIlxuICAgICAgICBbaWRdPVwibWVudS5pZCArICctY29udGVudCdcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibWVudS50cmlnZ2VySWRcIlxuICAgICAgICBkYXRhLXN0YXRlPVwib3BlblwiXG4gICAgICAgIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCJcbiAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IHRvcDogMDsgbGVmdDogMDtcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogUHJlZmVycmVkIHNpZGUgb2YgdGhlIHRyaWdnZXIgdG8gcmVuZGVyIG9uOyBmbGlwcyB3aGVuIHNwYWNlIGlzIHRpZ2h0LiBAZGVmYXVsdCAnYm90dG9tLXN0YXJ0JyAqL1xuICBASW5wdXQoKSBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnIHwgJ2JvdHRvbS1lbmQnIHwgJ3RvcC1zdGFydCcgfCAndG9wLWVuZCcgPSAnYm90dG9tLXN0YXJ0JztcbiAgLyoqIEdhcCBpbiBwaXhlbHMgYmV0d2VlbiB0aGUgdHJpZ2dlciBhbmQgdGhlIHBhbmVsLiBAZGVmYXVsdCA0ICovXG4gIEBJbnB1dCgpIHNpZGVPZmZzZXQgPSA0O1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcGFuZWwgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWVudSA9IGluamVjdChNZW51YmFyTWVudUNvbXBvbmVudCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChNZW51YmFyU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjbGVhbnVwPzogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN1YiA9IHRoaXMuc2VydmljZS5vcGVuSWQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSk7XG4gIH1cblxuICBAVmlld0NoaWxkKCdwYW5lbCcpIHNldCBwYW5lbFJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZWwgPSByZWY/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgICB0aGlzLm1lbnUuY29udGVudEVsZW1lbnQgPSBlbDtcbiAgICB0aGlzLnN0b3BQb3NpdGlvbmluZygpO1xuICAgIGlmIChlbCkgdGhpcy5zdGFydFBvc2l0aW9uaW5nKGVsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lbnUuaXNPcGVuO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBjb21wdXRlZENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ3otWzEwMDBdIG1pbi13LVsxMnJlbV0gb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctcG9wb3ZlciBwLTEnLFxuICAgICAgJ3RleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIHNoYWRvdy1tZCBhbmltYXRlLWluIGZhZGUtaW4gem9vbS1pbi05NScsXG4gICAgICB0aGlzLmNsYXNzXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQb3NpdGlvbmluZyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5tZW51LnRyaWdnZXJFbGVtZW50O1xuICAgIGlmICghdHJpZ2dlcikgcmV0dXJuO1xuICAgIHRoaXMuY2xlYW51cCA9IGF1dG9VcGRhdGUodHJpZ2dlciwgcGFuZWwsICgpID0+IHtcbiAgICAgIGNvbXB1dGVQb3NpdGlvbih0cmlnZ2VyLCBwYW5lbCwge1xuICAgICAgICBzdHJhdGVneTogJ2ZpeGVkJyxcbiAgICAgICAgcGxhY2VtZW50OiB0aGlzLnBsYWNlbWVudCxcbiAgICAgICAgbWlkZGxld2FyZTogW29mZnNldCh0aGlzLnNpZGVPZmZzZXQpLCBmbGlwKCksIHNoaWZ0KHsgcGFkZGluZzogOCB9KV0sXG4gICAgICB9KS50aGVuKCh7IHgsIHkgfSkgPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKHBhbmVsLnN0eWxlLCB7IGxlZnQ6IGAke3h9cHhgLCB0b3A6IGAke3l9cHhgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BQb3NpdGlvbmluZygpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXA/LigpO1xuICAgIHRoaXMuY2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wUG9zaXRpb25pbmcoKTtcbiAgfVxufVxuXG4vKiogQSBzZWxlY3RhYmxlIHJvdyBpbnNpZGUgYSBtZW51LiBDbG9zZXMgdGhlIGJhciB3aGVuIGFjdGl2YXRlZC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1lbnViYXItaXRlbScsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQgPyBudWxsIDogLTFcIlxuICAgICAgW2F0dHIuZGF0YS1kaXNhYmxlZF09XCJkaXNhYmxlZCA/ICcnIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIlxuICAgICAgKGNsaWNrKT1cImFjdGl2YXRlKCRldmVudClcIlxuICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWN0aXZhdGUoJGV2ZW50KVwiXG4gICAgICAoa2V5ZG93bi5zcGFjZSk9XCJhY3RpdmF0ZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcHJlZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC0xIHRydW5jYXRlXCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50Pjwvc3Bhbj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzaG9ydGN1dF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJJdGVtQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogVmlzdWFsIHN0eWxlIG9mIHRoZSBpdGVtLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgdmFyaWFudDogTWVudWJhckl0ZW1Qcm9wc1sndmFyaWFudCddID0gJ2RlZmF1bHQnO1xuICAvKiogQWRkcyBsZWZ0IHBhZGRpbmcgc28gdGhlIGxhYmVsIGxpbmVzIHVwIHdpdGggaXRlbXMgdGhhdCBoYXZlIGljb25zLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBpbnNldCA9IGZhbHNlO1xuICAvKiogQmxvY2tzIGFjdGl2YXRpb24gYW5kIGRpbXMgdGhlIGl0ZW0uIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBpdGVtIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgaXRlbSBpcyBjbGlja2VkIG9yIGFjdGl2YXRlZCB3aXRoIEVudGVyL1NwYWNlLiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoTWVudWJhclNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCBnZXQgY29tcHV0ZWRDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbihcbiAgICAgIG1lbnViYXJJdGVtVmFyaWFudHMoeyB2YXJpYW50OiB0aGlzLnZhcmlhbnQsIGluc2V0OiB0aGlzLmluc2V0IH0pLFxuICAgICAgdGhpcy5jbGFzc1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aXZhdGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc2VsZWN0LmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuc2VydmljZS5jbG9zZSgpO1xuICB9XG59XG5cbi8qKiBBIG5vbi1pbnRlcmFjdGl2ZSBoZWFkaW5nIGluc2lkZSBhIG1lbnUuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1tZW51YmFyLWxhYmVsJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIFtjbGFzc109XCJjbigncHgtMiBweS0xLjUgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsIGluc2V0ID8gJ3BsLTgnIDogJycsIGNsYXNzKVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBNZW51YmFyTGFiZWxDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBBZGRzIGxlZnQgcGFkZGluZyBzbyB0aGUgbGFiZWwgbGluZXMgdXAgd2l0aCBpdGVtcyB0aGF0IGhhdmUgaWNvbnMuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGluc2V0ID0gZmFsc2U7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBsYWJlbCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY24gPSBjbjtcbn1cblxuLyoqIEEgaG9yaXpvbnRhbCBydWxlIGJldHdlZW4gZ3JvdXBzIG9mIG1lbnUgaXRlbXMuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1tZW51YmFyLXNlcGFyYXRvcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IHJvbGU9XCJzZXBhcmF0b3JcIiBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiIFtjbGFzc109XCJjbignLW14LTEgbXktMSBoLXB4IGJnLWJvcmRlcicsIGNsYXNzKVwiPjwvZGl2PmAsXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJTZXBhcmF0b3JDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBzZXBhcmF0b3IgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNuID0gY247XG59XG4iXX0=