@universis/ngx-tables 0.8.5 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/universis-ngx-tables.umd.js +5816 -3756
- package/bundles/universis-ngx-tables.umd.js.map +1 -1
- package/bundles/universis-ngx-tables.umd.min.js +1 -1
- package/bundles/universis-ngx-tables.umd.min.js.map +1 -1
- package/esm2015/lib/actions/table.actions.js +48 -7
- package/esm2015/lib/advanced-aggregator.js +5 -1
- package/esm2015/lib/components/add-items/add-items.component.js +93 -26
- package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +75 -5
- package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +39 -12
- package/esm2015/lib/components/advanced-list/advanced-list.component.js +105 -33
- package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +97 -16
- package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +87 -16
- package/esm2015/lib/components/advanced-select/advanced-select.component.js +33 -1
- package/esm2015/lib/components/advanced-select/advanced-select.service.js +20 -3
- package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +23 -2
- package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +37 -9
- package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +22 -1
- package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +223 -31
- package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +90 -8
- package/esm2015/lib/components/advanced-table/advanced-table.component.js +576 -126
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +36 -1
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +257 -44
- package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +4 -0
- package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +211 -55
- package/esm2015/lib/components/column-selector/column-selector.component.js +167 -73
- package/esm2015/lib/components/column-selector/column-selector.service.js +19 -2
- package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +31 -7
- package/esm2015/lib/directives/advance-search-state.directive.js +49 -10
- package/esm2015/lib/directives/advance-table-state.directive.js +26 -3
- package/esm2015/lib/directives/advanced-search-router-state.directive.js +35 -8
- package/esm2015/lib/directives/advanced-table-editor.directive.js +43 -13
- package/esm2015/lib/directives/btnexp.directive.js +85 -42
- package/esm2015/lib/i18n/tables.el.js +6 -3
- package/esm2015/lib/i18n/tables.en.js +6 -3
- package/esm2015/lib/pipes/advanced-aggregator.pipe.js +12 -8
- package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +19 -7
- package/esm2015/lib/reducers/index.js +32 -1
- package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +37 -15
- package/esm2015/lib/tables.activated-table.service.js +41 -6
- package/esm2015/lib/tables.module.js +18 -4
- package/esm2015/public_api.js +33 -29
- package/esm2015/universis-ngx-tables.js +6 -2
- package/esm5/lib/actions/table.actions.js +37 -7
- package/esm5/lib/advanced-aggregator.js +5 -1
- package/esm5/lib/components/add-items/add-items.component.js +124 -34
- package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +111 -15
- package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +54 -11
- package/esm5/lib/components/advanced-list/advanced-list.component.js +125 -37
- package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +124 -24
- package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +109 -22
- package/esm5/lib/components/advanced-select/advanced-select.component.js +36 -4
- package/esm5/lib/components/advanced-select/advanced-select.service.js +22 -4
- package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +37 -5
- package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +43 -11
- package/esm5/lib/components/advanced-table/advanced-table-search-base.js +29 -4
- package/esm5/lib/components/advanced-table/advanced-table-search.component.js +323 -58
- package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +112 -15
- package/esm5/lib/components/advanced-table/advanced-table.component.js +761 -164
- package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +36 -1
- package/esm5/lib/components/advanced-table/advanced-table.formatters.js +392 -57
- package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +4 -0
- package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +311 -70
- package/esm5/lib/components/column-selector/column-selector.component.js +264 -145
- package/esm5/lib/components/column-selector/column-selector.service.js +21 -3
- package/esm5/lib/components/table-simple-header/table-simple-header.component.js +44 -10
- package/esm5/lib/directives/advance-search-state.directive.js +68 -15
- package/esm5/lib/directives/advance-table-state.directive.js +26 -4
- package/esm5/lib/directives/advanced-search-router-state.directive.js +39 -12
- package/esm5/lib/directives/advanced-table-editor.directive.js +66 -18
- package/esm5/lib/directives/btnexp.directive.js +171 -39
- package/esm5/lib/i18n/tables.el.js +6 -3
- package/esm5/lib/i18n/tables.en.js +6 -3
- package/esm5/lib/pipes/advanced-aggregator.pipe.js +32 -6
- package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +34 -8
- package/esm5/lib/reducers/index.js +32 -1
- package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +75 -13
- package/esm5/lib/tables.activated-table.service.js +39 -8
- package/esm5/lib/tables.module.js +19 -5
- package/esm5/public_api.js +33 -29
- package/esm5/universis-ngx-tables.js +6 -2
- package/fesm2015/universis-ngx-tables.js +1870 -569
- package/fesm2015/universis-ngx-tables.js.map +1 -1
- package/fesm5/universis-ngx-tables.js +2902 -802
- package/fesm5/universis-ngx-tables.js.map +1 -1
- package/lib/components/add-items/add-items.component.d.ts +9 -16
- package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +5 -5
- package/lib/components/advanced-list/advanced-list.component.d.ts +11 -11
- package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +11 -16
- package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +3 -3
- package/lib/components/advanced-table/advanced-table-search.component.d.ts +5 -5
- package/lib/components/advanced-table/advanced-table-settings.component.d.ts +5 -6
- package/lib/components/advanced-table/advanced-table.component.d.ts +14 -15
- package/lib/components/advanced-table/advanced-table.formatters.d.ts +11 -11
- package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +11 -11
- package/lib/components/column-selector/column-selector.component.d.ts +4 -4
- package/lib/components/table-simple-header/table-simple-header.component.d.ts +3 -3
- package/lib/directives/advance-search-state.directive.d.ts +3 -3
- package/lib/directives/advance-table-state.directive.d.ts +1 -1
- package/lib/directives/advanced-search-router-state.directive.d.ts +6 -6
- package/lib/directives/btnexp.directive.d.ts +9 -9
- package/lib/pipes/advanced-aggregator.pipe.d.ts +3 -3
- package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +5 -5
- package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +8 -8
- package/lib/tables.activated-table.service.d.ts +6 -6
- package/package.json +10 -4
- package/universis-ngx-tables.metadata.json +1 -1
|
@@ -1,10 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview added by tsickle
|
|
3
|
+
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
|
|
4
|
+
*/
|
|
1
5
|
import { template, at } from 'lodash';
|
|
2
6
|
import { TranslateService } from '@ngx-translate/core';
|
|
3
7
|
import { DatePipe } from '@angular/common';
|
|
4
8
|
import * as ISO6391 from 'iso-639-1/build';
|
|
5
9
|
import { ActivatedRoute, Router } from '@angular/router';
|
|
10
|
+
/**
|
|
11
|
+
* @abstract
|
|
12
|
+
*/
|
|
6
13
|
export class AdvancedColumnFormatter {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.title = '';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* @param {?} expr
|
|
19
|
+
* @return {?}
|
|
20
|
+
*/
|
|
7
21
|
static template(expr) {
|
|
22
|
+
/** @type {?} */
|
|
8
23
|
let result = AdvancedColumnFormatter.templateCache.get(expr);
|
|
9
24
|
if (typeof result === 'function') {
|
|
10
25
|
return result;
|
|
@@ -13,18 +28,28 @@ export class AdvancedColumnFormatter {
|
|
|
13
28
|
AdvancedColumnFormatter.templateCache.set(expr, result);
|
|
14
29
|
return result;
|
|
15
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* @param {?} data
|
|
33
|
+
* @param {?} options
|
|
34
|
+
* @return {?}
|
|
35
|
+
*/
|
|
16
36
|
createUrlTree(data, options) {
|
|
17
|
-
if (Array.isArray(options.commands)) {
|
|
37
|
+
if (Array.isArray(options.commands) && this.injector) {
|
|
38
|
+
/** @type {?} */
|
|
18
39
|
const activatedRoute = this.injector.get(ActivatedRoute);
|
|
40
|
+
/** @type {?} */
|
|
19
41
|
const router = this.injector.get(Router);
|
|
42
|
+
/** @type {?} */
|
|
20
43
|
const commands = options.commands.map((command) => {
|
|
21
44
|
if (typeof command === 'string') {
|
|
22
45
|
return AdvancedColumnFormatter.template(command)(data);
|
|
23
46
|
}
|
|
24
47
|
if (command.outlets) {
|
|
48
|
+
/** @type {?} */
|
|
25
49
|
const commandOutlets = {};
|
|
26
50
|
Object.keys(command.outlets).forEach((key) => {
|
|
27
51
|
if (Object.prototype.hasOwnProperty.call(command.outlets, key)) {
|
|
52
|
+
/** @type {?} */
|
|
28
53
|
const outlet = command.outlets[key];
|
|
29
54
|
if (Array.isArray(outlet)) {
|
|
30
55
|
Object.defineProperty(commandOutlets, key, {
|
|
@@ -52,21 +77,28 @@ export class AdvancedColumnFormatter {
|
|
|
52
77
|
}
|
|
53
78
|
return command;
|
|
54
79
|
});
|
|
80
|
+
/** @type {?} */
|
|
55
81
|
const queryParams = {};
|
|
82
|
+
/** @type {?} */
|
|
56
83
|
let replaceUrl = true;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
84
|
+
/** @type {?} */
|
|
85
|
+
const queryParamExtras = options.navigationExtras && options.navigationExtras.queryParams;
|
|
86
|
+
if (queryParamExtras) {
|
|
87
|
+
Object.keys(queryParamExtras).map((key) => {
|
|
88
|
+
/** @type {?} */
|
|
89
|
+
const text = queryParamExtras[key];
|
|
60
90
|
queryParams[key] = AdvancedColumnFormatter.template(text)(data);
|
|
61
91
|
});
|
|
62
92
|
}
|
|
63
93
|
if (options.navigationExtras && typeof options.navigationExtras.replaceUrl !== 'undefined') {
|
|
64
94
|
replaceUrl = options.navigationExtras.replaceUrl;
|
|
65
95
|
}
|
|
96
|
+
/** @type {?} */
|
|
66
97
|
let skipLocationChange = false;
|
|
67
98
|
if (options.navigationExtras && typeof options.navigationExtras.skipLocationChange !== 'undefined') {
|
|
68
99
|
skipLocationChange = options.navigationExtras.skipLocationChange;
|
|
69
100
|
}
|
|
101
|
+
/** @type {?} */
|
|
70
102
|
let fragment;
|
|
71
103
|
if (options.navigationExtras && typeof options.navigationExtras.fragment !== 'undefined') {
|
|
72
104
|
fragment = options.navigationExtras.fragment;
|
|
@@ -82,9 +114,61 @@ export class AdvancedColumnFormatter {
|
|
|
82
114
|
}
|
|
83
115
|
}
|
|
84
116
|
AdvancedColumnFormatter.templateCache = new Map();
|
|
117
|
+
if (false) {
|
|
118
|
+
/** @type {?} */
|
|
119
|
+
AdvancedColumnFormatter.templateCache;
|
|
120
|
+
/** @type {?} */
|
|
121
|
+
AdvancedColumnFormatter.prototype.injector;
|
|
122
|
+
/** @type {?} */
|
|
123
|
+
AdvancedColumnFormatter.prototype.className;
|
|
124
|
+
/** @type {?} */
|
|
125
|
+
AdvancedColumnFormatter.prototype.defaultContent;
|
|
126
|
+
/** @type {?} */
|
|
127
|
+
AdvancedColumnFormatter.prototype.formatString;
|
|
128
|
+
/** @type {?} */
|
|
129
|
+
AdvancedColumnFormatter.prototype.formatter;
|
|
130
|
+
/** @type {?} */
|
|
131
|
+
AdvancedColumnFormatter.prototype.hidden;
|
|
132
|
+
/** @type {?} */
|
|
133
|
+
AdvancedColumnFormatter.prototype.name;
|
|
134
|
+
/** @type {?} */
|
|
135
|
+
AdvancedColumnFormatter.prototype.order;
|
|
136
|
+
/** @type {?} */
|
|
137
|
+
AdvancedColumnFormatter.prototype.property;
|
|
138
|
+
/** @type {?} */
|
|
139
|
+
AdvancedColumnFormatter.prototype.sortable;
|
|
140
|
+
/** @type {?} */
|
|
141
|
+
AdvancedColumnFormatter.prototype.title;
|
|
142
|
+
/** @type {?} */
|
|
143
|
+
AdvancedColumnFormatter.prototype.formatOptions;
|
|
144
|
+
/** @type {?} */
|
|
145
|
+
AdvancedColumnFormatter.prototype.actions;
|
|
146
|
+
/**
|
|
147
|
+
* @abstract
|
|
148
|
+
* @param {?} data
|
|
149
|
+
* @param {?} type
|
|
150
|
+
* @param {?} row
|
|
151
|
+
* @param {?} meta
|
|
152
|
+
* @return {?}
|
|
153
|
+
*/
|
|
154
|
+
AdvancedColumnFormatter.prototype.render = function (data, type, row, meta) { };
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* @record
|
|
158
|
+
*/
|
|
159
|
+
export function OnAdvancedColumnAfterRender() { }
|
|
160
|
+
/** @type {?} */
|
|
161
|
+
OnAdvancedColumnAfterRender.prototype.afterRender;
|
|
85
162
|
export class NestedPropertyFormatter extends AdvancedColumnFormatter {
|
|
163
|
+
/**
|
|
164
|
+
* @param {?} data
|
|
165
|
+
* @param {?} type
|
|
166
|
+
* @param {?} row
|
|
167
|
+
* @param {?} meta
|
|
168
|
+
* @return {?}
|
|
169
|
+
*/
|
|
86
170
|
render(data, type, row, meta) {
|
|
87
|
-
|
|
171
|
+
/** @type {?} */
|
|
88
172
|
const column = meta.settings.aoColumns[meta.col];
|
|
89
173
|
if (column && column.data) {
|
|
90
174
|
return at(row, column.data.replace(/\//g, '.'));
|
|
@@ -96,18 +180,24 @@ export class NestedPropertyFormatter extends AdvancedColumnFormatter {
|
|
|
96
180
|
}
|
|
97
181
|
}
|
|
98
182
|
export class ButtonFormatter extends AdvancedColumnFormatter {
|
|
183
|
+
/**
|
|
184
|
+
* @param {?} data
|
|
185
|
+
* @param {?} type
|
|
186
|
+
* @param {?} row
|
|
187
|
+
* @param {?} meta
|
|
188
|
+
* @return {?}
|
|
189
|
+
*/
|
|
99
190
|
render(data, type, row, meta) {
|
|
100
|
-
if (data == null) {
|
|
191
|
+
if (data == null || this.injector == null) {
|
|
101
192
|
return '';
|
|
102
193
|
}
|
|
103
|
-
|
|
104
|
-
const column = meta.settings.aoColumns[meta.col];
|
|
105
|
-
// get format options
|
|
194
|
+
/** @type {?} */
|
|
106
195
|
const formatOptions = Object.assign({
|
|
107
196
|
buttonClass: 'btn btn-default',
|
|
108
197
|
}, this.formatOptions);
|
|
109
|
-
|
|
198
|
+
/** @type {?} */
|
|
110
199
|
let buttonText;
|
|
200
|
+
/** @type {?} */
|
|
111
201
|
let buttonTitle = '';
|
|
112
202
|
if (formatOptions.buttonText) {
|
|
113
203
|
buttonText = this.injector.get(TranslateService).instant(formatOptions.buttonText);
|
|
@@ -119,11 +209,12 @@ export class ButtonFormatter extends AdvancedColumnFormatter {
|
|
|
119
209
|
buttonTitle = this.injector.get(TranslateService).instant(formatOptions.buttonTitle);
|
|
120
210
|
}
|
|
121
211
|
if (Array.isArray(this.formatOptions.commands)) {
|
|
122
|
-
|
|
212
|
+
/** @type {?} */
|
|
213
|
+
const routerLink = this.createUrlTree(row, this.formatOptions);
|
|
123
214
|
return `<a class="${formatOptions.buttonClass}" title="${buttonTitle}" href="#${routerLink}">${buttonText}</a>`;
|
|
124
215
|
}
|
|
125
|
-
|
|
126
|
-
const href = AdvancedColumnFormatter.template(this.formatString)(row);
|
|
216
|
+
/** @type {?} */
|
|
217
|
+
const href = AdvancedColumnFormatter.template(/** @type {?} */ (this.formatString))(row);
|
|
127
218
|
return `<a class="${formatOptions.buttonClass}" title="${buttonTitle}" href="${href}">${buttonText}</a>`;
|
|
128
219
|
}
|
|
129
220
|
constructor() {
|
|
@@ -131,11 +222,18 @@ export class ButtonFormatter extends AdvancedColumnFormatter {
|
|
|
131
222
|
}
|
|
132
223
|
}
|
|
133
224
|
export class LinkFormatter extends AdvancedColumnFormatter {
|
|
225
|
+
/**
|
|
226
|
+
* @param {?} data
|
|
227
|
+
* @param {?} type
|
|
228
|
+
* @param {?} row
|
|
229
|
+
* @param {?} meta
|
|
230
|
+
* @return {?}
|
|
231
|
+
*/
|
|
134
232
|
render(data, type, row, meta) {
|
|
135
|
-
|
|
233
|
+
/** @type {?} */
|
|
136
234
|
const column = meta.settings.aoColumns[meta.col];
|
|
137
235
|
if (column && column.data) {
|
|
138
|
-
return `<a href="${(AdvancedColumnFormatter.template(this.formatString)(row))}">${data}</a>`;
|
|
236
|
+
return `<a href="${(AdvancedColumnFormatter.template((/** @type {?} */ (this.formatString)))(row))}">${data}</a>`;
|
|
139
237
|
}
|
|
140
238
|
return data;
|
|
141
239
|
}
|
|
@@ -144,11 +242,20 @@ export class LinkFormatter extends AdvancedColumnFormatter {
|
|
|
144
242
|
}
|
|
145
243
|
}
|
|
146
244
|
export class ActionLinkFormatter extends AdvancedColumnFormatter {
|
|
245
|
+
/**
|
|
246
|
+
* @param {?} data
|
|
247
|
+
* @param {?} type
|
|
248
|
+
* @param {?} row
|
|
249
|
+
* @param {?} meta
|
|
250
|
+
* @return {?}
|
|
251
|
+
*/
|
|
147
252
|
render(data, type, row, meta) {
|
|
148
|
-
|
|
253
|
+
/** @type {?} */
|
|
149
254
|
const column = meta.settings.aoColumns[meta.col];
|
|
150
255
|
if (column && column.data) {
|
|
256
|
+
/** @type {?} */
|
|
151
257
|
const actions = this.actions || [];
|
|
258
|
+
/** @type {?} */
|
|
152
259
|
let index = 1;
|
|
153
260
|
for (const action of actions) {
|
|
154
261
|
Object.assign(action, {
|
|
@@ -168,15 +275,16 @@ export class ActionLinkFormatter extends AdvancedColumnFormatter {
|
|
|
168
275
|
return `<div class="dropdown-divider"></div>`;
|
|
169
276
|
}
|
|
170
277
|
if (x.formatOptions && x.formatOptions.commands) {
|
|
278
|
+
/** @type {?} */
|
|
171
279
|
const urlTree = this.createUrlTree(row, x.formatOptions);
|
|
172
280
|
return `<a data-name='${x.name}' class="dropdown-item${typeof x.className === 'string' && x.className.length
|
|
173
|
-
? ` ${x.className.trim()}` : ''}" href="#${urlTree.toString()}">
|
|
174
|
-
${this.injector.get(TranslateService).instant(x.title)}
|
|
281
|
+
? ` ${x.className.trim()}` : ''}" href="#${urlTree && urlTree.toString()}">
|
|
282
|
+
${this.injector && this.injector.get(TranslateService).instant(x.title)}
|
|
175
283
|
</a>`;
|
|
176
284
|
}
|
|
177
285
|
return `<a data-name='${x.name}' class="dropdown-item${typeof x.className === 'string' && x.className.length
|
|
178
286
|
? ` ${x.className.trim()}` : ''}" href="${AdvancedColumnFormatter.template(x.href)(row)}">
|
|
179
|
-
${this.injector.get(TranslateService).instant(x.title)}
|
|
287
|
+
${this.injector && this.injector.get(TranslateService).instant(x.title)}
|
|
180
288
|
</a>`;
|
|
181
289
|
})
|
|
182
290
|
.join('')}
|
|
@@ -188,16 +296,33 @@ export class ActionLinkFormatter extends AdvancedColumnFormatter {
|
|
|
188
296
|
constructor() {
|
|
189
297
|
super();
|
|
190
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* @param {?} cell
|
|
301
|
+
* @param {?} cellData
|
|
302
|
+
* @param {?} rowData
|
|
303
|
+
* @param {?} rowIndex
|
|
304
|
+
* @param {?} colIndex
|
|
305
|
+
* @return {?}
|
|
306
|
+
*/
|
|
191
307
|
afterRender(cell, cellData, rowData, rowIndex, colIndex) {
|
|
192
308
|
// assign bootstrap dropdown (?)
|
|
193
309
|
}
|
|
194
310
|
}
|
|
195
311
|
export class ActionButtonFormatter extends AdvancedColumnFormatter {
|
|
312
|
+
/**
|
|
313
|
+
* @param {?} data
|
|
314
|
+
* @param {?} type
|
|
315
|
+
* @param {?} row
|
|
316
|
+
* @param {?} meta
|
|
317
|
+
* @return {?}
|
|
318
|
+
*/
|
|
196
319
|
render(data, type, row, meta) {
|
|
197
|
-
|
|
320
|
+
/** @type {?} */
|
|
198
321
|
const column = meta.settings.aoColumns[meta.col];
|
|
199
|
-
if (column && column.data) {
|
|
322
|
+
if (column && column.data && this.injector) {
|
|
323
|
+
/** @type {?} */
|
|
200
324
|
const actions = this.actions || [];
|
|
325
|
+
/** @type {?} */
|
|
201
326
|
let index = 1;
|
|
202
327
|
for (const action of actions) {
|
|
203
328
|
Object.assign(action, {
|
|
@@ -205,6 +330,7 @@ export class ActionButtonFormatter extends AdvancedColumnFormatter {
|
|
|
205
330
|
});
|
|
206
331
|
index += 1;
|
|
207
332
|
}
|
|
333
|
+
/** @type {?} */
|
|
208
334
|
let buttonText;
|
|
209
335
|
if (this.formatOptions && this.formatOptions.buttonText) {
|
|
210
336
|
// if button text is a literal expression
|
|
@@ -217,10 +343,12 @@ export class ActionButtonFormatter extends AdvancedColumnFormatter {
|
|
|
217
343
|
buttonText = this.injector.get(TranslateService).instant(this.formatOptions.buttonText);
|
|
218
344
|
}
|
|
219
345
|
}
|
|
346
|
+
/** @type {?} */
|
|
220
347
|
let buttonTitle;
|
|
221
348
|
if (this.formatOptions && this.formatOptions.buttonTitle) {
|
|
222
349
|
buttonTitle = this.injector.get(TranslateService).instant(this.formatOptions.buttonTbuttonTitleext);
|
|
223
350
|
}
|
|
351
|
+
/** @type {?} */
|
|
224
352
|
const buttonClass = (this.formatOptions && this.formatOptions.buttonClass) || 'btn btn-light';
|
|
225
353
|
// return the dropdown menu with 3 dots
|
|
226
354
|
return `<div class='dropdown details-control' data-id='${data}'>
|
|
@@ -234,13 +362,14 @@ export class ActionButtonFormatter extends AdvancedColumnFormatter {
|
|
|
234
362
|
return `<div class="dropdown-divider"></div>`;
|
|
235
363
|
}
|
|
236
364
|
if (x.commands) {
|
|
365
|
+
/** @type {?} */
|
|
237
366
|
const urlTree = this.createUrlTree(row, x);
|
|
238
|
-
return `<a class="dropdown-item" href="#${urlTree.toString()}">
|
|
239
|
-
${this.injector.get(TranslateService).instant(x.title)}
|
|
367
|
+
return `<a class="dropdown-item" href="#${urlTree && urlTree.toString()}">
|
|
368
|
+
${this.injector && this.injector.get(TranslateService).instant(x.title)}
|
|
240
369
|
</a>`;
|
|
241
370
|
}
|
|
242
371
|
return `<a class="dropdown-item" href="${AdvancedColumnFormatter.template(x.href)(row)}">
|
|
243
|
-
${this.injector.get(TranslateService).instant(x.title)}
|
|
372
|
+
${this.injector && this.injector.get(TranslateService).instant(x.title)}
|
|
244
373
|
</a>`;
|
|
245
374
|
})
|
|
246
375
|
.join('')}
|
|
@@ -252,16 +381,33 @@ export class ActionButtonFormatter extends AdvancedColumnFormatter {
|
|
|
252
381
|
constructor() {
|
|
253
382
|
super();
|
|
254
383
|
}
|
|
384
|
+
/**
|
|
385
|
+
* @param {?} cell
|
|
386
|
+
* @param {?} cellData
|
|
387
|
+
* @param {?} rowData
|
|
388
|
+
* @param {?} rowIndex
|
|
389
|
+
* @param {?} colIndex
|
|
390
|
+
* @return {?}
|
|
391
|
+
*/
|
|
255
392
|
afterRender(cell, cellData, rowData, rowIndex, colIndex) {
|
|
256
393
|
// assign bootstrap dropdown (?)
|
|
257
394
|
}
|
|
258
395
|
}
|
|
259
396
|
export class ActionSplitButtonFormatter extends AdvancedColumnFormatter {
|
|
397
|
+
/**
|
|
398
|
+
* @param {?} data
|
|
399
|
+
* @param {?} type
|
|
400
|
+
* @param {?} row
|
|
401
|
+
* @param {?} meta
|
|
402
|
+
* @return {?}
|
|
403
|
+
*/
|
|
260
404
|
render(data, type, row, meta) {
|
|
261
|
-
|
|
405
|
+
/** @type {?} */
|
|
262
406
|
const column = meta.settings.aoColumns[meta.col];
|
|
263
407
|
if (column && column.data) {
|
|
408
|
+
/** @type {?} */
|
|
264
409
|
const actions = this.actions || [];
|
|
410
|
+
/** @type {?} */
|
|
265
411
|
let index = 1;
|
|
266
412
|
for (const action of actions) {
|
|
267
413
|
Object.assign(action, {
|
|
@@ -272,23 +418,27 @@ export class ActionSplitButtonFormatter extends AdvancedColumnFormatter {
|
|
|
272
418
|
if (actions.length === 0) {
|
|
273
419
|
return;
|
|
274
420
|
}
|
|
421
|
+
/** @type {?} */
|
|
275
422
|
const buttonClass = (this.formatOptions && this.formatOptions.buttonClass) || 'btn btn-light';
|
|
276
|
-
|
|
423
|
+
/** @type {?} */
|
|
277
424
|
const defaultAction = actions[0];
|
|
425
|
+
/** @type {?} */
|
|
278
426
|
let defaultActionHref;
|
|
279
427
|
if (defaultAction && defaultAction.commands) {
|
|
280
|
-
|
|
428
|
+
/** @type {?} */
|
|
429
|
+
const urlTree = this.createUrlTree(row, defaultAction);
|
|
430
|
+
defaultActionHref = '#' + (urlTree && urlTree.toString());
|
|
281
431
|
}
|
|
282
432
|
else {
|
|
283
433
|
defaultActionHref = AdvancedColumnFormatter.template(defaultAction.href)(row);
|
|
284
434
|
}
|
|
285
435
|
return `<div class="btn-group">
|
|
286
436
|
<a type="button" class="${buttonClass}" href="${defaultActionHref}">
|
|
287
|
-
${this.injector.get(TranslateService).instant(defaultAction.title)}
|
|
437
|
+
${this.injector && this.injector.get(TranslateService).instant(defaultAction.title)}
|
|
288
438
|
</a>
|
|
289
439
|
<button type="button" class="${buttonClass} dropdown-toggle dropdown-toggle-split"
|
|
290
440
|
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
291
|
-
<span class="sr-only">${this.injector.get(TranslateService).instant('Toggle Dropdown')}</span>
|
|
441
|
+
<span class="sr-only">${this.injector && this.injector.get(TranslateService).instant('Toggle Dropdown')}</span>
|
|
292
442
|
</button>
|
|
293
443
|
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton-${data}">
|
|
294
444
|
${actions.map((x) => {
|
|
@@ -296,13 +446,14 @@ export class ActionSplitButtonFormatter extends AdvancedColumnFormatter {
|
|
|
296
446
|
return `<div class="dropdown-divider"></div>`;
|
|
297
447
|
}
|
|
298
448
|
if (x.commands) {
|
|
449
|
+
/** @type {?} */
|
|
299
450
|
const urlTree = this.createUrlTree(row, x);
|
|
300
|
-
return `<a class="dropdown-item" href="#${urlTree.toString()}">
|
|
301
|
-
${this.injector.get(TranslateService).instant(x.title)}
|
|
451
|
+
return `<a class="dropdown-item" href="#${urlTree && urlTree.toString()}">
|
|
452
|
+
${this.injector && this.injector.get(TranslateService).instant(x.title)}
|
|
302
453
|
</a>`;
|
|
303
454
|
}
|
|
304
455
|
return `<a class="dropdown-item" href="${AdvancedColumnFormatter.template(x.href)(row)}">
|
|
305
|
-
${this.injector.get(TranslateService).instant(x.title)}
|
|
456
|
+
${this.injector && this.injector.get(TranslateService).instant(x.title)}
|
|
306
457
|
</a>`;
|
|
307
458
|
})
|
|
308
459
|
.join('')}
|
|
@@ -314,15 +465,31 @@ export class ActionSplitButtonFormatter extends AdvancedColumnFormatter {
|
|
|
314
465
|
constructor() {
|
|
315
466
|
super();
|
|
316
467
|
}
|
|
468
|
+
/**
|
|
469
|
+
* @param {?} cell
|
|
470
|
+
* @param {?} cellData
|
|
471
|
+
* @param {?} rowData
|
|
472
|
+
* @param {?} rowIndex
|
|
473
|
+
* @param {?} colIndex
|
|
474
|
+
* @return {?}
|
|
475
|
+
*/
|
|
317
476
|
afterRender(cell, cellData, rowData, rowIndex, colIndex) {
|
|
318
477
|
// assign bootstrap dropdown (?)
|
|
319
478
|
}
|
|
320
479
|
}
|
|
321
480
|
export class SelectRowFormatter extends AdvancedColumnFormatter {
|
|
481
|
+
/**
|
|
482
|
+
* @param {?} data
|
|
483
|
+
* @param {?} type
|
|
484
|
+
* @param {?} row
|
|
485
|
+
* @param {?} meta
|
|
486
|
+
* @return {?}
|
|
487
|
+
*/
|
|
322
488
|
render(data, type, row, meta) {
|
|
323
|
-
|
|
489
|
+
/** @type {?} */
|
|
324
490
|
const column = meta.settings.aoColumns[meta.col];
|
|
325
491
|
if (column && column.data) {
|
|
492
|
+
/** @type {?} */
|
|
326
493
|
const _tpl = `<input class="checkbox checkbox-theme" type="checkbox"
|
|
327
494
|
id="s-${meta.row}" /><label for="s-${meta.row}"> </label>`;
|
|
328
495
|
return AdvancedColumnFormatter.template(_tpl)(row);
|
|
@@ -334,11 +501,18 @@ export class SelectRowFormatter extends AdvancedColumnFormatter {
|
|
|
334
501
|
}
|
|
335
502
|
}
|
|
336
503
|
export class TemplateFormatter extends AdvancedColumnFormatter {
|
|
504
|
+
/**
|
|
505
|
+
* @param {?} data
|
|
506
|
+
* @param {?} type
|
|
507
|
+
* @param {?} row
|
|
508
|
+
* @param {?} meta
|
|
509
|
+
* @return {?}
|
|
510
|
+
*/
|
|
337
511
|
render(data, type, row, meta) {
|
|
338
|
-
|
|
512
|
+
/** @type {?} */
|
|
339
513
|
const column = meta.settings.aoColumns[meta.col];
|
|
340
514
|
if (column && column.data) {
|
|
341
|
-
return AdvancedColumnFormatter.template(this.formatString)(row);
|
|
515
|
+
return AdvancedColumnFormatter.template(/** @type {?} */ (this.formatString))(row);
|
|
342
516
|
}
|
|
343
517
|
return data;
|
|
344
518
|
}
|
|
@@ -347,34 +521,56 @@ export class TemplateFormatter extends AdvancedColumnFormatter {
|
|
|
347
521
|
}
|
|
348
522
|
}
|
|
349
523
|
export class TrueFalseFormatter extends AdvancedColumnFormatter {
|
|
524
|
+
/**
|
|
525
|
+
* @param {?} data
|
|
526
|
+
* @param {?} type
|
|
527
|
+
* @param {?} row
|
|
528
|
+
* @param {?} meta
|
|
529
|
+
* @return {?}
|
|
530
|
+
*/
|
|
350
531
|
render(data, type, row, meta) {
|
|
351
|
-
return data ? this.injector.get(TranslateService).instant('TrueFalse.long.Yes') :
|
|
352
|
-
this.injector.get(TranslateService).instant('TrueFalse.long.No');
|
|
532
|
+
return data ? (this.injector && this.injector.get(TranslateService).instant('TrueFalse.long.Yes')) :
|
|
533
|
+
(this.injector && this.injector.get(TranslateService).instant('TrueFalse.long.No'));
|
|
353
534
|
}
|
|
354
535
|
constructor() {
|
|
355
536
|
super();
|
|
356
537
|
}
|
|
357
538
|
}
|
|
358
539
|
export class TranslationFormatter extends AdvancedColumnFormatter {
|
|
540
|
+
/**
|
|
541
|
+
* @param {?} data
|
|
542
|
+
* @param {?} type
|
|
543
|
+
* @param {?} row
|
|
544
|
+
* @param {?} meta
|
|
545
|
+
* @return {?}
|
|
546
|
+
*/
|
|
359
547
|
render(data, type, row, meta) {
|
|
360
|
-
|
|
548
|
+
/** @type {?} */
|
|
361
549
|
const column = meta.settings.aoColumns[meta.col];
|
|
362
550
|
if (column && data != null) {
|
|
363
|
-
return this.injector.get(TranslateService).instant(AdvancedColumnFormatter.template(this.formatString)({
|
|
551
|
+
return this.injector && this.injector.get(TranslateService).instant(AdvancedColumnFormatter.template(/** @type {?} */ (this.formatString))({
|
|
364
552
|
value: data,
|
|
365
553
|
}));
|
|
366
554
|
}
|
|
367
|
-
return this.injector.get(TranslateService).instant('Unknown');
|
|
555
|
+
return this.injector && this.injector.get(TranslateService).instant('Unknown');
|
|
368
556
|
}
|
|
369
557
|
constructor() {
|
|
370
558
|
super();
|
|
371
559
|
}
|
|
372
560
|
}
|
|
373
561
|
export class DateTimeFormatter extends AdvancedColumnFormatter {
|
|
562
|
+
/**
|
|
563
|
+
* @param {?} data
|
|
564
|
+
* @param {?} type
|
|
565
|
+
* @param {?} row
|
|
566
|
+
* @param {?} meta
|
|
567
|
+
* @return {?}
|
|
568
|
+
*/
|
|
374
569
|
render(data, type, row, meta) {
|
|
375
|
-
|
|
570
|
+
/** @type {?} */
|
|
376
571
|
const column = meta.settings.aoColumns[meta.col];
|
|
377
|
-
if (column && column.data) {
|
|
572
|
+
if (column && column.data && this.injector) {
|
|
573
|
+
/** @type {?} */
|
|
378
574
|
const datePipe = new DatePipe(this.injector.get(TranslateService).currentLang);
|
|
379
575
|
if (typeof data === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}$/.test(data)) {
|
|
380
576
|
return datePipe.transform(new Date(data + ':00'), this.formatString);
|
|
@@ -388,17 +584,27 @@ export class DateTimeFormatter extends AdvancedColumnFormatter {
|
|
|
388
584
|
}
|
|
389
585
|
}
|
|
390
586
|
export class NgClassFormatter extends AdvancedColumnFormatter {
|
|
587
|
+
/**
|
|
588
|
+
* @param {?} data
|
|
589
|
+
* @param {?} type
|
|
590
|
+
* @param {?} row
|
|
591
|
+
* @param {?} meta
|
|
592
|
+
* @return {?}
|
|
593
|
+
*/
|
|
391
594
|
render(data, type, row, meta) {
|
|
392
|
-
|
|
595
|
+
/** @type {?} */
|
|
393
596
|
const column = meta.settings.aoColumns[meta.col];
|
|
394
597
|
if (column && column.data) {
|
|
395
598
|
// get formatOptions
|
|
396
599
|
if (this.formatOptions) {
|
|
600
|
+
/** @type {?} */
|
|
397
601
|
const ngClass = this.formatOptions.ngClass;
|
|
398
602
|
// check condition for each key
|
|
399
603
|
column.ngClassTemplates = column.ngClassTemplates || {};
|
|
400
604
|
for (const key of Object.keys(ngClass)) {
|
|
605
|
+
/** @type {?} */
|
|
401
606
|
const result = AdvancedColumnFormatter.template(ngClass[key])(row);
|
|
607
|
+
/** @type {?} */
|
|
402
608
|
const fn = new Function(`return ${result};`);
|
|
403
609
|
// if condition returns true add class
|
|
404
610
|
if (fn() === true) {
|
|
@@ -415,6 +621,13 @@ export class NgClassFormatter extends AdvancedColumnFormatter {
|
|
|
415
621
|
}
|
|
416
622
|
}
|
|
417
623
|
export class LanguageFormatter extends AdvancedColumnFormatter {
|
|
624
|
+
/**
|
|
625
|
+
* @param {?} data
|
|
626
|
+
* @param {?} type
|
|
627
|
+
* @param {?} row
|
|
628
|
+
* @param {?} meta
|
|
629
|
+
* @return {?}
|
|
630
|
+
*/
|
|
418
631
|
render(data, type, row, meta) {
|
|
419
632
|
if (data) {
|
|
420
633
|
return ISO6391.getNativeName(data);
|
|
@@ -426,4 +639,4 @@ export class LanguageFormatter extends AdvancedColumnFormatter {
|
|
|
426
639
|
}
|
|
427
640
|
}
|
|
428
641
|
|
|
429
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuZm9ybWF0dGVycy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLmZvcm1hdHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFHdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxPQUFPLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBb0IsTUFBTSxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFFcEYsTUFBTTtJQWtCRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDakMsSUFBSSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRTtZQUNoQyxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4Qix1QkFBdUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBSVMsYUFBYSxDQUFDLElBQVMsRUFBRSxPQUFpRTtRQUNsRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ25DLE1BQU0sY0FBYyxHQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN6RSxNQUFNLE1BQU0sR0FB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QUM7SUFDVixDQUFDO0NBQ0Y7QUFDRCxNQUFNLHdCQUF5QixTQUFRLHVCQUF1QjtJQUNyRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSTtRQUNqQyxJQUFJLElBQUksRUFBRTtZQUNSLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNEO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0ZW1wbGF0ZSwgYXQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5Db25maWd1cmF0aW9uIH0gZnJvbSAnLi9hZHZhbmNlZC10YWJsZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgKiBhcyBJU082MzkxIGZyb20gJ2lzby02MzktMS9idWlsZCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyLCBVcmxUcmVlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmRlY2xhcmUgdmFyIGpRdWVyeTogYW55O1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIGltcGxlbWVudHMgVGFibGVDb2x1bW5Db25maWd1cmF0aW9uIHtcblxuICBwdWJsaWMgc3RhdGljIHRlbXBsYXRlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgKGRhdGE6IGFueSkgPT4gc3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3I7XG4gIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZztcbiAgcHVibGljIGRlZmF1bHRDb250ZW50OiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtYXRTdHJpbmc6IHN0cmluZztcbiAgcHVibGljIGZvcm1hdHRlcjogc3RyaW5nO1xuICBwdWJsaWMgaGlkZGVuOiBib29sZWFuO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgb3JkZXI6IHN0cmluZztcbiAgcHVibGljIHByb3BlcnR5OiBzdHJpbmc7XG4gIHB1YmxpYyBzb3J0YWJsZTogYm9vbGVhbjtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtYXRPcHRpb25zPzogYW55O1xuICBwdWJsaWMgYWN0aW9ucz86IEFycmF5PGFueT47XG5cbiAgcHVibGljIHN0YXRpYyB0ZW1wbGF0ZShleHByOiBzdHJpbmcpOiAoZGF0YTogYW55KSA9PiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZUNhY2hlLmdldChleHByKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmVzdWx0ID0gdGVtcGxhdGUoZXhwcik7XG4gICAgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGVDYWNoZS5zZXQoZXhwciwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IHN0cmluZywgcm93OiBhbnksIG1ldGE6IGFueSk6IGFueTtcblxuICBwcm90ZWN0ZWQgY3JlYXRlVXJsVHJlZShkYXRhOiBhbnksIG9wdGlvbnM6IHsgY29tbWFuZHM6IGFueVtdLCBuYXZpZ2F0aW9uRXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyB9KTogVXJsVHJlZSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5jb21tYW5kcykpIHtcbiAgICAgIGNvbnN0IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICAgIGNvbnN0IHJvdXRlcjogUm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZShjb21tYW5kKShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWFuZC5vdXRsZXRzKSB7XG4gICAgICAgICAgY29uc3QgY29tbWFuZE91dGxldHMgPSB7fTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhjb21tYW5kLm91dGxldHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb21tYW5kLm91dGxldHMsIGtleSkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3V0bGV0ID0gY29tbWFuZC5vdXRsZXRzW2tleV07XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG91dGxldCkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29tbWFuZE91dGxldHMsIGtleSwge1xuICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IG91dGxldC5tYXAoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHgpKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbW1hbmRPdXRsZXRzLCBrZXksIHtcbiAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBvdXRsZXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3V0bGV0czogY29tbWFuZE91dGxldHMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWFuZDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7fTtcbiAgICAgIGxldCByZXBsYWNlVXJsID0gdHJ1ZTtcbiAgICAgIGlmIChvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMgJiYgb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLnF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcy5xdWVyeVBhcmFtcykubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLnF1ZXJ5UGFyYW1zW2tleV07XG4gICAgICAgICAgcXVlcnlQYXJhbXNba2V5XSA9IEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHRleHQpKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMgJiYgdHlwZW9mIG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcy5yZXBsYWNlVXJsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXBsYWNlVXJsID0gb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLnJlcGxhY2VVcmw7XG4gICAgICB9XG4gICAgICBsZXQgc2tpcExvY2F0aW9uQ2hhbmdlID0gZmFsc2U7XG4gICAgICBpZiAob3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzICYmIHR5cGVvZiBvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMuc2tpcExvY2F0aW9uQ2hhbmdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBza2lwTG9jYXRpb25DaGFuZ2UgPSBvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMuc2tpcExvY2F0aW9uQ2hhbmdlO1xuICAgICAgfVxuXG4gICAgICBsZXQgZnJhZ21lbnQ6IHN0cmluZztcbiAgICAgIGlmIChvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMgJiYgdHlwZW9mIG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcy5mcmFnbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMuZnJhZ21lbnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcyxcbiAgICAgICAge1xuICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgIHJlbGF0aXZlVG86IGFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgICAgIHJlcGxhY2VVcmwsXG4gICAgICAgICAgc2tpcExvY2F0aW9uQ2hhbmdlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlciB7XG4gIGFmdGVyUmVuZGVyKGNlbGw6IGFueSwgY2VsbERhdGE6IGFueSwgcm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIE5lc3RlZFByb3BlcnR5Rm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGEsIHR5cGUsIHJvdywgbWV0YSkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSkge1xuICAgICAgcmV0dXJuIGF0KHJvdywgY29sdW1uLmRhdGEucmVwbGFjZSgvXFwvL2csICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCdXR0b25Gb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YSwgdHlwZSwgcm93LCBtZXRhKSB7XG4gICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIC8vIGdldCBmb3JtYXQgb3B0aW9uc1xuICAgIGNvbnN0IGZvcm1hdE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGJ1dHRvbkNsYXNzOiAnYnRuIGJ0bi1kZWZhdWx0JyxcbiAgICB9LCB0aGlzLmZvcm1hdE9wdGlvbnMpO1xuICAgIC8vIGdldCB0ZXh0IGNvbnRlbnRcbiAgICBsZXQgYnV0dG9uVGV4dDogc3RyaW5nO1xuICAgIGxldCBidXR0b25UaXRsZSA9ICcnO1xuICAgIGlmIChmb3JtYXRPcHRpb25zLmJ1dHRvblRleHQpIHtcbiAgICAgIGJ1dHRvblRleHQgPSB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KGZvcm1hdE9wdGlvbnMuYnV0dG9uVGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1dHRvblRleHQgPSBmb3JtYXRPcHRpb25zLmJ1dHRvbkNvbnRlbnQ7XG4gICAgfVxuICAgIGlmIChmb3JtYXRPcHRpb25zLmJ1dHRvblRpdGxlKSB7XG4gICAgICBidXR0b25UaXRsZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoZm9ybWF0T3B0aW9ucy5idXR0b25UaXRsZSk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZm9ybWF0T3B0aW9ucy5jb21tYW5kcykpIHtcbiAgICAgIGxldCByb3V0ZXJMaW5rID0gdGhpcy5jcmVhdGVVcmxUcmVlKHJvdywgdGhpcy5mb3JtYXRPcHRpb25zKTtcbiAgICAgIHJldHVybiBgPGEgY2xhc3M9XCIke2Zvcm1hdE9wdGlvbnMuYnV0dG9uQ2xhc3N9XCIgdGl0bGU9XCIke2J1dHRvblRpdGxlfVwiIGhyZWY9XCIjJHtyb3V0ZXJMaW5rfVwiPiR7YnV0dG9uVGV4dH08L2E+YDtcbiAgICB9XG4gICAgLy8gYW5kIHJldHVybiBidXR0b25cbiAgICBjb25zdCBocmVmID0gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUodGhpcy5mb3JtYXRTdHJpbmcpKHJvdyk7XG4gICAgcmV0dXJuIGA8YSBjbGFzcz1cIiR7Zm9ybWF0T3B0aW9ucy5idXR0b25DbGFzc31cIiB0aXRsZT1cIiR7YnV0dG9uVGl0bGV9XCIgaHJlZj1cIiR7aHJlZn1cIj4ke2J1dHRvblRleHR9PC9hPmA7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlua0Zvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IHN0cmluZywgcm93OiBhbnksIG1ldGE6IGFueSk6IGFueSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbiA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhKSB7XG4gICAgICByZXR1cm4gYDxhIGhyZWY9XCIkeyhBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh0aGlzLmZvcm1hdFN0cmluZykocm93KSl9XCI+JHtkYXRhfTwvYT5gO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25MaW5rRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXJcbiAgaW1wbGVtZW50cyBPbkFkdmFuY2VkQ29sdW1uQWZ0ZXJSZW5kZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55IHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuXG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSkge1xuICAgICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucyB8fCBbXTtcbiAgICAgIGxldCBpbmRleCA9IDE7XG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWN0aW9uLCB7XG4gICAgICAgICAgbmFtZTogYWN0aW9uLm5hbWUgfHwgYGFjdGlvbiR7aW5kZXh9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gdGhlIGRyb3Bkb3duIG1lbnUgd2l0aCAzIGRvdHNcbiAgICAgIHJldHVybiBgPGRpdiBjbGFzcz0nZHJvcGRvd24gZGV0YWlscy1jb250cm9sJyBkYXRhLWlkPScke2RhdGF9JyBkYXRhLXR5cGU9J3N0dWRlbnQnID5cbiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJkcm9wZG93bk1lbnVCdXR0b24tJHtkYXRhfVwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYS0yeCB0ZXh0LWRvdHNcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bk1lbnVCdXR0b24tJHtkYXRhfVwiPlxuICAgICAgICAgICAgICAgICAgICAgJHthY3Rpb25zLm1hcCgoeCkgPT4ge1xuICAgICAgICBpZiAoeC50eXBlID09PSAnZGl2aWRlcicpIHtcbiAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeC5mb3JtYXRPcHRpb25zICYmIHguZm9ybWF0T3B0aW9ucy5jb21tYW5kcykge1xuICAgICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLmNyZWF0ZVVybFRyZWUocm93LCB4LmZvcm1hdE9wdGlvbnMpO1xuICAgICAgICAgIHJldHVybiBgPGEgZGF0YS1uYW1lPScke3gubmFtZX0nIGNsYXNzPVwiZHJvcGRvd24taXRlbSR7dHlwZW9mIHguY2xhc3NOYW1lID09PSAnc3RyaW5nJyAmJiB4LmNsYXNzTmFtZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICBgICR7eC5jbGFzc05hbWUudHJpbSgpfWAgOiAnJ31cIiBocmVmPVwiIyR7dXJsVHJlZS50b1N0cmluZygpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh4LnRpdGxlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8YSBkYXRhLW5hbWU9JyR7eC5uYW1lfScgY2xhc3M9XCJkcm9wZG93bi1pdGVtJHt0eXBlb2YgeC5jbGFzc05hbWUgPT09ICdzdHJpbmcnICYmIHguY2xhc3NOYW1lLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGAgJHt4LmNsYXNzTmFtZS50cmltKCl9YCA6ICcnfVwiIGhyZWY9XCIke0FkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHguaHJlZikocm93KX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHgudGl0bGUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICB9KVxuICAgICAgICAgIC5qb2luKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlcihjZWxsOiBhbnksIGNlbGxEYXRhOiBhbnksIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGFzc2lnbiBib290c3RyYXAgZHJvcGRvd24gKD8pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkJ1dHRvbkZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyXG4gIGltcGxlbWVudHMgT25BZHZhbmNlZENvbHVtbkFmdGVyUmVuZGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IHN0cmluZywgcm93OiBhbnksIG1ldGE6IGFueSk6IGFueSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbiA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcblxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEpIHtcbiAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMgfHwgW107XG4gICAgICBsZXQgaW5kZXggPSAxO1xuICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGFjdGlvbiwge1xuICAgICAgICAgIG5hbWU6IGFjdGlvbi5uYW1lIHx8IGBhY3Rpb24ke2luZGV4fWAsXG4gICAgICAgIH0pO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuICAgICAgbGV0IGJ1dHRvblRleHQ6IHN0cmluZztcbiAgICAgIGlmICh0aGlzLmZvcm1hdE9wdGlvbnMgJiYgdGhpcy5mb3JtYXRPcHRpb25zLmJ1dHRvblRleHQpIHtcbiAgICAgICAgLy8gaWYgYnV0dG9uIHRleHQgaXMgYSBsaXRlcmFsIGV4cHJlc3Npb25cbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25UZXh0LmluY2x1ZGVzKCckeycpKSB7XG4gICAgICAgICAgLy8gdXNlIHRlbXBsYXRlXG4gICAgICAgICAgYnV0dG9uVGV4dCA9IEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25UZXh0KShyb3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSB0cmFuc2xhdGUgaXRcbiAgICAgICAgICBidXR0b25UZXh0ID0gdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh0aGlzLmZvcm1hdE9wdGlvbnMuYnV0dG9uVGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBidXR0b25UaXRsZTogc3RyaW5nO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0T3B0aW9ucyAmJiB0aGlzLmZvcm1hdE9wdGlvbnMuYnV0dG9uVGl0bGUpIHtcbiAgICAgICAgYnV0dG9uVGl0bGUgPSB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25UYnV0dG9uVGl0bGVleHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgYnV0dG9uQ2xhc3MgPSAodGhpcy5mb3JtYXRPcHRpb25zICYmIHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25DbGFzcykgfHwgJ2J0biBidG4tbGlnaHQnO1xuICAgICAgLy8gcmV0dXJuIHRoZSBkcm9wZG93biBtZW51IHdpdGggMyBkb3RzXG4gICAgICByZXR1cm4gYDxkaXYgY2xhc3M9J2Ryb3Bkb3duIGRldGFpbHMtY29udHJvbCcgZGF0YS1pZD0nJHtkYXRhfSc+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiJHtidXR0b25DbGFzc30gZHJvcGRvd24tdG9nZ2xlXCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgdGl0bGU9XCIke2J1dHRvblRpdGxlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkcm9wZG93bk1lbnVCdXR0b24tJHtkYXRhfVwiIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICR7YnV0dG9uVGV4dH1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duTWVudUJ1dHRvbi0ke2RhdGF9XCI+XG4gICAgICAgICAgICAgICAgICAgICAke2FjdGlvbnMubWFwKCh4KSA9PiB7XG4gICAgICAgIGlmICh4LnR5cGUgPT09ICdkaXZpZGVyJykge1xuICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4LmNvbW1hbmRzKSB7XG4gICAgICAgICAgY29uc3QgdXJsVHJlZSA9IHRoaXMuY3JlYXRlVXJsVHJlZShyb3csIHgpO1xuICAgICAgICAgIHJldHVybiBgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiMke3VybFRyZWUudG9TdHJpbmcoKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoeC50aXRsZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiR7QWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUoeC5ocmVmKShyb3cpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoeC50aXRsZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+YDtcbiAgICAgIH0pXG4gICAgICAgICAgLmpvaW4oJycpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyKGNlbGw6IGFueSwgY2VsbERhdGE6IGFueSwgcm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gYXNzaWduIGJvb3RzdHJhcCBkcm9wZG93biAoPylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uU3BsaXRCdXR0b25Gb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlclxuICBpbXBsZW1lbnRzIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5hY3Rpb25zIHx8IFtdO1xuICAgICAgbGV0IGluZGV4ID0gMTtcbiAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY3Rpb24sIHtcbiAgICAgICAgICBuYW1lOiBhY3Rpb24ubmFtZSB8fCBgYWN0aW9uJHtpbmRleH1gLFxuICAgICAgICB9KTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBidXR0b25DbGFzcyA9ICh0aGlzLmZvcm1hdE9wdGlvbnMgJiYgdGhpcy5mb3JtYXRPcHRpb25zLmJ1dHRvbkNsYXNzKSB8fCAnYnRuIGJ0bi1saWdodCc7XG4gICAgICAvLyByZXR1cm4gdGhlIGRyb3Bkb3duIG1lbnUgd2l0aCAzIGRvdHNcbiAgICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBhY3Rpb25zWzBdO1xuICAgICAgbGV0IGRlZmF1bHRBY3Rpb25IcmVmOiBzdHJpbmc7XG4gICAgICBpZiAoZGVmYXVsdEFjdGlvbiAmJiBkZWZhdWx0QWN0aW9uLmNvbW1hbmRzKSB7XG4gICAgICAgIGRlZmF1bHRBY3Rpb25IcmVmID0gJyMnICsgdGhpcy5jcmVhdGVVcmxUcmVlKHJvdywgZGVmYXVsdEFjdGlvbikudG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRBY3Rpb25IcmVmID0gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUoZGVmYXVsdEFjdGlvbi5ocmVmKShyb3cpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiR7YnV0dG9uQ2xhc3N9XCIgaHJlZj1cIiR7ZGVmYXVsdEFjdGlvbkhyZWZ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KGRlZmF1bHRBY3Rpb24udGl0bGUpfVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiJHtidXR0b25DbGFzc30gZHJvcGRvd24tdG9nZ2xlIGRyb3Bkb3duLXRvZ2dsZS1zcGxpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+JHt0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KCdUb2dnbGUgRHJvcGRvd24nKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duTWVudUJ1dHRvbi0ke2RhdGF9XCI+XG4gICAgICAgICAgICAgICAgICAgICAke2FjdGlvbnMubWFwKCh4KSA9PiB7XG4gICAgICAgIGlmICh4LnRpdGxlID09PSAnLScpIHtcbiAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeC5jb21tYW5kcykge1xuICAgICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLmNyZWF0ZVVybFRyZWUocm93LCB4KTtcbiAgICAgICAgICByZXR1cm4gYDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjJHt1cmxUcmVlLnRvU3RyaW5nKCl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHgudGl0bGUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIke0FkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHguaHJlZikocm93KX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHgudGl0bGUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICB9KVxuICAgICAgICAgIC5qb2luKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlcihjZWxsOiBhbnksIGNlbGxEYXRhOiBhbnksIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGFzc2lnbiBib290c3RyYXAgZHJvcGRvd24gKD8pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFJvd0Zvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEpIHtcbiAgICAgIGNvbnN0IF90cGwgPSBgPGlucHV0IGNsYXNzPVwiY2hlY2tib3ggY2hlY2tib3gtdGhlbWVcIiB0eXBlPVwiY2hlY2tib3hcIlxuIGlkPVwicy0ke21ldGEucm93fVwiIC8+PGxhYmVsIGZvcj1cInMtJHttZXRhLnJvd31cIj4mbmJzcDs8L2xhYmVsPmA7XG4gICAgICByZXR1cm4gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUoX3RwbCkocm93KTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSkge1xuICAgICAgcmV0dXJuIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHRoaXMuZm9ybWF0U3RyaW5nKShyb3cpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcnVlRmFsc2VGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG5cbiAgcHVibGljIHJlbmRlcihkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICByZXR1cm4gZGF0YSA/IHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoJ1RydWVGYWxzZS5sb25nLlllcycpIDpcbiAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoJ1RydWVGYWxzZS5sb25nLk5vJyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cbmRlY2xhcmUgaW50ZXJmYWNlIFRyYW5zbGF0aW9uRm9ybWF0dGVyVGVtcGxhdGUge1xuICB0cmFuc2xhdGVUZW1wbGF0ZT86IChkYXRhOiBhbnkpID0+IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0aW9uRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55IHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uOiBUcmFuc2xhdGlvbkZvcm1hdHRlclRlbXBsYXRlID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgZGF0YSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudChcbiAgICAgICAgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUodGhpcy5mb3JtYXRTdHJpbmcpKHtcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCgnVW5rbm93bicpO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGVUaW1lRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55IHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEpIHtcbiAgICAgIGNvbnN0IGRhdGVQaXBlOiBEYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSh0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5jdXJyZW50TGFuZyk7XG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnICYmIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXCtcXGR7Mn0kLy50ZXN0KGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBkYXRlUGlwZS50cmFuc2Zvcm0obmV3IERhdGUoZGF0YSArICc6MDAnKSwgdGhpcy5mb3JtYXRTdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGVQaXBlLnRyYW5zZm9ybShkYXRhLCB0aGlzLmZvcm1hdFN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5nQ2xhc3NGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YSwgdHlwZSwgcm93LCBtZXRhKSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbiA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhKSB7XG4gICAgICAvLyBnZXQgZm9ybWF0T3B0aW9uc1xuICAgICAgaWYgKHRoaXMuZm9ybWF0T3B0aW9ucykge1xuICAgICAgICBjb25zdCBuZ0NsYXNzID0gdGhpcy5mb3JtYXRPcHRpb25zLm5nQ2xhc3M7XG4gICAgICAgIC8vIGNoZWNrIGNvbmRpdGlvbiBmb3IgZWFjaCBrZXlcbiAgICAgICAgY29sdW1uLm5nQ2xhc3NUZW1wbGF0ZXMgPSBjb2x1bW4ubmdDbGFzc1RlbXBsYXRlcyB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobmdDbGFzcykpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZShuZ0NsYXNzW2tleV0pKHJvdyk7XG4gICAgICAgICAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAke3Jlc3VsdH07YCk7XG4gICAgICAgICAgLy8gaWYgY29uZGl0aW9uIHJldHVybnMgdHJ1ZSBhZGQgY2xhc3NcbiAgICAgICAgICBpZiAoZm4oKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cIiR7a2V5fVwiPiR7ZGF0YX08L3NwYW4+YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgTGFuZ3VhZ2VGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YSwgdHlwZSwgcm93LCBtZXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHJldHVybiBJU082MzkxLmdldE5hdGl2ZU5hbWUoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cbiJdfQ==
|
|
642
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuZm9ybWF0dGVycy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLmZvcm1hdHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBR3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEtBQUssT0FBTyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQW9CLE1BQU0sRUFBVyxNQUFNLGlCQUFpQixDQUFDOzs7O0FBRXBGLE1BQU07O3FCQWNXLEVBQUU7Ozs7OztJQUlWLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBWTs7UUFDakMsSUFBSSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRTtZQUNoQyxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4Qix1QkFBdUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxPQUFPLE1BQU0sQ0FBQzs7Ozs7OztJQUtOLGFBQWEsQ0FBQyxJQUFTLEVBQUUsT0FBaUU7UUFDbEcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFOztZQUNwRCxNQUFNLGNBQWMsR0FBbUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFH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QUFPLElBQUksQ0FBQzs7SUFFZDtRQUNFLEtBQUssRUFBRSxDQUFDO0tBQ1Q7Q0FDRjtBQUNELE1BQU0sd0JBQXlCLFNBQVEsdUJBQXVCOzs7Ozs7OztJQUNyRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSTtRQUNqQyxJQUFJLElBQUksRUFBRTtZQUNSLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sSUFBSSxDQUFDOztJQUVkO1FBQ0UsS0FBSyxFQUFFLENBQUM7S0FDVDtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdGVtcGxhdGUsIGF0IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0ICogYXMgSVNPNjM5MSBmcm9tICdpc28tNjM5LTEvYnVpbGQnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FeHRyYXMsIFJvdXRlciwgVXJsVHJlZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5kZWNsYXJlIHZhciBqUXVlcnk6IGFueTtcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciBpbXBsZW1lbnRzIFRhYmxlQ29sdW1uQ29uZmlndXJhdGlvbiB7XG5cbiAgcHVibGljIHN0YXRpYyB0ZW1wbGF0ZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIChkYXRhOiBhbnkpID0+IHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgaW5qZWN0b3I/OiBJbmplY3RvcjtcbiAgcHVibGljIGNsYXNzTmFtZT86IHN0cmluZztcbiAgcHVibGljIGRlZmF1bHRDb250ZW50Pzogc3RyaW5nO1xuICBwdWJsaWMgZm9ybWF0U3RyaW5nPzogc3RyaW5nO1xuICBwdWJsaWMgZm9ybWF0dGVyPzogc3RyaW5nO1xuICBwdWJsaWMgaGlkZGVuPzogYm9vbGVhbjtcbiAgcHVibGljIG5hbWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBvcmRlcj86IHN0cmluZztcbiAgcHVibGljIHByb3BlcnR5Pzogc3RyaW5nO1xuICBwdWJsaWMgc29ydGFibGU/OiBib29sZWFuO1xuICBwdWJsaWMgdGl0bGUgPSAnJztcbiAgcHVibGljIGZvcm1hdE9wdGlvbnM/OiBhbnk7XG4gIHB1YmxpYyBhY3Rpb25zPzogQXJyYXk8YW55PjtcblxuICBwdWJsaWMgc3RhdGljIHRlbXBsYXRlKGV4cHI6IHN0cmluZyk6IChkYXRhOiBhbnkpID0+IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9IEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlQ2FjaGUuZ2V0KGV4cHIpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXN1bHQgPSB0ZW1wbGF0ZShleHByKTtcbiAgICBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZUNhY2hlLnNldChleHByLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55O1xuXG4gIHByb3RlY3RlZCBjcmVhdGVVcmxUcmVlKGRhdGE6IGFueSwgb3B0aW9uczogeyBjb21tYW5kczogYW55W10sIG5hdmlnYXRpb25FeHRyYXM/OiBOYXZpZ2F0aW9uRXh0cmFzIH0pOiBVcmxUcmVlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbW1hbmRzKSAmJiB0aGlzLmluamVjdG9yKSB7XG4gICAgICBjb25zdCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUgPSB0aGlzLmluamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XG4gICAgICBjb25zdCByb3V0ZXI6IFJvdXRlciA9IHRoaXMuaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUoY29tbWFuZCkoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1hbmQub3V0bGV0cykge1xuICAgICAgICAgIGNvbnN0IGNvbW1hbmRPdXRsZXRzID0ge307XG4gICAgICAgICAgT2JqZWN0LmtleXMoY29tbWFuZC5vdXRsZXRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29tbWFuZC5vdXRsZXRzLCBrZXkpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG91dGxldCA9IGNvbW1hbmQub3V0bGV0c1trZXldO1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRsZXQpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbW1hbmRPdXRsZXRzLCBrZXksIHtcbiAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBvdXRsZXQubWFwKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh4KShkYXRhKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb21tYW5kT3V0bGV0cywga2V5LCB7XG4gICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogb3V0bGV0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG91dGxldHM6IGNvbW1hbmRPdXRsZXRzLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1hbmQ7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge307XG4gICAgICBsZXQgcmVwbGFjZVVybCA9IHRydWU7XG4gICAgICBjb25zdCBxdWVyeVBhcmFtRXh0cmFzID0gb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzICYmIG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcy5xdWVyeVBhcmFtcztcbiAgICAgIGlmIChxdWVyeVBhcmFtRXh0cmFzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1FeHRyYXMpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IHF1ZXJ5UGFyYW1FeHRyYXNba2V5XTtcbiAgICAgICAgICBxdWVyeVBhcmFtc1trZXldID0gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUodGV4dCkoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcyAmJiB0eXBlb2Ygb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLnJlcGxhY2VVcmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlcGxhY2VVcmwgPSBvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMucmVwbGFjZVVybDtcbiAgICAgIH1cbiAgICAgIGxldCBza2lwTG9jYXRpb25DaGFuZ2UgPSBmYWxzZTtcbiAgICAgIGlmIChvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMgJiYgdHlwZW9mIG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcy5za2lwTG9jYXRpb25DaGFuZ2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZSA9IG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcy5za2lwTG9jYXRpb25DaGFuZ2U7XG4gICAgICB9XG5cbiAgICAgIGxldCBmcmFnbWVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcyAmJiB0eXBlb2Ygb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLmZyYWdtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmcmFnbWVudCA9IG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcy5mcmFnbWVudDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdXRlci5jcmVhdGVVcmxUcmVlKGNvbW1hbmRzLFxuICAgICAgICB7XG4gICAgICAgICAgZnJhZ21lbnQsXG4gICAgICAgICAgcmVsYXRpdmVUbzogYWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICAgICAgcmVwbGFjZVVybCxcbiAgICAgICAgICBza2lwTG9jYXRpb25DaGFuZ2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25BZHZhbmNlZENvbHVtbkFmdGVyUmVuZGVyIHtcbiAgYWZ0ZXJSZW5kZXIoY2VsbDogYW55LCBjZWxsRGF0YTogYW55LCByb3dEYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgTmVzdGVkUHJvcGVydHlGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YSwgdHlwZSwgcm93LCBtZXRhKSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbiA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhKSB7XG4gICAgICByZXR1cm4gYXQocm93LCBjb2x1bW4uZGF0YS5yZXBsYWNlKC9cXC8vZywgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ1dHRvbkZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICBpZiAoZGF0YSA9PSBudWxsIHx8IHRoaXMuaW5qZWN0b3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyBnZXQgZm9ybWF0IG9wdGlvbnNcbiAgICBjb25zdCBmb3JtYXRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBidXR0b25DbGFzczogJ2J0biBidG4tZGVmYXVsdCcsXG4gICAgfSwgdGhpcy5mb3JtYXRPcHRpb25zKTtcbiAgICAvLyBnZXQgdGV4dCBjb250ZW50XG4gICAgbGV0IGJ1dHRvblRleHQ6IHN0cmluZztcbiAgICBsZXQgYnV0dG9uVGl0bGUgPSAnJztcbiAgICBpZiAoZm9ybWF0T3B0aW9ucy5idXR0b25UZXh0KSB7XG4gICAgICBidXR0b25UZXh0ID0gdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudChmb3JtYXRPcHRpb25zLmJ1dHRvblRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidXR0b25UZXh0ID0gZm9ybWF0T3B0aW9ucy5idXR0b25Db250ZW50O1xuICAgIH1cbiAgICBpZiAoZm9ybWF0T3B0aW9ucy5idXR0b25UaXRsZSkge1xuICAgICAgYnV0dG9uVGl0bGUgPSB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KGZvcm1hdE9wdGlvbnMuYnV0dG9uVGl0bGUpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZvcm1hdE9wdGlvbnMuY29tbWFuZHMpKSB7XG4gICAgICBjb25zdCByb3V0ZXJMaW5rID0gdGhpcy5jcmVhdGVVcmxUcmVlKHJvdywgdGhpcy5mb3JtYXRPcHRpb25zKTtcbiAgICAgIHJldHVybiBgPGEgY2xhc3M9XCIke2Zvcm1hdE9wdGlvbnMuYnV0dG9uQ2xhc3N9XCIgdGl0bGU9XCIke2J1dHRvblRpdGxlfVwiIGhyZWY9XCIjJHtyb3V0ZXJMaW5rfVwiPiR7YnV0dG9uVGV4dH08L2E+YDtcbiAgICB9XG4gICAgLy8gYW5kIHJldHVybiBidXR0b25cbiAgICBjb25zdCBocmVmID0gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUodGhpcy5mb3JtYXRTdHJpbmcgYXMgc3RyaW5nKShyb3cpO1xuICAgIHJldHVybiBgPGEgY2xhc3M9XCIke2Zvcm1hdE9wdGlvbnMuYnV0dG9uQ2xhc3N9XCIgdGl0bGU9XCIke2J1dHRvblRpdGxlfVwiIGhyZWY9XCIke2hyZWZ9XCI+JHtidXR0b25UZXh0fTwvYT5gO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpbmtGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSkge1xuICAgICAgcmV0dXJuIGA8YSBocmVmPVwiJHsoQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUodGhpcy5mb3JtYXRTdHJpbmcgYXMgc3RyaW5nKShyb3cpKX1cIj4ke2RhdGF9PC9hPmA7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkxpbmtGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlclxuICBpbXBsZW1lbnRzIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5hY3Rpb25zIHx8IFtdO1xuICAgICAgbGV0IGluZGV4ID0gMTtcbiAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY3Rpb24sIHtcbiAgICAgICAgICBuYW1lOiBhY3Rpb24ubmFtZSB8fCBgYWN0aW9uJHtpbmRleH1gLFxuICAgICAgICB9KTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiB0aGUgZHJvcGRvd24gbWVudSB3aXRoIDMgZG90c1xuICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSdkcm9wZG93biBkZXRhaWxzLWNvbnRyb2wnIGRhdGEtaWQ9JyR7ZGF0YX0nIGRhdGEtdHlwZT0nc3R1ZGVudCcgPlxuICAgICAgICAgICAgICAgICAgICA8YSBpZD1cImRyb3Bkb3duTWVudUJ1dHRvbi0ke2RhdGF9XCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhLTJ4IHRleHQtZG90c1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duTWVudUJ1dHRvbi0ke2RhdGF9XCI+XG4gICAgICAgICAgICAgICAgICAgICAke2FjdGlvbnMubWFwKCh4KSA9PiB7XG4gICAgICAgIGlmICh4LnR5cGUgPT09ICdkaXZpZGVyJykge1xuICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4LmZvcm1hdE9wdGlvbnMgJiYgeC5mb3JtYXRPcHRpb25zLmNvbW1hbmRzKSB7XG4gICAgICAgICAgY29uc3QgdXJsVHJlZSA9IHRoaXMuY3JlYXRlVXJsVHJlZShyb3csIHguZm9ybWF0T3B0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIGA8YSBkYXRhLW5hbWU9JyR7eC5uYW1lfScgY2xhc3M9XCJkcm9wZG93bi1pdGVtJHt0eXBlb2YgeC5jbGFzc05hbWUgPT09ICdzdHJpbmcnICYmIHguY2xhc3NOYW1lLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIGAgJHt4LmNsYXNzTmFtZS50cmltKCl9YCA6ICcnfVwiIGhyZWY9XCIjJHt1cmxUcmVlICYmIHVybFRyZWUudG9TdHJpbmcoKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh4LnRpdGxlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8YSBkYXRhLW5hbWU9JyR7eC5uYW1lfScgY2xhc3M9XCJkcm9wZG93bi1pdGVtJHt0eXBlb2YgeC5jbGFzc05hbWUgPT09ICdzdHJpbmcnICYmIHguY2xhc3NOYW1lLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGAgJHt4LmNsYXNzTmFtZS50cmltKCl9YCA6ICcnfVwiIGhyZWY9XCIke0FkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHguaHJlZikocm93KX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmluamVjdG9yICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoeC50aXRsZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+YDtcbiAgICAgIH0pXG4gICAgICAgICAgLmpvaW4oJycpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyKGNlbGw6IGFueSwgY2VsbERhdGE6IGFueSwgcm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gYXNzaWduIGJvb3RzdHJhcCBkcm9wZG93biAoPylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uQnV0dG9uRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXJcbiAgaW1wbGVtZW50cyBPbkFkdmFuY2VkQ29sdW1uQWZ0ZXJSZW5kZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55IHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuXG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSAmJiB0aGlzLmluamVjdG9yKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5hY3Rpb25zIHx8IFtdO1xuICAgICAgbGV0IGluZGV4ID0gMTtcbiAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY3Rpb24sIHtcbiAgICAgICAgICBuYW1lOiBhY3Rpb24ubmFtZSB8fCBgYWN0aW9uJHtpbmRleH1gLFxuICAgICAgICB9KTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICAgIGxldCBidXR0b25UZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5mb3JtYXRPcHRpb25zICYmIHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25UZXh0KSB7XG4gICAgICAgIC8vIGlmIGJ1dHRvbiB0ZXh0IGlzIGEgbGl0ZXJhbCBleHByZXNzaW9uXG4gICAgICAgIGlmICh0aGlzLmZvcm1hdE9wdGlvbnMuYnV0dG9uVGV4dC5pbmNsdWRlcygnJHsnKSkge1xuICAgICAgICAgIC8vIHVzZSB0ZW1wbGF0ZVxuICAgICAgICAgIGJ1dHRvblRleHQgPSBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh0aGlzLmZvcm1hdE9wdGlvbnMuYnV0dG9uVGV4dCkocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvdGhlcndpc2UgdHJhbnNsYXRlIGl0XG4gICAgICAgICAgYnV0dG9uVGV4dCA9IHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQodGhpcy5mb3JtYXRPcHRpb25zLmJ1dHRvblRleHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgYnV0dG9uVGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLmZvcm1hdE9wdGlvbnMgJiYgdGhpcy5mb3JtYXRPcHRpb25zLmJ1dHRvblRpdGxlKSB7XG4gICAgICAgIGJ1dHRvblRpdGxlID0gdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh0aGlzLmZvcm1hdE9wdGlvbnMuYnV0dG9uVGJ1dHRvblRpdGxlZXh0KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ1dHRvbkNsYXNzID0gKHRoaXMuZm9ybWF0T3B0aW9ucyAmJiB0aGlzLmZvcm1hdE9wdGlvbnMuYnV0dG9uQ2xhc3MpIHx8ICdidG4gYnRuLWxpZ2h0JztcbiAgICAgIC8vIHJldHVybiB0aGUgZHJvcGRvd24gbWVudSB3aXRoIDMgZG90c1xuICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSdkcm9wZG93biBkZXRhaWxzLWNvbnRyb2wnIGRhdGEtaWQ9JyR7ZGF0YX0nPlxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIiR7YnV0dG9uQ2xhc3N9IGRyb3Bkb3duLXRvZ2dsZVwiIGhyZWY9XCIjXCIgcm9sZT1cImJ1dHRvblwiIHRpdGxlPVwiJHtidXR0b25UaXRsZX1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZHJvcGRvd25NZW51QnV0dG9uLSR7ZGF0YX1cIiBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAke2J1dHRvblRleHR9XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bk1lbnVCdXR0b24tJHtkYXRhfVwiPlxuICAgICAgICAgICAgICAgICAgICAgJHthY3Rpb25zLm1hcCgoeCkgPT4ge1xuICAgICAgICBpZiAoeC50eXBlID09PSAnZGl2aWRlcicpIHtcbiAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeC5jb21tYW5kcykge1xuICAgICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLmNyZWF0ZVVybFRyZWUocm93LCB4KTtcbiAgICAgICAgICByZXR1cm4gYDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjJHt1cmxUcmVlICYmIHVybFRyZWUudG9TdHJpbmcoKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh4LnRpdGxlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiJHtBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh4LmhyZWYpKHJvdyl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5pbmplY3RvciAmJiB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHgudGl0bGUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICB9KVxuICAgICAgICAgIC5qb2luKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlcihjZWxsOiBhbnksIGNlbGxEYXRhOiBhbnksIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGFzc2lnbiBib290c3RyYXAgZHJvcGRvd24gKD8pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblNwbGl0QnV0dG9uRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXJcbiAgaW1wbGVtZW50cyBPbkFkdmFuY2VkQ29sdW1uQWZ0ZXJSZW5kZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55IHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuXG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSkge1xuICAgICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucyB8fCBbXTtcbiAgICAgIGxldCBpbmRleCA9IDE7XG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWN0aW9uLCB7XG4gICAgICAgICAgbmFtZTogYWN0aW9uLm5hbWUgfHwgYGFjdGlvbiR7aW5kZXh9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYnV0dG9uQ2xhc3MgPSAodGhpcy5mb3JtYXRPcHRpb25zICYmIHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25DbGFzcykgfHwgJ2J0biBidG4tbGlnaHQnO1xuICAgICAgLy8gcmV0dXJuIHRoZSBkcm9wZG93biBtZW51IHdpdGggMyBkb3RzXG4gICAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gYWN0aW9uc1swXTtcbiAgICAgIGxldCBkZWZhdWx0QWN0aW9uSHJlZjogc3RyaW5nO1xuICAgICAgaWYgKGRlZmF1bHRBY3Rpb24gJiYgZGVmYXVsdEFjdGlvbi5jb21tYW5kcykge1xuICAgICAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5jcmVhdGVVcmxUcmVlKHJvdywgZGVmYXVsdEFjdGlvbik7XG4gICAgICAgIGRlZmF1bHRBY3Rpb25IcmVmID0gJyMnICsgKHVybFRyZWUgJiYgdXJsVHJlZS50b1N0cmluZygpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRBY3Rpb25IcmVmID0gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUoZGVmYXVsdEFjdGlvbi5ocmVmKShyb3cpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiR7YnV0dG9uQ2xhc3N9XCIgaHJlZj1cIiR7ZGVmYXVsdEFjdGlvbkhyZWZ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmluamVjdG9yICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoZGVmYXVsdEFjdGlvbi50aXRsZSl9XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCIke2J1dHRvbkNsYXNzfSBkcm9wZG93bi10b2dnbGUgZHJvcGRvd24tdG9nZ2xlLXNwbGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj4ke3RoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCgnVG9nZ2xlIERyb3Bkb3duJyl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bk1lbnVCdXR0b24tJHtkYXRhfVwiPlxuICAgICAgICAgICAgICAgICAgICAgJHthY3Rpb25zLm1hcCgoeCkgPT4ge1xuICAgICAgICBpZiAoeC50aXRsZSA9PT0gJy0nKSB7XG4gICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHguY29tbWFuZHMpIHtcbiAgICAgICAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5jcmVhdGVVcmxUcmVlKHJvdywgeCk7XG4gICAgICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiIyR7dXJsVHJlZSAmJiB1cmxUcmVlLnRvU3RyaW5nKCl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmluamVjdG9yICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoeC50aXRsZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiR7QWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUoeC5ocmVmKShyb3cpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh4LnRpdGxlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5gO1xuICAgICAgfSlcbiAgICAgICAgICAuam9pbignJyl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXIoY2VsbDogYW55LCBjZWxsRGF0YTogYW55LCByb3dEYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhc3NpZ24gYm9vdHN0cmFwIGRyb3Bkb3duICg/KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RSb3dGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YSwgdHlwZSwgcm93LCBtZXRhKSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbiA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhKSB7XG4gICAgICBjb25zdCBfdHBsID0gYDxpbnB1dCBjbGFzcz1cImNoZWNrYm94IGNoZWNrYm94LXRoZW1lXCIgdHlwZT1cImNoZWNrYm94XCJcbiBpZD1cInMtJHttZXRhLnJvd31cIiAvPjxsYWJlbCBmb3I9XCJzLSR7bWV0YS5yb3d9XCI+Jm5ic3A7PC9sYWJlbD5gO1xuICAgICAgcmV0dXJuIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKF90cGwpKHJvdyk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55IHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEpIHtcbiAgICAgIHJldHVybiBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh0aGlzLmZvcm1hdFN0cmluZyBhcyBzdHJpbmcpKHJvdyk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRydWVGYWxzZUZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcblxuICBwdWJsaWMgcmVuZGVyKGRhdGEsIHR5cGUsIHJvdywgbWV0YSkge1xuICAgIHJldHVybiBkYXRhID8gKHRoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCgnVHJ1ZUZhbHNlLmxvbmcuWWVzJykpIDpcbiAgICAgICh0aGlzLmluamVjdG9yICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoJ1RydWVGYWxzZS5sb25nLk5vJykpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5kZWNsYXJlIGludGVyZmFjZSBUcmFuc2xhdGlvbkZvcm1hdHRlclRlbXBsYXRlIHtcbiAgdHJhbnNsYXRlVGVtcGxhdGU/OiAoZGF0YTogYW55KSA9PiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGlvbkZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IHN0cmluZywgcm93OiBhbnksIG1ldGE6IGFueSk6IGFueSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbjogVHJhbnNsYXRpb25Gb3JtYXR0ZXJUZW1wbGF0ZSA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcbiAgICBpZiAoY29sdW1uICYmIGRhdGEgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudChcbiAgICAgICAgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUodGhpcy5mb3JtYXRTdHJpbmcgYXMgc3RyaW5nKSh7XG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCgnVW5rbm93bicpO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGVUaW1lRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55IHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEgJiYgdGhpcy5pbmplY3Rvcikge1xuICAgICAgY29uc3QgZGF0ZVBpcGU6IERhdGVQaXBlID0gbmV3IERhdGVQaXBlKHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmN1cnJlbnRMYW5nKTtcbiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgJiYgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcK1xcZHsyfSQvLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGVQaXBlLnRyYW5zZm9ybShuZXcgRGF0ZShkYXRhICsgJzowMCcpLCB0aGlzLmZvcm1hdFN0cmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGEsIHRoaXMuZm9ybWF0U3RyaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmdDbGFzc0Zvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEpIHtcbiAgICAgIC8vIGdldCBmb3JtYXRPcHRpb25zXG4gICAgICBpZiAodGhpcy5mb3JtYXRPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG5nQ2xhc3MgPSB0aGlzLmZvcm1hdE9wdGlvbnMubmdDbGFzcztcbiAgICAgICAgLy8gY2hlY2sgY29uZGl0aW9uIGZvciBlYWNoIGtleVxuICAgICAgICBjb2x1bW4ubmdDbGFzc1RlbXBsYXRlcyA9IGNvbHVtbi5uZ0NsYXNzVGVtcGxhdGVzIHx8IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhuZ0NsYXNzKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKG5nQ2xhc3Nba2V5XSkocm93KTtcbiAgICAgICAgICBjb25zdCBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7cmVzdWx0fTtgKTtcbiAgICAgICAgICAvLyBpZiBjb25kaXRpb24gcmV0dXJucyB0cnVlIGFkZCBjbGFzc1xuICAgICAgICAgIGlmIChmbigpID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwiJHtrZXl9XCI+JHtkYXRhfTwvc3Bhbj5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBMYW5ndWFnZUZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgcmV0dXJuIElTTzYzOTEuZ2V0TmF0aXZlTmFtZShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuIl19
|