@covalent/markdown-navigator 3.1.2-beta.6 → 4.0.0-beta.1

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 (37) hide show
  1. package/covalent-markdown-navigator.d.ts +1 -1
  2. package/esm2020/covalent-markdown-navigator.mjs +5 -0
  3. package/esm2020/index.mjs +2 -0
  4. package/esm2020/markdown-navigator-window/markdown-navigator-window.component.mjs +91 -0
  5. package/esm2020/markdown-navigator-window-directive/markdown-navigator-window.directive.mjs +34 -0
  6. package/esm2020/markdown-navigator-window-service/markdown-navigator-window.service.mjs +129 -0
  7. package/esm2020/markdown-navigator.component.mjs +587 -0
  8. package/esm2020/markdown-navigator.module.mjs +62 -0
  9. package/esm2020/public-api.mjs +6 -0
  10. package/fesm2015/covalent-markdown-navigator.mjs +968 -0
  11. package/fesm2015/covalent-markdown-navigator.mjs.map +1 -0
  12. package/fesm2020/covalent-markdown-navigator.mjs +889 -0
  13. package/fesm2020/covalent-markdown-navigator.mjs.map +1 -0
  14. package/markdown-navigator-window/markdown-navigator-window.component.d.ts +3 -0
  15. package/markdown-navigator-window/markdown-navigator-window.component.scss +1 -0
  16. package/markdown-navigator-window-directive/markdown-navigator-window.directive.d.ts +3 -0
  17. package/markdown-navigator-window-service/markdown-navigator-window.service.d.ts +3 -0
  18. package/markdown-navigator.component.d.ts +3 -0
  19. package/markdown-navigator.component.scss +5 -0
  20. package/markdown-navigator.module.d.ts +16 -0
  21. package/package.json +30 -15
  22. package/public-api.d.ts +1 -0
  23. package/bundles/covalent-markdown-navigator.umd.js +0 -1650
  24. package/bundles/covalent-markdown-navigator.umd.js.map +0 -1
  25. package/bundles/covalent-markdown-navigator.umd.min.js +0 -16
  26. package/bundles/covalent-markdown-navigator.umd.min.js.map +0 -1
  27. package/covalent-markdown-navigator.metadata.json +0 -1
  28. package/esm2015/covalent-markdown-navigator.js +0 -11
  29. package/esm2015/index.js +0 -7
  30. package/esm2015/markdown-navigator-window/markdown-navigator-window.component.js +0 -129
  31. package/esm2015/markdown-navigator-window-directive/markdown-navigator-window.directive.js +0 -50
  32. package/esm2015/markdown-navigator-window-service/markdown-navigator-window.service.js +0 -254
  33. package/esm2015/markdown-navigator.component.js +0 -698
  34. package/esm2015/markdown-navigator.module.js +0 -41
  35. package/esm2015/public-api.js +0 -10
  36. package/fesm2015/covalent-markdown-navigator.js +0 -1181
  37. package/fesm2015/covalent-markdown-navigator.js.map +0 -1
