@tolle_/tolle-ui 18.2.29 → 18.2.30

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 (279) 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 +5 -10
  4. package/esm2022/lib/alert-dialog.component.mjs +44 -59
  5. package/esm2022/lib/alert.component.mjs +5 -11
  6. package/esm2022/lib/aspect-ratio.component.mjs +119 -0
  7. package/esm2022/lib/attachment.component.mjs +334 -0
  8. package/esm2022/lib/avatar-fallback.component.mjs +3 -3
  9. package/esm2022/lib/avatar.component.mjs +4 -9
  10. package/esm2022/lib/badge.component.mjs +4 -9
  11. package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
  12. package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
  13. package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
  14. package/esm2022/lib/breadcrumb.component.mjs +3 -3
  15. package/esm2022/lib/bubble.component.mjs +301 -0
  16. package/esm2022/lib/button.component.mjs +5 -11
  17. package/esm2022/lib/calendar.component.mjs +5 -11
  18. package/esm2022/lib/card.component.mjs +14 -43
  19. package/esm2022/lib/carousel/carousel.component.mjs +5 -12
  20. package/esm2022/lib/chain-of-thought.component.mjs +380 -0
  21. package/esm2022/lib/chart-pie.component.mjs +386 -0
  22. package/esm2022/lib/chart.component.mjs +1146 -0
  23. package/esm2022/lib/chart.service.mjs +555 -0
  24. package/esm2022/lib/checkbox.component.mjs +5 -11
  25. package/esm2022/lib/checkpoint.component.mjs +134 -0
  26. package/esm2022/lib/collapsible.component.mjs +4 -11
  27. package/esm2022/lib/combobox.component.mjs +372 -0
  28. package/esm2022/lib/command-dialog.component.mjs +164 -0
  29. package/esm2022/lib/command.component.mjs +514 -0
  30. package/esm2022/lib/command.service.mjs +130 -0
  31. package/esm2022/lib/confirmation.component.mjs +219 -0
  32. package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
  33. package/esm2022/lib/context-menu.component.mjs +460 -0
  34. package/esm2022/lib/context-menu.service.mjs +121 -0
  35. package/esm2022/lib/context.component.mjs +377 -0
  36. package/esm2022/lib/conversation.component.mjs +442 -0
  37. package/esm2022/lib/country-selector.component.mjs +5 -11
  38. package/esm2022/lib/data-table.component.mjs +59 -12
  39. package/esm2022/lib/date-picker.component.mjs +251 -198
  40. package/esm2022/lib/date-range-picker.component.mjs +224 -116
  41. package/esm2022/lib/date-time-picker.component.mjs +506 -0
  42. package/esm2022/lib/direction.component.mjs +79 -0
  43. package/esm2022/lib/dropdown-item.component.mjs +3 -3
  44. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  45. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  46. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  47. package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
  48. package/esm2022/lib/empty-state.component.mjs +4 -9
  49. package/esm2022/lib/field.component.mjs +394 -0
  50. package/esm2022/lib/hover-card.component.mjs +6 -16
  51. package/esm2022/lib/inline-citation.component.mjs +263 -0
  52. package/esm2022/lib/input-group.component.mjs +418 -0
  53. package/esm2022/lib/input.component.mjs +5 -11
  54. package/esm2022/lib/item.component.mjs +243 -0
  55. package/esm2022/lib/kbd.component.mjs +82 -0
  56. package/esm2022/lib/label.component.mjs +4 -9
  57. package/esm2022/lib/marker.component.mjs +135 -0
  58. package/esm2022/lib/masked-input.component.mjs +5 -11
  59. package/esm2022/lib/menubar.component.mjs +683 -0
  60. package/esm2022/lib/message-scroller.component.mjs +353 -0
  61. package/esm2022/lib/message-scroller.service.mjs +157 -0
  62. package/esm2022/lib/message.component.mjs +228 -0
  63. package/esm2022/lib/model-selector.component.mjs +310 -0
  64. package/esm2022/lib/multi-select.component.mjs +155 -72
  65. package/esm2022/lib/native-select.component.mjs +201 -0
  66. package/esm2022/lib/navigation-menu.component.mjs +642 -0
  67. package/esm2022/lib/otp-group.component.mjs +3 -3
  68. package/esm2022/lib/otp-slot.component.mjs +4 -9
  69. package/esm2022/lib/otp.component.mjs +5 -11
  70. package/esm2022/lib/pagination.component.mjs +7 -10
  71. package/esm2022/lib/plan.component.mjs +335 -0
  72. package/esm2022/lib/popover-content.component.mjs +4 -9
  73. package/esm2022/lib/popover.component.mjs +15 -13
  74. package/esm2022/lib/progress.component.mjs +4 -9
  75. package/esm2022/lib/prompt-input.component.mjs +526 -0
  76. package/esm2022/lib/queue.component.mjs +280 -0
  77. package/esm2022/lib/radio-group.component.mjs +6 -13
  78. package/esm2022/lib/radio-item.component.mjs +4 -9
  79. package/esm2022/lib/range-calendar.component.mjs +5 -11
  80. package/esm2022/lib/reasoning.component.mjs +335 -0
  81. package/esm2022/lib/resizable.component.mjs +219 -0
  82. package/esm2022/lib/segment.component.mjs +17 -7
  83. package/esm2022/lib/select-group.component.mjs +4 -8
  84. package/esm2022/lib/select-item.component.mjs +4 -9
  85. package/esm2022/lib/select-separator.component.mjs +4 -8
  86. package/esm2022/lib/select.component.mjs +133 -49
  87. package/esm2022/lib/separator.component.mjs +4 -9
  88. package/esm2022/lib/sheet.component.mjs +38 -56
  89. package/esm2022/lib/shimmer.component.mjs +84 -0
  90. package/esm2022/lib/sidebar.component.mjs +11 -1
  91. package/esm2022/lib/skeleton.component.mjs +4 -9
  92. package/esm2022/lib/sources.component.mjs +452 -0
  93. package/esm2022/lib/spinner.component.mjs +68 -0
  94. package/esm2022/lib/suggestion.component.mjs +207 -0
  95. package/esm2022/lib/switch.component.mjs +5 -11
  96. package/esm2022/lib/table.component.mjs +213 -0
  97. package/esm2022/lib/tabs.component.mjs +4 -11
  98. package/esm2022/lib/tag-input.component.mjs +5 -11
  99. package/esm2022/lib/task.component.mjs +359 -0
  100. package/esm2022/lib/textarea.component.mjs +5 -11
  101. package/esm2022/lib/theme.service.mjs +17 -6
  102. package/esm2022/lib/time-picker.component.mjs +923 -0
  103. package/esm2022/lib/toast.service.mjs +3 -2
  104. package/esm2022/lib/toaster.component.mjs +76 -39
  105. package/esm2022/lib/toggle-group.component.mjs +4 -9
  106. package/esm2022/lib/toggle.component.mjs +5 -11
  107. package/esm2022/lib/tool.component.mjs +462 -0
  108. package/esm2022/lib/typography.component.mjs +83 -0
  109. package/esm2022/lib/utils/color.mjs +140 -19
  110. package/esm2022/public-api.mjs +61 -1
  111. package/fesm2022/tolle-ui.mjs +16453 -1024
  112. package/fesm2022/tolle-ui.mjs.map +1 -1
  113. package/lib/alert-dialog.component.d.ts +10 -2
  114. package/lib/aspect-ratio.component.d.ts +20 -0
  115. package/lib/attachment.component.d.ts +101 -0
  116. package/lib/bubble.component.d.ts +112 -0
  117. package/lib/chain-of-thought.component.d.ts +166 -0
  118. package/lib/chart-pie.component.d.ts +108 -0
  119. package/lib/chart.component.d.ts +369 -0
  120. package/lib/chart.service.d.ts +222 -0
  121. package/lib/checkpoint.component.d.ts +51 -0
  122. package/lib/combobox.component.d.ts +90 -0
  123. package/lib/command-dialog.component.d.ts +53 -0
  124. package/lib/command.component.d.ts +189 -0
  125. package/lib/command.service.d.ts +67 -0
  126. package/lib/confirmation.component.d.ts +70 -0
  127. package/lib/context-menu-trigger.directive.d.ts +12 -0
  128. package/lib/context-menu.component.d.ts +41 -0
  129. package/lib/context-menu.service.d.ts +38 -0
  130. package/lib/context.component.d.ts +134 -0
  131. package/lib/conversation.component.d.ts +165 -0
  132. package/lib/data-table.component.d.ts +26 -1
  133. package/lib/date-picker.component.d.ts +72 -11
  134. package/lib/date-range-picker.component.d.ts +63 -6
  135. package/lib/date-time-picker.component.d.ts +119 -0
  136. package/lib/direction.component.d.ts +45 -0
  137. package/lib/field.component.d.ts +201 -0
  138. package/lib/inline-citation.component.d.ts +103 -0
  139. package/lib/input-group.component.d.ts +150 -0
  140. package/lib/item.component.d.ts +154 -0
  141. package/lib/kbd.component.d.ts +50 -0
  142. package/lib/marker.component.d.ts +58 -0
  143. package/lib/menubar.component.d.ts +247 -0
  144. package/lib/message-scroller.component.d.ts +159 -0
  145. package/lib/message-scroller.service.d.ts +73 -0
  146. package/lib/message.component.d.ts +128 -0
  147. package/lib/model-selector.component.d.ts +103 -0
  148. package/lib/multi-select.component.d.ts +66 -14
  149. package/lib/native-select.component.d.ts +57 -0
  150. package/lib/navigation-menu.component.d.ts +230 -0
  151. package/lib/plan.component.d.ts +120 -0
  152. package/lib/popover.component.d.ts +1 -0
  153. package/lib/prompt-input.component.d.ts +194 -0
  154. package/lib/queue.component.d.ts +106 -0
  155. package/lib/reasoning.component.d.ts +127 -0
  156. package/lib/resizable.component.d.ts +43 -0
  157. package/lib/segment.component.d.ts +13 -3
  158. package/lib/select.component.d.ts +37 -5
  159. package/lib/sheet.component.d.ts +3 -0
  160. package/lib/shimmer.component.d.ts +38 -0
  161. package/lib/sidebar.component.d.ts +2 -0
  162. package/lib/sources.component.d.ts +156 -0
  163. package/lib/spinner.component.d.ts +29 -0
  164. package/lib/suggestion.component.d.ts +96 -0
  165. package/lib/table.component.d.ts +106 -0
  166. package/lib/task.component.d.ts +151 -0
  167. package/lib/theme.service.d.ts +9 -0
  168. package/lib/time-picker.component.d.ts +243 -0
  169. package/lib/toast.service.d.ts +3 -1
  170. package/lib/toaster.component.d.ts +26 -9
  171. package/lib/tool.component.d.ts +158 -0
  172. package/lib/typography.component.d.ts +32 -0
  173. package/lib/utils/color.d.ts +19 -5
  174. package/package.json +1 -1
  175. package/public-api.d.ts +50 -0
  176. package/registry/docs-content.json +8480 -1542
  177. package/registry/llms-full.txt +2679 -319
  178. package/registry/llms.txt +43 -4
  179. package/registry/manifest.json +9090 -1742
  180. package/registry/r/accordion-item.json +1 -1
  181. package/registry/r/accordion.json +1 -1
  182. package/registry/r/alert-dialog-dynamic.json +1 -1
  183. package/registry/r/alert-dialog.json +1 -1
  184. package/registry/r/alert.json +1 -1
  185. package/registry/r/attachment.json +23 -0
  186. package/registry/r/avatar-fallback.json +1 -1
  187. package/registry/r/avatar.json +1 -1
  188. package/registry/r/badge.json +1 -1
  189. package/registry/r/breadcrumb-item.json +1 -1
  190. package/registry/r/breadcrumb-link.json +1 -1
  191. package/registry/r/breadcrumb-separator.json +1 -1
  192. package/registry/r/breadcrumb.json +1 -1
  193. package/registry/r/bubble.json +23 -0
  194. package/registry/r/button.json +1 -1
  195. package/registry/r/calendar.json +1 -1
  196. package/registry/r/card.json +1 -1
  197. package/registry/r/carousel.json +1 -1
  198. package/registry/r/chain-of-thought.json +23 -0
  199. package/registry/r/chart-pie.json +30 -0
  200. package/registry/r/chart.json +28 -0
  201. package/registry/r/checkbox.json +1 -1
  202. package/registry/r/checkpoint.json +23 -0
  203. package/registry/r/collapsible.json +1 -1
  204. package/registry/r/combobox.json +31 -0
  205. package/registry/r/command-dialog.json +21 -0
  206. package/registry/r/command.json +26 -0
  207. package/registry/r/confirmation.json +23 -0
  208. package/registry/r/context.json +26 -0
  209. package/registry/r/conversation.json +23 -0
  210. package/registry/r/country-selector.json +1 -1
  211. package/registry/r/data-table.json +1 -1
  212. package/registry/r/date-picker.json +4 -4
  213. package/registry/r/date-range-picker.json +3 -3
  214. package/registry/r/date-time-picker.json +28 -0
  215. package/registry/r/direction.json +16 -0
  216. package/registry/r/dropdown-item.json +1 -1
  217. package/registry/r/dropdown-label.json +1 -1
  218. package/registry/r/dropdown-menu.json +1 -1
  219. package/registry/r/dropdown-separator.json +1 -1
  220. package/registry/r/dropdown-trigger.json +1 -1
  221. package/registry/r/empty-state.json +1 -1
  222. package/registry/r/field.json +23 -0
  223. package/registry/r/hover-card.json +1 -1
  224. package/registry/r/inline-citation.json +26 -0
  225. package/registry/r/input-group.json +23 -0
  226. package/registry/r/input.json +1 -1
  227. package/registry/r/item.json +23 -0
  228. package/registry/r/kbd.json +23 -0
  229. package/registry/r/label.json +1 -1
  230. package/registry/r/marker.json +23 -0
  231. package/registry/r/masked-input.json +1 -1
  232. package/registry/r/menubar.json +24 -0
  233. package/registry/r/message-scroller.json +26 -0
  234. package/registry/r/message.json +23 -0
  235. package/registry/r/model-selector.json +32 -0
  236. package/registry/r/multi-select.json +2 -2
  237. package/registry/r/native-select.json +23 -0
  238. package/registry/r/navigation-menu.json +24 -0
  239. package/registry/r/otp-group.json +1 -1
  240. package/registry/r/otp-slot.json +1 -1
  241. package/registry/r/otp.json +1 -1
  242. package/registry/r/pagination.json +3 -2
  243. package/registry/r/plan.json +23 -0
  244. package/registry/r/popover-content.json +1 -1
  245. package/registry/r/popover.json +1 -1
  246. package/registry/r/progress.json +1 -1
  247. package/registry/r/prompt-input.json +23 -0
  248. package/registry/r/queue.json +23 -0
  249. package/registry/r/radio-group.json +1 -1
  250. package/registry/r/radio-item.json +1 -1
  251. package/registry/r/range-calendar.json +1 -1
  252. package/registry/r/reasoning.json +23 -0
  253. package/registry/r/segment.json +1 -1
  254. package/registry/r/select-group.json +1 -1
  255. package/registry/r/select-item.json +1 -1
  256. package/registry/r/select-separator.json +1 -1
  257. package/registry/r/select.json +4 -3
  258. package/registry/r/separator.json +1 -1
  259. package/registry/r/sheet.json +1 -1
  260. package/registry/r/shimmer.json +23 -0
  261. package/registry/r/sidebar.json +1 -1
  262. package/registry/r/skeleton.json +1 -1
  263. package/registry/r/sources.json +23 -0
  264. package/registry/r/spinner.json +23 -0
  265. package/registry/r/suggestion.json +23 -0
  266. package/registry/r/switch.json +1 -1
  267. package/registry/r/table.json +21 -0
  268. package/registry/r/tabs.json +1 -1
  269. package/registry/r/tag-input.json +1 -1
  270. package/registry/r/task.json +23 -0
  271. package/registry/r/textarea.json +1 -1
  272. package/registry/r/time-picker.json +24 -0
  273. package/registry/r/toaster.json +2 -2
  274. package/registry/r/toggle-group.json +1 -1
  275. package/registry/r/toggle.json +1 -1
  276. package/registry/r/tool.json +23 -0
  277. package/registry/r/typography.json +23 -0
  278. package/registry/registry.json +915 -22
  279. package/theme.css +109 -8
