@mediusinc/mng-commons 5.3.0-rc.2 → 5.3.0-rc.4
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/core/data-list/data-list.model.d.ts +1 -1
- package/core/data-providers/lookup.data-provider.d.ts +5 -5
- package/core/descriptors/lookup.descriptor.d.ts +3 -3
- package/core/descriptors/table.descriptor.d.ts +1 -1
- package/esm2022/core/data-list/data-list-params-helpers.mjs +1 -1
- package/esm2022/core/data-list/data-list.model.mjs +1 -1
- package/esm2022/core/data-providers/lookup.data-provider.mjs +1 -1
- package/esm2022/core/descriptors/lookup.descriptor.mjs +1 -1
- package/esm2022/core/descriptors/table.descriptor.mjs +1 -1
- package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +60 -2
- package/esm2022/filter/descriptors/filter.descriptor.mjs +118 -8
- package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +17 -6
- package/esm2022/form/api/data-providers/lookup.data-provider.mjs +1 -1
- package/esm2022/form/components/autocomplete/autocomplete.component.mjs +1 -1
- package/esm2022/form/components/dropdown/dropdown.component.mjs +3 -3
- package/esm2022/model/helpers/model.mjs +1 -1
- package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +16 -7
- package/esm2022/table/api/descriptors/column.descriptor.mjs +125 -4
- package/esm2022/table/api/descriptors/sort.descriptor.mjs +23 -1
- package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +1 -1
- package/esm2022/table/api/descriptors/table.descriptor.mjs +435 -44
- package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +7 -0
- package/esm2022/table/api/index.mjs +3 -1
- package/esm2022/table/api/models/row-expandable-component.model.mjs +2 -0
- package/esm2022/table/api/models/table-columns.model.mjs +1 -1
- package/esm2022/table/components/column-value/column-value.component.mjs +3 -3
- package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +3 -3
- package/esm2022/table/components/table/table.component.mjs +6 -6
- package/esm2022/tableview/action/components/action/action.component.mjs +3 -3
- package/esm2022/tableview/action/components/table/action-table.component.mjs +3 -3
- package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +6 -6
- package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +2 -4
- package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +1 -1
- package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +14 -1
- package/esm2022/tableview/api/editor/models/field-image-preview.model.mjs +2 -0
- package/esm2022/tableview/api/index.mjs +3 -1
- package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +16 -7
- package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +1 -1
- package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +5 -5
- package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +7 -0
- package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +9 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +3 -3
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-filter.mjs +176 -8
- package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form-api.mjs +16 -5
- package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form.mjs +2 -2
- package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-api.mjs +602 -53
- package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table.mjs +9 -9
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +45 -19
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +23 -18
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/filter/descriptors/filter-lookup.descriptor.d.ts +70 -12
- package/filter/descriptors/filter.descriptor.d.ts +116 -5
- package/form/api/data-providers/lookup-data-provider.factory.d.ts +16 -12
- package/form/api/data-providers/lookup.data-provider.d.ts +5 -5
- package/form/components/autocomplete/autocomplete.component.d.ts +1 -1
- package/form/components/dropdown/dropdown.component.d.ts +1 -1
- package/model/helpers/model.d.ts +1 -1
- package/package.json +7 -7
- package/table/api/data-providers/table-data-provider.factory.d.ts +9 -5
- package/table/api/descriptors/column.descriptor.d.ts +126 -5
- package/table/api/descriptors/sort.descriptor.d.ts +22 -0
- package/table/api/descriptors/table-descriptor.factory.d.ts +8 -4
- package/table/api/descriptors/table.descriptor.d.ts +429 -28
- package/table/api/helpers/table-data-provider-descriptor-convert.d.ts +20 -0
- package/table/api/index.d.ts +2 -0
- package/table/api/models/row-expandable-component.model.d.ts +4 -0
- package/table/api/models/table-columns.model.d.ts +6 -6
- package/table/components/column-filter/column-filter.component.d.ts +1 -1
- package/table/components/filter/filter-form/filter-form.component.d.ts +1 -1
- package/tableview/action/components/localization/data-language-dropdown.component.d.ts +1 -1
- package/tableview/api/editor/descriptors/editor.descriptor.d.ts +11 -11
- package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +5 -5
- package/tableview/api/editor/descriptors/field-lookup.descriptor.d.ts +12 -12
- package/tableview/api/editor/descriptors/field.descriptor.d.ts +10 -0
- package/tableview/api/editor/models/field-image-preview.model.d.ts +4 -0
- package/tableview/api/index.d.ts +2 -0
- package/tableview/api/tableview/data-providers/tableview-data-provider.factory.d.ts +9 -5
- package/tableview/api/tableview/descriptors/tableview-descriptor.factory.d.ts +10 -6
- package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +17 -17
- package/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.d.ts +20 -0
- package/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.d.ts +1 -0
- package/version-info.json +5 -5
|
@@ -76,12 +76,6 @@ export class TableDescriptorInst {
|
|
|
76
76
|
get size() {
|
|
77
77
|
return this._size;
|
|
78
78
|
}
|
|
79
|
-
get tableFullHeightOffset() {
|
|
80
|
-
return this._tableFullHeightOffset;
|
|
81
|
-
}
|
|
82
|
-
get rowHeight() {
|
|
83
|
-
return this._rowHeight;
|
|
84
|
-
}
|
|
85
79
|
get hasHover() {
|
|
86
80
|
return this._hasHover;
|
|
87
81
|
}
|
|
@@ -131,7 +125,13 @@ export class TableDescriptorInst {
|
|
|
131
125
|
return this._rowExpandableProperty;
|
|
132
126
|
}
|
|
133
127
|
/**
|
|
134
|
-
*
|
|
128
|
+
* This property is used to define the type of the custom component that will be used to render the expanded row.
|
|
129
|
+
*/
|
|
130
|
+
get rowExpandableComponentType() {
|
|
131
|
+
return this._rowExpandableComponentType;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Identifier is used for the purpose of combined saving user preferences in localstorage if 2 tables have the same track properties they will share the same localstorage entry.
|
|
135
135
|
* Similarly, this property can also be used to differentiate two tables of the same model on the same url (so that they have separate entries in localstorage).
|
|
136
136
|
* @param identifier
|
|
137
137
|
*/
|
|
@@ -139,112 +139,236 @@ export class TableDescriptorInst {
|
|
|
139
139
|
this._identifier = identifier;
|
|
140
140
|
return this;
|
|
141
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Sets the track property (identifier of table row) for the table.
|
|
144
|
+
*
|
|
145
|
+
* @param {keyof TableModel} property - The property to track the row items by.
|
|
146
|
+
*/
|
|
142
147
|
withTrackProperty(property) {
|
|
143
148
|
return this.withTrackPropertyUnsafe(property);
|
|
144
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Sets the track property (identifier of table row) for the table.
|
|
152
|
+
*
|
|
153
|
+
* This function is UNSAFE!
|
|
154
|
+
*
|
|
155
|
+
* @param {string} property - The property to set '_trackProperty' to.
|
|
156
|
+
*/
|
|
145
157
|
withTrackPropertyUnsafe(property) {
|
|
146
158
|
this._trackProperty = property;
|
|
147
159
|
return this;
|
|
148
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Retrieves the column descriptor for the given property.
|
|
163
|
+
*
|
|
164
|
+
* @param {keyof TableModel} property - The property for column descriptor.
|
|
165
|
+
*
|
|
166
|
+
* @return The column descriptor.
|
|
167
|
+
*/
|
|
149
168
|
getColumn(property) {
|
|
150
169
|
return this.getColumnUnsafe(property);
|
|
151
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Retrieves the column descriptor for the given property.
|
|
173
|
+
*
|
|
174
|
+
* This function is UNSAFE!
|
|
175
|
+
*
|
|
176
|
+
* @param {keyof TableModel} property - The property for column descriptor.
|
|
177
|
+
*
|
|
178
|
+
* @return The column descriptor.
|
|
179
|
+
*/
|
|
152
180
|
getColumnUnsafe(property) {
|
|
153
181
|
return this._columns.find(col => col.property === property) ?? null;
|
|
154
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* Removes the column descriptor for the given property.
|
|
185
|
+
*
|
|
186
|
+
* @param {keyof TableModel} property - The property for column descriptor.
|
|
187
|
+
*/
|
|
155
188
|
removeColumn(property) {
|
|
156
189
|
this.removeColumnUnsafe(property);
|
|
157
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Removes the column descriptor for the given property.
|
|
193
|
+
*
|
|
194
|
+
* This function is UNSAFE!
|
|
195
|
+
*
|
|
196
|
+
* @param {keyof TableModel} property - The property for column descriptor.
|
|
197
|
+
*/
|
|
158
198
|
removeColumnUnsafe(property) {
|
|
159
199
|
const columnIdx = this._columns.findIndex(c => c.property === property);
|
|
160
200
|
this._columns.splice(columnIdx, 1);
|
|
161
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Adds column descriptor to table columns.
|
|
204
|
+
*
|
|
205
|
+
* @param {ColumnDescriptor<ColumnModel, TableModel, ColumnValue>} column - The property for column descriptor.
|
|
206
|
+
*/
|
|
162
207
|
withColumn(column) {
|
|
163
208
|
this._columns.push(column);
|
|
164
209
|
return this;
|
|
165
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Adds a column to the table.
|
|
213
|
+
*
|
|
214
|
+
* @param {PropertyKey} property - The property key of the column in the table model.
|
|
215
|
+
*
|
|
216
|
+
* @returns The newly added column descriptor.
|
|
217
|
+
*/
|
|
166
218
|
addColumn(property) {
|
|
167
219
|
const column = new ColumnDescriptor(property);
|
|
168
220
|
this._columns.push(column);
|
|
169
221
|
return column;
|
|
170
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Adds a column with enum display to the table.
|
|
225
|
+
*
|
|
226
|
+
* @param {PropertyKey} property - The property key of the table model.
|
|
227
|
+
* @param {EnumDescriptor<Enum>} enumDesc - The enum descriptor for column display.
|
|
228
|
+
* @return {ColumnDescriptor<Enum, TableModel, TableModel[PropertyKey]>} - The added column descriptor.
|
|
229
|
+
*/
|
|
171
230
|
addColumnEnum(property, enumDesc) {
|
|
172
231
|
const column = new ColumnDescriptor(property);
|
|
173
232
|
column.asEnumUnsafe(enumDesc);
|
|
174
233
|
this._columns.push(column);
|
|
175
234
|
return column;
|
|
176
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Adds a column to the table.
|
|
238
|
+
*
|
|
239
|
+
* This function is UNSAFE!
|
|
240
|
+
*
|
|
241
|
+
* @param {string} property - The property key of the column in the table model.
|
|
242
|
+
*
|
|
243
|
+
* @returns The newly added column descriptor.
|
|
244
|
+
*/
|
|
177
245
|
addColumnUnsafe(property) {
|
|
178
246
|
const column = new ColumnDescriptor(property);
|
|
179
247
|
this._columns.push(column);
|
|
180
248
|
return column;
|
|
181
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Adds one or more columns to the table model.
|
|
252
|
+
*
|
|
253
|
+
* @param properties - An array of property names to add as columns.
|
|
254
|
+
*/
|
|
182
255
|
withColumns(...properties) {
|
|
183
256
|
properties.forEach(p => this.addColumn(p));
|
|
184
257
|
return this;
|
|
185
258
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
259
|
+
/**
|
|
260
|
+
* Set the pagination mode for the table.
|
|
261
|
+
*
|
|
262
|
+
* @param {TablePaginationModeEnum} paginationMode - The pagination mode to set. Must be one of the values from the TablePaginationModeEnum.
|
|
263
|
+
*/
|
|
190
264
|
withPaginationMode(paginationMode) {
|
|
191
265
|
this._paginationMode = paginationMode;
|
|
192
266
|
return this;
|
|
193
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Sets the number of rows per page for a paginated display.
|
|
270
|
+
*
|
|
271
|
+
* @param {number} rows - The default number of rows to display per page.
|
|
272
|
+
* @param {Array<number>} [options] - Rows per page options to be available in table paginator.
|
|
273
|
+
*/
|
|
194
274
|
withRowsPerPage(rows, options) {
|
|
195
275
|
this._defaultNumRows = rows;
|
|
196
276
|
this._rowsPerPageOptions = options;
|
|
197
277
|
return this;
|
|
198
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* Sets the title for an instance of the class.
|
|
281
|
+
*
|
|
282
|
+
* @param {string} [title] - The title value to be set. It undefiend, no title will be displayed.
|
|
283
|
+
*/
|
|
199
284
|
withTitle(title) {
|
|
200
285
|
this._title = title;
|
|
201
286
|
return this;
|
|
202
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* Shows/hides the header row with column titles.
|
|
290
|
+
*
|
|
291
|
+
* @param {boolean} hideHeader - A boolean value indicating whether to hide the header.
|
|
292
|
+
*/
|
|
203
293
|
withHideHeader(hideHeader = true) {
|
|
204
294
|
this._hideHeader = hideHeader;
|
|
205
295
|
return this;
|
|
206
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Adjusts loading display with custom text and/or icon.
|
|
299
|
+
*
|
|
300
|
+
* @param {string} [text] - Text to be displayed when loading indicator is shown.
|
|
301
|
+
* @param {string | null} [icon] - Icon to be used when loading indicator is shown.
|
|
302
|
+
*/
|
|
207
303
|
withLoading(text, icon) {
|
|
208
304
|
this._loadingText = text;
|
|
209
305
|
this._loadingIcon = icon === undefined ? 'pi pi-spinner' : icon;
|
|
210
306
|
return this;
|
|
211
307
|
}
|
|
212
308
|
/**
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
col.withReorderable(columnsReorderable);
|
|
219
|
-
}
|
|
220
|
-
return this;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Helper method that enables/disables toggleable property on all columns currently in the descriptor.
|
|
224
|
-
* @param columnsToggleable
|
|
309
|
+
* Retrieves the sort descriptor for a given property.
|
|
310
|
+
*
|
|
311
|
+
* @param {Sorts} property - The property to retrieve the sort for.
|
|
312
|
+
*
|
|
313
|
+
* @return {SortDescriptor<TableModel> | null} The sort descriptor or null.
|
|
225
314
|
*/
|
|
226
|
-
withCurrentColumnsToggleable(columnsToggleable = true) {
|
|
227
|
-
for (const col of this.columns) {
|
|
228
|
-
col.withToggleable(columnsToggleable);
|
|
229
|
-
}
|
|
230
|
-
return this;
|
|
231
|
-
}
|
|
232
315
|
getSort(property) {
|
|
233
316
|
return this.getSortUnsafe(property);
|
|
234
317
|
}
|
|
318
|
+
/**
|
|
319
|
+
* Retrieves the sort descriptor for a given property.
|
|
320
|
+
*
|
|
321
|
+
* This function is UNSAFE!
|
|
322
|
+
*
|
|
323
|
+
* @param {Sorts} property - The property to retrieve the sort for.
|
|
324
|
+
*
|
|
325
|
+
* @return {SortDescriptor<TableModel> | null} The sort descriptor or null.
|
|
326
|
+
*/
|
|
235
327
|
getSortUnsafe(property) {
|
|
236
328
|
return this._sorts.find(s => s.property === property) ?? null;
|
|
237
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* Removes the sort for a given property.
|
|
332
|
+
*
|
|
333
|
+
* @param {Sorts} property - The property to remove the sort for.
|
|
334
|
+
*/
|
|
238
335
|
removeSort(property) {
|
|
239
336
|
return this.removeSortUnsafe(property);
|
|
240
337
|
}
|
|
338
|
+
/**
|
|
339
|
+
* Removes the sort for a given property.
|
|
340
|
+
*
|
|
341
|
+
* This function is UNSAFE!
|
|
342
|
+
*
|
|
343
|
+
* @param {Sorts} property - The property to remove the sort for.
|
|
344
|
+
*/
|
|
241
345
|
removeSortUnsafe(property) {
|
|
242
346
|
const sortIdx = this._sorts.findIndex(c => c.property === property);
|
|
243
347
|
this._sorts.splice(sortIdx, 1);
|
|
244
348
|
}
|
|
349
|
+
/**
|
|
350
|
+
* Adds sort for the given property.
|
|
351
|
+
*
|
|
352
|
+
* @param property Property to add the sort for.
|
|
353
|
+
* @param isDefault If default sorting is enabled.
|
|
354
|
+
* @param ascending If default sort should be ascending.
|
|
355
|
+
*
|
|
356
|
+
* @return Created sort descriptor.
|
|
357
|
+
*/
|
|
245
358
|
addSort(property, isDefault = false, ascending) {
|
|
246
359
|
return this.addSortUnsafe(property, isDefault, ascending);
|
|
247
360
|
}
|
|
361
|
+
/**
|
|
362
|
+
* Adds sort for the given property.
|
|
363
|
+
*
|
|
364
|
+
* This function is UNSAFE!
|
|
365
|
+
*
|
|
366
|
+
* @param property Property to add the sort for.
|
|
367
|
+
* @param isDefault If default sorting is enabled.
|
|
368
|
+
* @param ascending If default sort should be ascending.
|
|
369
|
+
|
|
370
|
+
* @return Created sort descriptor.
|
|
371
|
+
*/
|
|
248
372
|
addSortUnsafe(property, isDefault = false, ascending) {
|
|
249
373
|
const sort = new SortDescriptor(property);
|
|
250
374
|
if (isDefault) {
|
|
@@ -256,16 +380,50 @@ export class TableDescriptorInst {
|
|
|
256
380
|
this._sorts.push(sort);
|
|
257
381
|
return sort;
|
|
258
382
|
}
|
|
383
|
+
/**
|
|
384
|
+
* Adds sort for the given property.
|
|
385
|
+
*
|
|
386
|
+
* @param property Property to add the sort for.
|
|
387
|
+
* @param isDefault If default sorting is enabled.
|
|
388
|
+
* @param ascending If default sort should be ascending.
|
|
389
|
+
*/
|
|
259
390
|
withSort(property, isDefault = false, ascending) {
|
|
260
391
|
return this.withSortUnsafe(property, isDefault, ascending);
|
|
261
392
|
}
|
|
393
|
+
/**
|
|
394
|
+
* Adds sort for the given property.
|
|
395
|
+
*
|
|
396
|
+
* This function is UNSAFE!
|
|
397
|
+
*
|
|
398
|
+
* @param property Property to add the sort for.
|
|
399
|
+
* @param isDefault If default sorting is enabled.
|
|
400
|
+
* @param ascending If default sort should be ascending.
|
|
401
|
+
*/
|
|
262
402
|
withSortUnsafe(property, isDefault = false, ascending) {
|
|
263
403
|
this.addSortUnsafe(property, isDefault, ascending);
|
|
264
404
|
return this;
|
|
265
405
|
}
|
|
406
|
+
/**
|
|
407
|
+
* Sets the default sorting for the property.
|
|
408
|
+
*
|
|
409
|
+
* @param property - The property to set default sort for.
|
|
410
|
+
* @param ascending - If the sorting should be ascending (default: true).
|
|
411
|
+
* @param order - The order for this default sort (default: 0).
|
|
412
|
+
* @param enabled - Enables/disabled the default sort.
|
|
413
|
+
*/
|
|
266
414
|
withDefaultSort(property, ascending, order, enabled) {
|
|
267
415
|
return this.withDefaultSortUnsafe(property, ascending, order, enabled);
|
|
268
416
|
}
|
|
417
|
+
/**
|
|
418
|
+
* Sets the default sorting for the property.
|
|
419
|
+
*
|
|
420
|
+
* This function is UNSAFE!
|
|
421
|
+
*
|
|
422
|
+
* @param property - The property to set default sort for.
|
|
423
|
+
* @param ascending - If the sorting should be ascending (default: true).
|
|
424
|
+
* @param order - The order for this default sort (default: 0).
|
|
425
|
+
* @param enabled - Enables/disabled the default sort.
|
|
426
|
+
*/
|
|
269
427
|
withDefaultSortUnsafe(property, ascending, order, enabled) {
|
|
270
428
|
let sort = this._sorts.find(s => s.property === property);
|
|
271
429
|
if (!sort) {
|
|
@@ -275,39 +433,115 @@ export class TableDescriptorInst {
|
|
|
275
433
|
sort.withDefaultSort(enabled ?? true, ascending, order);
|
|
276
434
|
return this;
|
|
277
435
|
}
|
|
436
|
+
/**
|
|
437
|
+
* Add sorts for more properties.
|
|
438
|
+
*
|
|
439
|
+
* @param properties Properties to add the sorts for.
|
|
440
|
+
*/
|
|
278
441
|
withSorts(...properties) {
|
|
279
442
|
return this.withSortsUnsafe(...properties);
|
|
280
443
|
}
|
|
444
|
+
/**
|
|
445
|
+
* Add sorts for more properties.
|
|
446
|
+
*
|
|
447
|
+
* This function is UNSAFE!
|
|
448
|
+
*
|
|
449
|
+
* @param properties Properties to add the sorts for.
|
|
450
|
+
*/
|
|
281
451
|
withSortsUnsafe(...properties) {
|
|
282
452
|
properties.forEach(p => {
|
|
283
453
|
this._sorts.push(new SortDescriptor(p));
|
|
284
454
|
});
|
|
285
455
|
return this;
|
|
286
456
|
}
|
|
457
|
+
/**
|
|
458
|
+
* Gets filter descriptor for given property.
|
|
459
|
+
*
|
|
460
|
+
* @param property Filter property
|
|
461
|
+
*
|
|
462
|
+
* @return Filter descriptor for property or null if not exists.
|
|
463
|
+
*/
|
|
287
464
|
getFilter(property) {
|
|
288
465
|
return this.getFilterUnsafe(property);
|
|
289
466
|
}
|
|
467
|
+
/**
|
|
468
|
+
* Gets filter descriptor for given property.
|
|
469
|
+
*
|
|
470
|
+
* This function is UNSAFE!
|
|
471
|
+
*
|
|
472
|
+
* @param property Filter property
|
|
473
|
+
*
|
|
474
|
+
* @return Filter descriptor for property or null if not exists.
|
|
475
|
+
*/
|
|
290
476
|
getFilterUnsafe(property) {
|
|
291
477
|
return this._filters.find(s => s.property === property) ?? null;
|
|
292
478
|
}
|
|
479
|
+
/**
|
|
480
|
+
* Removes filter descriptor for given property.
|
|
481
|
+
*
|
|
482
|
+
* @param property Filter property
|
|
483
|
+
*/
|
|
293
484
|
removeFilter(property) {
|
|
294
485
|
return this.removeFilterUnsafe(property);
|
|
295
486
|
}
|
|
487
|
+
/**
|
|
488
|
+
* Removes filter descriptor for given property.
|
|
489
|
+
*
|
|
490
|
+
* This function is UNSAFE!
|
|
491
|
+
*
|
|
492
|
+
* @param property Filter property
|
|
493
|
+
*/
|
|
296
494
|
removeFilterUnsafe(property) {
|
|
297
495
|
const filterIdx = this._filters.findIndex(c => c.property === property);
|
|
298
496
|
this._filters.splice(filterIdx, 1);
|
|
299
497
|
}
|
|
498
|
+
/**
|
|
499
|
+
* Creates filter descriptor for the given property.
|
|
500
|
+
*
|
|
501
|
+
* @param property Filter property.
|
|
502
|
+
*
|
|
503
|
+
* @return Created filter descriptor.
|
|
504
|
+
*/
|
|
300
505
|
addFilter(property) {
|
|
301
506
|
return this.addFilterUnsafe(property);
|
|
302
507
|
}
|
|
508
|
+
/**
|
|
509
|
+
* Creates filter descriptor for the given property.
|
|
510
|
+
*
|
|
511
|
+
* This function is UNSAFE!
|
|
512
|
+
*
|
|
513
|
+
* @param property Filter property.
|
|
514
|
+
*
|
|
515
|
+
* @return Created filter descriptor.
|
|
516
|
+
*/
|
|
303
517
|
addFilterUnsafe(property) {
|
|
304
518
|
const filter = new FilterDescriptor(property);
|
|
305
519
|
this._filters.push(filter);
|
|
306
520
|
return filter;
|
|
307
521
|
}
|
|
522
|
+
/**
|
|
523
|
+
* Creates filter lookup descriptor for the given property.
|
|
524
|
+
*
|
|
525
|
+
* @param property Filter property.
|
|
526
|
+
* @param provider Lookup provider.
|
|
527
|
+
* @param optionsValueProperty Property on lookup provider's item (FilterModel) that will be used as filter value.
|
|
528
|
+
*
|
|
529
|
+
* @return Created filter lookup descriptor.
|
|
530
|
+
*/
|
|
308
531
|
addFilterLookup(property, provider, optionsValueProperty) {
|
|
309
532
|
return this.addFilterLookupUnsafe(property, provider, optionsValueProperty);
|
|
310
533
|
}
|
|
534
|
+
/**
|
|
535
|
+
* Creates filter lookup descriptor for the given property.
|
|
536
|
+
*
|
|
537
|
+
* This function is UNSAFE!
|
|
538
|
+
*
|
|
539
|
+
* @param property Filter property.
|
|
540
|
+
* @param provider Lookup provider.
|
|
541
|
+
* @param optionsValueProperty Property on lookup provider's item (FilterModel) that will be used as filter value.
|
|
542
|
+
*
|
|
543
|
+
* @return Created filter lookup descriptor.
|
|
544
|
+
*/
|
|
311
545
|
addFilterLookupUnsafe(property, provider, optionsValueProperty) {
|
|
312
546
|
const filter = new FilterLookupDescriptor(property, {
|
|
313
547
|
dataProvider: provider,
|
|
@@ -316,26 +550,86 @@ export class TableDescriptorInst {
|
|
|
316
550
|
this._filters.push(filter);
|
|
317
551
|
return filter;
|
|
318
552
|
}
|
|
553
|
+
/**
|
|
554
|
+
* Creates filter lookup enum descriptor for the given property.
|
|
555
|
+
*
|
|
556
|
+
* @param property Filter property.
|
|
557
|
+
* @param enumDesc Descriptor for enum.
|
|
558
|
+
* @param options Optional options of enum values to be available to filter by.
|
|
559
|
+
*
|
|
560
|
+
* @return Created filter lookup enum descriptor.
|
|
561
|
+
*/
|
|
319
562
|
addFilterLookupEnum(property, enumDesc, options) {
|
|
320
563
|
return this.addFilterLookupEnumUnsafe(property, enumDesc, options);
|
|
321
564
|
}
|
|
565
|
+
/**
|
|
566
|
+
* Creates filter lookup enum descriptor for the given property.
|
|
567
|
+
*
|
|
568
|
+
* This function is UNSAFE!
|
|
569
|
+
*
|
|
570
|
+
* @param property Filter property.
|
|
571
|
+
* @param enumDesc Descriptor for enum.
|
|
572
|
+
* @param options Optional options of enum values to be available to filter by.
|
|
573
|
+
*
|
|
574
|
+
* @return Created filter lookup enum descriptor.
|
|
575
|
+
*/
|
|
322
576
|
addFilterLookupEnumUnsafe(property, enumDesc, options) {
|
|
323
577
|
const filter = new FilterLookupEnumDescriptor(property, enumDesc, options);
|
|
324
578
|
this._filters.push(filter);
|
|
325
579
|
return filter;
|
|
326
580
|
}
|
|
581
|
+
/**
|
|
582
|
+
* Creates filter descriptor from column. The column must exist on table descriptor.
|
|
583
|
+
*
|
|
584
|
+
* @param property Column property to add filter for.
|
|
585
|
+
* @param displayType Optional display type setting.
|
|
586
|
+
* @param forceSimple Forces simple creation of filter (no lookup or lookup enum filters).
|
|
587
|
+
*
|
|
588
|
+
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
589
|
+
*
|
|
590
|
+
* @return Created filter descriptor
|
|
591
|
+
*/
|
|
327
592
|
addFilterFromColumn(property, displayType, forceSimple = false) {
|
|
328
593
|
return this.addFilterFromColumnUnsafe(property, displayType, forceSimple);
|
|
329
594
|
}
|
|
595
|
+
/**
|
|
596
|
+
* Creates filter descriptors from columns. The columns must exist on table descriptor.
|
|
597
|
+
*
|
|
598
|
+
* @param properties Column properties to add filters for.
|
|
599
|
+
*
|
|
600
|
+
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
601
|
+
*/
|
|
330
602
|
withFiltersFromColumns(...properties) {
|
|
331
603
|
return this.withFiltersFromColumnsUnsafe(...properties);
|
|
332
604
|
}
|
|
605
|
+
/**
|
|
606
|
+
* Creates filter descriptors from columns. The columns must exist on table descriptor.
|
|
607
|
+
*
|
|
608
|
+
* This function is UNSAFE!
|
|
609
|
+
*
|
|
610
|
+
* @param properties Column properties to add filters for.
|
|
611
|
+
*
|
|
612
|
+
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
613
|
+
*/
|
|
333
614
|
withFiltersFromColumnsUnsafe(...properties) {
|
|
334
615
|
properties.forEach(p => {
|
|
335
616
|
this.addFilterFromColumnUnsafe(p);
|
|
336
617
|
});
|
|
337
618
|
return this;
|
|
338
619
|
}
|
|
620
|
+
/**
|
|
621
|
+
* Creates filter descriptor from column. The column must exist on table descriptor.
|
|
622
|
+
*
|
|
623
|
+
* This function is UNSAFE!
|
|
624
|
+
*
|
|
625
|
+
* @param property Column property to add filter for.
|
|
626
|
+
* @param displayType Optional display type setting.
|
|
627
|
+
* @param forceSimple Forces simple creation of filter (no lookup or lookup enum filters).
|
|
628
|
+
*
|
|
629
|
+
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
630
|
+
*
|
|
631
|
+
* @return Created filter descriptor
|
|
632
|
+
*/
|
|
339
633
|
addFilterFromColumnUnsafe(property, displayType, forceSimple = false) {
|
|
340
634
|
const column = this.getColumnUnsafe(property);
|
|
341
635
|
if (!column) {
|
|
@@ -346,6 +640,18 @@ export class TableDescriptorInst {
|
|
|
346
640
|
filter.withDisplayType(displayType);
|
|
347
641
|
return filter;
|
|
348
642
|
}
|
|
643
|
+
/**
|
|
644
|
+
* Creates filter descriptor from provided column descriptor.
|
|
645
|
+
*
|
|
646
|
+
* This function is UNSAFE!
|
|
647
|
+
*
|
|
648
|
+
* @param column Column descriptor.
|
|
649
|
+
* @param forceSimple Forces simple creation of filter (no lookup or lookup enum filters).
|
|
650
|
+
*
|
|
651
|
+
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
652
|
+
*
|
|
653
|
+
* @return Created filter descriptor
|
|
654
|
+
*/
|
|
349
655
|
addFilterFromColumnDescriptorUnsafe(column, forceSimple = false) {
|
|
350
656
|
let filterDescriptor = new FilterDescriptor(column.property);
|
|
351
657
|
let filterType;
|
|
@@ -381,42 +687,90 @@ export class TableDescriptorInst {
|
|
|
381
687
|
this._filters.push(filterDescriptor);
|
|
382
688
|
return filterDescriptor;
|
|
383
689
|
}
|
|
690
|
+
/**
|
|
691
|
+
* Adds filter descriptor for the given property.
|
|
692
|
+
*
|
|
693
|
+
* @param property Filter property.
|
|
694
|
+
* @param filter Descriptor for property.
|
|
695
|
+
*/
|
|
384
696
|
withFilter(property, filter) {
|
|
385
697
|
if (filter.property !== property) {
|
|
386
698
|
throw new CommonsInternalError(`Filter property "${property}" and Filter descriptor property "${filter.property}" do not match.`);
|
|
387
699
|
}
|
|
388
700
|
return this.withFilterUnsafe(filter);
|
|
389
701
|
}
|
|
702
|
+
/**
|
|
703
|
+
* Adds filter descriptor for the given property.
|
|
704
|
+
*
|
|
705
|
+
* This function is UNSAFE!
|
|
706
|
+
*
|
|
707
|
+
* @param filter Descriptor for property.
|
|
708
|
+
*/
|
|
390
709
|
withFilterUnsafe(filter) {
|
|
391
710
|
this._filters.push(filter);
|
|
392
711
|
return this;
|
|
393
712
|
}
|
|
713
|
+
/**
|
|
714
|
+
* Sets classes for table component.
|
|
715
|
+
*
|
|
716
|
+
* @param className Class names.
|
|
717
|
+
*/
|
|
394
718
|
withClassName(className) {
|
|
395
719
|
this._className = className;
|
|
396
720
|
return this;
|
|
397
721
|
}
|
|
722
|
+
/**
|
|
723
|
+
* Sets table sizing.
|
|
724
|
+
*
|
|
725
|
+
* @param size Table size.
|
|
726
|
+
*/
|
|
398
727
|
withSize(size = TableSizeEnum.Normal) {
|
|
399
728
|
this._size = size;
|
|
400
729
|
return this;
|
|
401
730
|
}
|
|
402
|
-
|
|
403
|
-
|
|
731
|
+
/**
|
|
732
|
+
* Enables hover effect on table rows.
|
|
733
|
+
*
|
|
734
|
+
* @param hover Enables/disables the hover.
|
|
735
|
+
*/
|
|
736
|
+
withHover(hover = true) {
|
|
737
|
+
this._hasHover = hover;
|
|
404
738
|
return this;
|
|
405
739
|
}
|
|
406
|
-
|
|
407
|
-
|
|
740
|
+
/**
|
|
741
|
+
* Enables gridlines on table.
|
|
742
|
+
*
|
|
743
|
+
* @param gridlines Enables/disables the gridlines.
|
|
744
|
+
*/
|
|
745
|
+
withGridlines(gridlines = true) {
|
|
746
|
+
this._hasGridlines = gridlines;
|
|
408
747
|
return this;
|
|
409
748
|
}
|
|
410
|
-
|
|
411
|
-
|
|
749
|
+
/**
|
|
750
|
+
* Enables/disables reorderable property on all columns currently in the descriptor.
|
|
751
|
+
*
|
|
752
|
+
* @param {boolean} [columnsReorderable] - Boolean flag to set reordering on columns to.
|
|
753
|
+
*/
|
|
754
|
+
withCurrentColumnsReorderable(columnsReorderable = true) {
|
|
755
|
+
for (const col of this.columns) {
|
|
756
|
+
col.withReorderable(columnsReorderable);
|
|
757
|
+
}
|
|
412
758
|
return this;
|
|
413
759
|
}
|
|
414
|
-
|
|
415
|
-
|
|
760
|
+
/**
|
|
761
|
+
* Enables/disables toggleable property on all columns currently in the descriptor.
|
|
762
|
+
*
|
|
763
|
+
* @param {boolean} [columnsToggleable] - Boolean flag to set toggleable on columns to.
|
|
764
|
+
*/
|
|
765
|
+
withCurrentColumnsToggleable(columnsToggleable = true) {
|
|
766
|
+
for (const col of this.columns) {
|
|
767
|
+
col.withToggleable(columnsToggleable);
|
|
768
|
+
}
|
|
416
769
|
return this;
|
|
417
770
|
}
|
|
418
771
|
/**
|
|
419
|
-
*
|
|
772
|
+
* Enables/disabled column resize feature with columnResizeMode on all columns.
|
|
773
|
+
*
|
|
420
774
|
* @param resizableColumns True if enabled
|
|
421
775
|
* @param columnResizeMode 'fit' or 'expand' mode
|
|
422
776
|
*/
|
|
@@ -427,6 +781,7 @@ export class TableDescriptorInst {
|
|
|
427
781
|
}
|
|
428
782
|
/**
|
|
429
783
|
* Sets column to (un)frozen.
|
|
784
|
+
*
|
|
430
785
|
* @param selectionColumnFrozen True to freeze selection column, false to unfreeze it.
|
|
431
786
|
* @param actionColumnFrozen True to freeze action column, false to unfreeze it.
|
|
432
787
|
*/
|
|
@@ -435,25 +790,51 @@ export class TableDescriptorInst {
|
|
|
435
790
|
this._actionColumnFrozen = actionColumnFrozen;
|
|
436
791
|
return this;
|
|
437
792
|
}
|
|
793
|
+
/**
|
|
794
|
+
* Sets the class name for rows in the table.
|
|
795
|
+
*
|
|
796
|
+
* @param {string} rowClassName - The CSS class name to be applied to each row.
|
|
797
|
+
* @param {function} [classNameMapFn] - Optional function to map the class name dynamically based on row's item and current class name.
|
|
798
|
+
*/
|
|
438
799
|
withRowClassName(rowClassName, classNameMapFn) {
|
|
439
800
|
this._rowClassName = rowClassName;
|
|
440
801
|
this._rowClassNameMapFn = classNameMapFn;
|
|
441
802
|
return this;
|
|
442
803
|
}
|
|
804
|
+
/**
|
|
805
|
+
* Sets header row class name.
|
|
806
|
+
*
|
|
807
|
+
* @param headerClassName Class name.
|
|
808
|
+
*/
|
|
443
809
|
withHeaderClassName(headerClassName) {
|
|
444
810
|
this._headerClassName = headerClassName;
|
|
445
811
|
return this;
|
|
446
812
|
}
|
|
813
|
+
/**
|
|
814
|
+
* Enables localization of the table.
|
|
815
|
+
*/
|
|
447
816
|
withLocalized() {
|
|
448
817
|
this._isLocalized = true;
|
|
449
818
|
return this;
|
|
450
819
|
}
|
|
451
|
-
|
|
820
|
+
/**
|
|
821
|
+
* Sets locale property for localization.
|
|
822
|
+
*
|
|
823
|
+
* @param property Locale property
|
|
824
|
+
*/
|
|
825
|
+
withLocalizationLocaleProperty(property) {
|
|
452
826
|
this._isLocalized = true;
|
|
453
|
-
this._localizationLocaleProperty =
|
|
827
|
+
this._localizationLocaleProperty = property;
|
|
454
828
|
return this;
|
|
455
829
|
}
|
|
456
|
-
|
|
830
|
+
/**
|
|
831
|
+
* Enables row expanding.
|
|
832
|
+
*
|
|
833
|
+
* @param property Property to check if row can be expanded.
|
|
834
|
+
* @param colSpan set custom row span for expanded row.
|
|
835
|
+
* @param componentType Component to be displayed on row expand.
|
|
836
|
+
*/
|
|
837
|
+
withRowExpandable(property, colSpan, componentType) {
|
|
457
838
|
this._rowExpandable = true;
|
|
458
839
|
if (property) {
|
|
459
840
|
this._rowExpandableProperty = property;
|
|
@@ -461,8 +842,16 @@ export class TableDescriptorInst {
|
|
|
461
842
|
if (colSpan) {
|
|
462
843
|
this._rowExpandableColSpan = colSpan;
|
|
463
844
|
}
|
|
845
|
+
if (componentType) {
|
|
846
|
+
this._rowExpandableComponentType = componentType;
|
|
847
|
+
}
|
|
464
848
|
return this;
|
|
465
849
|
}
|
|
850
|
+
/**
|
|
851
|
+
* Enables row reordering.
|
|
852
|
+
*
|
|
853
|
+
* @param reordable Enables/disables feature.
|
|
854
|
+
*/
|
|
466
855
|
withRowReorderable(reordable = true) {
|
|
467
856
|
this._rowReorderable = reordable;
|
|
468
857
|
return this;
|
|
@@ -475,8 +864,6 @@ export class TableDescriptorInst {
|
|
|
475
864
|
obj._sorts = this._sorts.map(s => s.copy());
|
|
476
865
|
obj._className = this._className;
|
|
477
866
|
obj._size = this._size;
|
|
478
|
-
obj._tableFullHeightOffset = this._tableFullHeightOffset;
|
|
479
|
-
obj._rowHeight = this._rowHeight;
|
|
480
867
|
obj._hasHover = this._hasHover;
|
|
481
868
|
obj._hasGridlines = this._hasGridlines;
|
|
482
869
|
obj._hasResizableColumns = this._hasResizableColumns;
|
|
@@ -490,8 +877,12 @@ export class TableDescriptorInst {
|
|
|
490
877
|
obj._rowExpandable = this._rowExpandable;
|
|
491
878
|
obj._rowExpandableColSpan = this._rowExpandableColSpan;
|
|
492
879
|
obj._rowExpandableProperty = this._rowExpandableProperty;
|
|
880
|
+
obj._rowExpandableComponentType = this._rowExpandableComponentType;
|
|
493
881
|
obj._rowReorderable = this._rowReorderable;
|
|
494
882
|
}
|
|
883
|
+
/**
|
|
884
|
+
* Copies current descriptor to a new instance.
|
|
885
|
+
*/
|
|
495
886
|
copy() {
|
|
496
887
|
const descriptor = new TableDescriptorInst(this.model.copy());
|
|
497
888
|
this.copyFieldsTo(descriptor);
|
|
@@ -645,4 +1036,4 @@ export class TableDynamicDescriptorInst extends TableDescriptorInst {
|
|
|
645
1036
|
return descriptor;
|
|
646
1037
|
}
|
|
647
1038
|
}
|
|
648
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RhYmxlL2FwaS9zcmMvZGVzY3JpcHRvcnMvdGFibGUuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsb0JBQW9CLEVBQTJFLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0osT0FBTyxFQUFDLGdCQUFnQixFQUF5QixzQkFBc0IsRUFBRSwwQkFBMEIsRUFBRSxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUcxSixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRixPQUFPLEVBQXdCLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTdFLE9BQU8sRUFBQywyQkFBMkIsRUFBMkIsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDMUcsT0FBTyxFQUFDLGdCQUFnQixFQUFFLHVCQUF1QixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE1BQU0sT0FBTyxtQkFBbUI7SUFvRDVCLFlBQW1CLEtBQWtDLEVBQUUsYUFBYSxHQUFHLEtBQUs7UUF6Q2xFLGFBQVEsR0FBNkMsRUFBRSxDQUFDO1FBRTFELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXBCLGlCQUFZLEdBQWtCLGVBQWUsQ0FBQztRQUV0RCxRQUFRO1FBQ0EsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qix5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFPckMsVUFBVTtRQUNGLFVBQUssR0FBa0IsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUMzQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBT3hCLGdCQUFnQjtRQUNSLGFBQVEsR0FBd0MsRUFBRSxDQUFDO1FBQ25ELFdBQU0sR0FB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QUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QixVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEQsVUFBVSxDQUFDLGdCQUFnQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6RCxVQUFVLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsVUFBVSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELFVBQVUsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDdEQsVUFBVSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2xELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxpQkFBaUI7UUFDcEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxtQkFBbUIsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QixPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbW1vbnNJbnRlcm5hbEVycm9yLCBEYXRhTGlzdFJlc3VsdCwgRW51bUNvbnN0YW50VHlwZSwgSUxvb2t1cERhdGFQcm92aWRlciwgSVRhYmxlRGVzY3JpcHRvciwgZmxhdHRlbk9iamVjdEtleXN9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0ZpbHRlckRlc2NyaXB0b3IsIEZpbHRlckRpc3BsYXlUeXBlRW51bSwgRmlsdGVyTG9va3VwRGVzY3JpcHRvciwgRmlsdGVyTG9va3VwRW51bURlc2NyaXB0b3IsIEZpbHRlclR5cGVFbnVtfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2ZpbHRlcic7XG5pbXBvcnQge0VudW1EZXNjcmlwdG9yLCBNb2RlbERlc2NyaXB0b3J9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvbW9kZWwnO1xuXG5pbXBvcnQge2NvbHVtblRvRGF0ZU51bWJlck9yQm9vbGVhbn0gZnJvbSAnLi4vaGVscGVycy9jbGFzcy1hdHRyaWJ1dGUtY29udmVydGVyJztcbmltcG9ydCB7Q29sdW1uRGlzcGxheVR5cGVFbnVtLCBDb2x1bW5UeXBlRW51bX0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi5tb2RlbCc7XG5pbXBvcnQge0lDb2x1bW5zTWFuYWdlSW50ZXJmYWNlfSBmcm9tICcuLi9tb2RlbHMvdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQge1RhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bSwgVGFibGVQYWdpbmF0aW9uTW9kZUVudW0sIFRhYmxlU2l6ZUVudW19IGZyb20gJy4uL21vZGVscy90YWJsZS5tb2RlbCc7XG5pbXBvcnQge0NvbHVtbkRlc2NyaXB0b3IsIENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yfSBmcm9tICcuL2NvbHVtbi5kZXNjcmlwdG9yJztcbmltcG9ydCB7U29ydERlc2NyaXB0b3J9IGZyb20gJy4vc29ydC5kZXNjcmlwdG9yJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlRGVzY3JpcHRvckluc3Q8VGFibGVNb2RlbCwgU29ydHMgPSBrZXlvZiBUYWJsZU1vZGVsLCBGaWx0ZXJzID0ga2V5b2YgVGFibGVNb2RlbD5cbiAgICBpbXBsZW1lbnRzIElUYWJsZURlc2NyaXB0b3I8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+LCBJQ29sdW1uc01hbmFnZUludGVyZmFjZTxUYWJsZU1vZGVsLCBTb3J0cywgRmlsdGVycz5cbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlbDogTW9kZWxEZXNjcmlwdG9yPFRhYmxlTW9kZWw+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfYXV0b0dlbmVyYXRlZDtcblxuICAgIHByaXZhdGUgX2lkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfdHJhY2tQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcml2YXRlIF9wYWdpbmF0aW9uTW9kZT86IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtO1xuICAgIHByaXZhdGUgX3Jvd3NQZXJQYWdlT3B0aW9ucz86IG51bWJlcltdO1xuICAgIHByaXZhdGUgX2RlZmF1bHROdW1Sb3dzPzogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfY29sdW1uczogQXJyYXk8Q29sdW1uRGVzY3JpcHRvcjxhbnksIFRhYmxlTW9kZWw+PiA9IFtdO1xuICAgIHByaXZhdGUgX3RpdGxlPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2hpZGVIZWFkZXIgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sb2FkaW5nVGV4dD86IHN0cmluZztcbiAgICBwcml2YXRlIF9sb2FkaW5nSWNvbjogc3RyaW5nIHwgbnVsbCA9ICdwaSBwaS1zcGlubmVyJztcblxuICAgIC8vIGV4dHJhXG4gICAgcHJpdmF0ZSBfaGFzSG92ZXIgPSB0cnVlO1xuICAgIHByaXZhdGUgX2hhc0dyaWRsaW5lcyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2hhc1Jlc2l6YWJsZUNvbHVtbnMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb2x1bW5SZXNpemVNb2RlPzogJ2ZpdCcgfCAnZXhwYW5kJztcblxuICAgIC8vIHNwZWNpYWwgY29sdW1uc1xuICAgIHByaXZhdGUgX3NlbGVjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfYWN0aW9uQ29sdW1uRnJvemVuPzogYm9vbGVhbjtcblxuICAgIC8vIHN0eWxpbmdcbiAgICBwcml2YXRlIF9zaXplOiBUYWJsZVNpemVFbnVtID0gVGFibGVTaXplRW51bS5MYXJnZTtcbiAgICBwcml2YXRlIF9jbGFzc05hbWUgPSAnJztcbiAgICBwcml2YXRlIF9oZWFkZXJDbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93Q2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3Jvd0NsYXNzTmFtZU1hcEZuPzogKGNsYXNzTmFtZT86IHN0cmluZywgaXRlbT86IFRhYmxlTW9kZWwpID0+IHN0cmluZztcbiAgICBwcml2YXRlIF90YWJsZUZ1bGxIZWlnaHRPZmZzZXQ/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfcm93SGVpZ2h0PzogbnVtYmVyO1xuXG4gICAgLy8gZmlsdGVycyZzb3J0c1xuICAgIHByaXZhdGUgX2ZpbHRlcnM6IEZpbHRlckRlc2NyaXB0b3I8YW55LCBUYWJsZU1vZGVsPltdID0gW107XG4gICAgcHJpdmF0ZSBfc29ydHM6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+W10gPSBbXTtcblxuICAgIC8vIGxvY2FsaXphdGlvblxuICAgIHByaXZhdGUgX2lzTG9jYWxpemVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHk/OiBzdHJpbmc7XG5cbiAgICAvLyByb3cgZXhwYW5kXG4gICAgcHJpdmF0ZSBfcm93RXhwYW5kYWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gMTAwO1xuICAgIHByaXZhdGUgX3Jvd0V4cGFuZGFibGVQcm9wZXJ0eT86IHN0cmluZztcblxuICAgIC8vIHJvdyByZW9yZGVyXG4gICAgcHJpdmF0ZSBfcm93UmVvcmRlcmFibGUgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFRhYmxlTW9kZWw+LCBhdXRvR2VuZXJhdGVkID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fdHJhY2tQcm9wZXJ0eSA9IHRoaXMuX21vZGVsLmlkUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2F1dG9HZW5lcmF0ZWQgPSBhdXRvR2VuZXJhdGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0cmFja1Byb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhY2tQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25Nb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgZ2V0IHJvd3NQZXJQYWdlT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdE51bVJvd3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0TnVtUm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZGVIZWFkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlSGVhZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9hZGluZ1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nVGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmdJY29uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ0ljb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZUZ1bGxIZWlnaHRPZmZzZXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dIZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNIb3ZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0hvdmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzR3JpZGxpbmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzR3JpZGxpbmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzUmVzaXphYmxlQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Jlc2l6YWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2x1bW5SZXNpemVNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUmVzaXplTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0NsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0NsYXNzTmFtZU1hcEZuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93Q2xhc3NOYW1lTWFwRm47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb25Db2x1bW5Gcm96ZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25Db2x1bW5Gcm96ZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0xvY2FsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTG9jYWxpemVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd1Jlb3JkZXJhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93UmVvcmRlcmFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dFeHBhbmRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RXhwYW5kYWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0V4cGFuZGFibGVDb2xTcGFuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RXhwYW5kYWJsZUNvbFNwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyB0YWJsZSBtb2RlbCBwcm9wZXJ0eSB0ZWxscyB1cyBpZiB0aGUgc3BlY2lmaWMgcm93IHNob3VsZCBiZSBleHBhbmRhYmxlIG9yIG5vdCBiYXNlZCBvbiByb3cgaXRlbSB2YWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RXhwYW5kYWJsZVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RXhwYW5kYWJsZVByb3BlcnR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrIHByb3BlcnR5IGlzIHVzZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbWJpbmVkIHNhdmluZyB1c2VyIHByZWZlcmVuY2VzIGluIGxvY2Fsc3RvcmFnZSBpZiAyIHRhYmxlcyBoYXZlIHRoZSBzYW1lIHRyYWNrIHByb3BlcnRpZXMgdGhleSB3aWxsIHNoYXJlIHRoZSBzYW1lIGxvY2Fsc3RvcmFnZSBlbnRyeS5cbiAgICAgKiBTaW1pbGFybHksIHRoaXMgcHJvcGVydHkgY2FuIGFsc28gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHR3byB0YWJsZXMgb2YgdGhlIHNhbWUgbW9kZWwgb24gdGhlIHNhbWUgdXJsIChzbyB0aGF0IHRoZXkgaGF2ZSBzZXBhcmF0ZSBlbnRyaWVzIGluIGxvY2Fsc3RvcmFnZSkuXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aElkZW50aWZpZXIoaWRlbnRpZmllcjogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRyYWNrUHJvcGVydHkocHJvcGVydHk/OiBrZXlvZiBUYWJsZU1vZGVsKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhUcmFja1Byb3BlcnR5VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhUcmFja1Byb3BlcnR5VW5zYWZlKHByb3BlcnR5Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RyYWNrUHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbihwcm9wZXJ0eToga2V5b2YgVGFibGVNb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5VbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29sdW1uVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQ29sdW1uKHByb3BlcnR5OiBrZXlvZiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ29sdW1uVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUNvbHVtblVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbHVtbklkeCA9IHRoaXMuX2NvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnNwbGljZShjb2x1bW5JZHgsIDEpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29sdW1uPENvbHVtbk1vZGVsLCBDb2x1bW5WYWx1ZSA9IENvbHVtbk1vZGVsPihjb2x1bW46IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWwsIENvbHVtblZhbHVlPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbjxQcm9wZXJ0eUtleSBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWw+KHByb3BlcnR5OiBQcm9wZXJ0eUtleSkge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxOb25OdWxsYWJsZTxUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT4sIFRhYmxlTW9kZWwsIFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29sdW1uRW51bTxQcm9wZXJ0eUtleSBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwsIEVudW0gZXh0ZW5kcyBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT4+KHByb3BlcnR5OiBQcm9wZXJ0eUtleSwgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yPEVudW0sIFRhYmxlTW9kZWwsIFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgICAgICBjb2x1bW4uYXNFbnVtVW5zYWZlKGVudW1EZXNjKTtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtblVuc2FmZTxDb2x1bW5Nb2RlbCA9IHVua25vd24+KHByb3BlcnR5OiBzdHJpbmcpOiBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29sdW1ucyguLi5wcm9wZXJ0aWVzOiAoa2V5b2YgVGFibGVNb2RlbClbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB0aGlzLmFkZENvbHVtbihwKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29sdW1uRGVzY3JpcHRvcnMoLi4uZGVzY3JpcHRvcnM6IENvbHVtbkRlc2NyaXB0b3I8YW55LCBUYWJsZU1vZGVsPltdKTogdGhpcyB7XG4gICAgICAgIGRlc2NyaXB0b3JzLmZvckVhY2goZCA9PiB0aGlzLndpdGhDb2x1bW4oZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBhZ2luYXRpb25Nb2RlKHBhZ2luYXRpb25Nb2RlOiBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uTW9kZSA9IHBhZ2luYXRpb25Nb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvd3NQZXJQYWdlKHJvd3M6IG51bWJlciwgb3B0aW9ucz86IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdE51bVJvd3MgPSByb3dzO1xuICAgICAgICB0aGlzLl9yb3dzUGVyUGFnZU9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEhpZGVIZWFkZXIoaGlkZUhlYWRlciA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5faGlkZUhlYWRlciA9IGhpZGVIZWFkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9hZGluZyh0ZXh0Pzogc3RyaW5nLCBpY29uPzogc3RyaW5nIHwgbnVsbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb2FkaW5nVGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdJY29uID0gaWNvbiA9PT0gdW5kZWZpbmVkID8gJ3BpIHBpLXNwaW5uZXInIDogaWNvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgcmVvcmRlcmFibGUgcHJvcGVydHkgb24gYWxsIGNvbHVtbnMgY3VycmVudGx5IGluIHRoZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBjb2x1bW5zUmVvcmRlcmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEN1cnJlbnRDb2x1bW5zUmVvcmRlcmFibGUoY29sdW1uc1Jlb3JkZXJhYmxlID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbC53aXRoUmVvcmRlcmFibGUoY29sdW1uc1Jlb3JkZXJhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgZW5hYmxlcy9kaXNhYmxlcyB0b2dnbGVhYmxlIHByb3BlcnR5IG9uIGFsbCBjb2x1bW5zIGN1cnJlbnRseSBpbiB0aGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gY29sdW1uc1RvZ2dsZWFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEN1cnJlbnRDb2x1bW5zVG9nZ2xlYWJsZShjb2x1bW5zVG9nZ2xlYWJsZSA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBjb2wud2l0aFRvZ2dsZWFibGUoY29sdW1uc1RvZ2dsZWFibGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTb3J0KHByb3BlcnR5OiBTb3J0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydHMuZmluZChzID0+IHMucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVTb3J0KHByb3BlcnR5OiBTb3J0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzb3J0SWR4ID0gdGhpcy5fc29ydHMuZmluZEluZGV4KGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9zb3J0cy5zcGxpY2Uoc29ydElkeCwgMSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFNvcnQocHJvcGVydHk6IFNvcnRzLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgaXNEZWZhdWx0LCBhc2NlbmRpbmcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHNvcnQgPSBuZXcgU29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4ocHJvcGVydHkpO1xuICAgICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0T3JkZXJNYXggPSB0aGlzLl9zb3J0c1xuICAgICAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmRlZmF1bHRJc0VuYWJsZWQpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBzKSA9PiAocy5kZWZhdWx0T3JkZXIgIT09IHVuZGVmaW5lZCAmJiBzLmRlZmF1bHRPcmRlciA+IGFjYyA/IHMuZGVmYXVsdE9yZGVyIDogYWNjKSwgLTEpO1xuICAgICAgICAgICAgc29ydC53aXRoRGVmYXVsdFNvcnQodHJ1ZSwgYXNjZW5kaW5nLCBkZWZhdWx0T3JkZXJNYXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3J0cy5wdXNoKHNvcnQpO1xuICAgICAgICByZXR1cm4gc29ydDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNvcnQocHJvcGVydHk6IFNvcnRzLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU29ydFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIGlzRGVmYXVsdCwgYXNjZW5kaW5nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRTb3J0VW5zYWZlKHByb3BlcnR5LCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFNvcnQocHJvcGVydHk6IFNvcnRzLCBhc2NlbmRpbmc/OiBib29sZWFuLCBvcmRlcj86IG51bWJlciwgZW5hYmxlZD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aERlZmF1bHRTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgYXNjZW5kaW5nLCBvcmRlciwgZW5hYmxlZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEZWZhdWx0U29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nLCBhc2NlbmRpbmc/OiBib29sZWFuLCBvcmRlcj86IG51bWJlciwgZW5hYmxlZD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgbGV0IHNvcnQgPSB0aGlzLl9zb3J0cy5maW5kKHMgPT4gcy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICBpZiAoIXNvcnQpIHtcbiAgICAgICAgICAgIHNvcnQgPSBuZXcgU29ydERlc2NyaXB0b3IocHJvcGVydHkpO1xuICAgICAgICAgICAgdGhpcy5fc29ydHMucHVzaChzb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0LndpdGhEZWZhdWx0U29ydChlbmFibGVkID8/IHRydWUsIGFzY2VuZGluZywgb3JkZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNvcnRzKC4uLnByb3BlcnRpZXM6IFNvcnRzW10pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNvcnRzVW5zYWZlKC4uLihwcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTb3J0c1Vuc2FmZSguLi5wcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0cy5wdXNoKG5ldyBTb3J0RGVzY3JpcHRvcihwKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsdGVyKHByb3BlcnR5OiBGaWx0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpbHRlclVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWx0ZXJVbnNhZmUocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycy5maW5kKHMgPT4gcy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUZpbHRlcihwcm9wZXJ0eTogRmlsdGVycykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVGaWx0ZXJVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRmlsdGVyVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmlsdGVySWR4ID0gdGhpcy5fZmlsdGVycy5maW5kSW5kZXgoYyA9PiBjLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuc3BsaWNlKGZpbHRlcklkeCwgMSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpbHRlcjxGaWx0ZXJNb2RlbCA9IEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsID8gVGFibGVNb2RlbFtGaWx0ZXJzXSA6IG5ldmVyPihwcm9wZXJ0eTogRmlsdGVycykge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4ocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXcgRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ocHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwPEZpbHRlck1vZGVsID0gRmlsdGVycyBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwgPyBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW0ZpbHRlcnNdPiA6IG5ldmVyLCBTZXJ2aWNlID0gdW5kZWZpbmVkPihcbiAgICAgICAgcHJvcGVydHk6IEZpbHRlcnMsXG4gICAgICAgIHByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxGaWx0ZXJNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIG9wdGlvbnNWYWx1ZVByb3BlcnR5Pzoga2V5b2YgRmlsdGVyTW9kZWxcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyTG9va3VwVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgcHJvdmlkZXIsIG9wdGlvbnNWYWx1ZVByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpbHRlckxvb2t1cFVuc2FmZTxGaWx0ZXJNb2RlbCwgU2VydmljZSA9IHVuZGVmaW5lZD4ocHJvcGVydHk6IHN0cmluZywgcHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPEZpbHRlck1vZGVsLCBTZXJ2aWNlPiwgb3B0aW9uc1ZhbHVlUHJvcGVydHk/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IEZpbHRlckxvb2t1cERlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWwsIFNlcnZpY2U+KHByb3BlcnR5LCB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXI6IHByb3ZpZGVyLFxuICAgICAgICAgICAgb3B0aW9uc1ZhbHVlUHJvcGVydHk6IG9wdGlvbnNWYWx1ZVByb3BlcnR5XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwRW51bTxFbnVtPihwcm9wZXJ0eTogRmlsdGVycywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyTG9va3VwRW51bVVuc2FmZTxFbnVtPihwcm9wZXJ0eSBhcyBzdHJpbmcsIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwRW51bVVuc2FmZTxFbnVtID0gRW51bUNvbnN0YW50VHlwZT4ocHJvcGVydHk6IHN0cmluZywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IEZpbHRlckxvb2t1cEVudW1EZXNjcmlwdG9yKHByb3BlcnR5LCBlbnVtRGVzYywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uKHByb3BlcnR5OiBFeHRyYWN0PEZpbHRlcnMsIGtleW9mIFRhYmxlTW9kZWw+LCBkaXNwbGF5VHlwZT86IEZpbHRlckRpc3BsYXlUeXBlRW51bSwgZm9yY2VTaW1wbGUgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJGcm9tQ29sdW1uVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgZGlzcGxheVR5cGUsIGZvcmNlU2ltcGxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpbHRlcnNGcm9tQ29sdW1ucyguLi5wcm9wZXJ0aWVzOiBFeHRyYWN0PEZpbHRlcnMsIGtleW9mIFRhYmxlTW9kZWw+W10pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aEZpbHRlcnNGcm9tQ29sdW1uc1Vuc2FmZSguLi4ocHJvcGVydGllcyBhcyBzdHJpbmdbXSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmlsdGVyc0Zyb21Db2x1bW5zVW5zYWZlKC4uLnByb3BlcnRpZXM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsdGVyRnJvbUNvbHVtblVuc2FmZShwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGRpc3BsYXlUeXBlPzogRmlsdGVyRGlzcGxheVR5cGVFbnVtLCBmb3JjZVNpbXBsZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uVW5zYWZlKHByb3BlcnR5KTtcbiAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgTm8gY29sdW1uIGZvdW5kIGZvciBmaWx0ZXIgcHJvcGVydHkgXCIke3Byb3BlcnR5fVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5hZGRGaWx0ZXJGcm9tQ29sdW1uRGVzY3JpcHRvclVuc2FmZShjb2x1bW4sIGZvcmNlU2ltcGxlKTtcbiAgICAgICAgaWYgKGRpc3BsYXlUeXBlICE9IG51bGwpIGZpbHRlci53aXRoRGlzcGxheVR5cGUoZGlzcGxheVR5cGUpO1xuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uRGVzY3JpcHRvclVuc2FmZTxDb2x1bW5Nb2RlbCwgQ29sdW1uVmFsdWU+KFxuICAgICAgICBjb2x1bW46IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWwsIENvbHVtblZhbHVlPixcbiAgICAgICAgZm9yY2VTaW1wbGUgPSBmYWxzZVxuICAgICk6IEZpbHRlckRlc2NyaXB0b3I8YW55LCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIGxldCBmaWx0ZXJEZXNjcmlwdG9yID0gbmV3IEZpbHRlckRlc2NyaXB0b3I8YW55LCBUYWJsZU1vZGVsPihjb2x1bW4ucHJvcGVydHkpO1xuICAgICAgICBsZXQgZmlsdGVyVHlwZTogRmlsdGVyVHlwZUVudW07XG5cbiAgICAgICAgc3dpdGNoIChjb2x1bW4uY29sdW1uVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLk51bWJlcjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uQm9vbGVhbjpcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uQm9vbGVhbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uRGF0ZTpcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uRGF0ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uRW51bTpcbiAgICAgICAgICAgICAgICBpZiAoIWZvcmNlU2ltcGxlICYmIGNvbHVtbi5lbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckRlc2NyaXB0b3IgPSBuZXcgRmlsdGVyTG9va3VwRW51bURlc2NyaXB0b3IoY29sdW1uLnByb3BlcnR5LCBjb2x1bW4uZW51bSk7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5TdHJpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5TdHJpbmc6XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLkN1c3RvbTpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLlN0cmluZztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbHRlckRlc2NyaXB0b3IuYXNGaWx0ZXJUeXBlKGZpbHRlclR5cGUpO1xuICAgICAgICBpZiAoKGZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLk51bWJlciB8fCBmaWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5EYXRlKSAmJiBjb2x1bW4uZGlzcGxheUZvcm1hdCkge1xuICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci53aXRoRGlzcGxheUZvcm1hdChjb2x1bW4uZGlzcGxheUZvcm1hdCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyRGVzY3JpcHRvcik7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlckRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGaWx0ZXI8RmlsdGVyTW9kZWw+KHByb3BlcnR5OiBGaWx0ZXJzLCBmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+KTogdGhpcyB7XG4gICAgICAgIGlmIChmaWx0ZXIucHJvcGVydHkgIT09IHByb3BlcnR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpbHRlciBwcm9wZXJ0eSBcIiR7cHJvcGVydHl9XCIgYW5kIEZpbHRlciBkZXNjcmlwdG9yIHByb3BlcnR5IFwiJHtmaWx0ZXIucHJvcGVydHl9XCIgZG8gbm90IG1hdGNoLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KGZpbHRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IFRhYmxlU2l6ZUVudW0gPSBUYWJsZVNpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhUYWJsZUZ1bGxIZWlnaHRPZmZzZXQodGFibGVGdWxsSGVpZ2h0T2Zmc2V0OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID0gdGFibGVGdWxsSGVpZ2h0T2Zmc2V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvd0hlaWdodChyb3dIZWlnaHQ6IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLl9yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSG92ZXIoaG92ZXI6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzSG92ZXIgPSBob3ZlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhHcmlkbGluZXMoZ3JpZGxpbmVzOiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc0dyaWRsaW5lcyA9IGdyaWRsaW5lcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIHRoYXQgZW5hYmxlcy9kaXNhYmxlZCBjb2x1bW4gcmVzaXplIGZlYXR1cmUgd2l0aCBjb2x1bW5SZXNpemVNb2RlIG9uIGFsbCBjb2x1bW5zLlxuICAgICAqIEBwYXJhbSByZXNpemFibGVDb2x1bW5zIFRydWUgaWYgZW5hYmxlZFxuICAgICAqIEBwYXJhbSBjb2x1bW5SZXNpemVNb2RlICdmaXQnIG9yICdleHBhbmQnIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbnNSZXNpemFibGUocmVzaXphYmxlQ29sdW1ucyA9IHRydWUsIGNvbHVtblJlc2l6ZU1vZGU6ICdmaXQnIHwgJ2V4cGFuZCcgPSAnZml0Jyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNSZXNpemFibGVDb2x1bW5zID0gcmVzaXphYmxlQ29sdW1ucztcbiAgICAgICAgdGhpcy5fY29sdW1uUmVzaXplTW9kZSA9IGNvbHVtblJlc2l6ZU1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgY29sdW1uIHRvICh1bilmcm96ZW4uXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbkNvbHVtbkZyb3plbiBUcnVlIHRvIGZyZWV6ZSBzZWxlY3Rpb24gY29sdW1uLCBmYWxzZSB0byB1bmZyZWV6ZSBpdC5cbiAgICAgKiBAcGFyYW0gYWN0aW9uQ29sdW1uRnJvemVuIFRydWUgdG8gZnJlZXplIGFjdGlvbiBjb2x1bW4sIGZhbHNlIHRvIHVuZnJlZXplIGl0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uRnJvemVuKHNlbGVjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW4sIGFjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ29sdW1uRnJvemVuID0gc2VsZWN0aW9uQ29sdW1uRnJvemVuO1xuICAgICAgICB0aGlzLl9hY3Rpb25Db2x1bW5Gcm96ZW4gPSBhY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUm93Q2xhc3NOYW1lKHJvd0NsYXNzTmFtZT86IHN0cmluZywgY2xhc3NOYW1lTWFwRm4/OiAoY2xhc3NOYW1lPzogc3RyaW5nLCBpdGVtPzogVGFibGVNb2RlbCkgPT4gc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Jvd0NsYXNzTmFtZSA9IHJvd0NsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fcm93Q2xhc3NOYW1lTWFwRm4gPSBjbGFzc05hbWVNYXBGbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIZWFkZXJDbGFzc05hbWUoaGVhZGVyQ2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGVhZGVyQ2xhc3NOYW1lID0gaGVhZGVyQ2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvY2FsaXplZCgpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNMb2NhbGl6ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KGxvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNMb2NhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IGxvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvd0V4cGFuZGFibGUocHJvcGVydHk/OiBrZXlvZiBUYWJsZU1vZGVsLCBjb2xTcGFuPzogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Jvd0V4cGFuZGFibGUgPSB0cnVlO1xuICAgICAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvd0V4cGFuZGFibGVQcm9wZXJ0eSA9IHByb3BlcnR5IGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sU3Bhbikge1xuICAgICAgICAgICAgdGhpcy5fcm93RXhwYW5kYWJsZUNvbFNwYW4gPSBjb2xTcGFuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSb3dSZW9yZGVyYWJsZShyZW9yZGFibGUgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3Jvd1Jlb3JkZXJhYmxlID0gcmVvcmRhYmxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29weUZpZWxkc1RvKG9iajogVGFibGVEZXNjcmlwdG9ySW5zdDxhbnksIGFueSwgYW55Pikge1xuICAgICAgICBvYmouX3RpdGxlID0gdGhpcy5fdGl0bGU7XG4gICAgICAgIG9iai5faGlkZUhlYWRlciA9IHRoaXMuX2hpZGVIZWFkZXI7XG4gICAgICAgIG9iai5fdHJhY2tQcm9wZXJ0eSA9IHRoaXMuX3RyYWNrUHJvcGVydHk7XG4gICAgICAgIG9iai5fZmlsdGVycyA9IHRoaXMuX2ZpbHRlcnMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICBvYmouX3NvcnRzID0gdGhpcy5fc29ydHMubWFwKHMgPT4gcy5jb3B5KCkpO1xuICAgICAgICBvYmouX2NsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcbiAgICAgICAgb2JqLl9zaXplID0gdGhpcy5fc2l6ZTtcbiAgICAgICAgb2JqLl90YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPSB0aGlzLl90YWJsZUZ1bGxIZWlnaHRPZmZzZXQ7XG4gICAgICAgIG9iai5fcm93SGVpZ2h0ID0gdGhpcy5fcm93SGVpZ2h0O1xuICAgICAgICBvYmouX2hhc0hvdmVyID0gdGhpcy5faGFzSG92ZXI7XG4gICAgICAgIG9iai5faGFzR3JpZGxpbmVzID0gdGhpcy5faGFzR3JpZGxpbmVzO1xuICAgICAgICBvYmouX2hhc1Jlc2l6YWJsZUNvbHVtbnMgPSB0aGlzLl9oYXNSZXNpemFibGVDb2x1bW5zO1xuICAgICAgICBvYmouX2NvbHVtblJlc2l6ZU1vZGUgPSB0aGlzLl9jb2x1bW5SZXNpemVNb2RlO1xuICAgICAgICBvYmouX2FjdGlvbkNvbHVtbkZyb3plbiA9IHRoaXMuX2FjdGlvbkNvbHVtbkZyb3plbjtcbiAgICAgICAgb2JqLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPSB0aGlzLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIG9iai5faXNMb2NhbGl6ZWQgPSB0aGlzLl9pc0xvY2FsaXplZDtcbiAgICAgICAgb2JqLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5O1xuICAgICAgICBvYmouX3BhZ2luYXRpb25Nb2RlID0gdGhpcy5fcGFnaW5hdGlvbk1vZGU7XG4gICAgICAgIG9iai5fcm93c1BlclBhZ2VPcHRpb25zID0gdGhpcy5fcm93c1BlclBhZ2VPcHRpb25zO1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGUgPSB0aGlzLl9yb3dFeHBhbmRhYmxlO1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gdGhpcy5fcm93RXhwYW5kYWJsZUNvbFNwYW47XG4gICAgICAgIG9iai5fcm93RXhwYW5kYWJsZVByb3BlcnR5ID0gdGhpcy5fcm93RXhwYW5kYWJsZVByb3BlcnR5O1xuICAgICAgICBvYmouX3Jvd1Jlb3JkZXJhYmxlID0gdGhpcy5fcm93UmVvcmRlcmFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxUYWJsZU1vZGVsLCBTb3J0cywgRmlsdGVycz4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbmV3IFRhYmxlRGVzY3JpcHRvckluc3Q8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+KHRoaXMubW9kZWwuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZGVzY3JpcHRvcik7XG4gICAgICAgIGRlc2NyaXB0b3IuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGMgPT4gYy5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCBleHRlbmRzIFRhYmxlRGVzY3JpcHRvckluc3Q8YW55PiB7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZWRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfZmlsdGVyQ29sdW1uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgX3NvcnRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfc29ydENvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERTtcbiAgICBwcml2YXRlIF9maWx0ZXJDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLkVYQ0xVREU7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2NvbHVtbnM6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yW10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPGFueT4pIHtcbiAgICAgICAgc3VwZXIobW9kZWwpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwudGl0bGVQcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMud2l0aFRpdGxlKG1vZGVsLnRpdGxlUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBjb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIGV4Y2x1ZGVkIGNvbHVtbnMgd2hlbiBnZW5lcmF0aW5nIGRlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0gZXhjbHVkZWRDb2x1bW4gbmFtZXMgb2YgZXhjbHVkZWQgY29sdW1uc1xuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0V4Y2x1ZGVkKGV4Y2x1ZGVkQ29sdW1uOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9leGNsdWRlZENvbHVtbnMgPSBleGNsdWRlZENvbHVtbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGVmaW5lcyBjb2x1bW4gcHJvcGVydGllcyBvbiB3aGljaCBzb3J0IGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBzb3J0Q29sdW1uTW9kZVxuICAgICAqIEBwYXJhbSBzb3J0T25Db2x1bW5zIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBzb3J0Q29sdW1uTW9kZSBJTkNMVURFX09OTFkgKGRlZmF1bHQpIG9ubHkgZ2l2ZW4gY29sdW1ucyB3aWxsIGhhdmUgc29ydCwgRVhDTFVERSBnaXZlbiBjb2x1bW5zIHdpbGwgTk9UIGhhdmUgc29ydFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc1NvcnQoc29ydE9uQ29sdW1uczogc3RyaW5nW10sIHNvcnRDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLklOQ0xVREVfT05MWSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1uTW9kZSA9IHNvcnRDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1ucyA9IHNvcnRPbkNvbHVtbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlZmluZXMgY29sdW1uIHByb3BlcnRpZXMgb24gd2hpY2ggZmlsdGVyIGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBmaWx0ZXJDb2x1bW5Nb2RlXG4gICAgICogQHBhcmFtIGZpbHRlck9uQ29sdW1uIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJDb2x1bW5Nb2RlIElOQ0xVREVfT05MWSAoZGVmYXVsdCkgb25seSBnaXZlbiBjb2x1bW5zIHdpbGwgaGF2ZSBmaWx0ZXIsIEVYQ0xVREUgZ2l2ZW4gY29sdW1ucyB3aWxsIE5PVCBoYXZlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0ZpbHRlcihmaWx0ZXJPbkNvbHVtbjogc3RyaW5nW10sIGZpbHRlckNvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPSBmaWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5zID0gZmlsdGVyT25Db2x1bW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgZ2l2ZW4gdHlwZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGUgY3VzdG9tIHR5cGUgZm9yIGNvbHVtblxuICAgICAqIEBwYXJhbSBkaXNwbGF5VHlwZSBjdXN0b20gY29sdW1uIHZhbHVlIGRpc3BsYXkgdHlwZVxuICAgICAqIEBwYXJhbSBhcmdzIGFkZGl0aW9uIGFyZ3VtZW50cyBmb3IgY29sdW1uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5QcmVzZXRUeXBlKHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENvbHVtblR5cGVFbnVtLCBkaXNwbGF5VHlwZT86IENvbHVtbkRpc3BsYXlUeXBlRW51bSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBwcm9wZXJ0eSA9PT0gY29sLnByb3BlcnR5KSA/PyB0aGlzLmFkZENvbHVtbihwcm9wZXJ0eSkud2l0aFRpdGxlKHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmFzVHlwZSh0eXBlLCBkaXNwbGF5VHlwZSwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0cyB0aXRsZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHRpdGxlIGNvbHVtbidzIHRpdGxlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5UaXRsZShwcm9wZXJ0eTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gcHJvcGVydHkgPT09IGNvbC5wcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFRpdGxlKHRpdGxlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVzIGNvbHVtbnMgZGVmaW5lZCBvbiB0YWJsZSBiYXNlZCBvbiBkYXRhIGZldGNoZWQgZnJvbSBhcGlcbiAgICAgKiBAcGFyYW0gZGF0YSBkYXRhIGZyb20gYXBpXG4gICAgICovXG4gICAgcHVibGljIHRvVGFibGVEZXNjcmlwdG9yRnJvbURhdGEoZGF0YTogRGF0YUxpc3RSZXN1bHQpOiBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4ge1xuICAgICAgICBjb25zdCB0YWJsZURlc2NyaXB0b3IgPSB0aGlzLnRvVGFibGVEZXNjcmlwdG9yKCk7XG5cbiAgICAgICAgaWYgKGRhdGEuZGF0YSA9PSBudWxsIHx8IGRhdGEuZGF0YS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdE1vZGVsID0gZGF0YS5kYXRhWzBdO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZmxhdHRlbk9iamVjdEtleXMob2JqZWN0TW9kZWwpXG4gICAgICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIXRoaXMuX2V4Y2x1ZGVkQ29sdW1ucy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpOyAvL2V4Y2x1ZGUgYXJyYXlzIGFuZCBzZXRzXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgbWV0YUNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBrZXkpO1xuICAgICAgICAgICAgbGV0IGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxhbnksIGFueT47XG4gICAgICAgICAgICBpZiAobWV0YUNvbHVtbikge1xuICAgICAgICAgICAgICAgIGlmICghbWV0YUNvbHVtbi52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBtZXRhQ29sdW1uLnRvQ29sdW1uRGVzY3JpcHRvcigpO1xuICAgICAgICAgICAgICAgIHRhYmxlRGVzY3JpcHRvci53aXRoQ29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IHRhYmxlRGVzY3JpcHRvci5hZGRDb2x1bW4oa2V5KS53aXRoVGl0bGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb2x1bW5Ub0RhdGVOdW1iZXJPckJvb2xlYW4oY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmkxOG5CYXNlS2V5ICYmICFjb2x1bW4ucHJvcGVydHkuaW5jbHVkZXMoJ3JldicpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLndpdGhUaXRsZShbdGhpcy5tb2RlbC5pMThuQmFzZUtleSwgJ3Byb3BlcnRpZXMnLCBjb2x1bW4ucHJvcGVydHldLmpvaW4oJy4nKS5yZXBsYWNlKCdzdGF0ZS4nLCAnJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZTb3J0Q29sdW1ucyA9IHRoaXMuX3NvcnRDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mU29ydENvbHVtbnMpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZICYmIGVsZW1lbnRPZlNvcnRDb2x1bW5zKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGFibGVEZXNjcmlwdG9yLndpdGhTb3J0VW5zYWZlKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRPZkZpbHRlckNvbHVtbnMgPSB0aGlzLl9maWx0ZXJDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mRmlsdGVyQ29sdW1ucykgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPT09IFRhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bS5JTkNMVURFX09OTFkgJiYgZWxlbWVudE9mRmlsdGVyQ29sdW1ucykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0YWJsZURlc2NyaXB0b3IuYWRkRmlsdGVyRnJvbUNvbHVtbkRlc2NyaXB0b3JVbnNhZmUoY29sdW1uLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGFkZHMgQ29sdW1uRHluYW1pY0Rlc2NyaXB0b3IgdG8gdGhpcyB0YWJsZVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBjb2x1bW4ncyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBhZGRDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGRlZXAgY29weSBvZiB0YWJsZSBkeW5hbWljIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QodGhpcy5tb2RlbC5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhkZXNjcmlwdG9yKTtcbiAgICAgICAgZGVzY3JpcHRvci5fY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoYyA9PiBjLmNvcHkoKSk7XG4gICAgICAgIGRlc2NyaXB0b3IuX2V4Y2x1ZGVkQ29sdW1ucyA9IFsuLi50aGlzLl9leGNsdWRlZENvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9maWx0ZXJDb2x1bW5zID0gWy4uLnRoaXMuX2ZpbHRlckNvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1ucyA9IFsuLi50aGlzLl9zb3J0Q29sdW1uc107XG4gICAgICAgIGRlc2NyaXB0b3IuX2ZpbHRlckNvbHVtbk1vZGUgPSB0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1uTW9kZSA9IHRoaXMuX3NvcnRDb2x1bW5Nb2RlO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9UYWJsZURlc2NyaXB0b3IoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxhbnk+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4odGhpcy5tb2RlbCk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGRlc2NyaXB0b3IpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG4iXX0=
|
|
1039
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RhYmxlL2FwaS9zcmMvZGVzY3JpcHRvcnMvdGFibGUuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsb0JBQW9CLEVBQTJFLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0osT0FBTyxFQUFDLGdCQUFnQixFQUF5QixzQkFBc0IsRUFBRSwwQkFBMEIsRUFBRSxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUcxSixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRixPQUFPLEVBQXdCLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRzdFLE9BQU8sRUFBQywyQkFBMkIsRUFBMkIsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDMUcsT0FBTyxFQUFDLGdCQUFnQixFQUFFLHVCQUF1QixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE1BQU0sT0FBTyxtQkFBbUI7SUFtRDVCLFlBQW1CLEtBQWtDLEVBQUUsYUFBYSxHQUFHLEtBQUs7UUF4Q2xFLGFBQVEsR0FBNkMsRUFBRSxDQUFDO1FBRTFELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXBCLGlCQUFZLEdBQWtCLGVBQWUsQ0FBQztRQUV0RCxRQUFRO1FBQ0EsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qix5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFPckMsVUFBVTtRQUNGLFVBQUssR0FBa0IsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUMzQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBS3hCLGdCQUFnQjtRQUNSLGFBQVEsR0FBd0MsRUFBRSxDQUFDO1FBQ25ELFdBQU0sR0FB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QUFpQixDQUFDO1FBQ3RELFVBQVUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNsRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRU0saUJBQWlCO1FBQ3BCLE1BQU0sVUFBVSxHQUFHLElBQUksbUJBQW1CLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUIsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtDb21tb25zSW50ZXJuYWxFcnJvciwgRGF0YUxpc3RSZXN1bHQsIEVudW1Db25zdGFudFR5cGUsIElMb29rdXBEYXRhUHJvdmlkZXIsIElUYWJsZURlc2NyaXB0b3IsIGZsYXR0ZW5PYmplY3RLZXlzfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJEZXNjcmlwdG9yLCBGaWx0ZXJEaXNwbGF5VHlwZUVudW0sIEZpbHRlckxvb2t1cERlc2NyaXB0b3IsIEZpbHRlckxvb2t1cEVudW1EZXNjcmlwdG9yLCBGaWx0ZXJUeXBlRW51bX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9maWx0ZXInO1xuaW1wb3J0IHtFbnVtRGVzY3JpcHRvciwgTW9kZWxEZXNjcmlwdG9yfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL21vZGVsJztcblxuaW1wb3J0IHtjb2x1bW5Ub0RhdGVOdW1iZXJPckJvb2xlYW59IGZyb20gJy4uL2hlbHBlcnMvY2xhc3MtYXR0cmlidXRlLWNvbnZlcnRlcic7XG5pbXBvcnQge0NvbHVtbkRpc3BsYXlUeXBlRW51bSwgQ29sdW1uVHlwZUVudW19IGZyb20gJy4uL21vZGVscy9jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHtJUm93RXhwYW5kYWJsZUNvbXBvbmVudH0gZnJvbSAnLi4vbW9kZWxzL3Jvdy1leHBhbmRhYmxlLWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQge0lDb2x1bW5zTWFuYWdlSW50ZXJmYWNlfSBmcm9tICcuLi9tb2RlbHMvdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQge1RhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bSwgVGFibGVQYWdpbmF0aW9uTW9kZUVudW0sIFRhYmxlU2l6ZUVudW19IGZyb20gJy4uL21vZGVscy90YWJsZS5tb2RlbCc7XG5pbXBvcnQge0NvbHVtbkRlc2NyaXB0b3IsIENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yfSBmcm9tICcuL2NvbHVtbi5kZXNjcmlwdG9yJztcbmltcG9ydCB7U29ydERlc2NyaXB0b3J9IGZyb20gJy4vc29ydC5kZXNjcmlwdG9yJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlRGVzY3JpcHRvckluc3Q8VGFibGVNb2RlbCwgU29ydHMgPSBrZXlvZiBUYWJsZU1vZGVsLCBGaWx0ZXJzID0ga2V5b2YgVGFibGVNb2RlbD5cbiAgICBpbXBsZW1lbnRzIElUYWJsZURlc2NyaXB0b3I8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+LCBJQ29sdW1uc01hbmFnZUludGVyZmFjZTxUYWJsZU1vZGVsLCBTb3J0cywgRmlsdGVycz5cbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlbDogTW9kZWxEZXNjcmlwdG9yPFRhYmxlTW9kZWw+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfYXV0b0dlbmVyYXRlZDtcblxuICAgIHByaXZhdGUgX2lkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfdHJhY2tQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcml2YXRlIF9wYWdpbmF0aW9uTW9kZT86IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtO1xuICAgIHByaXZhdGUgX3Jvd3NQZXJQYWdlT3B0aW9ucz86IG51bWJlcltdO1xuICAgIHByaXZhdGUgX2RlZmF1bHROdW1Sb3dzPzogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfY29sdW1uczogQXJyYXk8Q29sdW1uRGVzY3JpcHRvcjxhbnksIFRhYmxlTW9kZWw+PiA9IFtdO1xuICAgIHByaXZhdGUgX3RpdGxlPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2hpZGVIZWFkZXIgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sb2FkaW5nVGV4dD86IHN0cmluZztcbiAgICBwcml2YXRlIF9sb2FkaW5nSWNvbjogc3RyaW5nIHwgbnVsbCA9ICdwaSBwaS1zcGlubmVyJztcblxuICAgIC8vIGV4dHJhXG4gICAgcHJpdmF0ZSBfaGFzSG92ZXIgPSB0cnVlO1xuICAgIHByaXZhdGUgX2hhc0dyaWRsaW5lcyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2hhc1Jlc2l6YWJsZUNvbHVtbnMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb2x1bW5SZXNpemVNb2RlPzogJ2ZpdCcgfCAnZXhwYW5kJztcblxuICAgIC8vIHNwZWNpYWwgY29sdW1uc1xuICAgIHByaXZhdGUgX3NlbGVjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfYWN0aW9uQ29sdW1uRnJvemVuPzogYm9vbGVhbjtcblxuICAgIC8vIHN0eWxpbmdcbiAgICBwcml2YXRlIF9zaXplOiBUYWJsZVNpemVFbnVtID0gVGFibGVTaXplRW51bS5MYXJnZTtcbiAgICBwcml2YXRlIF9jbGFzc05hbWUgPSAnJztcbiAgICBwcml2YXRlIF9oZWFkZXJDbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93Q2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3Jvd0NsYXNzTmFtZU1hcEZuPzogKGNsYXNzTmFtZT86IHN0cmluZywgaXRlbT86IFRhYmxlTW9kZWwpID0+IHN0cmluZztcblxuICAgIC8vIGZpbHRlcnMmc29ydHNcbiAgICBwcml2YXRlIF9maWx0ZXJzOiBGaWx0ZXJEZXNjcmlwdG9yPGFueSwgVGFibGVNb2RlbD5bXSA9IFtdO1xuICAgIHByaXZhdGUgX3NvcnRzOiBTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPltdID0gW107XG5cbiAgICAvLyBsb2NhbGl6YXRpb25cbiAgICBwcml2YXRlIF9pc0xvY2FsaXplZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5Pzogc3RyaW5nO1xuXG4gICAgLy8gcm93IGV4cGFuZFxuICAgIHByaXZhdGUgX3Jvd0V4cGFuZGFibGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yb3dFeHBhbmRhYmxlQ29sU3BhbiA9IDEwMDtcbiAgICBwcml2YXRlIF9yb3dFeHBhbmRhYmxlUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGU/OiBUeXBlPElSb3dFeHBhbmRhYmxlQ29tcG9uZW50PFRhYmxlTW9kZWw+PjtcblxuICAgIC8vIHJvdyByZW9yZGVyXG4gICAgcHJpdmF0ZSBfcm93UmVvcmRlcmFibGUgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFRhYmxlTW9kZWw+LCBhdXRvR2VuZXJhdGVkID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fdHJhY2tQcm9wZXJ0eSA9IHRoaXMuX21vZGVsLmlkUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2F1dG9HZW5lcmF0ZWQgPSBhdXRvR2VuZXJhdGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0cmFja1Byb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhY2tQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25Nb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgZ2V0IHJvd3NQZXJQYWdlT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdE51bVJvd3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0TnVtUm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZGVIZWFkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlSGVhZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9hZGluZ1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nVGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmdJY29uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ0ljb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNIb3ZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0hvdmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzR3JpZGxpbmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzR3JpZGxpbmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzUmVzaXphYmxlQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Jlc2l6YWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2x1bW5SZXNpemVNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUmVzaXplTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0NsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0NsYXNzTmFtZU1hcEZuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93Q2xhc3NOYW1lTWFwRm47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb25Db2x1bW5Gcm96ZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25Db2x1bW5Gcm96ZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0xvY2FsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTG9jYWxpemVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd1Jlb3JkZXJhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93UmVvcmRlcmFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dFeHBhbmRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RXhwYW5kYWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0V4cGFuZGFibGVDb2xTcGFuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RXhwYW5kYWJsZUNvbFNwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyB0YWJsZSBtb2RlbCBwcm9wZXJ0eSB0ZWxscyB1cyBpZiB0aGUgc3BlY2lmaWMgcm93IHNob3VsZCBiZSBleHBhbmRhYmxlIG9yIG5vdCBiYXNlZCBvbiByb3cgaXRlbSB2YWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RXhwYW5kYWJsZVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RXhwYW5kYWJsZVByb3BlcnR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBkZWZpbmUgdGhlIHR5cGUgb2YgdGhlIGN1c3RvbSBjb21wb25lbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBleHBhbmRlZCByb3cuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFeHBhbmRhYmxlQ29tcG9uZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0V4cGFuZGFibGVDb21wb25lbnRUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgaXMgdXNlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgY29tYmluZWQgc2F2aW5nIHVzZXIgcHJlZmVyZW5jZXMgaW4gbG9jYWxzdG9yYWdlIGlmIDIgdGFibGVzIGhhdmUgdGhlIHNhbWUgdHJhY2sgcHJvcGVydGllcyB0aGV5IHdpbGwgc2hhcmUgdGhlIHNhbWUgbG9jYWxzdG9yYWdlIGVudHJ5LlxuICAgICAqIFNpbWlsYXJseSwgdGhpcyBwcm9wZXJ0eSBjYW4gYWxzbyBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdHdvIHRhYmxlcyBvZiB0aGUgc2FtZSBtb2RlbCBvbiB0aGUgc2FtZSB1cmwgKHNvIHRoYXQgdGhleSBoYXZlIHNlcGFyYXRlIGVudHJpZXMgaW4gbG9jYWxzdG9yYWdlKS5cbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRyYWNrIHByb3BlcnR5IChpZGVudGlmaWVyIG9mIHRhYmxlIHJvdykgZm9yIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7a2V5b2YgVGFibGVNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gdHJhY2sgdGhlIHJvdyBpdGVtcyBieS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFRyYWNrUHJvcGVydHkocHJvcGVydHk/OiBrZXlvZiBUYWJsZU1vZGVsKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhUcmFja1Byb3BlcnR5VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdHJhY2sgcHJvcGVydHkgKGlkZW50aWZpZXIgb2YgdGFibGUgcm93KSBmb3IgdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gc2V0ICdfdHJhY2tQcm9wZXJ0eScgdG8uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhUcmFja1Byb3BlcnR5VW5zYWZlKHByb3BlcnR5Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RyYWNrUHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjb2x1bW4gZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtrZXlvZiBUYWJsZU1vZGVsfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBmb3IgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sdW1uPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbCwgQ29sdW1uTW9kZWwgPSBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW1Byb3BlcnR5XT4sIENvbHVtblZhbHVlID0gVGFibGVNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHlcbiAgICApOiBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsLCBDb2x1bW5WYWx1ZT4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29sdW1uVW5zYWZlPENvbHVtbk1vZGVsLCBDb2x1bW5WYWx1ZT4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbHVtbiBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7a2V5b2YgVGFibGVNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgZm9yIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGdldENvbHVtblVuc2FmZTxDb2x1bW5Nb2RlbCA9IGFueSwgQ29sdW1uVmFsdWUgPSBDb2x1bW5Nb2RlbD4ocHJvcGVydHk6IHN0cmluZyk6IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWwsIENvbHVtblZhbHVlPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBjb2wucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNvbHVtbiBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2tleW9mIFRhYmxlTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGZvciBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlQ29sdW1uKHByb3BlcnR5OiBrZXlvZiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ29sdW1uVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY29sdW1uIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtrZXlvZiBUYWJsZU1vZGVsfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBmb3IgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUNvbHVtblVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbHVtbklkeCA9IHRoaXMuX2NvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnNwbGljZShjb2x1bW5JZHgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgY29sdW1uIGRlc2NyaXB0b3IgdG8gdGFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbCwgQ29sdW1uVmFsdWU+fSBjb2x1bW4gLSBUaGUgcHJvcGVydHkgZm9yIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uPENvbHVtbk1vZGVsLCBDb2x1bW5WYWx1ZSA9IENvbHVtbk1vZGVsPihjb2x1bW46IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWwsIENvbHVtblZhbHVlPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGNvbHVtbiBpbiB0aGUgdGFibGUgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgYWRkZWQgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZENvbHVtbjxQcm9wZXJ0eUtleSBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWw+KHByb3BlcnR5OiBQcm9wZXJ0eUtleSkge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxOb25OdWxsYWJsZTxUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT4sIFRhYmxlTW9kZWwsIFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sdW1uIHdpdGggZW51bSBkaXNwbGF5IHRvIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgdGFibGUgbW9kZWwuXG4gICAgICogQHBhcmFtIHtFbnVtRGVzY3JpcHRvcjxFbnVtPn0gZW51bURlc2MgLSBUaGUgZW51bSBkZXNjcmlwdG9yIGZvciBjb2x1bW4gZGlzcGxheS5cbiAgICAgKiBAcmV0dXJuIHtDb2x1bW5EZXNjcmlwdG9yPEVudW0sIFRhYmxlTW9kZWwsIFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPn0gLSBUaGUgYWRkZWQgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZENvbHVtbkVudW08UHJvcGVydHlLZXkgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsLCBFbnVtIGV4dGVuZHMgTm9uTnVsbGFibGU8VGFibGVNb2RlbFtQcm9wZXJ0eUtleV0+Pihwcm9wZXJ0eTogUHJvcGVydHlLZXksIGVudW1EZXNjOiBFbnVtRGVzY3JpcHRvcjxFbnVtPikge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxFbnVtLCBUYWJsZU1vZGVsLCBUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICAgICAgY29sdW1uLmFzRW51bVVuc2FmZShlbnVtRGVzYyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gdG8gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBjb2x1bW4gaW4gdGhlIHRhYmxlIG1vZGVsLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5ld2x5IGFkZGVkIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRDb2x1bW5VbnNhZmU8Q29sdW1uTW9kZWwgPSB1bmtub3duPihwcm9wZXJ0eTogc3RyaW5nKTogQ29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbD4ocHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG9uZSBvciBtb3JlIGNvbHVtbnMgdG8gdGhlIHRhYmxlIG1vZGVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgLSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0byBhZGQgYXMgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbnMoLi4ucHJvcGVydGllczogKGtleW9mIFRhYmxlTW9kZWwpW10pOiB0aGlzIHtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHAgPT4gdGhpcy5hZGRDb2x1bW4ocCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBhZ2luYXRpb24gbW9kZSBmb3IgdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUYWJsZVBhZ2luYXRpb25Nb2RlRW51bX0gcGFnaW5hdGlvbk1vZGUgLSBUaGUgcGFnaW5hdGlvbiBtb2RlIHRvIHNldC4gTXVzdCBiZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIHRoZSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFBhZ2luYXRpb25Nb2RlKHBhZ2luYXRpb25Nb2RlOiBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uTW9kZSA9IHBhZ2luYXRpb25Nb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZSBmb3IgYSBwYWdpbmF0ZWQgZGlzcGxheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dzIC0gVGhlIGRlZmF1bHQgbnVtYmVyIG9mIHJvd3MgdG8gZGlzcGxheSBwZXIgcGFnZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zXSAtIFJvd3MgcGVyIHBhZ2Ugb3B0aW9ucyB0byBiZSBhdmFpbGFibGUgaW4gdGFibGUgcGFnaW5hdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUm93c1BlclBhZ2Uocm93czogbnVtYmVyLCBvcHRpb25zPzogQXJyYXk8bnVtYmVyPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kZWZhdWx0TnVtUm93cyA9IHJvd3M7XG4gICAgICAgIHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRpdGxlIGZvciBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RpdGxlXSAtIFRoZSB0aXRsZSB2YWx1ZSB0byBiZSBzZXQuIEl0IHVuZGVmaWVuZCwgbm8gdGl0bGUgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhUaXRsZSh0aXRsZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzL2hpZGVzIHRoZSBoZWFkZXIgcm93IHdpdGggY29sdW1uIHRpdGxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZUhlYWRlciAtIEEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gaGlkZSB0aGUgaGVhZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoSGlkZUhlYWRlcihoaWRlSGVhZGVyID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9oaWRlSGVhZGVyID0gaGlkZUhlYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRqdXN0cyBsb2FkaW5nIGRpc3BsYXkgd2l0aCBjdXN0b20gdGV4dCBhbmQvb3IgaWNvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGV4dF0gLSBUZXh0IHRvIGJlIGRpc3BsYXllZCB3aGVuIGxvYWRpbmcgaW5kaWNhdG9yIGlzIHNob3duLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gW2ljb25dIC0gSWNvbiB0byBiZSB1c2VkIHdoZW4gbG9hZGluZyBpbmRpY2F0b3IgaXMgc2hvd24uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhMb2FkaW5nKHRleHQ/OiBzdHJpbmcsIGljb24/OiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdUZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0ljb24gPSBpY29uID09PSB1bmRlZmluZWQgPyAncGkgcGktc3Bpbm5lcicgOiBpY29uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHNvcnQgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U29ydHN9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHJldHJpZXZlIHRoZSBzb3J0IGZvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHwgbnVsbH0gVGhlIHNvcnQgZGVzY3JpcHRvciBvciBudWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTb3J0KHByb3BlcnR5OiBTb3J0cyk6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNvcnRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHNvcnQgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTb3J0c30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gcmV0cmlldmUgdGhlIHNvcnQgZm9yLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4gfCBudWxsfSBUaGUgc29ydCBkZXNjcmlwdG9yIG9yIG51bGwuXG4gICAgICovXG4gICAgcHVibGljIGdldFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZyk6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0cy5maW5kKHMgPT4gcy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc29ydCBmb3IgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U29ydHN9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHJlbW92ZSB0aGUgc29ydCBmb3IuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVNvcnQocHJvcGVydHk6IFNvcnRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVNvcnRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzb3J0IGZvciBhIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NvcnRzfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byByZW1vdmUgdGhlIHNvcnQgZm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc29ydElkeCA9IHRoaXMuX3NvcnRzLmZpbmRJbmRleChjID0+IGMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fc29ydHMuc3BsaWNlKHNvcnRJZHgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgc29ydCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IHRvIGFkZCB0aGUgc29ydCBmb3IuXG4gICAgICogQHBhcmFtIGlzRGVmYXVsdCBJZiBkZWZhdWx0IHNvcnRpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIElmIGRlZmF1bHQgc29ydCBzaG91bGQgYmUgYXNjZW5kaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIHNvcnQgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkU29ydChwcm9wZXJ0eTogU29ydHMsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKTogU29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgaXNEZWZhdWx0LCBhc2NlbmRpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgc29ydCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gYWRkIHRoZSBzb3J0IGZvci5cbiAgICAgKiBAcGFyYW0gaXNEZWZhdWx0IElmIGRlZmF1bHQgc29ydGluZyBpcyBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgSWYgZGVmYXVsdCBzb3J0IHNob3VsZCBiZSBhc2NlbmRpbmcuXG5cbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgc29ydCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKTogU29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4ge1xuICAgICAgICBjb25zdCBzb3J0ID0gbmV3IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+KHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGlzRGVmYXVsdCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdE9yZGVyTWF4ID0gdGhpcy5fc29ydHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHMgPT4gcy5kZWZhdWx0SXNFbmFibGVkKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgcykgPT4gKHMuZGVmYXVsdE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcy5kZWZhdWx0T3JkZXIgPiBhY2MgPyBzLmRlZmF1bHRPcmRlciA6IGFjYyksIC0xKTtcbiAgICAgICAgICAgIHNvcnQud2l0aERlZmF1bHRTb3J0KHRydWUsIGFzY2VuZGluZywgZGVmYXVsdE9yZGVyTWF4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc29ydHMucHVzaChzb3J0KTtcbiAgICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBzb3J0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gYWRkIHRoZSBzb3J0IGZvci5cbiAgICAgKiBAcGFyYW0gaXNEZWZhdWx0IElmIGRlZmF1bHQgc29ydGluZyBpcyBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgSWYgZGVmYXVsdCBzb3J0IHNob3VsZCBiZSBhc2NlbmRpbmcuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTb3J0KHByb3BlcnR5OiBTb3J0cywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNvcnRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nLCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBzb3J0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBhZGQgdGhlIHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBpc0RlZmF1bHQgSWYgZGVmYXVsdCBzb3J0aW5nIGlzIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIGFzY2VuZGluZyBJZiBkZWZhdWx0IHNvcnQgc2hvdWxkIGJlIGFzY2VuZGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRTb3J0VW5zYWZlKHByb3BlcnR5LCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRlZmF1bHQgc29ydGluZyBmb3IgdGhlIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHNldCBkZWZhdWx0IHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgLSBJZiB0aGUgc29ydGluZyBzaG91bGQgYmUgYXNjZW5kaW5nIChkZWZhdWx0OiB0cnVlKS5cbiAgICAgKiBAcGFyYW0gb3JkZXIgLSBUaGUgb3JkZXIgZm9yIHRoaXMgZGVmYXVsdCBzb3J0IChkZWZhdWx0OiAwKS5cbiAgICAgKiBAcGFyYW0gZW5hYmxlZCAtIEVuYWJsZXMvZGlzYWJsZWQgdGhlIGRlZmF1bHQgc29ydC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERlZmF1bHRTb3J0KHByb3BlcnR5OiBTb3J0cywgYXNjZW5kaW5nPzogYm9vbGVhbiwgb3JkZXI/OiBudW1iZXIsIGVuYWJsZWQ/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhEZWZhdWx0U29ydFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIGFzY2VuZGluZywgb3JkZXIsIGVuYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRlZmF1bHQgc29ydGluZyBmb3IgdGhlIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gc2V0IGRlZmF1bHQgc29ydCBmb3IuXG4gICAgICogQHBhcmFtIGFzY2VuZGluZyAtIElmIHRoZSBzb3J0aW5nIHNob3VsZCBiZSBhc2NlbmRpbmcgKGRlZmF1bHQ6IHRydWUpLlxuICAgICAqIEBwYXJhbSBvcmRlciAtIFRoZSBvcmRlciBmb3IgdGhpcyBkZWZhdWx0IHNvcnQgKGRlZmF1bHQ6IDApLlxuICAgICAqIEBwYXJhbSBlbmFibGVkIC0gRW5hYmxlcy9kaXNhYmxlZCB0aGUgZGVmYXVsdCBzb3J0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZywgYXNjZW5kaW5nPzogYm9vbGVhbiwgb3JkZXI/OiBudW1iZXIsIGVuYWJsZWQ/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIGxldCBzb3J0ID0gdGhpcy5fc29ydHMuZmluZChzID0+IHMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgaWYgKCFzb3J0KSB7XG4gICAgICAgICAgICBzb3J0ID0gbmV3IFNvcnREZXNjcmlwdG9yKHByb3BlcnR5KTtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRzLnB1c2goc29ydCk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydC53aXRoRGVmYXVsdFNvcnQoZW5hYmxlZCA/PyB0cnVlLCBhc2NlbmRpbmcsIG9yZGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHNvcnRzIGZvciBtb3JlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIHRvIGFkZCB0aGUgc29ydHMgZm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoU29ydHMoLi4ucHJvcGVydGllczogU29ydHNbXSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU29ydHNVbnNhZmUoLi4uKHByb3BlcnRpZXMgYXMgc3RyaW5nW10pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgc29ydHMgZm9yIG1vcmUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgUHJvcGVydGllcyB0byBhZGQgdGhlIHNvcnRzIGZvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNvcnRzVW5zYWZlKC4uLnByb3BlcnRpZXM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRzLnB1c2gobmV3IFNvcnREZXNjcmlwdG9yKHApKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHJldHVybiBGaWx0ZXIgZGVzY3JpcHRvciBmb3IgcHJvcGVydHkgb3IgbnVsbCBpZiBub3QgZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXI8RmlsdGVyTW9kZWwgPSBGaWx0ZXJzIGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbCA/IE5vbk51bGxhYmxlPFRhYmxlTW9kZWxbRmlsdGVyc10+IDogYW55Pihwcm9wZXJ0eTogRmlsdGVycyk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGZpbHRlciBkZXNjcmlwdG9yIGZvciBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHJldHVybiBGaWx0ZXIgZGVzY3JpcHRvciBmb3IgcHJvcGVydHkgb3IgbnVsbCBpZiBub3QgZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWwgPSBhbnk+KHByb3BlcnR5OiBzdHJpbmcpOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycy5maW5kKHMgPT4gcy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5XG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUZpbHRlcihwcm9wZXJ0eTogRmlsdGVycykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVGaWx0ZXJVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGZpbHRlciBkZXNjcmlwdG9yIGZvciBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVGaWx0ZXJVbnNhZmUocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaWx0ZXJJZHggPSB0aGlzLl9maWx0ZXJzLmZpbmRJbmRleChjID0+IGMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fZmlsdGVycy5zcGxpY2UoZmlsdGVySWR4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXI8RmlsdGVyTW9kZWwgPSBGaWx0ZXJzIGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbCA/IFRhYmxlTW9kZWxbRmlsdGVyc10gOiBuZXZlcj4ocHJvcGVydHk6IEZpbHRlcnMpOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4ocHJvcGVydHk6IHN0cmluZyk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+KHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgbG9va3VwIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIExvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1ZhbHVlUHJvcGVydHkgUHJvcGVydHkgb24gbG9va3VwIHByb3ZpZGVyJ3MgaXRlbSAoRmlsdGVyTW9kZWwpIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckxvb2t1cDxGaWx0ZXJNb2RlbCA9IEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsID8gTm9uTnVsbGFibGU8VGFibGVNb2RlbFtGaWx0ZXJzXT4gOiBuZXZlciwgU2VydmljZSA9IHVuZGVmaW5lZD4oXG4gICAgICAgIHByb3BlcnR5OiBGaWx0ZXJzLFxuICAgICAgICBwcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8RmlsdGVyTW9kZWwsIFNlcnZpY2U+LFxuICAgICAgICBvcHRpb25zVmFsdWVQcm9wZXJ0eT86IGtleW9mIEZpbHRlck1vZGVsXG4gICAgKTogRmlsdGVyTG9va3VwRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbCwgU2VydmljZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJMb29rdXBVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nLCBwcm92aWRlciwgb3B0aW9uc1ZhbHVlUHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBsb29rdXAgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBMb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnNWYWx1ZVByb3BlcnR5IFByb3BlcnR5IG9uIGxvb2t1cCBwcm92aWRlcidzIGl0ZW0gKEZpbHRlck1vZGVsKSB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXBVbnNhZmU8RmlsdGVyTW9kZWwsIFNlcnZpY2UgPSB1bmRlZmluZWQ+KFxuICAgICAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBwcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8RmlsdGVyTW9kZWwsIFNlcnZpY2U+LFxuICAgICAgICBvcHRpb25zVmFsdWVQcm9wZXJ0eT86IHN0cmluZ1xuICAgICk6IEZpbHRlckxvb2t1cERlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWwsIFNlcnZpY2U+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IEZpbHRlckxvb2t1cERlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWwsIFNlcnZpY2U+KHByb3BlcnR5LCB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXI6IHByb3ZpZGVyLFxuICAgICAgICAgICAgb3B0aW9uc1ZhbHVlUHJvcGVydHk6IG9wdGlvbnNWYWx1ZVByb3BlcnR5XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBsb29rdXAgZW51bSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBlbnVtRGVzYyBEZXNjcmlwdG9yIGZvciBlbnVtLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIG9wdGlvbnMgb2YgZW51bSB2YWx1ZXMgdG8gYmUgYXZhaWxhYmxlIHRvIGZpbHRlciBieS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgbG9va3VwIGVudW0gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwRW51bTxFbnVtPihwcm9wZXJ0eTogRmlsdGVycywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyTG9va3VwRW51bVVuc2FmZTxFbnVtPihwcm9wZXJ0eSBhcyBzdHJpbmcsIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBsb29rdXAgZW51bSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGVudW1EZXNjIERlc2NyaXB0b3IgZm9yIGVudW0uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgb3B0aW9ucyBvZiBlbnVtIHZhbHVlcyB0byBiZSBhdmFpbGFibGUgdG8gZmlsdGVyIGJ5LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBsb29rdXAgZW51bSBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXBFbnVtVW5zYWZlPEVudW0gPSBFbnVtQ29uc3RhbnRUeXBlPihwcm9wZXJ0eTogc3RyaW5nLCBlbnVtRGVzYzogRW51bURlc2NyaXB0b3I8RW51bT4sIG9wdGlvbnM/OiBBcnJheTxFbnVtPikge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXcgRmlsdGVyTG9va3VwRW51bURlc2NyaXB0b3IocHJvcGVydHksIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmcm9tIGNvbHVtbi4gVGhlIGNvbHVtbiBtdXN0IGV4aXN0IG9uIHRhYmxlIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgQ29sdW1uIHByb3BlcnR5IHRvIGFkZCBmaWx0ZXIgZm9yLlxuICAgICAqIEBwYXJhbSBkaXNwbGF5VHlwZSBPcHRpb25hbCBkaXNwbGF5IHR5cGUgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gZm9yY2VTaW1wbGUgRm9yY2VzIHNpbXBsZSBjcmVhdGlvbiBvZiBmaWx0ZXIgKG5vIGxvb2t1cCBvciBsb29rdXAgZW51bSBmaWx0ZXJzKS5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBjb2x1bW4gZm9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyRnJvbUNvbHVtbjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwsIEZpbHRlck1vZGVsID0gTm9uTnVsbGFibGU8VGFibGVNb2RlbFtQcm9wZXJ0eV0+PihcbiAgICAgICAgcHJvcGVydHk6IEV4dHJhY3Q8RmlsdGVycywgUHJvcGVydHk+LFxuICAgICAgICBkaXNwbGF5VHlwZT86IEZpbHRlckRpc3BsYXlUeXBlRW51bSxcbiAgICAgICAgZm9yY2VTaW1wbGUgPSBmYWxzZVxuICAgICk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyRnJvbUNvbHVtblVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIGRpc3BsYXlUeXBlLCBmb3JjZVNpbXBsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvcnMgZnJvbSBjb2x1bW5zLiBUaGUgY29sdW1ucyBtdXN0IGV4aXN0IG9uIHRhYmxlIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBDb2x1bW4gcHJvcGVydGllcyB0byBhZGQgZmlsdGVycyBmb3IuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gSWYgY29sdW1uIGZvciBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmlsdGVyc0Zyb21Db2x1bW5zKC4uLnByb3BlcnRpZXM6IEV4dHJhY3Q8RmlsdGVycywga2V5b2YgVGFibGVNb2RlbD5bXSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoRmlsdGVyc0Zyb21Db2x1bW5zVW5zYWZlKC4uLihwcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvcnMgZnJvbSBjb2x1bW5zLiBUaGUgY29sdW1ucyBtdXN0IGV4aXN0IG9uIHRhYmxlIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIENvbHVtbiBwcm9wZXJ0aWVzIHRvIGFkZCBmaWx0ZXJzIGZvci5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBjb2x1bW4gZm9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhGaWx0ZXJzRnJvbUNvbHVtbnNVbnNhZmUoLi4ucHJvcGVydGllczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRGaWx0ZXJGcm9tQ29sdW1uVW5zYWZlKHApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmcm9tIGNvbHVtbi4gVGhlIGNvbHVtbiBtdXN0IGV4aXN0IG9uIHRhYmxlIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBDb2x1bW4gcHJvcGVydHkgdG8gYWRkIGZpbHRlciBmb3IuXG4gICAgICogQHBhcmFtIGRpc3BsYXlUeXBlIE9wdGlvbmFsIGRpc3BsYXkgdHlwZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBmb3JjZVNpbXBsZSBGb3JjZXMgc2ltcGxlIGNyZWF0aW9uIG9mIGZpbHRlciAobm8gbG9va3VwIG9yIGxvb2t1cCBlbnVtIGZpbHRlcnMpLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIGNvbHVtbiBmb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgZGVzY3JpcHRvclxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uVW5zYWZlPEZpbHRlck1vZGVsID0gYW55Pihwcm9wZXJ0eTogc3RyaW5nLCBkaXNwbGF5VHlwZT86IEZpbHRlckRpc3BsYXlUeXBlRW51bSwgZm9yY2VTaW1wbGUgPSBmYWxzZSk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5VbnNhZmU8RmlsdGVyTW9kZWwsIGFueT4ocHJvcGVydHkpO1xuICAgICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBObyBjb2x1bW4gZm91bmQgZm9yIGZpbHRlciBwcm9wZXJ0eSBcIiR7cHJvcGVydHl9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmFkZEZpbHRlckZyb21Db2x1bW5EZXNjcmlwdG9yVW5zYWZlPEZpbHRlck1vZGVsPihjb2x1bW4sIGZvcmNlU2ltcGxlKTtcbiAgICAgICAgaWYgKGRpc3BsYXlUeXBlICE9IG51bGwpIGZpbHRlci53aXRoRGlzcGxheVR5cGUoZGlzcGxheVR5cGUpO1xuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGRlc2NyaXB0b3IgZnJvbSBwcm92aWRlZCBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbHVtbiBDb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gZm9yY2VTaW1wbGUgRm9yY2VzIHNpbXBsZSBjcmVhdGlvbiBvZiBmaWx0ZXIgKG5vIGxvb2t1cCBvciBsb29rdXAgZW51bSBmaWx0ZXJzKS5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBjb2x1bW4gZm9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyRnJvbUNvbHVtbkRlc2NyaXB0b3JVbnNhZmU8RmlsdGVyTW9kZWw+KFxuICAgICAgICBjb2x1bW46IENvbHVtbkRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWwsIGFueT4sXG4gICAgICAgIGZvcmNlU2ltcGxlID0gZmFsc2VcbiAgICApOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIGxldCBmaWx0ZXJEZXNjcmlwdG9yID0gbmV3IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+KGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgIGxldCBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlRW51bTtcblxuICAgICAgICBzd2l0Y2ggKGNvbHVtbi5jb2x1bW5UeXBlKSB7XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLk51bWJlcjpcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uTnVtYmVyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5Cb29sZWFuO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5EYXRlOlxuICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5EYXRlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5FbnVtOlxuICAgICAgICAgICAgICAgIGlmICghZm9yY2VTaW1wbGUgJiYgY29sdW1uLmVudW0pIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvciA9IG5ldyBGaWx0ZXJMb29rdXBFbnVtRGVzY3JpcHRvcihjb2x1bW4ucHJvcGVydHksIGNvbHVtbi5lbnVtKSBhcyBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPjtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLlN0cmluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLlN0cmluZzpcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uQ3VzdG9tOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uU3RyaW5nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZmlsdGVyRGVzY3JpcHRvci5hc0ZpbHRlclR5cGUoZmlsdGVyVHlwZSk7XG4gICAgICAgIGlmICgoZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uTnVtYmVyIHx8IGZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkRhdGUpICYmIGNvbHVtbi5kaXNwbGF5Rm9ybWF0KSB7XG4gICAgICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yLndpdGhEaXNwbGF5Rm9ybWF0KGNvbHVtbi5kaXNwbGF5Rm9ybWF0LCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXJEZXNjcmlwdG9yKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGZpbHRlciBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBmaWx0ZXIgRGVzY3JpcHRvciBmb3IgcHJvcGVydHkuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhGaWx0ZXI8RmlsdGVyTW9kZWw+KHByb3BlcnR5OiBGaWx0ZXJzLCBmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+KTogdGhpcyB7XG4gICAgICAgIGlmIChmaWx0ZXIucHJvcGVydHkgIT09IHByb3BlcnR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpbHRlciBwcm9wZXJ0eSBcIiR7cHJvcGVydHl9XCIgYW5kIEZpbHRlciBkZXNjcmlwdG9yIHByb3BlcnR5IFwiJHtmaWx0ZXIucHJvcGVydHl9XCIgZG8gbm90IG1hdGNoLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVyIERlc2NyaXB0b3IgZm9yIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsPihmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNsYXNzZXMgZm9yIHRhYmxlIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbGFzc05hbWUgQ2xhc3MgbmFtZXMuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRhYmxlIHNpemluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIFRhYmxlIHNpemUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IFRhYmxlU2l6ZUVudW0gPSBUYWJsZVNpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBob3ZlciBlZmZlY3Qgb24gdGFibGUgcm93cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBob3ZlciBFbmFibGVzL2Rpc2FibGVzIHRoZSBob3Zlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEhvdmVyKGhvdmVyID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNIb3ZlciA9IGhvdmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGdyaWRsaW5lcyBvbiB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncmlkbGluZXMgRW5hYmxlcy9kaXNhYmxlcyB0aGUgZ3JpZGxpbmVzLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoR3JpZGxpbmVzKGdyaWRsaW5lcyA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzR3JpZGxpbmVzID0gZ3JpZGxpbmVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHJlb3JkZXJhYmxlIHByb3BlcnR5IG9uIGFsbCBjb2x1bW5zIGN1cnJlbnRseSBpbiB0aGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbHVtbnNSZW9yZGVyYWJsZV0gLSBCb29sZWFuIGZsYWcgdG8gc2V0IHJlb3JkZXJpbmcgb24gY29sdW1ucyB0by5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEN1cnJlbnRDb2x1bW5zUmVvcmRlcmFibGUoY29sdW1uc1Jlb3JkZXJhYmxlID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbC53aXRoUmVvcmRlcmFibGUoY29sdW1uc1Jlb3JkZXJhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHRvZ2dsZWFibGUgcHJvcGVydHkgb24gYWxsIGNvbHVtbnMgY3VycmVudGx5IGluIHRoZSBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sdW1uc1RvZ2dsZWFibGVdIC0gQm9vbGVhbiBmbGFnIHRvIHNldCB0b2dnbGVhYmxlIG9uIGNvbHVtbnMgdG8uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDdXJyZW50Q29sdW1uc1RvZ2dsZWFibGUoY29sdW1uc1RvZ2dsZWFibGUgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuY29sdW1ucykge1xuICAgICAgICAgICAgY29sLndpdGhUb2dnbGVhYmxlKGNvbHVtbnNUb2dnbGVhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVkIGNvbHVtbiByZXNpemUgZmVhdHVyZSB3aXRoIGNvbHVtblJlc2l6ZU1vZGUgb24gYWxsIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzaXphYmxlQ29sdW1ucyBUcnVlIGlmIGVuYWJsZWRcbiAgICAgKiBAcGFyYW0gY29sdW1uUmVzaXplTW9kZSAnZml0JyBvciAnZXhwYW5kJyBtb2RlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5zUmVzaXphYmxlKHJlc2l6YWJsZUNvbHVtbnMgPSB0cnVlLCBjb2x1bW5SZXNpemVNb2RlOiAnZml0JyB8ICdleHBhbmQnID0gJ2ZpdCcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzUmVzaXphYmxlQ29sdW1ucyA9IHJlc2l6YWJsZUNvbHVtbnM7XG4gICAgICAgIHRoaXMuX2NvbHVtblJlc2l6ZU1vZGUgPSBjb2x1bW5SZXNpemVNb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNvbHVtbiB0byAodW4pZnJvemVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbkNvbHVtbkZyb3plbiBUcnVlIHRvIGZyZWV6ZSBzZWxlY3Rpb24gY29sdW1uLCBmYWxzZSB0byB1bmZyZWV6ZSBpdC5cbiAgICAgKiBAcGFyYW0gYWN0aW9uQ29sdW1uRnJvemVuIFRydWUgdG8gZnJlZXplIGFjdGlvbiBjb2x1bW4sIGZhbHNlIHRvIHVuZnJlZXplIGl0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uRnJvemVuKHNlbGVjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW4sIGFjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ29sdW1uRnJvemVuID0gc2VsZWN0aW9uQ29sdW1uRnJvemVuO1xuICAgICAgICB0aGlzLl9hY3Rpb25Db2x1bW5Gcm96ZW4gPSBhY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgZm9yIHJvd3MgaW4gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJvd0NsYXNzTmFtZSAtIFRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSBhcHBsaWVkIHRvIGVhY2ggcm93LlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjbGFzc05hbWVNYXBGbl0gLSBPcHRpb25hbCBmdW5jdGlvbiB0byBtYXAgdGhlIGNsYXNzIG5hbWUgZHluYW1pY2FsbHkgYmFzZWQgb24gcm93J3MgaXRlbSBhbmQgY3VycmVudCBjbGFzcyBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUm93Q2xhc3NOYW1lKHJvd0NsYXNzTmFtZT86IHN0cmluZywgY2xhc3NOYW1lTWFwRm4/OiAoY2xhc3NOYW1lPzogc3RyaW5nLCBpdGVtPzogVGFibGVNb2RlbCkgPT4gc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Jvd0NsYXNzTmFtZSA9IHJvd0NsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fcm93Q2xhc3NOYW1lTWFwRm4gPSBjbGFzc05hbWVNYXBGbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBoZWFkZXIgcm93IGNsYXNzIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaGVhZGVyQ2xhc3NOYW1lIENsYXNzIG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhIZWFkZXJDbGFzc05hbWUoaGVhZGVyQ2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGVhZGVyQ2xhc3NOYW1lID0gaGVhZGVyQ2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGxvY2FsaXphdGlvbiBvZiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhMb2NhbGl6ZWQoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzTG9jYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NhbGUgcHJvcGVydHkgZm9yIGxvY2FsaXphdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBMb2NhbGUgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aExvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNMb2NhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHJvdyBleHBhbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gY2hlY2sgaWYgcm93IGNhbiBiZSBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0gY29sU3BhbiBzZXQgY3VzdG9tIHJvdyBzcGFuIGZvciBleHBhbmRlZCByb3cuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgQ29tcG9uZW50IHRvIGJlIGRpc3BsYXllZCBvbiByb3cgZXhwYW5kLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUm93RXhwYW5kYWJsZShwcm9wZXJ0eT86IGtleW9mIFRhYmxlTW9kZWwsIGNvbFNwYW4/OiBudW1iZXIsIGNvbXBvbmVudFR5cGU/OiBUeXBlPElSb3dFeHBhbmRhYmxlQ29tcG9uZW50PFRhYmxlTW9kZWw+Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9yb3dFeHBhbmRhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9yb3dFeHBhbmRhYmxlUHJvcGVydHkgPSBwcm9wZXJ0eSBhcyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbFNwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gY29sU3BhbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgcm93IHJlb3JkZXJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVvcmRhYmxlIEVuYWJsZXMvZGlzYWJsZXMgZmVhdHVyZS5cbiAgICAgKi9cbiAgICB3aXRoUm93UmVvcmRlcmFibGUocmVvcmRhYmxlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9yb3dSZW9yZGVyYWJsZSA9IHJlb3JkYWJsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvcHlGaWVsZHNUbyhvYmo6IFRhYmxlRGVzY3JpcHRvckluc3Q8YW55LCBhbnksIGFueT4pIHtcbiAgICAgICAgb2JqLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBvYmouX2hpZGVIZWFkZXIgPSB0aGlzLl9oaWRlSGVhZGVyO1xuICAgICAgICBvYmouX3RyYWNrUHJvcGVydHkgPSB0aGlzLl90cmFja1Byb3BlcnR5O1xuICAgICAgICBvYmouX2ZpbHRlcnMgPSB0aGlzLl9maWx0ZXJzLm1hcChmID0+IGYuY29weSgpKTtcbiAgICAgICAgb2JqLl9zb3J0cyA9IHRoaXMuX3NvcnRzLm1hcChzID0+IHMuY29weSgpKTtcbiAgICAgICAgb2JqLl9jbGFzc05hbWUgPSB0aGlzLl9jbGFzc05hbWU7XG4gICAgICAgIG9iai5fc2l6ZSA9IHRoaXMuX3NpemU7XG4gICAgICAgIG9iai5faGFzSG92ZXIgPSB0aGlzLl9oYXNIb3ZlcjtcbiAgICAgICAgb2JqLl9oYXNHcmlkbGluZXMgPSB0aGlzLl9oYXNHcmlkbGluZXM7XG4gICAgICAgIG9iai5faGFzUmVzaXphYmxlQ29sdW1ucyA9IHRoaXMuX2hhc1Jlc2l6YWJsZUNvbHVtbnM7XG4gICAgICAgIG9iai5fY29sdW1uUmVzaXplTW9kZSA9IHRoaXMuX2NvbHVtblJlc2l6ZU1vZGU7XG4gICAgICAgIG9iai5fYWN0aW9uQ29sdW1uRnJvemVuID0gdGhpcy5fYWN0aW9uQ29sdW1uRnJvemVuO1xuICAgICAgICBvYmouX3NlbGVjdGlvbkNvbHVtbkZyb3plbiA9IHRoaXMuX3NlbGVjdGlvbkNvbHVtbkZyb3plbjtcbiAgICAgICAgb2JqLl9pc0xvY2FsaXplZCA9IHRoaXMuX2lzTG9jYWxpemVkO1xuICAgICAgICBvYmouX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5ID0gdGhpcy5fbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHk7XG4gICAgICAgIG9iai5fcGFnaW5hdGlvbk1vZGUgPSB0aGlzLl9wYWdpbmF0aW9uTW9kZTtcbiAgICAgICAgb2JqLl9yb3dzUGVyUGFnZU9wdGlvbnMgPSB0aGlzLl9yb3dzUGVyUGFnZU9wdGlvbnM7XG4gICAgICAgIG9iai5fcm93RXhwYW5kYWJsZSA9IHRoaXMuX3Jvd0V4cGFuZGFibGU7XG4gICAgICAgIG9iai5fcm93RXhwYW5kYWJsZUNvbFNwYW4gPSB0aGlzLl9yb3dFeHBhbmRhYmxlQ29sU3BhbjtcbiAgICAgICAgb2JqLl9yb3dFeHBhbmRhYmxlUHJvcGVydHkgPSB0aGlzLl9yb3dFeHBhbmRhYmxlUHJvcGVydHk7XG4gICAgICAgIG9iai5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGUgPSB0aGlzLl9yb3dFeHBhbmRhYmxlQ29tcG9uZW50VHlwZTtcbiAgICAgICAgb2JqLl9yb3dSZW9yZGVyYWJsZSA9IHRoaXMuX3Jvd1Jlb3JkZXJhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBjdXJyZW50IGRlc2NyaXB0b3IgdG8gYSBuZXcgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGNvcHkoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxUYWJsZU1vZGVsLCBTb3J0cywgRmlsdGVycz4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbmV3IFRhYmxlRGVzY3JpcHRvckluc3Q8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+KHRoaXMubW9kZWwuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZGVzY3JpcHRvcik7XG4gICAgICAgIGRlc2NyaXB0b3IuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGMgPT4gYy5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCBleHRlbmRzIFRhYmxlRGVzY3JpcHRvckluc3Q8YW55PiB7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZWRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfZmlsdGVyQ29sdW1uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgX3NvcnRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfc29ydENvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERTtcbiAgICBwcml2YXRlIF9maWx0ZXJDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLkVYQ0xVREU7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2NvbHVtbnM6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yW10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPGFueT4pIHtcbiAgICAgICAgc3VwZXIobW9kZWwpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwudGl0bGVQcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMud2l0aFRpdGxlKG1vZGVsLnRpdGxlUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBjb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIGV4Y2x1ZGVkIGNvbHVtbnMgd2hlbiBnZW5lcmF0aW5nIGRlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0gZXhjbHVkZWRDb2x1bW4gbmFtZXMgb2YgZXhjbHVkZWQgY29sdW1uc1xuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0V4Y2x1ZGVkKGV4Y2x1ZGVkQ29sdW1uOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9leGNsdWRlZENvbHVtbnMgPSBleGNsdWRlZENvbHVtbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGVmaW5lcyBjb2x1bW4gcHJvcGVydGllcyBvbiB3aGljaCBzb3J0IGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBzb3J0Q29sdW1uTW9kZVxuICAgICAqIEBwYXJhbSBzb3J0T25Db2x1bW5zIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBzb3J0Q29sdW1uTW9kZSBJTkNMVURFX09OTFkgKGRlZmF1bHQpIG9ubHkgZ2l2ZW4gY29sdW1ucyB3aWxsIGhhdmUgc29ydCwgRVhDTFVERSBnaXZlbiBjb2x1bW5zIHdpbGwgTk9UIGhhdmUgc29ydFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc1NvcnQoc29ydE9uQ29sdW1uczogc3RyaW5nW10sIHNvcnRDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLklOQ0xVREVfT05MWSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1uTW9kZSA9IHNvcnRDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1ucyA9IHNvcnRPbkNvbHVtbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlZmluZXMgY29sdW1uIHByb3BlcnRpZXMgb24gd2hpY2ggZmlsdGVyIGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBmaWx0ZXJDb2x1bW5Nb2RlXG4gICAgICogQHBhcmFtIGZpbHRlck9uQ29sdW1uIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJDb2x1bW5Nb2RlIElOQ0xVREVfT05MWSAoZGVmYXVsdCkgb25seSBnaXZlbiBjb2x1bW5zIHdpbGwgaGF2ZSBmaWx0ZXIsIEVYQ0xVREUgZ2l2ZW4gY29sdW1ucyB3aWxsIE5PVCBoYXZlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0ZpbHRlcihmaWx0ZXJPbkNvbHVtbjogc3RyaW5nW10sIGZpbHRlckNvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPSBmaWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5zID0gZmlsdGVyT25Db2x1bW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgZ2l2ZW4gdHlwZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGUgY3VzdG9tIHR5cGUgZm9yIGNvbHVtblxuICAgICAqIEBwYXJhbSBkaXNwbGF5VHlwZSBjdXN0b20gY29sdW1uIHZhbHVlIGRpc3BsYXkgdHlwZVxuICAgICAqIEBwYXJhbSBhcmdzIGFkZGl0aW9uIGFyZ3VtZW50cyBmb3IgY29sdW1uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5QcmVzZXRUeXBlKHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENvbHVtblR5cGVFbnVtLCBkaXNwbGF5VHlwZT86IENvbHVtbkRpc3BsYXlUeXBlRW51bSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBwcm9wZXJ0eSA9PT0gY29sLnByb3BlcnR5KSA/PyB0aGlzLmFkZENvbHVtbihwcm9wZXJ0eSkud2l0aFRpdGxlKHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmFzVHlwZSh0eXBlLCBkaXNwbGF5VHlwZSwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0cyB0aXRsZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHRpdGxlIGNvbHVtbidzIHRpdGxlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5UaXRsZShwcm9wZXJ0eTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gcHJvcGVydHkgPT09IGNvbC5wcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFRpdGxlKHRpdGxlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVzIGNvbHVtbnMgZGVmaW5lZCBvbiB0YWJsZSBiYXNlZCBvbiBkYXRhIGZldGNoZWQgZnJvbSBhcGlcbiAgICAgKiBAcGFyYW0gZGF0YSBkYXRhIGZyb20gYXBpXG4gICAgICovXG4gICAgcHVibGljIHRvVGFibGVEZXNjcmlwdG9yRnJvbURhdGEoZGF0YTogRGF0YUxpc3RSZXN1bHQpOiBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4ge1xuICAgICAgICBjb25zdCB0YWJsZURlc2NyaXB0b3IgPSB0aGlzLnRvVGFibGVEZXNjcmlwdG9yKCk7XG5cbiAgICAgICAgaWYgKGRhdGEuZGF0YSA9PSBudWxsIHx8IGRhdGEuZGF0YS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdE1vZGVsID0gZGF0YS5kYXRhWzBdO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZmxhdHRlbk9iamVjdEtleXMob2JqZWN0TW9kZWwpXG4gICAgICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIXRoaXMuX2V4Y2x1ZGVkQ29sdW1ucy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpOyAvL2V4Y2x1ZGUgYXJyYXlzIGFuZCBzZXRzXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgbWV0YUNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBrZXkpO1xuICAgICAgICAgICAgbGV0IGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxhbnksIGFueT47XG4gICAgICAgICAgICBpZiAobWV0YUNvbHVtbikge1xuICAgICAgICAgICAgICAgIGlmICghbWV0YUNvbHVtbi52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBtZXRhQ29sdW1uLnRvQ29sdW1uRGVzY3JpcHRvcigpO1xuICAgICAgICAgICAgICAgIHRhYmxlRGVzY3JpcHRvci53aXRoQ29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IHRhYmxlRGVzY3JpcHRvci5hZGRDb2x1bW4oa2V5KS53aXRoVGl0bGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb2x1bW5Ub0RhdGVOdW1iZXJPckJvb2xlYW4oY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmkxOG5CYXNlS2V5ICYmICFjb2x1bW4ucHJvcGVydHkuaW5jbHVkZXMoJ3JldicpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLndpdGhUaXRsZShbdGhpcy5tb2RlbC5pMThuQmFzZUtleSwgJ3Byb3BlcnRpZXMnLCBjb2x1bW4ucHJvcGVydHldLmpvaW4oJy4nKS5yZXBsYWNlKCdzdGF0ZS4nLCAnJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZTb3J0Q29sdW1ucyA9IHRoaXMuX3NvcnRDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mU29ydENvbHVtbnMpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZICYmIGVsZW1lbnRPZlNvcnRDb2x1bW5zKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGFibGVEZXNjcmlwdG9yLndpdGhTb3J0VW5zYWZlKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRPZkZpbHRlckNvbHVtbnMgPSB0aGlzLl9maWx0ZXJDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mRmlsdGVyQ29sdW1ucykgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPT09IFRhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bS5JTkNMVURFX09OTFkgJiYgZWxlbWVudE9mRmlsdGVyQ29sdW1ucykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0YWJsZURlc2NyaXB0b3IuYWRkRmlsdGVyRnJvbUNvbHVtbkRlc2NyaXB0b3JVbnNhZmUoY29sdW1uLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGFkZHMgQ29sdW1uRHluYW1pY0Rlc2NyaXB0b3IgdG8gdGhpcyB0YWJsZVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBjb2x1bW4ncyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBhZGRDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGRlZXAgY29weSBvZiB0YWJsZSBkeW5hbWljIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QodGhpcy5tb2RlbC5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhkZXNjcmlwdG9yKTtcbiAgICAgICAgZGVzY3JpcHRvci5fY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoYyA9PiBjLmNvcHkoKSk7XG4gICAgICAgIGRlc2NyaXB0b3IuX2V4Y2x1ZGVkQ29sdW1ucyA9IFsuLi50aGlzLl9leGNsdWRlZENvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9maWx0ZXJDb2x1bW5zID0gWy4uLnRoaXMuX2ZpbHRlckNvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1ucyA9IFsuLi50aGlzLl9zb3J0Q29sdW1uc107XG4gICAgICAgIGRlc2NyaXB0b3IuX2ZpbHRlckNvbHVtbk1vZGUgPSB0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1uTW9kZSA9IHRoaXMuX3NvcnRDb2x1bW5Nb2RlO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9UYWJsZURlc2NyaXB0b3IoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxhbnk+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4odGhpcy5tb2RlbCk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGRlc2NyaXB0b3IpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG4iXX0=
|