@@ -0,0 +1,587 @@
1
+ import { Component, Input, HostListener, ViewChild, ElementRef, ChangeDetectorRef, ChangeDetectionStrategy, Type, Output, EventEmitter, SecurityContext, } from '@angular/core';
2
+ import { removeLeadingHash, isAnchorLink, TdMarkdownLoaderService } from '@covalent/markdown';
3
+ import { DomSanitizer } from '@angular/platform-browser';
4
+ import { HttpClient } from '@angular/common/http';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@covalent/markdown";
7
+ import * as i2 from "@angular/platform-browser";
8
+ import * as i3 from "@angular/common/http";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "@angular/material/progress-bar";
11
+ import * as i6 from "@angular/material/button";
12
+ import * as i7 from "@angular/material/tooltip";
13
+ import * as i8 from "@angular/material/icon";
14
+ import * as i9 from "@angular/material/divider";
15
+ import * as i10 from "@covalent/core/message";
16
+ import * as i11 from "@covalent/flavored-markdown";
17
+ import * as i12 from "@angular/material/list";
18
+ import * as i13 from "@angular/material/core";
19
+ const _c0 = ["markdownWrapper"];
20
+ function TdMarkdownNavigatorComponent_ng_container_0_mat_progress_bar_1_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelement(0, "mat-progress-bar", 8);
22
+ } }
23
+ function TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_button_2_Template(rf, ctx) { if (rf & 1) {
24
+ const _r12 = i0.ɵɵgetCurrentView();
25
+ i0.ɵɵelementStart(0, "button", 12);
26
+ i0.ɵɵlistener("click", function TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_button_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(3); return ctx_r11.reset(); });
27
+ i0.ɵɵelementStart(1, "mat-icon");
28
+ i0.ɵɵtext(2, "home");
29
+ i0.ɵɵelementEnd();
30
+ i0.ɵɵelementEnd();
31
+ } if (rf & 2) {
32
+ const ctx_r8 = i0.ɵɵnextContext(3);
33
+ i0.ɵɵproperty("matTooltip", ctx_r8.goHomeLabel);
34
+ i0.ɵɵattribute("data-test", "home-button");
35
+ i0.ɵɵadvance(1);
36
+ i0.ɵɵattribute("aria-label", ctx_r8.goHomeLabel);
37
+ } }
38
+ function TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_button_3_Template(rf, ctx) { if (rf & 1) {
39
+ const _r14 = i0.ɵɵgetCurrentView();
40
+ i0.ɵɵelementStart(0, "button", 13);
41
+ i0.ɵɵlistener("click", function TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(3); return ctx_r13.goBack(); });
42
+ i0.ɵɵelementStart(1, "mat-icon");
43
+ i0.ɵɵtext(2, "arrow_back");
44
+ i0.ɵɵelementEnd();
45
+ i0.ɵɵelementEnd();
46
+ } if (rf & 2) {
47
+ const ctx_r9 = i0.ɵɵnextContext(3);
48
+ i0.ɵɵproperty("matTooltip", ctx_r9.goBackLabel);
49
+ i0.ɵɵattribute("data-test", "back-button");
50
+ i0.ɵɵadvance(1);
51
+ i0.ɵɵattribute("aria-label", ctx_r9.goBackLabel);
52
+ } }
53
+ function TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_span_4_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelementStart(0, "span", 14);
55
+ i0.ɵɵtext(1);
56
+ i0.ɵɵelementEnd();
57
+ } if (rf & 2) {
58
+ const ctx_r10 = i0.ɵɵnextContext(3);
59
+ i0.ɵɵattribute("data-test", "title");
60
+ i0.ɵɵadvance(1);
61
+ i0.ɵɵtextInterpolate1(" ", ctx_r10.currentItemTitle, " ");
62
+ } }
63
+ function TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_Template(rf, ctx) { if (rf & 1) {
64
+ i0.ɵɵelementContainerStart(0);
65
+ i0.ɵɵelementStart(1, "div");
66
+ i0.ɵɵtemplate(2, TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_button_2_Template, 3, 3, "button", 9);
67
+ i0.ɵɵtemplate(3, TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_button_3_Template, 3, 3, "button", 10);
68
+ i0.ɵɵtemplate(4, TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_span_4_Template, 2, 2, "span", 11);
69
+ i0.ɵɵelementEnd();
70
+ i0.ɵɵelement(5, "mat-divider");
71
+ i0.ɵɵelementContainerEnd();
72
+ } if (rf & 2) {
73
+ const ctx_r3 = i0.ɵɵnextContext(2);
74
+ i0.ɵɵadvance(1);
75
+ i0.ɵɵstyleProp("display", "flex");
76
+ i0.ɵɵadvance(1);
77
+ i0.ɵɵproperty("ngIf", ctx_r3.showHomeButton);
78
+ i0.ɵɵadvance(1);
79
+ i0.ɵɵproperty("ngIf", ctx_r3.showGoBackButton);
80
+ i0.ɵɵadvance(1);
81
+ i0.ɵɵproperty("ngIf", ctx_r3.currentItemTitle);
82
+ i0.ɵɵadvance(1);
83
+ i0.ɵɵstyleProp("position", "relative");
84
+ } }
85
+ function TdMarkdownNavigatorComponent_ng_container_0_div_4_td_message_2_Template(rf, ctx) { if (rf & 1) {
86
+ i0.ɵɵelement(0, "td-message", 19);
87
+ } if (rf & 2) {
88
+ const ctx_r16 = i0.ɵɵnextContext(3);
89
+ i0.ɵɵproperty("sublabel", ctx_r16.markdownLoaderError);
90
+ i0.ɵɵattribute("data-test", "markdown-loader-error");
91
+ } }
92
+ function TdMarkdownNavigatorComponent_ng_container_0_div_4_td_flavored_markdown_loader_3_Template(rf, ctx) { if (rf & 1) {
93
+ const _r20 = i0.ɵɵgetCurrentView();
94
+ i0.ɵɵelementStart(0, "td-flavored-markdown-loader", 20);
95
+ i0.ɵɵlistener("loadFailed", function TdMarkdownNavigatorComponent_ng_container_0_div_4_td_flavored_markdown_loader_3_Template_td_flavored_markdown_loader_loadFailed_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r19 = i0.ɵɵnextContext(3); return ctx_r19.handleMarkdownLoaderError($event); });
96
+ i0.ɵɵelementEnd();
97
+ } if (rf & 2) {
98
+ const ctx_r17 = i0.ɵɵnextContext(3);
99
+ i0.ɵɵproperty("url", ctx_r17.url)("httpOptions", ctx_r17.httpOptions)("anchor", ctx_r17.anchor)("copyCodeToClipboard", ctx_r17.copyCodeToClipboard)("copyCodeTooltips", ctx_r17.copyCodeTooltips);
100
+ } }
101
+ function TdMarkdownNavigatorComponent_ng_container_0_div_4_td_flavored_markdown_4_Template(rf, ctx) { if (rf & 1) {
102
+ const _r22 = i0.ɵɵgetCurrentView();
103
+ i0.ɵɵelementStart(0, "td-flavored-markdown", 21);
104
+ i0.ɵɵlistener("buttonClicked", function TdMarkdownNavigatorComponent_ng_container_0_div_4_td_flavored_markdown_4_Template_td_flavored_markdown_buttonClicked_0_listener($event) { i0.ɵɵrestoreView(_r22); const ctx_r21 = i0.ɵɵnextContext(3); return ctx_r21.buttonClicked.emit($event); });
105
+ i0.ɵɵelementEnd();
106
+ } if (rf & 2) {
107
+ const ctx_r18 = i0.ɵɵnextContext(3);
108
+ i0.ɵɵproperty("content", ctx_r18.markdownString)("hostedUrl", ctx_r18.url)("anchor", ctx_r18.anchor)("copyCodeToClipboard", ctx_r18.copyCodeToClipboard)("copyCodeTooltips", ctx_r18.copyCodeTooltips);
109
+ } }
110
+ function TdMarkdownNavigatorComponent_ng_container_0_div_4_Template(rf, ctx) { if (rf & 1) {
111
+ i0.ɵɵelementStart(0, "div", 15, 16);
112
+ i0.ɵɵtemplate(2, TdMarkdownNavigatorComponent_ng_container_0_div_4_td_message_2_Template, 1, 2, "td-message", 5);
113
+ i0.ɵɵtemplate(3, TdMarkdownNavigatorComponent_ng_container_0_div_4_td_flavored_markdown_loader_3_Template, 1, 5, "td-flavored-markdown-loader", 17);
114
+ i0.ɵɵtemplate(4, TdMarkdownNavigatorComponent_ng_container_0_div_4_td_flavored_markdown_4_Template, 1, 5, "td-flavored-markdown", 18);
115
+ i0.ɵɵelementEnd();
116
+ } if (rf & 2) {
117
+ const ctx_r4 = i0.ɵɵnextContext(2);
118
+ i0.ɵɵadvance(2);
119
+ i0.ɵɵproperty("ngIf", ctx_r4.markdownLoaderError);
120
+ i0.ɵɵadvance(1);
121
+ i0.ɵɵproperty("ngIf", ctx_r4.showTdMarkdownLoader);
122
+ i0.ɵɵadvance(1);
123
+ i0.ɵɵproperty("ngIf", ctx_r4.showTdMarkdown);
124
+ } }
125
+ function TdMarkdownNavigatorComponent_ng_container_0_td_message_5_Template(rf, ctx) { if (rf & 1) {
126
+ i0.ɵɵelement(0, "td-message", 19);
127
+ } if (rf & 2) {
128
+ const ctx_r5 = i0.ɵɵnextContext(2);
129
+ i0.ɵɵproperty("sublabel", ctx_r5.childrenUrlError);
130
+ i0.ɵɵattribute("data-test", "children-url-error");
131
+ } }
132
+ function TdMarkdownNavigatorComponent_ng_container_0_div_6_button_2_Template(rf, ctx) { if (rf & 1) {
133
+ const _r27 = i0.ɵɵgetCurrentView();
134
+ i0.ɵɵelementStart(0, "button", 24);
135
+ i0.ɵɵlistener("click", function TdMarkdownNavigatorComponent_ng_container_0_div_6_button_2_Template_button_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r27); const item_r24 = restoredCtx.$implicit; const ctx_r26 = i0.ɵɵnextContext(3); return ctx_r26.handleItemSelected(item_r24); });
136
+ i0.ɵɵelementStart(1, "mat-icon", 25);
137
+ i0.ɵɵtext(2);
138
+ i0.ɵɵelementEnd();
139
+ i0.ɵɵelementStart(3, "span", 26);
140
+ i0.ɵɵtext(4);
141
+ i0.ɵɵelementEnd();
142
+ i0.ɵɵelementStart(5, "span", 26);
143
+ i0.ɵɵtext(6);
144
+ i0.ɵɵelementEnd();
145
+ i0.ɵɵelement(7, "mat-divider");
146
+ i0.ɵɵelementEnd();
147
+ } if (rf & 2) {
148
+ const item_r24 = ctx.$implicit;
149
+ const index_r25 = ctx.index;
150
+ const ctx_r23 = i0.ɵɵnextContext(3);
151
+ i0.ɵɵproperty("id", "td-markdown-navigator-list-item-" + (item_r24.id ? item_r24.id : index_r25))("matTooltip", ctx_r23.getTitle(item_r24));
152
+ i0.ɵɵadvance(2);
153
+ i0.ɵɵtextInterpolate1(" ", ctx_r23.getIcon(item_r24), " ");
154
+ i0.ɵɵadvance(2);
155
+ i0.ɵɵtextInterpolate1(" ", ctx_r23.getTitle(item_r24), " ");
156
+ i0.ɵɵadvance(2);
157
+ i0.ɵɵtextInterpolate(item_r24.description);
158
+ } }
159
+ function TdMarkdownNavigatorComponent_ng_container_0_div_6_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "div", 22);
161
+ i0.ɵɵelementStart(1, "mat-action-list");
162
+ i0.ɵɵtemplate(2, TdMarkdownNavigatorComponent_ng_container_0_div_6_button_2_Template, 8, 5, "button", 23);
163
+ i0.ɵɵelementEnd();
164
+ i0.ɵɵelementEnd();
165
+ } if (rf & 2) {
166
+ const ctx_r6 = i0.ɵɵnextContext(2);
167
+ i0.ɵɵadvance(2);
168
+ i0.ɵɵproperty("ngForOf", ctx_r6.currentMenuItems);
169
+ } }
170
+ function TdMarkdownNavigatorComponent_ng_container_0_ng_container_7_Template(rf, ctx) { if (rf & 1) {
171
+ i0.ɵɵelementContainer(0);
172
+ } }
173
+ function TdMarkdownNavigatorComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {
174
+ i0.ɵɵelementContainerStart(0);
175
+ i0.ɵɵtemplate(1, TdMarkdownNavigatorComponent_ng_container_0_mat_progress_bar_1_Template, 1, 0, "mat-progress-bar", 2);
176
+ i0.ɵɵtemplate(2, TdMarkdownNavigatorComponent_ng_container_0_ng_container_2_Template, 6, 7, "ng-container", 0);
177
+ i0.ɵɵelementStart(3, "div", 3);
178
+ i0.ɵɵtemplate(4, TdMarkdownNavigatorComponent_ng_container_0_div_4_Template, 5, 3, "div", 4);
179
+ i0.ɵɵtemplate(5, TdMarkdownNavigatorComponent_ng_container_0_td_message_5_Template, 1, 2, "td-message", 5);
180
+ i0.ɵɵtemplate(6, TdMarkdownNavigatorComponent_ng_container_0_div_6_Template, 3, 1, "div", 6);
181
+ i0.ɵɵtemplate(7, TdMarkdownNavigatorComponent_ng_container_0_ng_container_7_Template, 1, 0, "ng-container", 7);
182
+ i0.ɵɵelementEnd();
183
+ i0.ɵɵelementContainerEnd();
184
+ } if (rf & 2) {
185
+ const ctx_r0 = i0.ɵɵnextContext();
186
+ i0.ɵɵadvance(1);
187
+ i0.ɵɵproperty("ngIf", ctx_r0.loading);
188
+ i0.ɵɵadvance(1);
189
+ i0.ɵɵproperty("ngIf", ctx_r0.showHeader);
190
+ i0.ɵɵadvance(2);
191
+ i0.ɵɵproperty("ngIf", ctx_r0.showTdMarkdownLoader || ctx_r0.showTdMarkdown);
192
+ i0.ɵɵadvance(1);
193
+ i0.ɵɵproperty("ngIf", ctx_r0.childrenUrlError);
194
+ i0.ɵɵadvance(1);
195
+ i0.ɵɵproperty("ngIf", ctx_r0.showMenu);
196
+ i0.ɵɵadvance(1);
197
+ i0.ɵɵproperty("ngComponentOutlet", ctx_r0.footerComponent);
198
+ } }
199
+ function TdMarkdownNavigatorComponent_div_1_Template(rf, ctx) { if (rf & 1) {
200
+ i0.ɵɵelementStart(0, "div", 27);
201
+ i0.ɵɵelementStart(1, "mat-icon", 28);
202
+ i0.ɵɵtext(2, "subject");
203
+ i0.ɵɵelementEnd();
204
+ i0.ɵɵelementStart(3, "h2");
205
+ i0.ɵɵtext(4);
206
+ i0.ɵɵelementEnd();
207
+ i0.ɵɵelementEnd();
208
+ } if (rf & 2) {
209
+ const ctx_r1 = i0.ɵɵnextContext();
210
+ i0.ɵɵadvance(4);
211
+ i0.ɵɵtextInterpolate(ctx_r1.emptyStateLabel);
212
+ } }
213
+ export const DEFAULT_MARKDOWN_NAVIGATOR_LABELS = {
214
+ goHome: 'Go home',
215
+ goBack: 'Go back',
216
+ emptyState: 'No item(s) to display',
217
+ };
218
+ function getTitleFromUrl(url) {
219
+ if (url) {
220
+ const temp = new URL(url);
221
+ if (temp.hash) {
222
+ return removeLeadingHash(temp.hash);
223
+ }
224
+ else {
225
+ const path = temp.pathname.split('/');
226
+ const fileName = path[path.length - 1];
227
+ return fileName.replace(/\.[^/.]+$/, ''); // remove .md
228
+ }
229
+ }
230
+ return undefined;
231
+ }
232
+ function getTitleFromMarkdownString(markdownString) {
233
+ if (markdownString) {
234
+ const firstLine = markdownString.split(/[\r\n]+/).find((line) => !!line);
235
+ return removeLeadingHash(firstLine).trim();
236
+ }
237
+ return undefined;
238
+ }
239
+ function isMarkdownHref(anchor) {
240
+ return !isAnchorLink(anchor) && anchor.pathname.endsWith('.md');
241
+ }
242
+ function defaultCompareWith(o1, o2) {
243
+ if (o1.id && o2.id) {
244
+ return o1.id === o2.id;
245
+ }
246
+ return o1 === o2;
247
+ }
248
+ export class TdMarkdownNavigatorComponent {
249
+ constructor(_markdownUrlLoaderService, _changeDetectorRef, _sanitizer, _http) {
250
+ this._markdownUrlLoaderService = _markdownUrlLoaderService;
251
+ this._changeDetectorRef = _changeDetectorRef;
252
+ this._sanitizer = _sanitizer;
253
+ this._http = _http;
254
+ /**
255
+ * copyCodeToClipboard?: boolean
256
+ *
257
+ * Display copy button on code snippets to copy code to clipboard.
258
+ *
259
+ */
260
+ this.copyCodeToClipboard = false;
261
+ /**
262
+ * copyCodeTooltips?: ICopyCodeTooltips
263
+ *
264
+ * Tooltips for copy button to copy and upon copying.
265
+ */
266
+ this.copyCodeTooltips = {};
267
+ this.buttonClicked = new EventEmitter();
268
+ this.historyStack = []; // history
269
+ this.currentMenuItems = []; // current menu items
270
+ this.loading = false;
271
+ }
272
+ clickListener(event) {
273
+ const element = event.srcElement;
274
+ if (element.matches('a[href]') && isMarkdownHref(element)) {
275
+ this.handleLinkClick(event);
276
+ }
277
+ }
278
+ get showGoBackButton() {
279
+ return this.historyStack.length > 0;
280
+ }
281
+ get showHomeButton() {
282
+ return this.historyStack.length > 1;
283
+ }
284
+ get showHeader() {
285
+ return this.showHomeButton || this.showGoBackButton || !!this.currentItemTitle;
286
+ }
287
+ get showMenu() {
288
+ return this.currentMenuItems && this.currentMenuItems.length > 0;
289
+ }
290
+ get showTdMarkdownLoader() {
291
+ return !!this.currentMarkdownItem && !!this.currentMarkdownItem.url && !this.showTdMarkdown;
292
+ }
293
+ get showTdMarkdown() {
294
+ return !!this.currentMarkdownItem && !!this.currentMarkdownItem.markdownString;
295
+ }
296
+ get url() {
297
+ if (this.currentMarkdownItem) {
298
+ return this.currentMarkdownItem.url;
299
+ }
300
+ return undefined;
301
+ }
302
+ get footerComponent() {
303
+ if (this.currentMarkdownItem && this.currentMarkdownItem.footer) {
304
+ return this.currentMarkdownItem.footer;
305
+ }
306
+ return this.footer;
307
+ }
308
+ get httpOptions() {
309
+ if (this.currentMarkdownItem) {
310
+ return this.currentMarkdownItem.httpOptions;
311
+ }
312
+ }
313
+ get markdownString() {
314
+ if (this.currentMarkdownItem) {
315
+ return this.currentMarkdownItem.markdownString;
316
+ }
317
+ }
318
+ get anchor() {
319
+ if (this.currentMarkdownItem) {
320
+ return this.currentMarkdownItem.anchor;
321
+ }
322
+ }
323
+ get showEmptyState() {
324
+ return !this.items || this.items.length < 1;
325
+ }
326
+ get goHomeLabel() {
327
+ return (this.labels && this.labels.goHome) || DEFAULT_MARKDOWN_NAVIGATOR_LABELS.goHome;
328
+ }
329
+ get goBackLabel() {
330
+ return (this.labels && this.labels.goBack) || DEFAULT_MARKDOWN_NAVIGATOR_LABELS.goBack;
331
+ }
332
+ get emptyStateLabel() {
333
+ return (this.labels && this.labels.emptyState) || DEFAULT_MARKDOWN_NAVIGATOR_LABELS.emptyState;
334
+ }
335
+ get currentItemTitle() {
336
+ if (this.historyStack.length < 1) {
337
+ return '';
338
+ }
339
+ else if (this.currentMarkdownItem) {
340
+ return this.getTitle(this.currentMarkdownItem);
341
+ }
342
+ else if (this.historyStack.length > 0) {
343
+ return this.getTitle(this.historyStack[this.historyStack.length - 1]);
344
+ }
345
+ return '';
346
+ }
347
+ async ngOnChanges(changes) {
348
+ if (changes.items) {
349
+ this.reset();
350
+ }
351
+ if (changes.startAt && this.items && this.startAt) {
352
+ this._jumpTo(this.startAt, undefined);
353
+ }
354
+ }
355
+ hasChildrenOrChildrenUrl(item) {
356
+ return (item.children && item.children.length > 0) || !!item.childrenUrl;
357
+ }
358
+ clearErrors() {
359
+ this.markdownLoaderError = undefined;
360
+ this.childrenUrlError = undefined;
361
+ }
362
+ reset() {
363
+ this.loading = false;
364
+ this.clearErrors();
365
+ // if single item and no children
366
+ if (this.items && this.items.length === 1 && !this.hasChildrenOrChildrenUrl(this.items[0])) {
367
+ this.currentMenuItems = [];
368
+ this.currentMarkdownItem = this.items[0];
369
+ }
370
+ else {
371
+ this.currentMenuItems = this.items;
372
+ this.currentMarkdownItem = undefined;
373
+ }
374
+ this.historyStack = [];
375
+ this._changeDetectorRef.markForCheck();
376
+ }
377
+ goBack() {
378
+ this.loading = false;
379
+ this.clearErrors();
380
+ if (this.historyStack.length > 1) {
381
+ let parent = this.historyStack[this.historyStack.length - 2];
382
+ if (parent.startAtLink) {
383
+ parent = this.historyStack[this.historyStack.length - 3]
384
+ ? this.historyStack[this.historyStack.length - 3]
385
+ : undefined;
386
+ this.historyStack = this.historyStack.slice(0, -1);
387
+ }
388
+ if (parent) {
389
+ this.currentMarkdownItem = parent;
390
+ this.historyStack = this.historyStack.slice(0, -1);
391
+ this.setChildrenAsCurrentMenuItems(parent);
392
+ }
393
+ else {
394
+ this.reset();
395
+ }
396
+ }
397
+ else {
398
+ // one level down just go to root
399
+ this.reset();
400
+ }
401
+ this._changeDetectorRef.markForCheck();
402
+ }
403
+ handleItemSelected(item) {
404
+ this.clearErrors();
405
+ this.currentMarkdownItem = item;
406
+ this.historyStack = [...this.historyStack, item];
407
+ this.setChildrenAsCurrentMenuItems(item);
408
+ this._changeDetectorRef.markForCheck();
409
+ }
410
+ async setChildrenAsCurrentMenuItems(item) {
411
+ this.currentMenuItems = [];
412
+ this.loading = true;
413
+ this._changeDetectorRef.markForCheck();
414
+ const stackSnapshot = this.historyStack;
415
+ let children = [];
416
+ if (item.children) {
417
+ children = item.children;
418
+ }
419
+ else if (item.childrenUrl) {
420
+ children = await this.loadChildrenUrl(item);
421
+ }
422
+ if (children && children.length && item.startAtLink) {
423
+ this._jumpTo(item.startAtLink, children);
424
+ }
425
+ const newStackSnapshot = this.historyStack;
426
+ if (stackSnapshot.length === newStackSnapshot.length &&
427
+ stackSnapshot.every((stackItem, index) => stackItem === newStackSnapshot[index])) {
428
+ this.currentMenuItems = children;
429
+ }
430
+ this.loading = false;
431
+ this._changeDetectorRef.markForCheck();
432
+ }
433
+ async loadChildrenUrl(item) {
434
+ const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.URL, item.childrenUrl);
435
+ try {
436
+ return await this._http.get(sanitizedUrl, { ...item.httpOptions }).toPromise();
437
+ }
438
+ catch (error) {
439
+ this.handleChildrenUrlError(error);
440
+ return [];
441
+ }
442
+ }
443
+ getTitle(item) {
444
+ if (item) {
445
+ return (removeLeadingHash(item.anchor) ||
446
+ item.title ||
447
+ getTitleFromUrl(item.url) ||
448
+ getTitleFromMarkdownString(item.markdownString) ||
449
+ '').trim();
450
+ }
451
+ }
452
+ getIcon(item) {
453
+ if (item) {
454
+ return item.icon || 'subject';
455
+ }
456
+ }
457
+ handleChildrenUrlError(error) {
458
+ this.childrenUrlError = error.message;
459
+ this._changeDetectorRef.markForCheck();
460
+ }
461
+ handleMarkdownLoaderError(error) {
462
+ this.markdownLoaderError = error.message;
463
+ this._changeDetectorRef.markForCheck();
464
+ }
465
+ async _jumpTo(itemOrPath, children) {
466
+ const historyStack = this.historyStack;
467
+ this.reset();
468
+ if (this.items && this.items.length > 0) {
469
+ let path = [];
470
+ if (Array.isArray(itemOrPath)) {
471
+ path = await this.followPath(this.items, itemOrPath);
472
+ }
473
+ else if (children && children.length > 0) {
474
+ this.historyStack = historyStack;
475
+ path = this.findPath(children, itemOrPath);
476
+ }
477
+ else {
478
+ path = this.findPath(this.items, itemOrPath);
479
+ }
480
+ (path || []).forEach((pathItem) => this.handleItemSelected(pathItem));
481
+ }
482
+ this._changeDetectorRef.markForCheck();
483
+ }
484
+ async followPath(items, path) {
485
+ let pathItems = [];
486
+ let currentLevel = items;
487
+ const compareWith = this.compareWith || defaultCompareWith;
488
+ for (const pathItem of path) {
489
+ const foundItem = currentLevel.find((item) => compareWith(pathItem, item));
490
+ if (foundItem) {
491
+ pathItems = [...pathItems, foundItem];
492
+ if (foundItem.children) {
493
+ currentLevel = foundItem.children;
494
+ }
495
+ else if (foundItem.childrenUrl) {
496
+ currentLevel = await this.loadChildrenUrl(foundItem);
497
+ }
498
+ }
499
+ else {
500
+ break;
501
+ }
502
+ }
503
+ if (pathItems.length !== path.length) {
504
+ pathItems = [];
505
+ }
506
+ return pathItems;
507
+ }
508
+ findPath(items, item) {
509
+ const compareWith = this.compareWith || defaultCompareWith;
510
+ if (items) {
511
+ for (const child of items) {
512
+ if (compareWith(child, item)) {
513
+ return [child];
514
+ }
515
+ const ancestors = this.findPath(child.children, item);
516
+ if (ancestors) {
517
+ return [child, ...ancestors];
518
+ }
519
+ }
520
+ }
521
+ return undefined;
522
+ }
523
+ async handleLinkClick(event) {
524
+ event.preventDefault();
525
+ const link = event.target;
526
+ const url = new URL(link.href);
527
+ this.loading = true;
528
+ this._changeDetectorRef.markForCheck();
529
+ try {
530
+ const markdownString = await this._markdownUrlLoaderService.load(url.href);
531
+ // pass in url to be able to use currentMarkdownItem.url later on
532
+ this.handleItemSelected({ markdownString, url: url.href });
533
+ this.markdownWrapper.nativeElement.scrollTop = 0;
534
+ }
535
+ catch (error) {
536
+ const win = window.open(url.href, '_blank');
537
+ win.focus();
538
+ }
539
+ finally {
540
+ this.loading = false;
541
+ }
542
+ this._changeDetectorRef.markForCheck();
543
+ }
544
+ }
545
+ /** @nocollapse */ /** @nocollapse */ TdMarkdownNavigatorComponent.ɵfac = function TdMarkdownNavigatorComponent_Factory(t) { return new (t || TdMarkdownNavigatorComponent)(i0.ɵɵdirectiveInject(i1.TdMarkdownLoaderService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.DomSanitizer), i0.ɵɵdirectiveInject(i3.HttpClient)); };
546
+ /** @nocollapse */ /** @nocollapse */ TdMarkdownNavigatorComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TdMarkdownNavigatorComponent, selectors: [["td-markdown-navigator"]], viewQuery: function TdMarkdownNavigatorComponent_Query(rf, ctx) { if (rf & 1) {
547
+ i0.ɵɵviewQuery(_c0, 5);
548
+ } if (rf & 2) {
549
+ let _t;
550
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.markdownWrapper = _t.first);
551
+ } }, hostBindings: function TdMarkdownNavigatorComponent_HostBindings(rf, ctx) { if (rf & 1) {
552
+ i0.ɵɵlistener("click", function TdMarkdownNavigatorComponent_click_HostBindingHandler($event) { return ctx.clickListener($event); });
553
+ } }, inputs: { items: "items", labels: "labels", startAt: "startAt", copyCodeToClipboard: "copyCodeToClipboard", copyCodeTooltips: "copyCodeTooltips", footer: "footer", compareWith: "compareWith" }, outputs: { buttonClicked: "buttonClicked" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 2, consts: [[4, "ngIf"], ["layout", "column", "layout-align", "center center", "class", "empty-state", 4, "ngIf"], ["mode", "indeterminate", "color", "accent", 4, "ngIf"], ["id", "td-markdown-navigator-content", 1, "scroll-area"], ["class", "markdown-wrapper", 4, "ngIf"], ["color", "warn", "icon", "error", 3, "sublabel", 4, "ngIf"], ["class", "td-markdown-list", 4, "ngIf"], [4, "ngComponentOutlet"], ["mode", "indeterminate", "color", "accent"], ["id", "td-markdown-navigator-home-button", "mat-icon-button", "", 3, "matTooltip", "click", 4, "ngIf"], ["id", "td-markdown-navigator-back-button", "mat-icon-button", "", 3, "matTooltip", "click", 4, "ngIf"], ["flex", "", "class", "mat-body-2 title truncate", 4, "ngIf"], ["id", "td-markdown-navigator-home-button", "mat-icon-button", "", 3, "matTooltip", "click"], ["id", "td-markdown-navigator-back-button", "mat-icon-button", "", 3, "matTooltip", "click"], ["flex", "", 1, "mat-body-2", "title", "truncate"], [1, "markdown-wrapper"], ["markdownWrapper", ""], [3, "url", "httpOptions", "anchor", "copyCodeToClipboard", "copyCodeTooltips", "loadFailed", 4, "ngIf"], [3, "content", "hostedUrl", "anchor", "copyCodeToClipboard", "copyCodeTooltips", "buttonClicked", 4, "ngIf"], ["color", "warn", "icon", "error", 3, "sublabel"], [3, "url", "httpOptions", "anchor", "copyCodeToClipboard", "copyCodeTooltips", "loadFailed"], [3, "content", "hostedUrl", "anchor", "copyCodeToClipboard", "copyCodeTooltips", "buttonClicked"], [1, "td-markdown-list"], ["mat-list-item", "", "matTooltipPosition", "before", "matTooltipShowDelay", "500", 3, "id", "matTooltip", "click", 4, "ngFor", "ngForOf"], ["mat-list-item", "", "matTooltipPosition", "before", "matTooltipShowDelay", "500", 3, "id", "matTooltip", "click"], ["matListIcon", ""], ["matLine", "", 1, "truncate"], ["layout", "column", "layout-align", "center center", 1, "empty-state"], ["matListAvatar", ""]], template: function TdMarkdownNavigatorComponent_Template(rf, ctx) { if (rf & 1) {
554
+ i0.ɵɵtemplate(0, TdMarkdownNavigatorComponent_ng_container_0_Template, 8, 6, "ng-container", 0);
555
+ i0.ɵɵtemplate(1, TdMarkdownNavigatorComponent_div_1_Template, 5, 1, "div", 1);
556
+ } if (rf & 2) {
557
+ i0.ɵɵproperty("ngIf", !ctx.showEmptyState);
558
+ i0.ɵɵadvance(1);
559
+ i0.ɵɵproperty("ngIf", ctx.showEmptyState);
560
+ } }, directives: [i4.NgIf, i5.MatProgressBar, i6.MatButton, i7.MatTooltip, i8.MatIcon, i9.MatDivider, i10.TdMessageComponent, i11.TdFlavoredMarkdownLoaderComponent, i11.TdFlavoredMarkdownComponent, i12.MatList, i4.NgForOf, i12.MatListItem, i12.MatListIconCssMatStyler, i13.MatLine, i4.NgComponentOutlet, i12.MatListAvatarCssMatStyler], styles: ["[_nghost-%COMP%]{position:relative;height:inherit;height:100%;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}[_nghost-%COMP%] .scroll-area[_ngcontent-%COMP%]{min-height:1px;overflow-y:auto;-ms-flex:1;flex:1;box-sizing:border-box}[_nghost-%COMP%] .markdown-wrapper[_ngcontent-%COMP%]{padding:16px 16px 0}[_nghost-%COMP%] .td-markdown-list[_ngcontent-%COMP%] > .mat-list[_ngcontent-%COMP%]{padding-top:0}[_nghost-%COMP%] td-flavored-markdown-loader[_ngcontent-%COMP%] .mat-progress-bar{top:0;left:0;right:0;position:absolute}[_nghost-%COMP%] .title[_ngcontent-%COMP%]{display:inline-block;vertical-align:middle;margin:8px 0;padding-left:16px}.truncate[_ngcontent-%COMP%]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.empty-state[_ngcontent-%COMP%]{padding:32px}.empty-state[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:4em}"], changeDetection: 0 });
561
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TdMarkdownNavigatorComponent, [{
562
+ type: Component,
563
+ args: [{ selector: 'td-markdown-navigator', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!showEmptyState\">\n <mat-progress-bar *ngIf=\"loading\" mode=\"indeterminate\" color=\"accent\"></mat-progress-bar>\n\n <ng-container *ngIf=\"showHeader\">\n <div [style.display]=\"'flex'\">\n <button\n id=\"td-markdown-navigator-home-button\"\n *ngIf=\"showHomeButton\"\n mat-icon-button\n [matTooltip]=\"goHomeLabel\"\n (click)=\"reset()\"\n [attr.data-test]=\"'home-button'\"\n >\n <mat-icon [attr.aria-label]=\"goHomeLabel\">home</mat-icon>\n </button>\n\n <button\n id=\"td-markdown-navigator-back-button\"\n *ngIf=\"showGoBackButton\"\n mat-icon-button\n [matTooltip]=\"goBackLabel\"\n (click)=\"goBack()\"\n [attr.data-test]=\"'back-button'\"\n >\n <mat-icon [attr.aria-label]=\"goBackLabel\">arrow_back</mat-icon>\n </button>\n <span flex *ngIf=\"currentItemTitle\" class=\"mat-body-2 title truncate\" [attr.data-test]=\"'title'\">\n {{ currentItemTitle }}\n </span>\n </div>\n\n <mat-divider [style.position]=\"'relative'\"></mat-divider>\n </ng-container>\n\n <div class=\"scroll-area\" id=\"td-markdown-navigator-content\">\n <div *ngIf=\"showTdMarkdownLoader || showTdMarkdown\" class=\"markdown-wrapper\" #markdownWrapper>\n <td-message\n *ngIf=\"markdownLoaderError\"\n [sublabel]=\"markdownLoaderError\"\n color=\"warn\"\n icon=\"error\"\n [attr.data-test]=\"'markdown-loader-error'\"\n ></td-message>\n <td-flavored-markdown-loader\n *ngIf=\"showTdMarkdownLoader\"\n [url]=\"url\"\n [httpOptions]=\"httpOptions\"\n [anchor]=\"anchor\"\n [copyCodeToClipboard]=\"copyCodeToClipboard\"\n [copyCodeTooltips]=\"copyCodeTooltips\"\n (loadFailed)=\"handleMarkdownLoaderError($event)\"\n ></td-flavored-markdown-loader>\n <td-flavored-markdown\n *ngIf=\"showTdMarkdown\"\n [content]=\"markdownString\"\n [hostedUrl]=\"url\"\n [anchor]=\"anchor\"\n [copyCodeToClipboard]=\"copyCodeToClipboard\"\n [copyCodeTooltips]=\"copyCodeTooltips\"\n (buttonClicked)=\"buttonClicked.emit($event)\"\n ></td-flavored-markdown>\n </div>\n\n <td-message\n *ngIf=\"childrenUrlError\"\n [sublabel]=\"childrenUrlError\"\n color=\"warn\"\n icon=\"error\"\n [attr.data-test]=\"'children-url-error'\"\n ></td-message>\n <div *ngIf=\"showMenu\" class=\"td-markdown-list\">\n <mat-action-list>\n <button\n *ngFor=\"let item of currentMenuItems; index as index\"\n [id]=\"'td-markdown-navigator-list-item-' + (item.id ? item.id : index)\"\n (click)=\"handleItemSelected(item)\"\n mat-list-item\n [matTooltip]=\"getTitle(item)\"\n matTooltipPosition=\"before\"\n matTooltipShowDelay=\"500\"\n >\n <mat-icon matListIcon>\n {{ getIcon(item) }}\n </mat-icon>\n <span matLine class=\"truncate\">\n {{ getTitle(item) }}\n </span>\n <span matLine class=\"truncate\">{{ item.description }}</span>\n <mat-divider></mat-divider>\n </button>\n </mat-action-list>\n </div>\n\n <ng-container *ngComponentOutlet=\"footerComponent\"></ng-container>\n </div>\n</ng-container>\n\n<div *ngIf=\"showEmptyState\" layout=\"column\" layout-align=\"center center\" class=\"empty-state\">\n <mat-icon matListAvatar>subject</mat-icon>\n <h2>{{ emptyStateLabel }}</h2>\n</div>\n", styles: [":host{position:relative;height:inherit;height:100%;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:host .scroll-area{min-height:1px;overflow-y:auto;-ms-flex:1;flex:1;box-sizing:border-box}:host .markdown-wrapper{padding:16px 16px 0}:host .td-markdown-list>.mat-list{padding-top:0}:host td-flavored-markdown-loader ::ng-deep .mat-progress-bar{top:0;left:0;right:0;position:absolute}:host .title{display:inline-block;vertical-align:middle;margin:8px 0;padding-left:16px}.truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.empty-state{padding:32px}.empty-state mat-icon{font-size:4em}\n"] }]
564
+ }], function () { return [{ type: i1.TdMarkdownLoaderService }, { type: i0.ChangeDetectorRef }, { type: i2.DomSanitizer }, { type: i3.HttpClient }]; }, { items: [{
565
+ type: Input
566
+ }], labels: [{
567
+ type: Input
568
+ }], startAt: [{
569
+ type: Input
570
+ }], copyCodeToClipboard: [{
571
+ type: Input
572
+ }], copyCodeTooltips: [{
573
+ type: Input
574
+ }], footer: [{
575
+ type: Input
576
+ }], compareWith: [{
577
+ type: Input
578
+ }], buttonClicked: [{
579
+ type: Output
580
+ }], markdownWrapper: [{
581
+ type: ViewChild,
582
+ args: ['markdownWrapper']
583
+ }], clickListener: [{
584
+ type: HostListener,
585
+ args: ['click', ['$event']]
586
+ }] }); })();
587
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tbmF2aWdhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9tYXJrZG93bi1uYXZpZ2F0b3IvbWFya2Rvd24tbmF2aWdhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9tYXJrZG93bi1uYXZpZ2F0b3IvbWFya2Rvd24tbmF2aWdhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUdMLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsSUFBSSxFQUNKLE1BQU0sRUFDTixZQUFZLEVBQ1osZUFBZSxHQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUNqQmhELHNDQUF5Rjs7OztJQUlyRixrQ0FPQztJQUZDLDZNQUFTLGVBQU8sSUFBQztJQUdqQixnQ0FBMEM7SUFBQSxvQkFBSTtJQUFBLGlCQUFXO0lBQzNELGlCQUFTOzs7SUFMUCwrQ0FBMEI7SUFFMUIsMENBQWdDO0lBRXRCLGVBQStCO0lBQS9CLGdEQUErQjs7OztJQUczQyxrQ0FPQztJQUZDLDZNQUFTLGdCQUFRLElBQUM7SUFHbEIsZ0NBQTBDO0lBQUEsMEJBQVU7SUFBQSxpQkFBVztJQUNqRSxpQkFBUzs7O0lBTFAsK0NBQTBCO0lBRTFCLDBDQUFnQztJQUV0QixlQUErQjtJQUEvQixnREFBK0I7OztJQUUzQyxnQ0FBaUc7SUFDL0YsWUFDRjtJQUFBLGlCQUFP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QyxZQUFZLEVBQUUsQ0FBQztJQUN6QyxDQUFDOzs4SUF6WFUsNEJBQTRCO2lJQUE1Qiw0QkFBNEI7Ozs7OzsrR0FBNUIseUJBQXFCOztRQ3hGbEMsK0ZBK0ZlO1FBRWYsNkVBR007O1FBcEdTLDBDQUFxQjtRQWlHOUIsZUFBb0I7UUFBcEIseUNBQW9COzt1RkRUYiw0QkFBNEI7Y0FOeEMsU0FBUzsyQkFDRSx1QkFBdUIsbUJBR2hCLHVCQUF1QixDQUFDLE1BQU07OEpBUXRDLEtBQUs7a0JBQWIsS0FBSztZQU9HLE1BQU07a0JBQWQsS0FBSztZQU9HLE9BQU87a0JBQWYsS0FBSztZQVFHLG1CQUFtQjtrQkFBM0IsS0FBSztZQU9HLGdCQUFnQjtrQkFBeEIsS0FBSztZQU9HLE1BQU07a0JBQWQsS0FBSztZQVFHLFdBQVc7a0JBQW5CLEtBQUs7WUFFSSxhQUFhO2tCQUF0QixNQUFNO1lBRXVCLGVBQWU7a0JBQTVDLFNBQVM7bUJBQUMsaUJBQWlCO1lBbUI1QixhQUFhO2tCQURaLFlBQVk7bUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBIb3N0TGlzdGVuZXIsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBUeXBlLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgU2VjdXJpdHlDb250ZXh0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHJlbW92ZUxlYWRpbmdIYXNoLCBpc0FuY2hvckxpbmssIFRkTWFya2Rvd25Mb2FkZXJTZXJ2aWNlIH0gZnJvbSAnQGNvdmFsZW50L21hcmtkb3duJztcbmltcG9ydCB7IElUZEZsYXZvcmVkTWFya2Rvd25CdXR0b25DbGlja0V2ZW50IH0gZnJvbSAnQGNvdmFsZW50L2ZsYXZvcmVkLW1hcmtkb3duJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IElDb3B5Q29kZVRvb2x0aXBzIH0gZnJvbSAnQGNvdmFsZW50L2hpZ2hsaWdodCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hcmtkb3duTmF2aWdhdG9ySXRlbSB7XG4gIGlkPzogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xuICBodHRwT3B0aW9ucz86IG9iamVjdDtcbiAgbWFya2Rvd25TdHJpbmc/OiBzdHJpbmc7IC8vIHJhdyBtYXJrZG93blxuICBhbmNob3I/OiBzdHJpbmc7XG4gIGNoaWxkcmVuPzogSU1hcmtkb3duTmF2aWdhdG9ySXRlbVtdO1xuICBjaGlsZHJlblVybD86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIGZvb3Rlcj86IFR5cGU8YW55PjtcbiAgc3RhcnRBdExpbms/OiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXJrZG93bk5hdmlnYXRvckxhYmVscyB7XG4gIGdvSG9tZT86IHN0cmluZztcbiAgZ29CYWNrPzogc3RyaW5nO1xuICBlbXB0eVN0YXRlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBJTWFya2Rvd25OYXZpZ2F0b3JDb21wYXJlV2l0aCA9IChvMTogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSwgbzI6IElNYXJrZG93bk5hdmlnYXRvckl0ZW0pID0+IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BUktET1dOX05BVklHQVRPUl9MQUJFTFM6IElNYXJrZG93bk5hdmlnYXRvckxhYmVscyA9IHtcbiAgZ29Ib21lOiAnR28gaG9tZScsXG4gIGdvQmFjazogJ0dvIGJhY2snLFxuICBlbXB0eVN0YXRlOiAnTm8gaXRlbShzKSB0byBkaXNwbGF5Jyxcbn07XG5cbmZ1bmN0aW9uIGdldFRpdGxlRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCB0ZW1wOiBVUkwgPSBuZXcgVVJMKHVybCk7XG4gICAgaWYgKHRlbXAuaGFzaCkge1xuICAgICAgcmV0dXJuIHJlbW92ZUxlYWRpbmdIYXNoKHRlbXAuaGFzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gdGVtcC5wYXRobmFtZS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgZmlsZU5hbWU6IHN0cmluZyA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICAgIHJldHVybiBmaWxlTmFtZS5yZXBsYWNlKC9cXC5bXi8uXSskLywgJycpOyAvLyByZW1vdmUgLm1kXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFRpdGxlRnJvbU1hcmtkb3duU3RyaW5nKG1hcmtkb3duU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAobWFya2Rvd25TdHJpbmcpIHtcbiAgICBjb25zdCBmaXJzdExpbmU6IHN0cmluZyA9IG1hcmtkb3duU3RyaW5nLnNwbGl0KC9bXFxyXFxuXSsvKS5maW5kKChsaW5lOiBzdHJpbmcpID0+ICEhbGluZSk7XG4gICAgcmV0dXJuIHJlbW92ZUxlYWRpbmdIYXNoKGZpcnN0TGluZSkudHJpbSgpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzTWFya2Rvd25IcmVmKGFuY2hvcjogSFRNTEFuY2hvckVsZW1lbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuICFpc0FuY2hvckxpbmsoYW5jaG9yKSAmJiBhbmNob3IucGF0aG5hbWUuZW5kc1dpdGgoJy5tZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmVXaXRoKG8xOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtLCBvMjogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSk6IGJvb2xlYW4ge1xuICBpZiAobzEuaWQgJiYgbzIuaWQpIHtcbiAgICByZXR1cm4gbzEuaWQgPT09IG8yLmlkO1xuICB9XG4gIHJldHVybiBvMSA9PT0gbzI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RkLW1hcmtkb3duLW5hdmlnYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXJrZG93bi1uYXZpZ2F0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXJrZG93bi1uYXZpZ2F0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRkTWFya2Rvd25OYXZpZ2F0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogaXRlbXM6IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXVxuICAgKlxuICAgKiBMaXN0IG9mIElNYXJrZG93bk5hdmlnYXRvckl0ZW1zIHRvIGJlIHJlbmRlcmVkXG4gICAqL1xuICBASW5wdXQoKSBpdGVtczogSU1hcmtkb3duTmF2aWdhdG9ySXRlbVtdO1xuXG4gIC8qKlxuICAgKiBsYWJlbHM/OiBJTWFya2Rvd25OYXZpZ2F0b3JMYWJlbHNcbiAgICpcbiAgICogVHJhbnNsYXRlZCBsYWJlbHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsczogSU1hcmtkb3duTmF2aWdhdG9yTGFiZWxzO1xuXG4gIC8qKlxuICAgKiBzdGFydEF0PzogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSB8IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXTtcbiAgICpcbiAgICogSXRlbSBvciBwYXRoIHRvIHN0YXJ0IGF0XG4gICAqL1xuICBASW5wdXQoKSBzdGFydEF0OiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtIHwgSU1hcmtkb3duTmF2aWdhdG9ySXRlbVtdO1xuXG4gIC8qKlxuICAgKiBjb3B5Q29kZVRvQ2xpcGJvYXJkPzogYm9vbGVhblxuICAgKlxuICAgKiBEaXNwbGF5IGNvcHkgYnV0dG9uIG9uIGNvZGUgc25pcHBldHMgdG8gY29weSBjb2RlIHRvIGNsaXBib2FyZC5cbiAgICpcbiAgICovXG4gIEBJbnB1dCgpIGNvcHlDb2RlVG9DbGlwYm9hcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogY29weUNvZGVUb29sdGlwcz86IElDb3B5Q29kZVRvb2x0aXBzXG4gICAqXG4gICAqIFRvb2x0aXBzIGZvciBjb3B5IGJ1dHRvbiB0byBjb3B5IGFuZCB1cG9uIGNvcHlpbmcuXG4gICAqL1xuICBASW5wdXQoKSBjb3B5Q29kZVRvb2x0aXBzOiBJQ29weUNvZGVUb29sdGlwcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBmb290ZXI/OiBUeXBlPGFueT5cbiAgICpcbiAgICogQ29tcG9uZW50IHRvIGJlIGRpc3BsYXllZCBpbiBmb290ZXJcbiAgICovXG4gIEBJbnB1dCgpIGZvb3RlcjogVHlwZTxhbnk+O1xuXG4gIC8qKlxuICAgKiBjb21wYXJlV2l0aD86IElNYXJrZG93bk5hdmlnYXRvckNvbXBhcmVXaXRoXG4gICAqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gZmluZCBzdGFydEF0IGl0ZW1cbiAgICogRGVmYXVsdHMgdG8gY29tcGFyaXNvbiBieSBzdHJpY3QgZXF1YWxpdHkgKD09PSlcbiAgICovXG4gIEBJbnB1dCgpIGNvbXBhcmVXaXRoOiBJTWFya2Rvd25OYXZpZ2F0b3JDb21wYXJlV2l0aDtcblxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPElUZEZsYXZvcmVkTWFya2Rvd25CdXR0b25DbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdtYXJrZG93bldyYXBwZXInKSBtYXJrZG93bldyYXBwZXI6IEVsZW1lbnRSZWY7XG5cbiAgaGlzdG9yeVN0YWNrOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtW10gPSBbXTsgLy8gaGlzdG9yeVxuICBjdXJyZW50TWFya2Rvd25JdGVtOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtOyAvLyBjdXJyZW50bHkgcmVuZGVyZWRcbiAgY3VycmVudE1lbnVJdGVtczogSU1hcmtkb3duTmF2aWdhdG9ySXRlbVtdID0gW107IC8vIGN1cnJlbnQgbWVudSBpdGVtc1xuXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtYXJrZG93bkxvYWRlckVycm9yOiBzdHJpbmc7XG4gIGNoaWxkcmVuVXJsRXJyb3I6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9tYXJrZG93blVybExvYWRlclNlcnZpY2U6IFRkTWFya2Rvd25Mb2FkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LFxuICApIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBjbGlja0xpc3RlbmVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnNyY0VsZW1lbnQ7XG4gICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnYVtocmVmXScpICYmIGlzTWFya2Rvd25IcmVmKDxIVE1MQW5jaG9yRWxlbWVudD5lbGVtZW50KSkge1xuICAgICAgdGhpcy5oYW5kbGVMaW5rQ2xpY2soZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzaG93R29CYWNrQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0IHNob3dIb21lQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGggPiAxO1xuICB9XG5cbiAgZ2V0IHNob3dIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0hvbWVCdXR0b24gfHwgdGhpcy5zaG93R29CYWNrQnV0dG9uIHx8ICEhdGhpcy5jdXJyZW50SXRlbVRpdGxlO1xuICB9XG5cbiAgZ2V0IHNob3dNZW51KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRNZW51SXRlbXMgJiYgdGhpcy5jdXJyZW50TWVudUl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgc2hvd1RkTWFya2Rvd25Mb2FkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jdXJyZW50TWFya2Rvd25JdGVtICYmICEhdGhpcy5jdXJyZW50TWFya2Rvd25JdGVtLnVybCAmJiAhdGhpcy5zaG93VGRNYXJrZG93bjtcbiAgfVxuXG4gIGdldCBzaG93VGRNYXJrZG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0gJiYgISF0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0ubWFya2Rvd25TdHJpbmc7XG4gIH1cblxuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY3VycmVudE1hcmtkb3duSXRlbSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudE1hcmtkb3duSXRlbS51cmw7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgZm9vdGVyQ29tcG9uZW50KCk6IGFueSB7XG4gICAgaWYgKHRoaXMuY3VycmVudE1hcmtkb3duSXRlbSAmJiB0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0uZm9vdGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50TWFya2Rvd25JdGVtLmZvb3RlcjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9vdGVyO1xuICB9XG4gIGdldCBodHRwT3B0aW9ucygpOiBvYmplY3Qge1xuICAgIGlmICh0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0pIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0uaHR0cE9wdGlvbnM7XG4gICAgfVxuICB9XG4gIGdldCBtYXJrZG93blN0cmluZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0pIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0ubWFya2Rvd25TdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFuY2hvcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0pIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0uYW5jaG9yO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzaG93RW1wdHlTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXRlbXMgfHwgdGhpcy5pdGVtcy5sZW5ndGggPCAxO1xuICB9XG5cbiAgZ2V0IGdvSG9tZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVscy5nb0hvbWUpIHx8IERFRkFVTFRfTUFSS0RPV05fTkFWSUdBVE9SX0xBQkVMUy5nb0hvbWU7XG4gIH1cblxuICBnZXQgZ29CYWNrTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMubGFiZWxzICYmIHRoaXMubGFiZWxzLmdvQmFjaykgfHwgREVGQVVMVF9NQVJLRE9XTl9OQVZJR0FUT1JfTEFCRUxTLmdvQmFjaztcbiAgfVxuXG4gIGdldCBlbXB0eVN0YXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMubGFiZWxzICYmIHRoaXMubGFiZWxzLmVtcHR5U3RhdGUpIHx8IERFRkFVTFRfTUFSS0RPV05fTkFWSUdBVE9SX0xBQkVMUy5lbXB0eVN0YXRlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRJdGVtVGl0bGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50TWFya2Rvd25JdGVtKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSh0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGl0bGUodGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNoYW5nZXMuaXRlbXMpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuc3RhcnRBdCAmJiB0aGlzLml0ZW1zICYmIHRoaXMuc3RhcnRBdCkge1xuICAgICAgdGhpcy5fanVtcFRvKHRoaXMuc3RhcnRBdCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBoYXNDaGlsZHJlbk9yQ2hpbGRyZW5VcmwoaXRlbTogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHx8ICEhaXRlbS5jaGlsZHJlblVybDtcbiAgfVxuICBjbGVhckVycm9ycygpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtkb3duTG9hZGVyRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGlsZHJlblVybEVycm9yID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jbGVhckVycm9ycygpO1xuICAgIC8vIGlmIHNpbmdsZSBpdGVtIGFuZCBubyBjaGlsZHJlblxuICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoID09PSAxICYmICF0aGlzLmhhc0NoaWxkcmVuT3JDaGlsZHJlblVybCh0aGlzLml0ZW1zWzBdKSkge1xuICAgICAgdGhpcy5jdXJyZW50TWVudUl0ZW1zID0gW107XG4gICAgICB0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0gPSB0aGlzLml0ZW1zWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRNZW51SXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgICAgdGhpcy5jdXJyZW50TWFya2Rvd25JdGVtID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmhpc3RvcnlTdGFjayA9IFtdO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ29CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJFcnJvcnMoKTtcbiAgICBpZiAodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID4gMSkge1xuICAgICAgbGV0IHBhcmVudDogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSA9IHRoaXMuaGlzdG9yeVN0YWNrW3RoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCAtIDJdO1xuXG4gICAgICBpZiAocGFyZW50LnN0YXJ0QXRMaW5rKSB7XG4gICAgICAgIHBhcmVudCA9IHRoaXMuaGlzdG9yeVN0YWNrW3RoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCAtIDNdXG4gICAgICAgICAgPyB0aGlzLmhpc3RvcnlTdGFja1t0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGggLSAzXVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmhpc3RvcnlTdGFjayA9IHRoaXMuaGlzdG9yeVN0YWNrLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRNYXJrZG93bkl0ZW0gPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuaGlzdG9yeVN0YWNrID0gdGhpcy5oaXN0b3J5U3RhY2suc2xpY2UoMCwgLTEpO1xuICAgICAgICB0aGlzLnNldENoaWxkcmVuQXNDdXJyZW50TWVudUl0ZW1zKHBhcmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9uZSBsZXZlbCBkb3duIGp1c3QgZ28gdG8gcm9vdFxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGhhbmRsZUl0ZW1TZWxlY3RlZChpdGVtOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckVycm9ycygpO1xuICAgIHRoaXMuY3VycmVudE1hcmtkb3duSXRlbSA9IGl0ZW07XG4gICAgdGhpcy5oaXN0b3J5U3RhY2sgPSBbLi4udGhpcy5oaXN0b3J5U3RhY2ssIGl0ZW1dO1xuICAgIHRoaXMuc2V0Q2hpbGRyZW5Bc0N1cnJlbnRNZW51SXRlbXMoaXRlbSk7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBhc3luYyBzZXRDaGlsZHJlbkFzQ3VycmVudE1lbnVJdGVtcyhpdGVtOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50TWVudUl0ZW1zID0gW107XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcblxuICAgIGNvbnN0IHN0YWNrU25hcHNob3Q6IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXSA9IHRoaXMuaGlzdG9yeVN0YWNrO1xuICAgIGxldCBjaGlsZHJlbjogSU1hcmtkb3duTmF2aWdhdG9ySXRlbVtdID0gW107XG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuID0gaXRlbS5jaGlsZHJlbjtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY2hpbGRyZW5VcmwpIHtcbiAgICAgIGNoaWxkcmVuID0gYXdhaXQgdGhpcy5sb2FkQ2hpbGRyZW5VcmwoaXRlbSk7XG4gICAgfVxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggJiYgaXRlbS5zdGFydEF0TGluaykge1xuICAgICAgdGhpcy5fanVtcFRvKGl0ZW0uc3RhcnRBdExpbmssIGNoaWxkcmVuKTtcbiAgICB9XG4gICAgY29uc3QgbmV3U3RhY2tTbmFwc2hvdDogSU1hcmtkb3duTmF2aWdhdG9ySXRlbVtdID0gdGhpcy5oaXN0b3J5U3RhY2s7XG4gICAgaWYgKFxuICAgICAgc3RhY2tTbmFwc2hvdC5sZW5ndGggPT09IG5ld1N0YWNrU25hcHNob3QubGVuZ3RoICYmXG4gICAgICBzdGFja1NuYXBzaG90LmV2ZXJ5KChzdGFja0l0ZW06IElNYXJrZG93bk5hdmlnYXRvckl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHN0YWNrSXRlbSA9PT0gbmV3U3RhY2tTbmFwc2hvdFtpbmRleF0pXG4gICAgKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNZW51SXRlbXMgPSBjaGlsZHJlbjtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRDaGlsZHJlblVybChpdGVtOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtKTogUHJvbWlzZTxJTWFya2Rvd25OYXZpZ2F0b3JJdGVtW10+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRVcmw6IHN0cmluZyA9IHRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuVVJMLCBpdGVtLmNoaWxkcmVuVXJsKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHAuZ2V0PElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXT4oc2FuaXRpemVkVXJsLCB7IC4uLml0ZW0uaHR0cE9wdGlvbnMgfSkudG9Qcm9taXNlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2hpbGRyZW5VcmxFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgZ2V0VGl0bGUoaXRlbTogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHJlbW92ZUxlYWRpbmdIYXNoKGl0ZW0uYW5jaG9yKSB8fFxuICAgICAgICBpdGVtLnRpdGxlIHx8XG4gICAgICAgIGdldFRpdGxlRnJvbVVybChpdGVtLnVybCkgfHxcbiAgICAgICAgZ2V0VGl0bGVGcm9tTWFya2Rvd25TdHJpbmcoaXRlbS5tYXJrZG93blN0cmluZykgfHxcbiAgICAgICAgJydcbiAgICAgICkudHJpbSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldEljb24oaXRlbTogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmljb24gfHwgJ3N1YmplY3QnO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNoaWxkcmVuVXJsRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5jaGlsZHJlblVybEVycm9yID0gZXJyb3IubWVzc2FnZTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBoYW5kbGVNYXJrZG93bkxvYWRlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMubWFya2Rvd25Mb2FkZXJFcnJvciA9IGVycm9yLm1lc3NhZ2U7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9qdW1wVG8oXG4gICAgaXRlbU9yUGF0aDogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSB8IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXSxcbiAgICBjaGlsZHJlbjogSU1hcmtkb3duTmF2aWdhdG9ySXRlbVtdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoaXN0b3J5U3RhY2s6IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXSA9IHRoaXMuaGlzdG9yeVN0YWNrO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBwYXRoOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtW10gPSBbXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1PclBhdGgpKSB7XG4gICAgICAgIHBhdGggPSBhd2FpdCB0aGlzLmZvbGxvd1BhdGgodGhpcy5pdGVtcywgaXRlbU9yUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5U3RhY2sgPSBoaXN0b3J5U3RhY2s7XG4gICAgICAgIHBhdGggPSB0aGlzLmZpbmRQYXRoKGNoaWxkcmVuLCBpdGVtT3JQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGggPSB0aGlzLmZpbmRQYXRoKHRoaXMuaXRlbXMsIGl0ZW1PclBhdGgpO1xuICAgICAgfVxuICAgICAgKHBhdGggfHwgW10pLmZvckVhY2goKHBhdGhJdGVtOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtKSA9PiB0aGlzLmhhbmRsZUl0ZW1TZWxlY3RlZChwYXRoSXRlbSkpO1xuICAgIH1cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZm9sbG93UGF0aChcbiAgICBpdGVtczogSU1hcmtkb3duTmF2aWdhdG9ySXRlbVtdLFxuICAgIHBhdGg6IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXSxcbiAgKTogUHJvbWlzZTxJTWFya2Rvd25OYXZpZ2F0b3JJdGVtW10+IHtcbiAgICBsZXQgcGF0aEl0ZW1zOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtW10gPSBbXTtcbiAgICBsZXQgY3VycmVudExldmVsOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtW10gPSBpdGVtcztcbiAgICBjb25zdCBjb21wYXJlV2l0aDogSU1hcmtkb3duTmF2aWdhdG9yQ29tcGFyZVdpdGggPSB0aGlzLmNvbXBhcmVXaXRoIHx8IGRlZmF1bHRDb21wYXJlV2l0aDtcbiAgICBmb3IgKGNvbnN0IHBhdGhJdGVtIG9mIHBhdGgpIHtcbiAgICAgIGNvbnN0IGZvdW5kSXRlbTogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSA9IGN1cnJlbnRMZXZlbC5maW5kKChpdGVtOiBJTWFya2Rvd25OYXZpZ2F0b3JJdGVtKSA9PlxuICAgICAgICBjb21wYXJlV2l0aChwYXRoSXRlbSwgaXRlbSksXG4gICAgICApO1xuXG4gICAgICBpZiAoZm91bmRJdGVtKSB7XG4gICAgICAgIHBhdGhJdGVtcyA9IFsuLi5wYXRoSXRlbXMsIGZvdW5kSXRlbV07XG5cbiAgICAgICAgaWYgKGZvdW5kSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IGZvdW5kSXRlbS5jaGlsZHJlbjtcbiAgICAgICAgfSBlbHNlIGlmIChmb3VuZEl0ZW0uY2hpbGRyZW5VcmwpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwgPSBhd2FpdCB0aGlzLmxvYWRDaGlsZHJlblVybChmb3VuZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhdGhJdGVtcy5sZW5ndGggIT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBwYXRoSXRlbXMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhJdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhdGgoaXRlbXM6IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXSwgaXRlbTogSU1hcmtkb3duTmF2aWdhdG9ySXRlbSk6IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXSB7XG4gICAgY29uc3QgY29tcGFyZVdpdGg6IElNYXJrZG93bk5hdmlnYXRvckNvbXBhcmVXaXRoID0gdGhpcy5jb21wYXJlV2l0aCB8fCBkZWZhdWx0Q29tcGFyZVdpdGg7XG4gICAgaWYgKGl0ZW1zKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChjb21wYXJlV2l0aChjaGlsZCwgaXRlbSkpIHtcbiAgICAgICAgICByZXR1cm4gW2NoaWxkXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbmNlc3RvcnM6IElNYXJrZG93bk5hdmlnYXRvckl0ZW1bXSA9IHRoaXMuZmluZFBhdGgoY2hpbGQuY2hpbGRyZW4sIGl0ZW0pO1xuICAgICAgICBpZiAoYW5jZXN0b3JzKSB7XG4gICAgICAgICAgcmV0dXJuIFtjaGlsZCwgLi4uYW5jZXN0b3JzXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVMaW5rQ2xpY2soZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBsaW5rOiBIVE1MQW5jaG9yRWxlbWVudCA9IDxIVE1MQW5jaG9yRWxlbWVudD5ldmVudC50YXJnZXQ7XG4gICAgY29uc3QgdXJsOiBVUkwgPSBuZXcgVVJMKGxpbmsuaHJlZik7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFya2Rvd25TdHJpbmc6IHN0cmluZyA9IGF3YWl0IHRoaXMuX21hcmtkb3duVXJsTG9hZGVyU2VydmljZS5sb2FkKHVybC5ocmVmKTtcbiAgICAgIC8vIHBhc3MgaW4gdXJsIHRvIGJlIGFibGUgdG8gdXNlIGN1cnJlbnRNYXJrZG93bkl0ZW0udXJsIGxhdGVyIG9uXG4gICAgICB0aGlzLmhhbmRsZUl0ZW1TZWxlY3RlZCh7IG1hcmtkb3duU3RyaW5nLCB1cmw6IHVybC5ocmVmIH0pO1xuICAgICAgdGhpcy5tYXJrZG93bldyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCB3aW46IFdpbmRvdyA9IHdpbmRvdy5vcGVuKHVybC5ocmVmLCAnX2JsYW5rJyk7XG4gICAgICB3aW4uZm9jdXMoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dFbXB0eVN0YXRlXCI+XG4gIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwibG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgY29sb3I9XCJhY2NlbnRcIj48L21hdC1wcm9ncmVzcy1iYXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dIZWFkZXJcIj5cbiAgICA8ZGl2IFtzdHlsZS5kaXNwbGF5XT1cIidmbGV4J1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBpZD1cInRkLW1hcmtkb3duLW5hdmlnYXRvci1ob21lLWJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwic2hvd0hvbWVCdXR0b25cIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW21hdFRvb2x0aXBdPVwiZ29Ib21lTGFiZWxcIlxuICAgICAgICAoY2xpY2spPVwicmVzZXQoKVwiXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdF09XCInaG9tZS1idXR0b24nXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIFthdHRyLmFyaWEtbGFiZWxdPVwiZ29Ib21lTGFiZWxcIj5ob21lPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIGlkPVwidGQtbWFya2Rvd24tbmF2aWdhdG9yLWJhY2stYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJzaG93R29CYWNrQnV0dG9uXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIFttYXRUb29sdGlwXT1cImdvQmFja0xhYmVsXCJcbiAgICAgICAgKGNsaWNrKT1cImdvQmFjaygpXCJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0XT1cIidiYWNrLWJ1dHRvbidcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gW2F0dHIuYXJpYS1sYWJlbF09XCJnb0JhY2tMYWJlbFwiPmFycm93X2JhY2s8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhbiBmbGV4ICpuZ0lmPVwiY3VycmVudEl0ZW1UaXRsZVwiIGNsYXNzPVwibWF0LWJvZHktMiB0aXRsZSB0cnVuY2F0ZVwiIFthdHRyLmRhdGEtdGVzdF09XCIndGl0bGUnXCI+XG4gICAgICAgIHt7IGN1cnJlbnRJdGVtVGl0bGUgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtZGl2aWRlciBbc3R5bGUucG9zaXRpb25dPVwiJ3JlbGF0aXZlJ1wiPjwvbWF0LWRpdmlkZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJzY3JvbGwtYXJlYVwiIGlkPVwidGQtbWFya2Rvd24tbmF2aWdhdG9yLWNvbnRlbnRcIj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd1RkTWFya2Rvd25Mb2FkZXIgfHwgc2hvd1RkTWFya2Rvd25cIiBjbGFzcz1cIm1hcmtkb3duLXdyYXBwZXJcIiAjbWFya2Rvd25XcmFwcGVyPlxuICAgICAgPHRkLW1lc3NhZ2VcbiAgICAgICAgKm5nSWY9XCJtYXJrZG93bkxvYWRlckVycm9yXCJcbiAgICAgICAgW3N1YmxhYmVsXT1cIm1hcmtkb3duTG9hZGVyRXJyb3JcIlxuICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICBpY29uPVwiZXJyb3JcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RdPVwiJ21hcmtkb3duLWxvYWRlci1lcnJvcidcIlxuICAgICAgPjwvdGQtbWVzc2FnZT5cbiAgICAgIDx0ZC1mbGF2b3JlZC1tYXJrZG93bi1sb2FkZXJcbiAgICAgICAgKm5nSWY9XCJzaG93VGRNYXJrZG93bkxvYWRlclwiXG4gICAgICAgIFt1cmxdPVwidXJsXCJcbiAgICAgICAgW2h0dHBPcHRpb25zXT1cImh0dHBPcHRpb25zXCJcbiAgICAgICAgW2FuY2hvcl09XCJhbmNob3JcIlxuICAgICAgICBbY29weUNvZGVUb0NsaXBib2FyZF09XCJjb3B5Q29kZVRvQ2xpcGJvYXJkXCJcbiAgICAgICAgW2NvcHlDb2RlVG9vbHRpcHNdPVwiY29weUNvZGVUb29sdGlwc1wiXG4gICAgICAgIChsb2FkRmFpbGVkKT1cImhhbmRsZU1hcmtkb3duTG9hZGVyRXJyb3IoJGV2ZW50KVwiXG4gICAgICA+PC90ZC1mbGF2b3JlZC1tYXJrZG93bi1sb2FkZXI+XG4gICAgICA8dGQtZmxhdm9yZWQtbWFya2Rvd25cbiAgICAgICAgKm5nSWY9XCJzaG93VGRNYXJrZG93blwiXG4gICAgICAgIFtjb250ZW50XT1cIm1hcmtkb3duU3RyaW5nXCJcbiAgICAgICAgW2hvc3RlZFVybF09XCJ1cmxcIlxuICAgICAgICBbYW5jaG9yXT1cImFuY2hvclwiXG4gICAgICAgIFtjb3B5Q29kZVRvQ2xpcGJvYXJkXT1cImNvcHlDb2RlVG9DbGlwYm9hcmRcIlxuICAgICAgICBbY29weUNvZGVUb29sdGlwc109XCJjb3B5Q29kZVRvb2x0aXBzXCJcbiAgICAgICAgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxuICAgICAgPjwvdGQtZmxhdm9yZWQtbWFya2Rvd24+XG4gICAgPC9kaXY+XG5cbiAgICA8dGQtbWVzc2FnZVxuICAgICAgKm5nSWY9XCJjaGlsZHJlblVybEVycm9yXCJcbiAgICAgIFtzdWJsYWJlbF09XCJjaGlsZHJlblVybEVycm9yXCJcbiAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICBpY29uPVwiZXJyb3JcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0XT1cIidjaGlsZHJlbi11cmwtZXJyb3InXCJcbiAgICA+PC90ZC1tZXNzYWdlPlxuICAgIDxkaXYgKm5nSWY9XCJzaG93TWVudVwiIGNsYXNzPVwidGQtbWFya2Rvd24tbGlzdFwiPlxuICAgICAgPG1hdC1hY3Rpb24tbGlzdD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGN1cnJlbnRNZW51SXRlbXM7IGluZGV4IGFzIGluZGV4XCJcbiAgICAgICAgICBbaWRdPVwiJ3RkLW1hcmtkb3duLW5hdmlnYXRvci1saXN0LWl0ZW0tJyArIChpdGVtLmlkID8gaXRlbS5pZCA6IGluZGV4KVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUl0ZW1TZWxlY3RlZChpdGVtKVwiXG4gICAgICAgICAgbWF0LWxpc3QtaXRlbVxuICAgICAgICAgIFttYXRUb29sdGlwXT1cImdldFRpdGxlKGl0ZW0pXCJcbiAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWZvcmVcIlxuICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uIG1hdExpc3RJY29uPlxuICAgICAgICAgICAge3sgZ2V0SWNvbihpdGVtKSB9fVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4gbWF0TGluZSBjbGFzcz1cInRydW5jYXRlXCI+XG4gICAgICAgICAgICB7eyBnZXRUaXRsZShpdGVtKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBtYXRMaW5lIGNsYXNzPVwidHJ1bmNhdGVcIj57eyBpdGVtLmRlc2NyaXB0aW9uIH19PC9zcGFuPlxuICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbWF0LWFjdGlvbi1saXN0PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCJmb290ZXJDb21wb25lbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPGRpdiAqbmdJZj1cInNob3dFbXB0eVN0YXRlXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIGNlbnRlclwiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgPG1hdC1pY29uIG1hdExpc3RBdmF0YXI+c3ViamVjdDwvbWF0LWljb24+XG4gIDxoMj57eyBlbXB0eVN0YXRlTGFiZWwgfX08L2gyPlxuPC9kaXY+XG4iXX0=