@@ -0,0 +1,462 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Directive, EventEmitter, Injectable, Input, Output, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { BehaviorSubject, Subscription } from 'rxjs';
4
+ import { skip } from 'rxjs/operators';
5
+ import { cva } from 'class-variance-authority';
6
+ import { cn } from './utils/cn';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ const toolStateVariants = cva('inline-flex shrink-0 items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium', {
10
+ variants: {
11
+ state: {
12
+ pending: 'bg-muted text-muted-foreground',
13
+ running: 'bg-info/10 text-info',
14
+ success: 'bg-success/10 text-success',
15
+ error: 'bg-destructive/10 text-destructive',
16
+ },
17
+ },
18
+ defaultVariants: {
19
+ state: 'pending',
20
+ },
21
+ });
22
+ /** Remixicon class shown in the state chip for each state. */
23
+ const TOOL_STATE_ICONS = {
24
+ pending: 'ri-time-line',
25
+ running: 'ri-loader-4-line animate-spin',
26
+ success: 'ri-check-line',
27
+ error: 'ri-error-warning-line',
28
+ };
29
+ /** Default chip text for each state. */
30
+ const TOOL_STATE_LABELS = {
31
+ pending: 'Pending',
32
+ running: 'Running',
33
+ success: 'Completed',
34
+ error: 'Error',
35
+ };
36
+ /**
37
+ * Coordinates a `tolle-tool` with its header, input and output.
38
+ *
39
+ * Header/input/output are OnPush siblings projected into the tool, so the
40
+ * shared open + state they render from is published here.
41
+ *
42
+ * Provided on `ToolComponent`, so each tool call gets its own instance.
43
+ */
44
+ export class ToolService {
45
+ openSource = new BehaviorSubject(false);
46
+ /** Emits whether the tool call is expanded. */
47
+ open$ = this.openSource.asObservable();
48
+ stateSource = new BehaviorSubject('pending');
49
+ /** Emits the tool call's lifecycle state. */
50
+ state$ = this.stateSource.asObservable();
51
+ /** True while the tool call is expanded. */
52
+ get open() {
53
+ return this.openSource.value;
54
+ }
55
+ /** The tool call's current state. */
56
+ get state() {
57
+ return this.stateSource.value;
58
+ }
59
+ setOpen(value) {
60
+ if (this.openSource.value !== value)
61
+ this.openSource.next(value);
62
+ }
63
+ toggle() {
64
+ this.setOpen(!this.openSource.value);
65
+ }
66
+ setState(state) {
67
+ if (this.stateSource.value !== state)
68
+ this.stateSource.next(state);
69
+ }
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
71
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolService });
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolService, decorators: [{
74
+ type: Injectable
75
+ }] });
76
+ const toolVariants = cva('w-full overflow-hidden rounded-md border bg-card text-card-foreground', {
77
+ variants: {
78
+ state: {
79
+ pending: 'border-border',
80
+ running: 'border-info/40',
81
+ success: 'border-border',
82
+ error: 'border-destructive/40',
83
+ },
84
+ },
85
+ defaultVariants: {
86
+ state: 'pending',
87
+ },
88
+ });
89
+ /**
90
+ * A collapsible record of one tool/function call: what was invoked, the
91
+ * arguments it received and the result it returned.
92
+ *
93
+ * Compose it from `tolle-tool-header`, `tolle-tool-input` and
94
+ * `tolle-tool-output`.
95
+ * @new
96
+ */
97
+ export class ToolComponent {
98
+ /** Lifecycle of the call, driving the header chip and border. @default 'pending' */
99
+ state = 'pending';
100
+ /** Whether the call's input and output are expanded. @default false */
101
+ open = false;
102
+ /** Extra Tailwind classes merged onto the tool via `cn()` (last-wins). */
103
+ class = '';
104
+ /** Emitted with the new state whenever the call is expanded or collapsed. */
105
+ openChange = new EventEmitter();
106
+ service = inject(ToolService);
107
+ cdr = inject(ChangeDetectorRef);
108
+ subscriptions = new Subscription();
109
+ /** True while an `open` input is being pushed into the service. */
110
+ applyingInput = false;
111
+ ngOnInit() {
112
+ this.service.setOpen(this.open);
113
+ this.service.setState(this.state);
114
+ // `skip(1)` drops the BehaviorSubject's current value so mounting never
115
+ // emits a spurious `openChange`.
116
+ this.subscriptions.add(this.service.open$.pipe(skip(1)).subscribe((open) => {
117
+ this.open = open;
118
+ this.cdr.markForCheck();
119
+ // Only user-driven toggles are worth reporting; echoing a change the
120
+ // parent just made would fight a `[(open)]` binding.
121
+ if (!this.applyingInput)
122
+ this.openChange.emit(open);
123
+ }));
124
+ }
125
+ ngOnChanges(changes) {
126
+ if (changes['open'])
127
+ this.applyInput(this.open);
128
+ this.service.setState(this.state);
129
+ // A bound `class` input is written through Angular's styling path,
130
+ // which does not mark an OnPush view dirty on its own.
131
+ this.cdr.markForCheck();
132
+ }
133
+ applyInput(open) {
134
+ this.applyingInput = true;
135
+ try {
136
+ this.service.setOpen(open);
137
+ }
138
+ finally {
139
+ this.applyingInput = false;
140
+ }
141
+ }
142
+ ngOnDestroy() {
143
+ this.subscriptions.unsubscribe();
144
+ }
145
+ get computedClass() {
146
+ return cn(toolVariants({ state: this.state }), this.class);
147
+ }
148
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
149
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ToolComponent, isStandalone: true, selector: "tolle-tool", inputs: { state: "state", open: "open", class: "class" }, outputs: { openChange: "openChange" }, providers: [ToolService], usesOnChanges: true, ngImport: i0, template: `
150
+ <div [class]="computedClass" [attr.data-state]="open ? 'open' : 'closed'">
151
+ <ng-content></ng-content>
152
+ </div>
153
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
154
+ }
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolComponent, decorators: [{
156
+ type: Component,
157
+ args: [{ selector: 'tolle-tool', standalone: true, imports: [CommonModule], providers: [ToolService], changeDetection: ChangeDetectionStrategy.OnPush, template: `
158
+ <div [class]="computedClass" [attr.data-state]="open ? 'open' : 'closed'">
159
+ <ng-content></ng-content>
160
+ </div>
161
+ `, styles: [":host{display:block}\n"] }]
162
+ }], propDecorators: { state: [{
163
+ type: Input
164
+ }], open: [{
165
+ type: Input
166
+ }], class: [{
167
+ type: Input
168
+ }], openChange: [{
169
+ type: Output
170
+ }] } });
171
+ /** Clickable header of a `tolle-tool`: the tool's name plus its state chip. */
172
+ export class ToolHeaderComponent {
173
+ /**
174
+ * Angular writes a bound `class` input through its styling path, which does
175
+ * not mark an OnPush component dirty — without this hook the component keeps
176
+ * rendering the class it was born with.
177
+ */
178
+ ngOnChanges() {
179
+ this.cdr.markForCheck();
180
+ }
181
+ /** Name of the tool that was called. @default '' */
182
+ name = '';
183
+ /** Remixicon class shown before the tool name. @default 'ri-tools-line' */
184
+ icon = 'ri-tools-line';
185
+ /** Overrides the chip text; defaults to a label derived from the state. @default '' */
186
+ stateLabelOverride = '';
187
+ /** Extra Tailwind classes merged onto the header via `cn()` (last-wins). */
188
+ class = '';
189
+ /** Extra Tailwind classes merged onto the state chip via `cn()` (last-wins). */
190
+ chipClassName = '';
191
+ service = inject(ToolService);
192
+ cdr = inject(ChangeDetectorRef);
193
+ subscriptions = new Subscription();
194
+ open = false;
195
+ state = 'pending';
196
+ ngOnInit() {
197
+ this.subscriptions.add(this.service.open$.subscribe((open) => {
198
+ this.open = open;
199
+ this.cdr.markForCheck();
200
+ }));
201
+ this.subscriptions.add(this.service.state$.subscribe((state) => {
202
+ this.state = state;
203
+ this.cdr.markForCheck();
204
+ }));
205
+ }
206
+ ngOnDestroy() {
207
+ this.subscriptions.unsubscribe();
208
+ }
209
+ get stateIcon() {
210
+ return TOOL_STATE_ICONS[this.state];
211
+ }
212
+ get stateLabel() {
213
+ return this.stateLabelOverride || TOOL_STATE_LABELS[this.state];
214
+ }
215
+ get chipClass() {
216
+ return cn(toolStateVariants({ state: this.state }), this.chipClassName);
217
+ }
218
+ get computedClass() {
219
+ return cn('flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors', 'hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring', this.class);
220
+ }
221
+ onToggle() {
222
+ this.service.toggle();
223
+ }
224
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
225
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ToolHeaderComponent, isStandalone: true, selector: "tolle-tool-header", inputs: { name: "name", icon: "icon", stateLabelOverride: "stateLabelOverride", class: "class", chipClassName: "chipClassName" }, usesOnChanges: true, ngImport: i0, template: `
226
+ <button
227
+ type="button"
228
+ data-tool-header
229
+ [attr.aria-expanded]="open"
230
+ [attr.data-state]="open ? 'open' : 'closed'"
231
+ [class]="computedClass"
232
+ (click)="onToggle()"
233
+ >
234
+ <i [class]="icon" class="shrink-0 text-muted-foreground" aria-hidden="true"></i>
235
+
236
+ <span class="truncate font-medium text-foreground" data-tool-name>{{ name }}</span>
237
+
238
+ <span [class]="chipClass" data-tool-state>
239
+ <i [class]="stateIcon" aria-hidden="true"></i>
240
+ {{ stateLabel }}
241
+ </span>
242
+
243
+ <i
244
+ class="ri-arrow-down-s-line shrink-0 text-muted-foreground transition-transform duration-200"
245
+ [class.rotate-180]="open"
246
+ aria-hidden="true"
247
+ ></i>
248
+
249
+ <ng-content></ng-content>
250
+ </button>
251
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
252
+ }
253
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolHeaderComponent, decorators: [{
254
+ type: Component,
255
+ args: [{ selector: 'tolle-tool-header', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
256
+ <button
257
+ type="button"
258
+ data-tool-header
259
+ [attr.aria-expanded]="open"
260
+ [attr.data-state]="open ? 'open' : 'closed'"
261
+ [class]="computedClass"
262
+ (click)="onToggle()"
263
+ >
264
+ <i [class]="icon" class="shrink-0 text-muted-foreground" aria-hidden="true"></i>
265
+
266
+ <span class="truncate font-medium text-foreground" data-tool-name>{{ name }}</span>
267
+
268
+ <span [class]="chipClass" data-tool-state>
269
+ <i [class]="stateIcon" aria-hidden="true"></i>
270
+ {{ stateLabel }}
271
+ </span>
272
+
273
+ <i
274
+ class="ri-arrow-down-s-line shrink-0 text-muted-foreground transition-transform duration-200"
275
+ [class.rotate-180]="open"
276
+ aria-hidden="true"
277
+ ></i>
278
+
279
+ <ng-content></ng-content>
280
+ </button>
281
+ `, styles: [":host{display:block}\n"] }]
282
+ }], propDecorators: { name: [{
283
+ type: Input
284
+ }], icon: [{
285
+ type: Input
286
+ }], stateLabelOverride: [{
287
+ type: Input
288
+ }], class: [{
289
+ type: Input
290
+ }], chipClassName: [{
291
+ type: Input
292
+ }] } });
293
+ /**
294
+ * Base for the two payload panels. Owns the shared "visible only while the
295
+ * tool is expanded" wiring and the payload-to-text formatting.
296
+ *
297
+ * Decorated with a selector-less `@Directive()` because it uses Angular
298
+ * features (DI and lifecycle hooks) on behalf of its subclasses.
299
+ */
300
+ export class ToolPayloadBase {
301
+ /**
302
+ * Angular writes a bound `class` input through its styling path, which does
303
+ * not mark an OnPush component dirty — without this hook subclasses keep
304
+ * rendering the class they were born with.
305
+ */
306
+ ngOnChanges() {
307
+ this.cdr.markForCheck();
308
+ }
309
+ /** Payload to render; objects are pretty-printed as JSON, strings are shown as-is. */
310
+ payload = null;
311
+ service = inject(ToolService);
312
+ cdr = inject(ChangeDetectorRef);
313
+ subscriptions = new Subscription();
314
+ open = false;
315
+ ngOnInit() {
316
+ this.subscriptions.add(this.service.open$.subscribe((open) => {
317
+ this.open = open;
318
+ this.cdr.markForCheck();
319
+ }));
320
+ }
321
+ ngOnDestroy() {
322
+ this.subscriptions.unsubscribe();
323
+ }
324
+ /** True once there is a payload worth rendering. */
325
+ get hasPayload() {
326
+ return this.payload !== null && this.payload !== undefined && this.payload !== '';
327
+ }
328
+ /** The payload as display text. Falls back to `String()` for cyclic values. */
329
+ get formatted() {
330
+ if (typeof this.payload === 'string')
331
+ return this.payload;
332
+ try {
333
+ return JSON.stringify(this.payload, null, 2) ?? String(this.payload);
334
+ }
335
+ catch {
336
+ return String(this.payload);
337
+ }
338
+ }
339
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolPayloadBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
340
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: ToolPayloadBase, usesOnChanges: true, ngImport: i0 });
341
+ }
342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolPayloadBase, decorators: [{
343
+ type: Directive
344
+ }] });
345
+ /** Arguments the tool was called with. Visible while the `tolle-tool` is expanded. */
346
+ export class ToolInputComponent extends ToolPayloadBase {
347
+ /** Arguments passed to the tool; objects are pretty-printed as JSON. @default null */
348
+ payload = null;
349
+ /** Heading above the payload. @default 'Parameters' */
350
+ label = 'Parameters';
351
+ /** Extra Tailwind classes merged onto the panel via `cn()` (last-wins). */
352
+ class = '';
353
+ get computedClass() {
354
+ return cn('flex flex-col gap-1.5 border-t border-border px-3 py-2', this.class);
355
+ }
356
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
357
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ToolInputComponent, isStandalone: true, selector: "tolle-tool-input", inputs: { payload: "payload", label: "label", class: "class" }, usesInheritance: true, ngImport: i0, template: `
358
+ <div *ngIf="open" data-tool-input [class]="computedClass">
359
+ <p *ngIf="label" class="text-xs font-medium uppercase tracking-wide text-muted-foreground">
360
+ {{ label }}
361
+ </p>
362
+
363
+ <pre
364
+ *ngIf="hasPayload; else projected"
365
+ class="max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground"
366
+ >{{ formatted }}</pre>
367
+
368
+ <ng-template #projected>
369
+ <div class="max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground">
370
+ <ng-content></ng-content>
371
+ </div>
372
+ </ng-template>
373
+ </div>
374
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
375
+ }
376
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolInputComponent, decorators: [{
377
+ type: Component,
378
+ args: [{ selector: 'tolle-tool-input', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
379
+ <div *ngIf="open" data-tool-input [class]="computedClass">
380
+ <p *ngIf="label" class="text-xs font-medium uppercase tracking-wide text-muted-foreground">
381
+ {{ label }}
382
+ </p>
383
+
384
+ <pre
385
+ *ngIf="hasPayload; else projected"
386
+ class="max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground"
387
+ >{{ formatted }}</pre>
388
+
389
+ <ng-template #projected>
390
+ <div class="max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground">
391
+ <ng-content></ng-content>
392
+ </div>
393
+ </ng-template>
394
+ </div>
395
+ `, styles: [":host{display:block}\n"] }]
396
+ }], propDecorators: { payload: [{
397
+ type: Input
398
+ }], label: [{
399
+ type: Input
400
+ }], class: [{
401
+ type: Input
402
+ }] } });
403
+ /** Result the tool returned. Visible while the `tolle-tool` is expanded. */
404
+ export class ToolOutputComponent extends ToolPayloadBase {
405
+ /** Result returned by the tool; objects are pretty-printed as JSON. @default null */
406
+ payload = null;
407
+ /** Heading above the payload. @default 'Result' */
408
+ label = 'Result';
409
+ /** Styles the payload as a failure. @default false */
410
+ error = false;
411
+ /** Extra Tailwind classes merged onto the panel via `cn()` (last-wins). */
412
+ class = '';
413
+ get payloadClass() {
414
+ return cn('max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground', this.error && 'bg-destructive/10 text-destructive');
415
+ }
416
+ get computedClass() {
417
+ return cn('flex flex-col gap-1.5 border-t border-border px-3 py-2', this.class);
418
+ }
419
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolOutputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
420
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ToolOutputComponent, isStandalone: true, selector: "tolle-tool-output", inputs: { payload: "payload", label: "label", error: "error", class: "class" }, usesInheritance: true, ngImport: i0, template: `
421
+ <div *ngIf="open" data-tool-output [class]="computedClass">
422
+ <p *ngIf="label" class="text-xs font-medium uppercase tracking-wide text-muted-foreground">
423
+ {{ label }}
424
+ </p>
425
+
426
+ <pre *ngIf="hasPayload; else projected" [class]="payloadClass">{{ formatted }}</pre>
427
+
428
+ <ng-template #projected>
429
+ <div [class]="payloadClass">
430
+ <ng-content></ng-content>
431
+ </div>
432
+ </ng-template>
433
+ </div>
434
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
435
+ }
436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolOutputComponent, decorators: [{
437
+ type: Component,
438
+ args: [{ selector: 'tolle-tool-output', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
439
+ <div *ngIf="open" data-tool-output [class]="computedClass">
440
+ <p *ngIf="label" class="text-xs font-medium uppercase tracking-wide text-muted-foreground">
441
+ {{ label }}
442
+ </p>
443
+
444
+ <pre *ngIf="hasPayload; else projected" [class]="payloadClass">{{ formatted }}</pre>
445
+
446
+ <ng-template #projected>
447
+ <div [class]="payloadClass">
448
+ <ng-content></ng-content>
449
+ </div>
450
+ </ng-template>
451
+ </div>
452
+ `, styles: [":host{display:block}\n"] }]
453
+ }], propDecorators: { payload: [{
454
+ type: Input
455
+ }], label: [{
456
+ type: Input
457
+ }], error: [{
458
+ type: Input
459
+ }], class: [{
460
+ type: Input
461
+ }] } });
462
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL3Rvb2wuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBRWhDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUMzQixzRkFBc0YsRUFDdEY7SUFDRSxRQUFRLEVBQUU7UUFDUixLQUFLLEVBQUU7WUFDTCxPQUFPLEVBQUUsZ0NBQWdDO1lBQ3pDLE9BQU8sRUFBRSxzQkFBc0I7WUFDL0IsT0FBTyxFQUFFLDRCQUE0QjtZQUNyQyxLQUFLLEVBQUUsb0NBQW9DO1NBQzVDO0tBQ0Y7SUFDRCxlQUFlLEVBQUU7UUFDZixLQUFLLEVBQUUsU0FBUztLQUNqQjtDQUNGLENBQ0YsQ0FBQztBQU9GLDhEQUE4RDtBQUM5RCxNQUFNLGdCQUFnQixHQUE4QjtJQUNsRCxPQUFPLEVBQUUsY0FBYztJQUN2QixPQUFPLEVBQUUsK0JBQStCO0lBQ3hDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLEtBQUssRUFBRSx1QkFBdUI7Q0FDL0IsQ0FBQztBQUVGLHdDQUF3QztBQUN4QyxNQUFNLGlCQUFpQixHQUE4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bkUsT0FBTyxHQUFZLElBQUksQ0FBQztJQUMxQyxtREFBbUQ7SUFDMUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztJQUMxQixzREFBc0Q7SUFDN0MsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QiwyRUFBMkU7SUFDbEUsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVwQixJQUFJLFlBQVk7UUFDZCxPQUFPLEVBQUUsQ0FDUCxrRkFBa0YsRUFDbEYsSUFBSSxDQUFDLEtBQUssSUFBSSxvQ0FBb0MsQ0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEYsQ0FBQzt3R0FuQlUsbUJBQW1COzRGQUFuQixtQkFBbUIsb0xBaEJwQjs7Ozs7Ozs7Ozs7Ozs7R0FjVCwrRkFoQlMsWUFBWTs7NEZBa0JYLG1CQUFtQjtrQkF0Qi9CLFNBQVM7K0JBQ0UsbUJBQW1CLGNBRWpCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7OztHQWNUOzhCQUlpQixPQUFPO3NCQUF4QixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuY29uc3QgdG9vbFN0YXRlVmFyaWFudHMgPSBjdmEoXG4gICdpbmxpbmUtZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1mdWxsIHB4LTIgcHktMC41IHRleHQteHMgZm9udC1tZWRpdW0nLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIHBlbmRpbmc6ICdiZy1tdXRlZCB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgICBydW5uaW5nOiAnYmctaW5mby8xMCB0ZXh0LWluZm8nLFxuICAgICAgICBzdWNjZXNzOiAnYmctc3VjY2Vzcy8xMCB0ZXh0LXN1Y2Nlc3MnLFxuICAgICAgICBlcnJvcjogJ2JnLWRlc3RydWN0aXZlLzEwIHRleHQtZGVzdHJ1Y3RpdmUnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgc3RhdGU6ICdwZW5kaW5nJyxcbiAgICB9LFxuICB9XG4pO1xuXG5leHBvcnQgdHlwZSBUb29sU3RhdGVQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgdG9vbFN0YXRlVmFyaWFudHM+O1xuXG4vKiogTGlmZWN5Y2xlIG9mIGEgdG9vbCBjYWxsLiAqL1xuZXhwb3J0IHR5cGUgVG9vbFN0YXRlID0gTm9uTnVsbGFibGU8VG9vbFN0YXRlUHJvcHNbJ3N0YXRlJ10+O1xuXG4vKiogUmVtaXhpY29uIGNsYXNzIHNob3duIGluIHRoZSBzdGF0ZSBjaGlwIGZvciBlYWNoIHN0YXRlLiAqL1xuY29uc3QgVE9PTF9TVEFURV9JQ09OUzogUmVjb3JkPFRvb2xTdGF0ZSwgc3RyaW5nPiA9IHtcbiAgcGVuZGluZzogJ3JpLXRpbWUtbGluZScsXG4gIHJ1bm5pbmc6ICdyaS1sb2FkZXItNC1saW5lIGFuaW1hdGUtc3BpbicsXG4gIHN1Y2Nlc3M6ICdyaS1jaGVjay1saW5lJyxcbiAgZXJyb3I6ICdyaS1lcnJvci13YXJuaW5nLWxpbmUnLFxufTtcblxuLyoqIERlZmF1bHQgY2hpcCB0ZXh0IGZvciBlYWNoIHN0YXRlLiAqL1xuY29uc3QgVE9PTF9TVEFURV9MQUJFTFM6IFJlY29yZDxUb29sU3RhdGUsIHN0cmluZz4gPSB7XG4gIHBlbmRpbmc6ICdQZW5kaW5nJyxcbiAgcnVubmluZzogJ1J1bm5pbmcnLFxuICBzdWNjZXNzOiAnQ29tcGxldGVkJyxcbiAgZXJyb3I6ICdFcnJvcicsXG59O1xuXG4vKipcbiAqIENvb3JkaW5hdGVzIGEgYHRvbGxlLXRvb2xgIHdpdGggaXRzIGhlYWRlciwgaW5wdXQgYW5kIG91dHB1dC5cbiAqXG4gKiBIZWFkZXIvaW5wdXQvb3V0cHV0IGFyZSBPblB1c2ggc2libGluZ3MgcHJvamVjdGVkIGludG8gdGhlIHRvb2wsIHNvIHRoZVxuICogc2hhcmVkIG9wZW4gKyBzdGF0ZSB0aGV5IHJlbmRlciBmcm9tIGlzIHB1Ymxpc2hlZCBoZXJlLlxuICpcbiAqIFByb3ZpZGVkIG9uIGBUb29sQ29tcG9uZW50YCwgc28gZWFjaCB0b29sIGNhbGwgZ2V0cyBpdHMgb3duIGluc3RhbmNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVG9vbFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wZW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEVtaXRzIHdoZXRoZXIgdGhlIHRvb2wgY2FsbCBpcyBleHBhbmRlZC4gKi9cbiAgcmVhZG9ubHkgb3BlbiQgPSB0aGlzLm9wZW5Tb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VG9vbFN0YXRlPigncGVuZGluZycpO1xuICAvKiogRW1pdHMgdGhlIHRvb2wgY2FsbCdzIGxpZmVjeWNsZSBzdGF0ZS4gKi9cbiAgcmVhZG9ubHkgc3RhdGUkID0gdGhpcy5zdGF0ZVNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICAvKiogVHJ1ZSB3aGlsZSB0aGUgdG9vbCBjYWxsIGlzIGV4cGFuZGVkLiAqL1xuICBnZXQgb3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuU291cmNlLnZhbHVlO1xuICB9XG5cbiAgLyoqIFRoZSB0b29sIGNhbGwncyBjdXJyZW50IHN0YXRlLiAqL1xuICBnZXQgc3RhdGUoKTogVG9vbFN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVNvdXJjZS52YWx1ZTtcbiAgfVxuXG4gIHNldE9wZW4odmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuU291cmNlLnZhbHVlICE9PSB2YWx1ZSkgdGhpcy5vcGVuU291cmNlLm5leHQodmFsdWUpO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3BlbighdGhpcy5vcGVuU291cmNlLnZhbHVlKTtcbiAgfVxuXG4gIHNldFN0YXRlKHN0YXRlOiBUb29sU3RhdGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZVNvdXJjZS52YWx1ZSAhPT0gc3RhdGUpIHRoaXMuc3RhdGVTb3VyY2UubmV4dChzdGF0ZSk7XG4gIH1cbn1cblxuY29uc3QgdG9vbFZhcmlhbnRzID0gY3ZhKCd3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHBlbmRpbmc6ICdib3JkZXItYm9yZGVyJyxcbiAgICAgIHJ1bm5pbmc6ICdib3JkZXItaW5mby80MCcsXG4gICAgICBzdWNjZXNzOiAnYm9yZGVyLWJvcmRlcicsXG4gICAgICBlcnJvcjogJ2JvcmRlci1kZXN0cnVjdGl2ZS80MCcsXG4gICAgfSxcbiAgfSxcbiAgZGVmYXVsdFZhcmlhbnRzOiB7XG4gICAgc3RhdGU6ICdwZW5kaW5nJyxcbiAgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBUb29sUHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIHRvb2xWYXJpYW50cz47XG5cbi8qKlxuICogQSBjb2xsYXBzaWJsZSByZWNvcmQgb2Ygb25lIHRvb2wvZnVuY3Rpb24gY2FsbDogd2hhdCB3YXMgaW52b2tlZCwgdGhlXG4gKiBhcmd1bWVudHMgaXQgcmVjZWl2ZWQgYW5kIHRoZSByZXN1bHQgaXQgcmV0dXJuZWQuXG4gKlxuICogQ29tcG9zZSBpdCBmcm9tIGB0b2xsZS10b29sLWhlYWRlcmAsIGB0b2xsZS10b29sLWlucHV0YCBhbmRcbiAqIGB0b2xsZS10b29sLW91dHB1dGAuXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvb2wnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbVG9vbFNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCIgW2F0dHIuZGF0YS1zdGF0ZV09XCJvcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCdcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgVG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogTGlmZWN5Y2xlIG9mIHRoZSBjYWxsLCBkcml2aW5nIHRoZSBoZWFkZXIgY2hpcCBhbmQgYm9yZGVyLiBAZGVmYXVsdCAncGVuZGluZycgKi9cbiAgQElucHV0KCkgc3RhdGU6IFRvb2xTdGF0ZSA9ICdwZW5kaW5nJztcbiAgLyoqIFdoZXRoZXIgdGhlIGNhbGwncyBpbnB1dCBhbmQgb3V0cHV0IGFyZSBleHBhbmRlZC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgb3BlbiA9IGZhbHNlO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdG9vbCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIC8qKiBFbWl0dGVkIHdpdGggdGhlIG5ldyBzdGF0ZSB3aGVuZXZlciB0aGUgY2FsbCBpcyBleHBhbmRlZCBvciBjb2xsYXBzZWQuICovXG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChUb29sU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAvKiogVHJ1ZSB3aGlsZSBhbiBgb3BlbmAgaW5wdXQgaXMgYmVpbmcgcHVzaGVkIGludG8gdGhlIHNlcnZpY2UuICovXG4gIHByaXZhdGUgYXBwbHlpbmdJbnB1dCA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5zZXRPcGVuKHRoaXMub3Blbik7XG4gICAgdGhpcy5zZXJ2aWNlLnNldFN0YXRlKHRoaXMuc3RhdGUpO1xuICAgIC8vIGBza2lwKDEpYCBkcm9wcyB0aGUgQmVoYXZpb3JTdWJqZWN0J3MgY3VycmVudCB2YWx1ZSBzbyBtb3VudGluZyBuZXZlclxuICAgIC8vIGVtaXRzIGEgc3B1cmlvdXMgYG9wZW5DaGFuZ2VgLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnNlcnZpY2Uub3BlbiQucGlwZShza2lwKDEpKS5zdWJzY3JpYmUoKG9wZW4pID0+IHtcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIC8vIE9ubHkgdXNlci1kcml2ZW4gdG9nZ2xlcyBhcmUgd29ydGggcmVwb3J0aW5nOyBlY2hvaW5nIGEgY2hhbmdlIHRoZVxuICAgICAgICAvLyBwYXJlbnQganVzdCBtYWRlIHdvdWxkIGZpZ2h0IGEgYFsob3BlbildYCBiaW5kaW5nLlxuICAgICAgICBpZiAoIXRoaXMuYXBwbHlpbmdJbnB1dCkgdGhpcy5vcGVuQ2hhbmdlLmVtaXQob3Blbik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ29wZW4nXSkgdGhpcy5hcHBseUlucHV0KHRoaXMub3Blbik7XG4gICAgdGhpcy5zZXJ2aWNlLnNldFN0YXRlKHRoaXMuc3RhdGUpO1xuICBcbiAgICAvLyBBIGJvdW5kIGBjbGFzc2AgaW5wdXQgaXMgd3JpdHRlbiB0aHJvdWdoIEFuZ3VsYXIncyBzdHlsaW5nIHBhdGgsXG4gICAgLy8gd2hpY2ggZG9lcyBub3QgbWFyayBhbiBPblB1c2ggdmlldyBkaXJ0eSBvbiBpdHMgb3duLlxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUlucHV0KG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5aW5nSW5wdXQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNlcnZpY2Uuc2V0T3BlbihvcGVuKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHBseWluZ0lucHV0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24odG9vbFZhcmlhbnRzKHsgc3RhdGU6IHRoaXMuc3RhdGUgfSksIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKiBDbGlja2FibGUgaGVhZGVyIG9mIGEgYHRvbGxlLXRvb2xgOiB0aGUgdG9vbCdzIG5hbWUgcGx1cyBpdHMgc3RhdGUgY2hpcC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvb2wtaGVhZGVyJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS10b29sLWhlYWRlclxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuXCJcbiAgICAgIFthdHRyLmRhdGEtc3RhdGVdPVwib3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnXCJcbiAgICAgIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCJcbiAgICAgIChjbGljayk9XCJvblRvZ2dsZSgpXCJcbiAgICA+XG4gICAgICA8aSBbY2xhc3NdPVwiaWNvblwiIGNsYXNzPVwic2hyaW5rLTAgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuXG4gICAgICA8c3BhbiBjbGFzcz1cInRydW5jYXRlIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdG9vbC1uYW1lPnt7IG5hbWUgfX08L3NwYW4+XG5cbiAgICAgIDxzcGFuIFtjbGFzc109XCJjaGlwQ2xhc3NcIiBkYXRhLXRvb2wtc3RhdGU+XG4gICAgICAgIDxpIFtjbGFzc109XCJzdGF0ZUljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIHt7IHN0YXRlTGFiZWwgfX1cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJyaS1hcnJvdy1kb3duLXMtbGluZSBzaHJpbmstMCB0ZXh0LW11dGVkLWZvcmVncm91bmQgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwXCJcbiAgICAgICAgW2NsYXNzLnJvdGF0ZS0xODBdPVwib3BlblwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICA+PC9pPlxuXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9idXR0b24+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2xIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIE5hbWUgb2YgdGhlIHRvb2wgdGhhdCB3YXMgY2FsbGVkLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBuYW1lID0gJyc7XG4gIC8qKiBSZW1peGljb24gY2xhc3Mgc2hvd24gYmVmb3JlIHRoZSB0b29sIG5hbWUuIEBkZWZhdWx0ICdyaS10b29scy1saW5lJyAqL1xuICBASW5wdXQoKSBpY29uID0gJ3JpLXRvb2xzLWxpbmUnO1xuICAvKiogT3ZlcnJpZGVzIHRoZSBjaGlwIHRleHQ7IGRlZmF1bHRzIHRvIGEgbGFiZWwgZGVyaXZlZCBmcm9tIHRoZSBzdGF0ZS4gQGRlZmF1bHQgJycgKi9cbiAgQElucHV0KCkgc3RhdGVMYWJlbE92ZXJyaWRlID0gJyc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBoZWFkZXIgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHN0YXRlIGNoaXAgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2hpcENsYXNzTmFtZSA9ICcnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChUb29sU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIG9wZW4gPSBmYWxzZTtcbiAgc3RhdGU6IFRvb2xTdGF0ZSA9ICdwZW5kaW5nJztcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5zZXJ2aWNlLm9wZW4kLnN1YnNjcmliZSgob3BlbikgPT4ge1xuICAgICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5zZXJ2aWNlLnN0YXRlJC5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBzdGF0ZUljb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVE9PTF9TVEFURV9JQ09OU1t0aGlzLnN0YXRlXTtcbiAgfVxuXG4gIGdldCBzdGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVMYWJlbE92ZXJyaWRlIHx8IFRPT0xfU1RBVEVfTEFCRUxTW3RoaXMuc3RhdGVdO1xuICB9XG5cbiAgZ2V0IGNoaXBDbGFzcygpIHtcbiAgICByZXR1cm4gY24odG9vbFN0YXRlVmFyaWFudHMoeyBzdGF0ZTogdGhpcy5zdGF0ZSB9KSwgdGhpcy5jaGlwQ2xhc3NOYW1lKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgICdmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICdob3ZlcjpiZy1hY2NlbnQvNTAgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLWluc2V0IGZvY3VzLXZpc2libGU6cmluZy1yaW5nJyxcbiAgICAgIHRoaXMuY2xhc3NcbiAgICApO1xuICB9XG5cbiAgb25Ub2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnRvZ2dsZSgpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBmb3IgdGhlIHR3byBwYXlsb2FkIHBhbmVscy4gT3ducyB0aGUgc2hhcmVkIFwidmlzaWJsZSBvbmx5IHdoaWxlIHRoZVxuICogdG9vbCBpcyBleHBhbmRlZFwiIHdpcmluZyBhbmQgdGhlIHBheWxvYWQtdG8tdGV4dCBmb3JtYXR0aW5nLlxuICpcbiAqIERlY29yYXRlZCB3aXRoIGEgc2VsZWN0b3ItbGVzcyBgQERpcmVjdGl2ZSgpYCBiZWNhdXNlIGl0IHVzZXMgQW5ndWxhclxuICogZmVhdHVyZXMgKERJIGFuZCBsaWZlY3ljbGUgaG9va3MpIG9uIGJlaGFsZiBvZiBpdHMgc3ViY2xhc3Nlcy5cbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVG9vbFBheWxvYWRCYXNlIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgc3ViY2xhc3NlcyBrZWVwXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgdGhleSB3ZXJlIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFBheWxvYWQgdG8gcmVuZGVyOyBvYmplY3RzIGFyZSBwcmV0dHktcHJpbnRlZCBhcyBKU09OLCBzdHJpbmdzIGFyZSBzaG93biBhcy1pcy4gKi9cbiAgcGF5bG9hZDogdW5rbm93biA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoVG9vbFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBvcGVuID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc2VydmljZS5vcGVuJC5zdWJzY3JpYmUoKG9wZW4pID0+IHtcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBUcnVlIG9uY2UgdGhlcmUgaXMgYSBwYXlsb2FkIHdvcnRoIHJlbmRlcmluZy4gKi9cbiAgZ2V0IGhhc1BheWxvYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGF5bG9hZCAhPT0gbnVsbCAmJiB0aGlzLnBheWxvYWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBheWxvYWQgIT09ICcnO1xuICB9XG5cbiAgLyoqIFRoZSBwYXlsb2FkIGFzIGRpc3BsYXkgdGV4dC4gRmFsbHMgYmFjayB0byBgU3RyaW5nKClgIGZvciBjeWNsaWMgdmFsdWVzLiAqL1xuICBnZXQgZm9ybWF0dGVkKCk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnBheWxvYWQgPT09ICdzdHJpbmcnKSByZXR1cm4gdGhpcy5wYXlsb2FkO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5wYXlsb2FkLCBudWxsLCAyKSA/PyBTdHJpbmcodGhpcy5wYXlsb2FkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBTdHJpbmcodGhpcy5wYXlsb2FkKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFyZ3VtZW50cyB0aGUgdG9vbCB3YXMgY2FsbGVkIHdpdGguIFZpc2libGUgd2hpbGUgdGhlIGB0b2xsZS10b29sYCBpcyBleHBhbmRlZC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvb2wtaW5wdXQnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cIm9wZW5cIiBkYXRhLXRvb2wtaW5wdXQgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj5cbiAgICAgIDxwICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cInRleHQteHMgZm9udC1tZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgIHt7IGxhYmVsIH19XG4gICAgICA8L3A+XG5cbiAgICAgIDxwcmVcbiAgICAgICAgKm5nSWY9XCJoYXNQYXlsb2FkOyBlbHNlIHByb2plY3RlZFwiXG4gICAgICAgIGNsYXNzPVwibWF4LWgtNjQgb3ZlcmZsb3ctYXV0byByb3VuZGVkLW1kIGJnLW11dGVkIHAtMyBmb250LW1vbm8gdGV4dC14cyB0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgPnt7IGZvcm1hdHRlZCB9fTwvcHJlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI3Byb2plY3RlZD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1heC1oLTY0IG92ZXJmbG93LWF1dG8gcm91bmRlZC1tZCBiZy1tdXRlZCBwLTMgZm9udC1tb25vIHRleHQteHMgdGV4dC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2xJbnB1dENvbXBvbmVudCBleHRlbmRzIFRvb2xQYXlsb2FkQmFzZSB7XG4gIC8qKiBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSB0b29sOyBvYmplY3RzIGFyZSBwcmV0dHktcHJpbnRlZCBhcyBKU09OLiBAZGVmYXVsdCBudWxsICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHBheWxvYWQ6IHVua25vd24gPSBudWxsO1xuICAvKiogSGVhZGluZyBhYm92ZSB0aGUgcGF5bG9hZC4gQGRlZmF1bHQgJ1BhcmFtZXRlcnMnICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJ1BhcmFtZXRlcnMnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcGFuZWwgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oJ2ZsZXggZmxleC1jb2wgZ2FwLTEuNSBib3JkZXItdCBib3JkZXItYm9yZGVyIHB4LTMgcHktMicsIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKiBSZXN1bHQgdGhlIHRvb2wgcmV0dXJuZWQuIFZpc2libGUgd2hpbGUgdGhlIGB0b2xsZS10b29sYCBpcyBleHBhbmRlZC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvb2wtb3V0cHV0JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgKm5nSWY9XCJvcGVuXCIgZGF0YS10b29sLW91dHB1dCBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgPHAgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwidGV4dC14cyBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5cbiAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgIDwvcD5cblxuICAgICAgPHByZSAqbmdJZj1cImhhc1BheWxvYWQ7IGVsc2UgcHJvamVjdGVkXCIgW2NsYXNzXT1cInBheWxvYWRDbGFzc1wiPnt7IGZvcm1hdHRlZCB9fTwvcHJlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI3Byb2plY3RlZD5cbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicGF5bG9hZENsYXNzXCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2xPdXRwdXRDb21wb25lbnQgZXh0ZW5kcyBUb29sUGF5bG9hZEJhc2Uge1xuICAvKiogUmVzdWx0IHJldHVybmVkIGJ5IHRoZSB0b29sOyBvYmplY3RzIGFyZSBwcmV0dHktcHJpbnRlZCBhcyBKU09OLiBAZGVmYXVsdCBudWxsICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHBheWxvYWQ6IHVua25vd24gPSBudWxsO1xuICAvKiogSGVhZGluZyBhYm92ZSB0aGUgcGF5bG9hZC4gQGRlZmF1bHQgJ1Jlc3VsdCcgKi9cbiAgQElucHV0KCkgbGFiZWwgPSAnUmVzdWx0JztcbiAgLyoqIFN0eWxlcyB0aGUgcGF5bG9hZCBhcyBhIGZhaWx1cmUuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGVycm9yID0gZmFsc2U7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBwYW5lbCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIGdldCBwYXlsb2FkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ21heC1oLTY0IG92ZXJmbG93LWF1dG8gcm91bmRlZC1tZCBiZy1tdXRlZCBwLTMgZm9udC1tb25vIHRleHQteHMgdGV4dC1mb3JlZ3JvdW5kJyxcbiAgICAgIHRoaXMuZXJyb3IgJiYgJ2JnLWRlc3RydWN0aXZlLzEwIHRleHQtZGVzdHJ1Y3RpdmUnXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbignZmxleCBmbGV4LWNvbCBnYXAtMS41IGJvcmRlci10IGJvcmRlci1ib3JkZXIgcHgtMyBweS0yJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,83 @@
1
+ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from './utils/cn';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ const typographyVariants = cva('', {
8
+ variants: {
9
+ variant: {
10
+ h1: 'scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl',
11
+ h2: 'scroll-m-20 border-b border-border pb-2 text-3xl font-semibold tracking-tight first:mt-0',
12
+ h3: 'scroll-m-20 text-2xl font-semibold tracking-tight',
13
+ h4: 'scroll-m-20 text-xl font-semibold tracking-tight',
14
+ p: 'leading-7 [&:not(:first-child)]:mt-6',
15
+ blockquote: 'mt-6 border-l-2 border-border pl-6 italic',
16
+ lead: 'text-xl text-muted-foreground',
17
+ large: 'text-lg font-semibold',
18
+ small: 'text-sm font-medium leading-none',
19
+ muted: 'text-sm text-muted-foreground',
20
+ code: 'relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold',
21
+ },
22
+ },
23
+ defaultVariants: { variant: 'p' },
24
+ });
25
+ /**
26
+ * Applies the theme's type scale to projected content. Renders the semantically
27
+ * correct host tag for the chosen `variant` (`h1`–`h4`, `blockquote`, `code`,
28
+ * otherwise `p`), so headings stay real headings for assistive tech.
29
+ * @new
30
+ */
31
+ export class TypographyComponent {
32
+ cdr = inject(ChangeDetectorRef);
33
+ /**
34
+ * Angular writes a bound `class` input through its styling path, which does
35
+ * not mark an OnPush component dirty — without this hook the component keeps
36
+ * rendering the class it was born with.
37
+ */
38
+ ngOnChanges() {
39
+ this.cdr.markForCheck();
40
+ }
41
+ /** Type scale step; also selects the rendered HTML tag. @default 'p' */
42
+ variant = 'p';
43
+ /** Extra Tailwind classes merged onto the element via `cn()` (last-wins). */
44
+ class = '';
45
+ /** True for the variants that have no dedicated tag and render as `<p>`. */
46
+ get isParagraph() {
47
+ return !['h1', 'h2', 'h3', 'h4', 'blockquote', 'code'].includes(this.variant ?? 'p');
48
+ }
49
+ get computedClass() {
50
+ return cn(typographyVariants({ variant: this.variant }), this.class);
51
+ }
52
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TypographyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
53
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TypographyComponent, isStandalone: true, selector: "tolle-typography", inputs: { variant: "variant", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
54
+ <ng-template #body><ng-content></ng-content></ng-template>
55
+
56
+ <h1 *ngIf="variant === 'h1'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h1>
57
+ <h2 *ngIf="variant === 'h2'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h2>
58
+ <h3 *ngIf="variant === 'h3'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h3>
59
+ <h4 *ngIf="variant === 'h4'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h4>
60
+ <blockquote *ngIf="variant === 'blockquote'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></blockquote>
61
+ <code *ngIf="variant === 'code'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></code>
62
+ <p *ngIf="isParagraph" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></p>
63
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TypographyComponent, decorators: [{
66
+ type: Component,
67
+ args: [{ selector: 'tolle-typography', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
68
+ <ng-template #body><ng-content></ng-content></ng-template>
69
+
70
+ <h1 *ngIf="variant === 'h1'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h1>
71
+ <h2 *ngIf="variant === 'h2'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h2>
72
+ <h3 *ngIf="variant === 'h3'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h3>
73
+ <h4 *ngIf="variant === 'h4'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h4>
74
+ <blockquote *ngIf="variant === 'blockquote'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></blockquote>
75
+ <code *ngIf="variant === 'code'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></code>
76
+ <p *ngIf="isParagraph" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></p>
77
+ `, styles: [":host{display:block}\n"] }]
78
+ }], propDecorators: { variant: [{
79
+ type: Input
80
+ }], class: [{
81
+ type: Input
82
+ }] } });
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwb2dyYXBoeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL3R5cG9ncmFwaHkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUFFaEMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFO0lBQ2pDLFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRTtZQUNQLEVBQUUsRUFBRSxnRUFBZ0U7WUFDcEUsRUFBRSxFQUFFLDBGQUEwRjtZQUM5RixFQUFFLEVBQUUsbURBQW1EO1lBQ3ZELEVBQUUsRUFBRSxrREFBa0Q7WUFDdEQsQ0FBQyxFQUFFLHNDQUFzQztZQUN6QyxVQUFVLEVBQUUsMkNBQTJDO1lBQ3ZELElBQUksRUFBRSwrQkFBK0I7WUFDckMsS0FBSyxFQUFFLHVCQUF1QjtZQUM5QixLQUFLLEVBQUUsa0NBQWtDO1lBQ3pDLEtBQUssRUFBRSwrQkFBK0I7WUFDdEMsSUFBSSxFQUFFLG1GQUFtRjtTQUMxRjtLQUNGO0lBQ0QsZUFBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRTtDQUNsQyxDQUFDLENBQUM7QUFJSDs7Ozs7R0FLRztBQXNCSCxNQUFNLE9BQU8sbUJBQW1CO0lBQ2IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsd0VBQXdFO0lBQy9ELE9BQU8sR0FBK0IsR0FBRyxDQUFDO0lBQ25ELDZFQUE2RTtJQUNwRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRXBCLDRFQUE0RTtJQUM1RSxJQUFJLFdBQVc7UUFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQzt3R0F4QlUsbUJBQW1COzRGQUFuQixtQkFBbUIsaUpBWnBCOzs7Ozs7Ozs7O0dBVVQsK0ZBZlMsWUFBWTs7NEZBaUJYLG1CQUFtQjtrQkFyQi9CLFNBQVM7K0JBQ0Usa0JBQWtCLGNBRWhCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBSXJDOzs7Ozs7Ozs7O0dBVVQ7OEJBZVEsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25DaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbmNvbnN0IHR5cG9ncmFwaHlWYXJpYW50cyA9IGN2YSgnJywge1xuICB2YXJpYW50czoge1xuICAgIHZhcmlhbnQ6IHtcbiAgICAgIGgxOiAnc2Nyb2xsLW0tMjAgdGV4dC00eGwgZm9udC1leHRyYWJvbGQgdHJhY2tpbmctdGlnaHQgbGc6dGV4dC01eGwnLFxuICAgICAgaDI6ICdzY3JvbGwtbS0yMCBib3JkZXItYiBib3JkZXItYm9yZGVyIHBiLTIgdGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodCBmaXJzdDptdC0wJyxcbiAgICAgIGgzOiAnc2Nyb2xsLW0tMjAgdGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodCcsXG4gICAgICBoNDogJ3Njcm9sbC1tLTIwIHRleHQteGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodCcsXG4gICAgICBwOiAnbGVhZGluZy03IFsmOm5vdCg6Zmlyc3QtY2hpbGQpXTptdC02JyxcbiAgICAgIGJsb2NrcXVvdGU6ICdtdC02IGJvcmRlci1sLTIgYm9yZGVyLWJvcmRlciBwbC02IGl0YWxpYycsXG4gICAgICBsZWFkOiAndGV4dC14bCB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgbGFyZ2U6ICd0ZXh0LWxnIGZvbnQtc2VtaWJvbGQnLFxuICAgICAgc21hbGw6ICd0ZXh0LXNtIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZScsXG4gICAgICBtdXRlZDogJ3RleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAgICAgIGNvZGU6ICdyZWxhdGl2ZSByb3VuZGVkIGJnLW11dGVkIHB4LVswLjNyZW1dIHB5LVswLjJyZW1dIGZvbnQtbW9ubyB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQnLFxuICAgIH0sXG4gIH0sXG4gIGRlZmF1bHRWYXJpYW50czogeyB2YXJpYW50OiAncCcgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBUeXBvZ3JhcGh5UHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIHR5cG9ncmFwaHlWYXJpYW50cz47XG5cbi8qKlxuICogQXBwbGllcyB0aGUgdGhlbWUncyB0eXBlIHNjYWxlIHRvIHByb2plY3RlZCBjb250ZW50LiBSZW5kZXJzIHRoZSBzZW1hbnRpY2FsbHlcbiAqIGNvcnJlY3QgaG9zdCB0YWcgZm9yIHRoZSBjaG9zZW4gYHZhcmlhbnRgIChgaDFg4oCTYGg0YCwgYGJsb2NrcXVvdGVgLCBgY29kZWAsXG4gKiBvdGhlcndpc2UgYHBgKSwgc28gaGVhZGluZ3Mgc3RheSByZWFsIGhlYWRpbmdzIGZvciBhc3Npc3RpdmUgdGVjaC5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtdHlwb2dyYXBoeScsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgLy8gYDxuZy1jb250ZW50PmAgbWF5IG9ubHkgYXBwZWFyIG9uY2Ug4oCUIGEgZHVwbGljYXRlZCBzbG90IHBlciBicmFuY2ggd291bGQgbGVhdmVcbiAgLy8gZXZlcnkgYnJhbmNoIGJ1dCB0aGUgZmlyc3QgZW1wdHkuIFByb2plY3Qgb25jZSBpbnRvIGEgdGVtcGxhdGUgYW5kIHN0YW1wIHRoYXRcbiAgLy8gdGVtcGxhdGUgaW50byB3aGljaGV2ZXIgdGFnIHRoZSB2YXJpYW50IHNlbGVjdHMuXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLXRlbXBsYXRlICNib2R5PjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPlxuXG4gICAgPGgxICpuZ0lmPVwidmFyaWFudCA9PT0gJ2gxJ1wiIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlcIj48L25nLWNvbnRhaW5lcj48L2gxPlxuICAgIDxoMiAqbmdJZj1cInZhcmlhbnQgPT09ICdoMidcIiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5XCI+PC9uZy1jb250YWluZXI+PC9oMj5cbiAgICA8aDMgKm5nSWY9XCJ2YXJpYW50ID09PSAnaDMnXCIgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm9keVwiPjwvbmctY29udGFpbmVyPjwvaDM+XG4gICAgPGg0ICpuZ0lmPVwidmFyaWFudCA9PT0gJ2g0J1wiIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlcIj48L25nLWNvbnRhaW5lcj48L2g0PlxuICAgIDxibG9ja3F1b3RlICpuZ0lmPVwidmFyaWFudCA9PT0gJ2Jsb2NrcXVvdGUnXCIgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm9keVwiPjwvbmctY29udGFpbmVyPjwvYmxvY2txdW90ZT5cbiAgICA8Y29kZSAqbmdJZj1cInZhcmlhbnQgPT09ICdjb2RlJ1wiIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlcIj48L25nLWNvbnRhaW5lcj48L2NvZGU+XG4gICAgPHAgKm5nSWY9XCJpc1BhcmFncmFwaFwiIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlcIj48L25nLWNvbnRhaW5lcj48L3A+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFR5cG9ncmFwaHlDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUeXBlIHNjYWxlIHN0ZXA7IGFsc28gc2VsZWN0cyB0aGUgcmVuZGVyZWQgSFRNTCB0YWcuIEBkZWZhdWx0ICdwJyAqL1xuICBASW5wdXQoKSB2YXJpYW50OiBUeXBvZ3JhcGh5UHJvcHNbJ3ZhcmlhbnQnXSA9ICdwJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGVsZW1lbnQgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICAvKiogVHJ1ZSBmb3IgdGhlIHZhcmlhbnRzIHRoYXQgaGF2ZSBubyBkZWRpY2F0ZWQgdGFnIGFuZCByZW5kZXIgYXMgYDxwPmAuICovXG4gIGdldCBpc1BhcmFncmFwaCgpIHtcbiAgICByZXR1cm4gIVsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnYmxvY2txdW90ZScsICdjb2RlJ10uaW5jbHVkZXModGhpcy52YXJpYW50ID8/ICdwJyk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24odHlwb2dyYXBoeVZhcmlhbnRzKHsgdmFyaWFudDogdGhpcy52YXJpYW50IH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxufVxuIl19