@bryntum/taskboard-angular-thin 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +44 -0
  2. package/bryntum-taskboard-angular-thin.d.ts +5 -0
  3. package/bundles/bryntum-taskboard-angular-thin.umd.js +18990 -0
  4. package/bundles/bryntum-taskboard-angular-thin.umd.js.map +1 -0
  5. package/esm2015/bryntum-taskboard-angular-thin.js +5 -0
  6. package/esm2015/lib/bryntum-column-combo.component.js +937 -0
  7. package/esm2015/lib/bryntum-column-filter-field.component.js +800 -0
  8. package/esm2015/lib/bryntum-column-picker-button.component.js +720 -0
  9. package/esm2015/lib/bryntum-column-scroll-button.component.js +720 -0
  10. package/esm2015/lib/bryntum-project-combo.component.js +941 -0
  11. package/esm2015/lib/bryntum-resources-combo.component.js +937 -0
  12. package/esm2015/lib/bryntum-swimlane-combo.component.js +937 -0
  13. package/esm2015/lib/bryntum-swimlane-filter-field.component.js +808 -0
  14. package/esm2015/lib/bryntum-swimlane-picker-button.component.js +720 -0
  15. package/esm2015/lib/bryntum-swimlane-scroll-button.component.js +720 -0
  16. package/esm2015/lib/bryntum-tag-combo.component.js +941 -0
  17. package/esm2015/lib/bryntum-task-board-base.component.js +1679 -0
  18. package/esm2015/lib/bryntum-task-board-field-filter-picker-group.component.js +763 -0
  19. package/esm2015/lib/bryntum-task-board-field-filter-picker.component.js +733 -0
  20. package/esm2015/lib/bryntum-task-board-project-model.component.js +690 -0
  21. package/esm2015/lib/bryntum-task-board.component.js +1683 -0
  22. package/esm2015/lib/bryntum-task-color-combo.component.js +795 -0
  23. package/esm2015/lib/bryntum-task-filter-field.component.js +808 -0
  24. package/esm2015/lib/bryntum-todo-list-field.component.js +781 -0
  25. package/esm2015/lib/bryntum-undo-redo.component.js +690 -0
  26. package/esm2015/lib/bryntum-zoom-slider.component.js +666 -0
  27. package/esm2015/lib/taskboard.module.js +124 -0
  28. package/esm2015/lib/wrapper.helper.js +74 -0
  29. package/esm2015/public-api.js +26 -0
  30. package/fesm2015/bryntum-taskboard-angular-thin.js +18489 -0
  31. package/fesm2015/bryntum-taskboard-angular-thin.js.map +1 -0
  32. package/lib/bryntum-column-combo.component.d.ts +1209 -0
  33. package/lib/bryntum-column-filter-field.component.d.ts +989 -0
  34. package/lib/bryntum-column-picker-button.component.d.ts +854 -0
  35. package/lib/bryntum-column-scroll-button.component.d.ts +854 -0
  36. package/lib/bryntum-project-combo.component.d.ts +1210 -0
  37. package/lib/bryntum-resources-combo.component.d.ts +1208 -0
  38. package/lib/bryntum-swimlane-combo.component.d.ts +1208 -0
  39. package/lib/bryntum-swimlane-filter-field.component.d.ts +1002 -0
  40. package/lib/bryntum-swimlane-picker-button.component.d.ts +854 -0
  41. package/lib/bryntum-swimlane-scroll-button.component.d.ts +854 -0
  42. package/lib/bryntum-tag-combo.component.d.ts +1213 -0
  43. package/lib/bryntum-task-board-base.component.d.ts +1922 -0
  44. package/lib/bryntum-task-board-field-filter-picker-group.component.d.ts +942 -0
  45. package/lib/bryntum-task-board-field-filter-picker.component.d.ts +890 -0
  46. package/lib/bryntum-task-board-project-model.component.d.ts +733 -0
  47. package/lib/bryntum-task-board.component.d.ts +1924 -0
  48. package/lib/bryntum-task-color-combo.component.d.ts +966 -0
  49. package/lib/bryntum-task-filter-field.component.d.ts +1002 -0
  50. package/lib/bryntum-todo-list-field.component.d.ts +956 -0
  51. package/lib/bryntum-undo-redo.component.d.ts +832 -0
  52. package/lib/bryntum-zoom-slider.component.d.ts +785 -0
  53. package/lib/taskboard.module.d.ts +27 -0
  54. package/lib/wrapper.helper.d.ts +26 -0
  55. package/package.json +33 -0
  56. package/public-api.d.ts +22 -0
@@ -0,0 +1,690 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /**
3
+ * Angular wrapper for Bryntum ProjectModel
4
+ */
5
+ import { Component, EventEmitter, Output, Input } from '@angular/core';
6
+ import WrapperHelper from './wrapper.helper';
7
+ import { ProjectModel } from '@bryntum/taskboard-thin';
8
+ import * as i0 from "@angular/core";
9
+ export class BryntumTaskBoardProjectModelComponent {
10
+ constructor(element) {
11
+ this.bryntumConfig = {
12
+ adopt: undefined,
13
+ appendTo: undefined,
14
+ href: undefined,
15
+ angularComponent: this,
16
+ features: {},
17
+ listeners: {}
18
+ };
19
+ // Events emitters
20
+ /**
21
+ * Fires before an object is destroyed.
22
+ * @param {object} event Event object
23
+ * @param {Core.Base} event.source The Object that is being destroyed.
24
+ */
25
+ this.onBeforeDestroy = new EventEmitter();
26
+ /**
27
+ * Fires before [load request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) is sent. Return `false` to cancel load request.
28
+ * @param {object} event Event object
29
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
30
+ * @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
31
+ */
32
+ this.onBeforeLoad = new EventEmitter();
33
+ /**
34
+ * Fires before loaded data get applied to the stores. Return `false` to prevent data applying.
35
+ * This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
36
+ * @param {object} event Event object
37
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
38
+ * @param {object} event.response The decoded server response object.
39
+ * @param {object} event.options Options provided to the [load](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) method.
40
+ */
41
+ this.onBeforeLoadApply = new EventEmitter();
42
+ /**
43
+ * Fires before server response gets applied to the stores. Return `false` to prevent data applying.
44
+ * This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
45
+ * @param {object} event Event object
46
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
47
+ * @param {'sync','load'} event.requestType The request type (`sync` or `load`).
48
+ * @param {object} event.response The decoded server response object.
49
+ */
50
+ this.onBeforeResponseApply = new EventEmitter();
51
+ /**
52
+ * Fires before a request is sent to the server.
53
+ * ...
54
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-beforeSend)
55
+ * @param {object} event Event object
56
+ * @param {Scheduler.crud.AbstractCrudManager} event.crudManager The CRUD manager.
57
+ * @param {object} event.params HTTP request params to be passed in the request URL.
58
+ * @param {'sync','load'} event.requestType CrudManager request type (`load`/`sync`)
59
+ * @param {object} event.requestConfig Configuration object for Ajax request call
60
+ */
61
+ this.onBeforeSend = new EventEmitter();
62
+ /**
63
+ * Fires before [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) is sent. Return `false` to cancel sync request.
64
+ * ...
65
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-beforeSync)
66
+ * @param {object} event Event object
67
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
68
+ * @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
69
+ */
70
+ this.onBeforeSync = new EventEmitter();
71
+ /**
72
+ * Fires before sync response data get applied to the stores. Return `false` to prevent data applying.
73
+ * This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
74
+ * @param {object} event Event object
75
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
76
+ * @param {object} event.response The decoded server response object.
77
+ */
78
+ this.onBeforeSyncApply = new EventEmitter();
79
+ /**
80
+ * Fires when any other event is fired from the object.
81
+ * ...
82
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-catchAll)
83
+ * @param {object} event Event object
84
+ * @param {{[key: string]: any, type: string}} event.event The Object that contains event details
85
+ * @param {string} event.event.type The type of the event which is caught by the listener
86
+ */
87
+ this.onCatchAll = new EventEmitter();
88
+ /**
89
+ * Fired when data in any of the projects stores changes.
90
+ * ...
91
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-change)
92
+ * @param {object} event Event object
93
+ * @param {Scheduler.model.SchedulerProjectModel,any} event.source This project
94
+ * @param {Core.data.Store} event.store Affected store
95
+ * @param {'remove','removeAll','add','clearchanges','filter','update','dataset','replace'} event.action Name of action which triggered the change. May be one of: * `'remove'` * `'removeAll'` * `'add'` * `'clearchanges'` * `'filter'` * `'update'` * `'dataset'` * `'replace'`
96
+ * @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
97
+ * @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
98
+ * @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
99
+ */
100
+ this.onChange = new EventEmitter();
101
+ /**
102
+ * Fired when the engine has finished its calculations and the results has been written back to the records.
103
+ * ...
104
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-dataReady)
105
+ * @param {object} event Event object
106
+ * @param {Scheduler.model.SchedulerProjectModel,any} event.source The project
107
+ * @param {boolean} event.isInitialCommit Flag that shows if this commit is initial
108
+ * @param {Set<any>} event.records Set of all [Model](https://bryntum.com/products/taskboard/docs/api/Core/data/Model)s that were modified in the completed transaction. Use the [modifications](https://bryntum.com/products/taskboard/docs/api/Core/data/Model#property-modifications) property of each Model to identify modified fields.
109
+ */
110
+ this.onDataReady = new EventEmitter();
111
+ /**
112
+ * Fires when an object is destroyed.
113
+ * @param {object} event Event object
114
+ * @param {Core.Base} event.source The Object that is being destroyed.
115
+ */
116
+ this.onDestroy = new EventEmitter();
117
+ /**
118
+ * Fires when data in any of the registered data stores is changed.
119
+ * ...
120
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-hasChanges)
121
+ * @param {object} event Event object
122
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
123
+ */
124
+ this.onHasChanges = new EventEmitter();
125
+ /**
126
+ * Fires on successful [load request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) completion after data gets loaded to the stores.
127
+ * @param {object} event Event object
128
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
129
+ * @param {object} event.response The decoded server response object.
130
+ * @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
131
+ * @param {object} event.requestOptions The request options passed to the request.
132
+ * @param {Response} event.rawResponse The native Response object
133
+ */
134
+ this.onLoad = new EventEmitter();
135
+ /**
136
+ * Fired after [load request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) was canceled by some [beforeLoad](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#event-beforeLoad)
137
+ * listener or due to incomplete prior load request.
138
+ * @param {object} event Event object
139
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
140
+ * @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
141
+ */
142
+ this.onLoadCanceled = new EventEmitter();
143
+ /**
144
+ * Fires when a [load request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) fails.
145
+ * @param {object} event Event object
146
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
147
+ * @param {object} event.response The decoded server response object.
148
+ * @param {string} event.responseText The raw server response text
149
+ * @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
150
+ * @param {object} event.requestOptions The request options passed to the request.
151
+ * @param {Response} event.rawResponse The native Response object
152
+ */
153
+ this.onLoadFail = new EventEmitter();
154
+ /**
155
+ * Fires when registered stores get into state when they don't have any
156
+ * not persisted change. This happens after [load](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) or [sync](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) request
157
+ * completion. Or this may happen after a record update which turns its fields back to their original state.
158
+ * ...
159
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-noChanges)
160
+ * @param {object} event Event object
161
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
162
+ */
163
+ this.onNoChanges = new EventEmitter();
164
+ /**
165
+ * Fires on successful request completion after data gets applied to the stores.
166
+ * @param {object} event Event object
167
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
168
+ * @param {'sync','load'} event.requestType The request type (`sync` or `load`).
169
+ * @param {object} event.response The decoded server response object.
170
+ * @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
171
+ * @param {object} event.requestOptions The request options passed to the request.
172
+ * @param {Response} event.rawResponse The native Response object
173
+ */
174
+ this.onRequestDone = new EventEmitter();
175
+ /**
176
+ * Fires when a request fails.
177
+ * @param {object} event Event object
178
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
179
+ * @param {'sync','load'} event.requestType The request type (`sync` or `load`).
180
+ * @param {object} event.response The decoded server response object.
181
+ * @param {string} event.responseText The raw server response text
182
+ * @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
183
+ * @param {object} event.requestOptions The request options passed to the request.
184
+ * @param {Response} event.rawResponse The native Response object
185
+ */
186
+ this.onRequestFail = new EventEmitter();
187
+ /**
188
+ * Fires on successful [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) completion.
189
+ * @param {object} event Event object
190
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
191
+ * @param {object} event.response The decoded server response object.
192
+ * @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
193
+ * @param {object} event.requestOptions The request options passed to the request.
194
+ * @param {Response} event.rawResponse The native Response object
195
+ */
196
+ this.onSync = new EventEmitter();
197
+ /**
198
+ * Fires after [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) was canceled by some [beforeSync](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#event-beforeSync) listener.
199
+ * @param {object} event Event object
200
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
201
+ * @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
202
+ */
203
+ this.onSyncCanceled = new EventEmitter();
204
+ /**
205
+ * Fires after [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) was delayed due to incomplete previous one.
206
+ * @param {object} event Event object
207
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
208
+ * @param {object} event.arguments The arguments of [sync](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) call.
209
+ */
210
+ this.onSyncDelayed = new EventEmitter();
211
+ /**
212
+ * Fires when a [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) fails.
213
+ * @param {object} event Event object
214
+ * @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
215
+ * @param {object} event.response The decoded server response object.
216
+ * @param {string} event.responseText The raw server response text
217
+ * @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
218
+ * @param {object} event.requestOptions The request options passed to the request.
219
+ * @param {Response} event.rawResponse The native Response object
220
+ */
221
+ this.onSyncFail = new EventEmitter();
222
+ this.elementRef = element;
223
+ }
224
+ /**
225
+ * Create and append the underlying widget
226
+ */
227
+ ngOnInit() {
228
+ const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumTaskBoardProjectModelComponent;
229
+ bryntumConfigs.filter(prop => prop in this).forEach(prop => {
230
+ // @ts-ignore
231
+ WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
232
+ if (['features', 'config'].includes(prop)) {
233
+ WrapperHelper.devWarningConfigProp(instanceName, prop);
234
+ }
235
+ });
236
+ // @ts-ignore
237
+ bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
238
+ const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
239
+ // @ts-ignore
240
+ bryntumConfig.listeners[eventName(event)] = e => {
241
+ // @ts-ignore
242
+ me[event].emit(e);
243
+ // EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
244
+ // in Angular listeners
245
+ return e.returnValue;
246
+ };
247
+ });
248
+ // If component has no container specified in config then use adopt to Wrapper's element
249
+ const containerParam = [
250
+ 'adopt',
251
+ 'appendTo',
252
+ 'insertAfter',
253
+ 'insertBefore'
254
+ // @ts-ignore
255
+ ].find(prop => bryntumConfig[prop]);
256
+ if (!containerParam) {
257
+ if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
258
+ // Button should always be <a> or <button> inside owner element
259
+ bryntumConfig.appendTo = elementRef.nativeElement;
260
+ }
261
+ else {
262
+ bryntumConfig.adopt = elementRef.nativeElement;
263
+ }
264
+ }
265
+ else {
266
+ WrapperHelper.devWarningContainer(instanceName, containerParam);
267
+ }
268
+ // @ts-ignore
269
+ me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
270
+ }
271
+ /**
272
+ * Watch for changes
273
+ * @param changes
274
+ */
275
+ ngOnChanges(changes) {
276
+ const { instance } = this, { instanceName } = BryntumTaskBoardProjectModelComponent;
277
+ if (!instance) {
278
+ return;
279
+ }
280
+ // Iterate over all changes
281
+ Object.entries(changes).forEach(([prop, change]) => {
282
+ const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumTaskBoardProjectModelComponent;
283
+ if (bryntumProps.includes(prop)) {
284
+ WrapperHelper.applyPropValue(instance, prop, newValue, false);
285
+ if (bryntumConfigsOnly.includes(prop)) {
286
+ WrapperHelper.devWarningUpdateProp(instanceName, prop);
287
+ }
288
+ }
289
+ });
290
+ }
291
+ /**
292
+ * Destroy the component
293
+ */
294
+ ngOnDestroy() {
295
+ // @ts-ignore
296
+ if (this.instance && this.instance.destroy) {
297
+ this.instance.destroy();
298
+ }
299
+ }
300
+ }
301
+ BryntumTaskBoardProjectModelComponent.instanceClass = ProjectModel;
302
+ BryntumTaskBoardProjectModelComponent.instanceName = 'ProjectModel';
303
+ BryntumTaskBoardProjectModelComponent.bryntumEvents = [
304
+ 'onBeforeDestroy',
305
+ 'onBeforeLoad',
306
+ 'onBeforeLoadApply',
307
+ 'onBeforeResponseApply',
308
+ 'onBeforeSend',
309
+ 'onBeforeSync',
310
+ 'onBeforeSyncApply',
311
+ 'onCatchAll',
312
+ 'onChange',
313
+ 'onDataReady',
314
+ 'onDestroy',
315
+ 'onHasChanges',
316
+ 'onLoad',
317
+ 'onLoadCanceled',
318
+ 'onLoadFail',
319
+ 'onNoChanges',
320
+ 'onRequestDone',
321
+ 'onRequestFail',
322
+ 'onSync',
323
+ 'onSyncCanceled',
324
+ 'onSyncDelayed',
325
+ 'onSyncFail'
326
+ ];
327
+ BryntumTaskBoardProjectModelComponent.bryntumFeatureNames = [];
328
+ BryntumTaskBoardProjectModelComponent.bryntumConfigs = BryntumTaskBoardProjectModelComponent.bryntumFeatureNames.concat([
329
+ 'adjustDurationToDST',
330
+ 'assignmentModelClass',
331
+ 'assignments',
332
+ 'assignmentsData',
333
+ 'assignmentStore',
334
+ 'assignmentStoreClass',
335
+ 'autoLoad',
336
+ 'autoSync',
337
+ 'autoSyncTimeout',
338
+ 'bubbleEvents',
339
+ 'callOnFunctions',
340
+ 'catchEventHandlerExceptions',
341
+ 'children',
342
+ 'crudStores',
343
+ 'dependencies',
344
+ 'dependenciesData',
345
+ 'dependencyModelClass',
346
+ 'dependencyStore',
347
+ 'dependencyStoreClass',
348
+ 'encoder',
349
+ 'events',
350
+ 'eventsData',
351
+ 'eventStore',
352
+ 'expanded',
353
+ 'forceSync',
354
+ 'id',
355
+ 'ignoreRemoteChangesInSTM',
356
+ 'includeChildrenInRemoveRequest',
357
+ 'includeLegacyDataProperties',
358
+ 'isFullyLoaded',
359
+ 'json',
360
+ 'listeners',
361
+ 'loadUrl',
362
+ 'orderedParentIndex',
363
+ 'parentId',
364
+ 'parentIndex',
365
+ 'phantomIdField',
366
+ 'phantomParentIdField',
367
+ 'readOnly',
368
+ 'remoteChildCount',
369
+ 'resetIdsBeforeSync',
370
+ 'resourceModelClass',
371
+ 'resources',
372
+ 'resourcesData',
373
+ 'resourceStore',
374
+ 'resourceStoreClass',
375
+ 'shouldSyncDataOnLoad',
376
+ 'silenceInitialCommit',
377
+ 'skipSuccessProperty',
378
+ 'stm',
379
+ 'storeIdProperty',
380
+ 'supportShortSyncResponse',
381
+ 'syncApplySequence',
382
+ 'syncUrl',
383
+ 'taskModelClass',
384
+ 'tasks',
385
+ 'tasksData',
386
+ 'taskStore',
387
+ 'taskStoreClass',
388
+ 'timeZone',
389
+ 'toJSONResultFormat',
390
+ 'trackResponseType',
391
+ 'transport',
392
+ 'useRawData',
393
+ 'validateResponse',
394
+ 'writeAllFields'
395
+ ]);
396
+ BryntumTaskBoardProjectModelComponent.bryntumConfigsOnly = [
397
+ 'adjustDurationToDST',
398
+ 'assignmentModelClass',
399
+ 'assignmentsData',
400
+ 'assignmentStoreClass',
401
+ 'autoLoad',
402
+ 'autoSync',
403
+ 'autoSyncTimeout',
404
+ 'bubbleEvents',
405
+ 'children',
406
+ 'dependenciesData',
407
+ 'dependencyModelClass',
408
+ 'dependencyStoreClass',
409
+ 'encoder',
410
+ 'eventsData',
411
+ 'expanded',
412
+ 'ignoreRemoteChangesInSTM',
413
+ 'includeChildrenInRemoveRequest',
414
+ 'listeners',
415
+ 'orderedParentIndex',
416
+ 'parentIndex',
417
+ 'phantomIdField',
418
+ 'phantomParentIdField',
419
+ 'resetIdsBeforeSync',
420
+ 'resourceModelClass',
421
+ 'resourcesData',
422
+ 'resourceStoreClass',
423
+ 'silenceInitialCommit',
424
+ 'skipSuccessProperty',
425
+ 'storeIdProperty',
426
+ 'supportShortSyncResponse',
427
+ 'taskModelClass',
428
+ 'tasksData',
429
+ 'taskStoreClass',
430
+ 'toJSONResultFormat',
431
+ 'trackResponseType',
432
+ 'transport',
433
+ 'useRawData',
434
+ 'validateResponse',
435
+ 'writeAllFields'
436
+ ];
437
+ BryntumTaskBoardProjectModelComponent.bryntumProps = BryntumTaskBoardProjectModelComponent.bryntumFeatureNames.concat([
438
+ 'allChildren',
439
+ 'allUnfilteredChildren',
440
+ 'assignments',
441
+ 'assignmentStore',
442
+ 'callOnFunctions',
443
+ 'catchEventHandlerExceptions',
444
+ 'crudStores',
445
+ 'dependencies',
446
+ 'dependencyStore',
447
+ 'descendantCount',
448
+ 'events',
449
+ 'eventStore',
450
+ 'forceSync',
451
+ 'hasGeneratedId',
452
+ 'id',
453
+ 'includeLegacyDataProperties',
454
+ 'inlineData',
455
+ 'internalId',
456
+ 'isCommitting',
457
+ 'isCreating',
458
+ 'isFullyLoaded',
459
+ 'isValid',
460
+ 'json',
461
+ 'loadUrl',
462
+ 'parentId',
463
+ 'previousSiblingsTotalCount',
464
+ 'readOnly',
465
+ 'remoteChildCount',
466
+ 'resources',
467
+ 'resourceStore',
468
+ 'resourceTimeRanges',
469
+ 'shouldSyncDataOnLoad',
470
+ 'stm',
471
+ 'syncApplySequence',
472
+ 'syncUrl',
473
+ 'tasks',
474
+ 'taskStore',
475
+ 'timeRanges',
476
+ 'timeZone',
477
+ 'visibleDescendantCount'
478
+ ]);
479
+ BryntumTaskBoardProjectModelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTaskBoardProjectModelComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
480
+ BryntumTaskBoardProjectModelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumTaskBoardProjectModelComponent, selector: "bryntum-task-board-project-model", inputs: { adjustDurationToDST: "adjustDurationToDST", assignmentModelClass: "assignmentModelClass", assignmentsData: "assignmentsData", assignmentStoreClass: "assignmentStoreClass", autoLoad: "autoLoad", autoSync: "autoSync", autoSyncTimeout: "autoSyncTimeout", bubbleEvents: "bubbleEvents", children: "children", dependenciesData: "dependenciesData", dependencyModelClass: "dependencyModelClass", dependencyStoreClass: "dependencyStoreClass", encoder: "encoder", eventsData: "eventsData", expanded: "expanded", ignoreRemoteChangesInSTM: "ignoreRemoteChangesInSTM", includeChildrenInRemoveRequest: "includeChildrenInRemoveRequest", listeners: "listeners", orderedParentIndex: "orderedParentIndex", parentIndex: "parentIndex", phantomIdField: "phantomIdField", phantomParentIdField: "phantomParentIdField", resetIdsBeforeSync: "resetIdsBeforeSync", resourceModelClass: "resourceModelClass", resourcesData: "resourcesData", resourceStoreClass: "resourceStoreClass", silenceInitialCommit: "silenceInitialCommit", skipSuccessProperty: "skipSuccessProperty", storeIdProperty: "storeIdProperty", supportShortSyncResponse: "supportShortSyncResponse", taskModelClass: "taskModelClass", tasksData: "tasksData", taskStoreClass: "taskStoreClass", toJSONResultFormat: "toJSONResultFormat", trackResponseType: "trackResponseType", transport: "transport", useRawData: "useRawData", validateResponse: "validateResponse", writeAllFields: "writeAllFields", assignments: "assignments", assignmentStore: "assignmentStore", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", crudStores: "crudStores", dependencies: "dependencies", dependencyStore: "dependencyStore", events: "events", eventStore: "eventStore", forceSync: "forceSync", id: "id", includeLegacyDataProperties: "includeLegacyDataProperties", isFullyLoaded: "isFullyLoaded", json: "json", loadUrl: "loadUrl", parentId: "parentId", readOnly: "readOnly", remoteChildCount: "remoteChildCount", resources: "resources", resourceStore: "resourceStore", shouldSyncDataOnLoad: "shouldSyncDataOnLoad", stm: "stm", syncApplySequence: "syncApplySequence", syncUrl: "syncUrl", tasks: "tasks", taskStore: "taskStore", timeZone: "timeZone", allChildren: "allChildren", allUnfilteredChildren: "allUnfilteredChildren", descendantCount: "descendantCount", hasGeneratedId: "hasGeneratedId", inlineData: "inlineData", internalId: "internalId", isCommitting: "isCommitting", isCreating: "isCreating", isValid: "isValid", previousSiblingsTotalCount: "previousSiblingsTotalCount", resourceTimeRanges: "resourceTimeRanges", timeRanges: "timeRanges", visibleDescendantCount: "visibleDescendantCount" }, outputs: { onBeforeDestroy: "onBeforeDestroy", onBeforeLoad: "onBeforeLoad", onBeforeLoadApply: "onBeforeLoadApply", onBeforeResponseApply: "onBeforeResponseApply", onBeforeSend: "onBeforeSend", onBeforeSync: "onBeforeSync", onBeforeSyncApply: "onBeforeSyncApply", onCatchAll: "onCatchAll", onChange: "onChange", onDataReady: "onDataReady", onDestroy: "onDestroy", onHasChanges: "onHasChanges", onLoad: "onLoad", onLoadCanceled: "onLoadCanceled", onLoadFail: "onLoadFail", onNoChanges: "onNoChanges", onRequestDone: "onRequestDone", onRequestFail: "onRequestFail", onSync: "onSync", onSyncCanceled: "onSyncCanceled", onSyncDelayed: "onSyncDelayed", onSyncFail: "onSyncFail" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
481
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTaskBoardProjectModelComponent, decorators: [{
482
+ type: Component,
483
+ args: [{
484
+ selector: 'bryntum-task-board-project-model',
485
+ template: ''
486
+ }]
487
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { adjustDurationToDST: [{
488
+ type: Input
489
+ }], assignmentModelClass: [{
490
+ type: Input
491
+ }], assignmentsData: [{
492
+ type: Input
493
+ }], assignmentStoreClass: [{
494
+ type: Input
495
+ }], autoLoad: [{
496
+ type: Input
497
+ }], autoSync: [{
498
+ type: Input
499
+ }], autoSyncTimeout: [{
500
+ type: Input
501
+ }], bubbleEvents: [{
502
+ type: Input
503
+ }], children: [{
504
+ type: Input
505
+ }], dependenciesData: [{
506
+ type: Input
507
+ }], dependencyModelClass: [{
508
+ type: Input
509
+ }], dependencyStoreClass: [{
510
+ type: Input
511
+ }], encoder: [{
512
+ type: Input
513
+ }], eventsData: [{
514
+ type: Input
515
+ }], expanded: [{
516
+ type: Input
517
+ }], ignoreRemoteChangesInSTM: [{
518
+ type: Input
519
+ }], includeChildrenInRemoveRequest: [{
520
+ type: Input
521
+ }], listeners: [{
522
+ type: Input
523
+ }], orderedParentIndex: [{
524
+ type: Input
525
+ }], parentIndex: [{
526
+ type: Input
527
+ }], phantomIdField: [{
528
+ type: Input
529
+ }], phantomParentIdField: [{
530
+ type: Input
531
+ }], resetIdsBeforeSync: [{
532
+ type: Input
533
+ }], resourceModelClass: [{
534
+ type: Input
535
+ }], resourcesData: [{
536
+ type: Input
537
+ }], resourceStoreClass: [{
538
+ type: Input
539
+ }], silenceInitialCommit: [{
540
+ type: Input
541
+ }], skipSuccessProperty: [{
542
+ type: Input
543
+ }], storeIdProperty: [{
544
+ type: Input
545
+ }], supportShortSyncResponse: [{
546
+ type: Input
547
+ }], taskModelClass: [{
548
+ type: Input
549
+ }], tasksData: [{
550
+ type: Input
551
+ }], taskStoreClass: [{
552
+ type: Input
553
+ }], toJSONResultFormat: [{
554
+ type: Input
555
+ }], trackResponseType: [{
556
+ type: Input
557
+ }], transport: [{
558
+ type: Input
559
+ }], useRawData: [{
560
+ type: Input
561
+ }], validateResponse: [{
562
+ type: Input
563
+ }], writeAllFields: [{
564
+ type: Input
565
+ }], assignments: [{
566
+ type: Input
567
+ }], assignmentStore: [{
568
+ type: Input
569
+ }], callOnFunctions: [{
570
+ type: Input
571
+ }], catchEventHandlerExceptions: [{
572
+ type: Input
573
+ }], crudStores: [{
574
+ type: Input
575
+ }], dependencies: [{
576
+ type: Input
577
+ }], dependencyStore: [{
578
+ type: Input
579
+ }], events: [{
580
+ type: Input
581
+ }], eventStore: [{
582
+ type: Input
583
+ }], forceSync: [{
584
+ type: Input
585
+ }], id: [{
586
+ type: Input
587
+ }], includeLegacyDataProperties: [{
588
+ type: Input
589
+ }], isFullyLoaded: [{
590
+ type: Input
591
+ }], json: [{
592
+ type: Input
593
+ }], loadUrl: [{
594
+ type: Input
595
+ }], parentId: [{
596
+ type: Input
597
+ }], readOnly: [{
598
+ type: Input
599
+ }], remoteChildCount: [{
600
+ type: Input
601
+ }], resources: [{
602
+ type: Input
603
+ }], resourceStore: [{
604
+ type: Input
605
+ }], shouldSyncDataOnLoad: [{
606
+ type: Input
607
+ }], stm: [{
608
+ type: Input
609
+ }], syncApplySequence: [{
610
+ type: Input
611
+ }], syncUrl: [{
612
+ type: Input
613
+ }], tasks: [{
614
+ type: Input
615
+ }], taskStore: [{
616
+ type: Input
617
+ }], timeZone: [{
618
+ type: Input
619
+ }], allChildren: [{
620
+ type: Input
621
+ }], allUnfilteredChildren: [{
622
+ type: Input
623
+ }], descendantCount: [{
624
+ type: Input
625
+ }], hasGeneratedId: [{
626
+ type: Input
627
+ }], inlineData: [{
628
+ type: Input
629
+ }], internalId: [{
630
+ type: Input
631
+ }], isCommitting: [{
632
+ type: Input
633
+ }], isCreating: [{
634
+ type: Input
635
+ }], isValid: [{
636
+ type: Input
637
+ }], previousSiblingsTotalCount: [{
638
+ type: Input
639
+ }], resourceTimeRanges: [{
640
+ type: Input
641
+ }], timeRanges: [{
642
+ type: Input
643
+ }], visibleDescendantCount: [{
644
+ type: Input
645
+ }], onBeforeDestroy: [{
646
+ type: Output
647
+ }], onBeforeLoad: [{
648
+ type: Output
649
+ }], onBeforeLoadApply: [{
650
+ type: Output
651
+ }], onBeforeResponseApply: [{
652
+ type: Output
653
+ }], onBeforeSend: [{
654
+ type: Output
655
+ }], onBeforeSync: [{
656
+ type: Output
657
+ }], onBeforeSyncApply: [{
658
+ type: Output
659
+ }], onCatchAll: [{
660
+ type: Output
661
+ }], onChange: [{
662
+ type: Output
663
+ }], onDataReady: [{
664
+ type: Output
665
+ }], onDestroy: [{
666
+ type: Output
667
+ }], onHasChanges: [{
668
+ type: Output
669
+ }], onLoad: [{
670
+ type: Output
671
+ }], onLoadCanceled: [{
672
+ type: Output
673
+ }], onLoadFail: [{
674
+ type: Output
675
+ }], onNoChanges: [{
676
+ type: Output
677
+ }], onRequestDone: [{
678
+ type: Output
679
+ }], onRequestFail: [{
680
+ type: Output
681
+ }], onSync: [{
682
+ type: Output
683
+ }], onSyncCanceled: [{
684
+ type: Output
685
+ }], onSyncDelayed: [{
686
+ type: Output
687
+ }], onSyncFail: [{
688
+ type: Output
689
+ }] } });
690
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS10YXNrLWJvYXJkLXByb2plY3QtbW9kZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50L3NyYy9saWIvYnJ5bnR1bS10YXNrLWJvYXJkLXByb2plY3QtbW9kZWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RDs7R0FFRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWtELE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBRzdDLE9BQU8sRUFBK1EsWUFBWSxFQUE0UixNQUFNLHlCQUF5QixDQUFDOztBQStaOWxCLE1BQU0sT0FBTyxxQ0FBcUM7SUF5TTlDLFlBQVksT0FBbUI7UUFUdkIsa0JBQWEsR0FBRztZQUNwQixLQUFLLEVBQWMsU0FBUztZQUM1QixRQUFRLEVBQVcsU0FBUztZQUM1QixJQUFJLEVBQWUsU0FBUztZQUM1QixnQkFBZ0IsRUFBRyxJQUFJO1lBQ3ZCLFFBQVEsRUFBVyxFQUFFO1lBQ3JCLFNBQVMsRUFBVSxFQUFFO1NBQ3hCLENBQUM7UUFnR0Ysa0JBQWtCO1FBQ2xCOzs7O1dBSUc7UUFDTyxvQkFBZSxHQUFRLElBQUksWUFBWSxFQUE4QyxDQUFDO1FBQ2hHOzs7OztXQUtHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBb0csQ0FBQztRQUNuSjs7Ozs7OztXQU9HO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQXlILENBQUM7UUFDN0s7Ozs7Ozs7V0FPRztRQUNPLDBCQUFxQixHQUFRLElBQUksWUFBWSxFQUFvSSxDQUFDO1FBQzVMOzs7Ozs7Ozs7V0FTRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQThJLENBQUM7UUFDN0w7Ozs7Ozs7V0FPRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQW9HLENB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dGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGZvciBCcnludHVtIFByb2plY3RNb2RlbFxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCBXcmFwcGVySGVscGVyIGZyb20gJy4vd3JhcHBlci5oZWxwZXInO1xuXG5pbXBvcnQgeyBCYXNlLCBNb2RlbCwgTW9kZWxDb25maWcsIFN0YXRlVHJhY2tpbmdNYW5hZ2VyLCBTdGF0ZVRyYWNraW5nTWFuYWdlckNvbmZpZywgU3RvcmUsIFN0b3JlQ29uZmlnIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIEFzc2lnbm1lbnRNb2RlbCwgQXNzaWdubWVudE1vZGVsQ29uZmlnLCBBc3NpZ25tZW50U3RvcmUsIEFzc2lnbm1lbnRTdG9yZUNvbmZpZywgQ3J1ZE1hbmFnZXJTdG9yZURlc2NyaXB0b3IsIERlcGVuZGVuY3lNb2RlbCwgRGVwZW5kZW5jeU1vZGVsQ29uZmlnLCBEZXBlbmRlbmN5U3RvcmUsIERlcGVuZGVuY3lTdG9yZUNvbmZpZywgRXZlbnRNb2RlbCwgRXZlbnRNb2RlbENvbmZpZywgRXZlbnRTdG9yZSwgRXZlbnRTdG9yZUNvbmZpZywgUHJvamVjdE1vZGVsLCBQcm9qZWN0TW9kZWwgYXMgU2NoZWR1bGVyUHJvamVjdE1vZGVsLCBQcm9qZWN0TW9kZWxMaXN0ZW5lcnMsIFJlc291cmNlTW9kZWwsIFJlc291cmNlTW9kZWxDb25maWcsIFJlc291cmNlU3RvcmUsIFJlc291cmNlU3RvcmVDb25maWcsIFJlc291cmNlVGltZVJhbmdlTW9kZWwsIFJlc291cmNlVGltZVJhbmdlTW9kZWxDb25maWcsIFRhc2tNb2RlbCwgVGFza01vZGVsQ29uZmlnLCBUYXNrU3RvcmUsIFRhc2tTdG9yZUNvbmZpZywgVGltZVJhbmdlTW9kZWwsIFRpbWVSYW5nZU1vZGVsQ29uZmlnIH0gZnJvbSAnQGJyeW50dW0vdGFza2JvYXJkLXRoaW4nO1xuXG5pbXBvcnQgeyBTdHJpbmdIZWxwZXIgfSBmcm9tICdAYnJ5bnR1bS9jb3JlLXRoaW4nO1xuXG5leHBvcnQgdHlwZSBCcnludHVtVGFza0JvYXJkUHJvamVjdE1vZGVsUHJvcHMgPSB7XG4gICAgLy8gQ29uZmlnc1xuICAgIC8qKlxuICAgICAqIEEgZmxhZywgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkYXRlcyBhbmQgZHVyYXRpb24gY2FsY3VsYXRpb25zIHNob3VsZCBhZGp1c3QgdGhlIHJlc3VsdCB0byBEU1QgdGltZSBzaGlmdC5cbiAgICAgKi9cbiAgICBhZGp1c3REdXJhdGlvblRvRFNUID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBhc3NpZ25tZW50IG1vZGVsIGNsYXNzLCB0byBiZSB1c2VkIGluIHRoZSBwcm9qZWN0LiBXaWxsIGJlIHNldCBhcyB0aGVcbiAgICAgKiBbbW9kZWxDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1tb2RlbENsYXNzKSBwcm9wZXJ0eSBvZiB0aGUgW2Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWFzc2lnbm1lbnRTdG9yZSlcbiAgICAgKi9cbiAgICBhc3NpZ25tZW50TW9kZWxDbGFzcyA/IDogdHlwZW9mIEFzc2lnbm1lbnRNb2RlbFxuICAgIC8qKlxuICAgICAqIERhdGEgdXNlIHRvIGZpbGwgdGhlIFthc3NpZ25tZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbQXNzaWdubWVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvQXNzaWdubWVudE1vZGVsKSBvciBpdHMgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRzID8gOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBpbml0aWFsIGRhdGEsIHRvIGZpbGwgdGhlIFthc3NpZ25tZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGFuIGFycmF5IG9mIFtBc3NpZ25tZW50TW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Bc3NpZ25tZW50TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uXG4gICAgICogb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW2Fzc2lnbm1lbnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWFzc2lnbm1lbnRzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgYXNzaWdubWVudHNEYXRhID8gOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIEFuIFtBc3NpZ25tZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvQXNzaWdubWVudFN0b3JlKSBpbnN0YW5jZSBvciBhIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgYXNzaWdubWVudFN0b3JlID8gOiBBc3NpZ25tZW50U3RvcmV8QXNzaWdubWVudFN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBhc3NpZ25tZW50IHN0b3JlIGluc3RhbmNlIHdpdGguIFNob3VsZCBiZSBhIGNsYXNzLCBzdWJjbGFzc2luZyB0aGVcbiAgICAgKiBbQXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL0Fzc2lnbm1lbnRTdG9yZSlcbiAgICAgKi9cbiAgICBhc3NpZ25tZW50U3RvcmVDbGFzcyA/IDogdHlwZW9mIEFzc2lnbm1lbnRTdG9yZXxvYmplY3RcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNhbGwgW2xvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIG1ldGhvZCBvbiB0aGUgbmV4dCBmcmFtZSBhZnRlciBjcmVhdGlvbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctYXV0b0xvYWQpXG4gICAgICovXG4gICAgYXV0b0xvYWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBwZXJzaXN0IHN0b3JlIGNoYW5nZXMgYWZ0ZXIgZWRpdHMgYXJlIG1hZGUgaW4gYW55IG9mIHRoZSBzdG9yZXMgbW9uaXRvcmVkLlxuICAgICAqIFBsZWFzZSBub3RlIHRoYXQgc3luYyByZXF1ZXN0IHdpbGwgbm90IGJlIGludm9rZWQgaW1tZWRpYXRlbHkgYnV0IG9ubHkgYWZ0ZXJcbiAgICAgKiBbYXV0b1N5bmNUaW1lb3V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNjb25maWctYXV0b1N5bmNUaW1lb3V0KSBpbnRlcnZhbC5cbiAgICAgKi9cbiAgICBhdXRvU3luYyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBwZXJzaXN0aW5nIGNoYW5nZXMgdG8gdGhlIHNlcnZlci5cbiAgICAgKiBVc2VkIHdoZW4gW2F1dG9TeW5jXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNjb25maWctYXV0b1N5bmMpIGlzIHNldCB0byBgdHJ1ZWAuXG4gICAgICovXG4gICAgYXV0b1N5bmNUaW1lb3V0ID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hlcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0ZSB3aGljaCBldmVudHMgc2hvdWxkIGJ1YmJsZSB1cCB0aGUgb3duZXJzaGlwXG4gICAgICogaGllcmFyY2h5IHdoZW4gdHJpZ2dlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1idWJibGVFdmVudHMpXG4gICAgICovXG4gICAgYnViYmxlRXZlbnRzID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGNhbGwgb25YWFggbWV0aG9kIG5hbWVzIChlLmcuIGBvblNob3dgLCBgb25DbGlja2ApLCBhcyBhbiBlYXN5IHdheSB0byBsaXN0ZW4gZm9yIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY2FsbE9uRnVuY3Rpb25zKVxuICAgICAqL1xuICAgIGNhbGxPbkZ1bmN0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGlmIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIGVycm9yIHByb3BhZ2F0ZXMgdXAgdGhlIHN0YWNrIGFuZCB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0ZSBpcyB1bmRlZmluZWQuIENvZGUgd2hpY2ggZm9sbG93cyB0aGUgZXZlbnQgaGFuZGxlciB3aWxsICpub3QqIGJlIGV4ZWN1dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1jYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMpXG4gICAgICovXG4gICAgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ2hpbGQgbm9kZXMuIFRvIGFsbG93IGxvYWRpbmcgY2hpbGRyZW4gb24gZGVtYW5kLCBzcGVjaWZ5IGBjaGlsZHJlbiA6IHRydWVgIGluIHlvdXIgZGF0YS4gT21pdCB0aGUgZmllbGQgZm9yIGxlYWZcbiAgICAgKiB0YXNrcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY2hpbGRyZW4pXG4gICAgICovXG4gICAgY2hpbGRyZW4gPyA6IGJvb2xlYW58b2JqZWN0W118TW9kZWxbXXxNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBvZiBzdG9yZXMgY29udHJvbGxlZCBieSB0aGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1jcnVkU3RvcmVzKVxuICAgICAqL1xuICAgIGNydWRTdG9yZXMgPyA6IFN0b3JlW118c3RyaW5nW118Q3J1ZE1hbmFnZXJTdG9yZURlc2NyaXB0b3JbXXxTdG9yZUNvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogRGF0YSB1c2UgdG8gZmlsbCB0aGUgW2RlcGVuZGVuY3lTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWRlcGVuZGVuY3lTdG9yZSkuIFNob3VsZCBiZSBhbiBhcnJheSBvZlxuICAgICAqIFtEZXBlbmRlbmN5TW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9EZXBlbmRlbmN5TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzID8gOiBEZXBlbmRlbmN5TW9kZWxbXXxEZXBlbmRlbmN5TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBpbml0aWFsIGRhdGEsIHRvIGZpbGwgdGhlIFtkZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1kZXBlbmRlbmN5U3RvcmUpIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGFuIGFycmF5IG9mIFtEZXBlbmRlbmN5TW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9EZXBlbmRlbmN5TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uXG4gICAgICogb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW2RlcGVuZGVuY2llc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1kZXBlbmRlbmNpZXMpIGluc3RlYWRcbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXNEYXRhID8gOiBEZXBlbmRlbmN5TW9kZWxbXXxEZXBlbmRlbmN5TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZGVwZW5kZW5jeSBtb2RlbCBjbGFzcywgdG8gYmUgdXNlZCBpbiB0aGUgcHJvamVjdC4gV2lsbCBiZSBzZXQgYXMgdGhlXG4gICAgICogW21vZGVsQ2xhc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctbW9kZWxDbGFzcykgcHJvcGVydHkgb2YgdGhlIFtkZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1kZXBlbmRlbmN5U3RvcmUpXG4gICAgICovXG4gICAgZGVwZW5kZW5jeU1vZGVsQ2xhc3MgPyA6IHR5cGVvZiBEZXBlbmRlbmN5TW9kZWxcbiAgICAvKipcbiAgICAgKiBBIFtEZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvRGVwZW5kZW5jeVN0b3JlKSBpbnN0YW5jZSBvciBhIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgZGVwZW5kZW5jeVN0b3JlID8gOiBEZXBlbmRlbmN5U3RvcmV8RGVwZW5kZW5jeVN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIGRlcGVuZGVuY3kgc3RvcmUgaW5zdGFuY2Ugd2l0aC4gU2hvdWxkIGJlIGEgY2xhc3MsIHN1YmNsYXNzaW5nIHRoZVxuICAgICAqIFtEZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvRGVwZW5kZW5jeVN0b3JlKVxuICAgICAqL1xuICAgIGRlcGVuZGVuY3lTdG9yZUNsYXNzID8gOiB0eXBlb2YgRGVwZW5kZW5jeVN0b3JlfG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gb2YgdGhlIEpTT04gZW5jb2RlciB1c2VkIGJ5IHRoZSAqQ3J1ZCBNYW5hZ2VyKi5cbiAgICAgKi9cbiAgICBlbmNvZGVyID8gOiB7XG4gICAgICAgIHJlcXVlc3REYXRhPzogb2JqZWN0XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERhdGEgdXNlIHRvIGZpbGwgdGhlIFtldmVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktZXZlbnRTdG9yZSkuIFNob3VsZCBiZSBhbiBhcnJheSBvZlxuICAgICAqIFtFdmVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvRXZlbnRNb2RlbCkgb3IgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKi9cbiAgICBldmVudHMgPyA6IEV2ZW50TW9kZWxbXXxFdmVudE1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbZXZlbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWV2ZW50U3RvcmUpIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGFuIGFycmF5IG9mIFtFdmVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvRXZlbnRNb2RlbCkgb3IgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW2V2ZW50c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1ldmVudHMpIGluc3RlYWRcbiAgICAgKi9cbiAgICBldmVudHNEYXRhID8gOiBFdmVudE1vZGVsW118RXZlbnRNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogQW4gW0V2ZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvRXZlbnRTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGV2ZW50U3RvcmUgPyA6IEV2ZW50U3RvcmV8RXZlbnRTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFN0YXJ0IGV4cGFuZGVkIG9yIG5vdCAob25seSB2YWxpZCBmb3IgdHJlZSBkYXRhKVxuICAgICAqL1xuICAgIGV4cGFuZGVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhcyBgdHJ1ZWAgdG8gZm9yY2Ugc3luYyByZXF1ZXN0cyB0byBiZSBzZW50IHdoZW4gY2FsbGluZyBgc3luYygpYCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbG9jYWxcbiAgICAgKiBjaGFuZ2VzLiBVc2VmdWwgaW4gYSBwb2xsaW5nIHNjZW5hcmlvLCB0byBrZWVwIGNsaWVudCB1cCB0byBkYXRlIHdpdGggdGhlIGJhY2tlbmQuXG4gICAgICovXG4gICAgZm9yY2VTeW5jID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZWNvcmQuIE1pZ2h0IGJlIG1hcHBlZCB0byBhbm90aGVyIGRhdGFTb3VyY2UgdXNpbmcgaWRGaWVsZCwgYnV0IGFsd2F5cyBleHBvc2VkIGFzXG4gICAgICogcmVjb3JkLmlkLiBXaWxsIGdldCBhIGdlbmVyYXRlZCB2YWx1ZSBpZiBub25lIGlzIHNwZWNpZmllZCBpbiByZWNvcmRzIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWlkKVxuICAgICAqL1xuICAgIGlkID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtYWtlIFNUTSBpZ25vcmUgY2hhbmdlcyBjb21pbmcgZnJvbSB0aGUgYmFja2VuZC4gVGhpcyB3aWxsIGFsbG93IHVzZXIgdG8gb25seSB1bmRvIHJlZG9cbiAgICAgKiBsb2NhbCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGlnbm9yZVJlbW90ZUNoYW5nZXNJblNUTSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG9ubHkgaW5jbHVkZSB0aGUgaWQgb2YgYSByZW1vdmVkIHBhcmVudCBub2RlIGluIHRoZSByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kIChhbHNvXG4gICAgICogYWZmZWN0cyBwcm9ncmFtbWF0aWMgY2FsbHMgdG8gZ2V0IFtjaGFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNwcm9wZXJ0eS1jaGFuZ2VzKSBldGMuKSwgYW5kIG5vdCB0aGUgaWRzIG9mIGl0cyBjaGlsZHJlbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctaW5jbHVkZUNoaWxkcmVuSW5SZW1vdmVSZXF1ZXN0KVxuICAgICAqL1xuICAgIGluY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBsZWdhY3kgZGF0YSBwcm9wZXJ0aWVzIGluIHRoZSBKU09OIC8gaW5saW5lRGF0YSBvdXRwdXQuIFRoZSBsZWdhY3kgZGF0YSBwcm9wZXJ0aWVzIGFyZVxuICAgICAqIHRoZSBgeHhEYXRhYCAoYGV2ZW50c0RhdGFgLCBgcmVzb3VyY2VzRGF0YWAgZXRjLikgcHJvcGVydGllcyB0aGF0IGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW5cbiAgICAgKiB0aGUgZnV0dXJlLlxuICAgICAqIEBkZXByZWNhdGVkIDYuMy4wIFRoaXMgY29uZmlnIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoZSBldmVudHNEYXRhLCByZXNvdXJjZXNEYXRhIGV0Yy4gcHJvcGVydGllcyBhcmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqL1xuICAgIGluY2x1ZGVMZWdhY3lEYXRhUHJvcGVydGllcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgYWRkZWQgdG8gdGhlIGNsYXNzIGF0IHJ1bnRpbWUgd2hlbiB0aGUgU3RvcmUgaXMgY29uZmlndXJlZCB3aXRoXG4gICAgICogW2xhenlMb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUjY29uZmlnLWxhenlMb2FkKS4gSWYgc2V0IG9uIGEgcGFyZW50IHJlY29yZCBhdCBsb2FkIHRpbWUsIHRoYXQgcGFyZW50IHdpbGwgbm90IGNhdXNlIGFueVxuICAgICAqIG1vcmUgY2hpbGQgbG9hZCByZXF1ZXN0cy4gSWYgb21pdHRlZCwgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNldCB0byBgdHJ1ZWAgd2hlbiBhIGxvYWQgcmVxdWVzdCByZWNlaXZlcyBmZXdlclxuICAgICAqIGNoaWxkIHJlY29yZHMgdGhhbiByZXF1ZXN0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWlzRnVsbHlMb2FkZWQpXG4gICAgICovXG4gICAgaXNGdWxseUxvYWRlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFByb2plY3QgZGF0YSBhcyBhIEpTT04gc3RyaW5nLCB1c2VkIHRvIHBvcHVsYXRlIGl0cyBzdG9yZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWpzb24pXG4gICAgICovXG4gICAganNvbiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3RlbmVyIHNldCBmb3IgdGhpcyBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWxpc3RlbmVycylcbiAgICAgKi9cbiAgICBsaXN0ZW5lcnMgPyA6IFByb2plY3RNb2RlbExpc3RlbmVyc1xuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0Y3V0IHRvIHNldCBvbmx5IHRoZSB1cmwgdG8gbG9hZCBmcm9tLCB3aGVuIHlvdSBkbyBub3QgbmVlZCB0byBzdXBwbHkgYW55IG90aGVyIGNvbmZpZ1xuICAgICAqIG9wdGlvbnMgaW4gdGhlIGBsb2FkYCBzZWN0aW9uIG9mIHRoZSBgdHJhbnNwb3J0YCBjb25maWcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWxvYWRVcmwpXG4gICAgICovXG4gICAgbG9hZFVybCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIHJlYWQtb25seSBmaWVsZCBwcm92aWRlZCBpbiBzZXJ2ZXIgc3luY2hyb25pemF0aW9uIHBhY2tldHMgdG8gc3BlY2lmeVxuICAgICAqIHdoaWNoIHBvc2l0aW9uIHRoZSBub2RlIHRha2VzIGluIHRoZSBwYXJlbnQncyBvcmRlcmVkIGNoaWxkcmVuIGFycmF5LlxuICAgICAqIFRoaXMgaW5kZXggaXMgc2V0IG9uIGxvYWQgYW5kIGdldHMgdXBkYXRlZCBvbiByZW9yZGVyaW5nIG5vZGVzIGluIHRyZWUuIFNvcnRpbmcgYW5kIGZpbHRlcmluZ1xuICAgICAqIGhhdmUgbm8gZWZmZWN0IG9uIGl0LlxuICAgICAqL1xuICAgIG9yZGVyZWRQYXJlbnRJbmRleCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIHJlYWQtb25seSBmaWVsZCBwcm92aWRlZCBpbiBzZXJ2ZXIgc3luY2hyb25pemF0aW9uIHBhY2tldHMgdG8gc3BlY2lmeVxuICAgICAqIHdoaWNoIHJlY29yZCBpZCBpcyB0aGUgcGFyZW50IG9mIHRoZSByZWNvcmQuXG4gICAgICovXG4gICAgcGFyZW50SWQgPyA6IHN0cmluZ3xudW1iZXJ8bnVsbFxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSByZWFkLW9ubHkgZmllbGQgcHJvdmlkZWQgaW4gc2VydmVyIHN5bmNocm9uaXphdGlvbiBwYWNrZXRzIHRvIHNwZWNpZnlcbiAgICAgKiB3aGljaCBwb3NpdGlvbiB0aGUgbm9kZSB0YWtlcyBpbiB0aGUgcGFyZW50J3MgY2hpbGRyZW4gYXJyYXkuXG4gICAgICogVGhpcyBpbmRleCBpcyBzZXQgb24gbG9hZCBhbmQgZ2V0cyB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgcm93IHJlb3JkZXJpbmcsIHNvcnRpbmcsIGV0Yy5cbiAgICAgKiBUbyBzYXZlIHRoZSBvcmRlciwgbmVlZCB0byBwZXJzaXN0IHRoZSBmaWVsZCBvbiB0aGUgc2VydmVyIGFuZCB3aGVuIGRhdGEgaXMgZmV0Y2hlZCB0byBiZSBsb2FkZWQsXG4gICAgICogbmVlZCB0byBzb3J0IGJ5IHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgcGFyZW50SW5kZXggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIEZpZWxkIG5hbWUgdG8gYmUgdXNlZCB0byB0cmFuc2ZlciBhIHBoYW50b20gcmVjb3JkIGlkZW50aWZpZXIuXG4gICAgICovXG4gICAgcGhhbnRvbUlkRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEZpZWxkIG5hbWUgdG8gYmUgdXNlZCB0byB0cmFuc2ZlciBhIHBoYW50b20gcGFyZW50IHJlY29yZCBpZGVudGlmaWVyLlxuICAgICAqL1xuICAgIHBoYW50b21QYXJlbnRJZEZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBGbGFnIHRoZSByZWNvcmQgYXMgcmVhZC1vbmx5IG9uIHRoZSBVSSBsZXZlbCwgcHJldmVudGluZyB0aGUgZW5kIHVzZXIgZnJvbSBtYW5pcHVsYXRpbmcgaXQgdXNpbmcgZWRpdGluZ1xuICAgICAqIGZlYXR1cmVzIHN1Y2ggYXMgY2VsbCBlZGl0aW5nIGFuZCBldmVudCBkcmFnZ2luZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctcmVhZE9ubHkpXG4gICAgICovXG4gICAgcmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIGFkZGVkIHRvIHRoZSBjbGFzcyBhdCBydW50aW1lIHdoZW4gdGhlIFN0b3JlIGlzIGNvbmZpZ3VyZWQgd2l0aFxuICAgICAqIFtsYXp5TG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1sYXp5TG9hZCkuIFRoZVxuICAgICAqIG51bWJlciBzcGVjaWZpZWQgc2hvdWxkIHJlZmxlY3QgdGhlIDxzdHJvbmc+dG90YWw8L3N0cm9uZz4gYW1vdW50IG9mIGNoaWxkcmVuIG9mIGEgcGFyZW50IG5vZGUsIGluY2x1ZGluZyBuZXN0ZWQgZGVzY2VuZGFudHMuXG4gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgcmVhZCB0aGUgW2d1aWRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9ndWlkZS9HcmlkL2RhdGEvbGF6eWxvYWRpbmcpIHRvIGZpbmQgb3V0IGlmIHlvdXIgYXBwIG5lZWRzIHRvIHVzZSB0aGUgbmV3IFtpc0Z1bGx5TG9hZGVkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvbWl4aW4vVHJlZU5vZGUjZmllbGQtaXNGdWxseUxvYWRlZCkgZmllbGQuXG4gICAgICovXG4gICAgcmVtb3RlQ2hpbGRDb3VudCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogYFRydWVgIHRvIHJlc2V0IGlkZW50aWZpZXJzIChkZWZpbmVkIGJ5IGBpZEZpZWxkYCBjb25maWcpIG9mIHBoYW50b20gcmVjb3JkcyBiZWZvcmUgc3VibWl0dGluZyB0aGVtXG4gICAgICogdG8gdGhlIHNlcnZlci5cbiAgICAgKi9cbiAgICByZXNldElkc0JlZm9yZVN5bmMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlc291cmNlIG1vZGVsIGNsYXNzLCB0byBiZSB1c2VkIGluIHRoZSBwcm9qZWN0LiBXaWxsIGJlIHNldCBhcyB0aGVcbiAgICAgKiBbbW9kZWxDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1tb2RlbENsYXNzKSBwcm9wZXJ0eSBvZiB0aGUgW3Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1yZXNvdXJjZVN0b3JlKVxuICAgICAqL1xuICAgIHJlc291cmNlTW9kZWxDbGFzcyA/IDogdHlwZW9mIFJlc291cmNlTW9kZWxcbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbcmVzb3VyY2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXJlc291cmNlU3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbUmVzb3VyY2VNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgcmVzb3VyY2VzID8gOiBSZXNvdXJjZU1vZGVsW118UmVzb3VyY2VNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGF0YSwgdG8gZmlsbCB0aGUgW3Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1yZXNvdXJjZVN0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbUmVzb3VyY2VNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICogQGRlcHJlY2F0ZWQgNi4zLjAgVXNlIFtyZXNvdXJjZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctcmVzb3VyY2VzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgcmVzb3VyY2VzRGF0YSA/IDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIEEgW1Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvUmVzb3VyY2VTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIHJlc291cmNlU3RvcmUgPyA6IFJlc291cmNlU3RvcmV8UmVzb3VyY2VTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSByZXNvdXJjZSBzdG9yZSBpbnN0YW5jZSB3aXRoLiBTaG91bGQgYmUgYSBjbGFzcywgc3ViY2xhc3NpbmcgdGhlXG4gICAgICogW1Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvUmVzb3VyY2VTdG9yZSlcbiAgICAgKi9cbiAgICByZXNvdXJjZVN0b3JlQ2xhc3MgPyA6IHR5cGVvZiBSZXNvdXJjZVN0b3JlfG9iamVjdFxuICAgIC8qKlxuICAgICAqIEV4cGVyaW1lbnRhbCBob29rIHRoYXQgbGV0cyB0aGUgYXBwIGRldGVybWluZSBpZiBhIGJvdW5kIGRhdGFzZXQgbmVlZHMgc3luY2luZyB3aXRoIHRoZSBzdG9yZSBvciBub3QsIGFuZFxuICAgICAqIGlmIGl0IGRvZXMgLSB3aGljaCByZWNvcmRzIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4gT25seSBjYWxsZWQgZm9yIHN0b3JlcyB0aGF0IGFyZSBjb25maWd1cmVkIHdpdGhcbiAgICAgKiBgc3luY0RhdGFPbkxvYWQ6IHRydWVgICh3aGljaCBpcyB0aGUgZGVmYXVsdCBpbiB0aGUgUmVhY3QsIEFuZ3VsYXIgYW5kIFZ1ZSB3cmFwcGVycykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXNob3VsZFN5bmNEYXRhT25Mb2FkKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgcGFzc2VkIGJ5IHRoZSBzdG9yZSB0byB0aGlzIGhvb2tcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5TdG9yZX0gb3B0aW9ucy5zdG9yZSBTdG9yZSBhYm91dCB0byBiZSBzeW5jZWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gb3B0aW9ucy5yZWNvcmRzIFJlY29yZHMgY3VycmVudGx5IGluIHRoZSBzdG9yZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IG9wdGlvbnMuZGF0YSBJbmNvbWluZyBkYXRhXG4gICAgICogQHJldHVybnMge1NldDxhbnk+LGJvb2xlYW59IFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIHN0b3JlIGZyb20gc3luY2luZywgb3IgYSBzZXQgb2YgcmVjb3JkIGlkcyB0aGF0IG5lZWQgZnVydGhlciBwcm9jZXNzaW5nIChmb3IgcmVjb3JkcyB0aGF0IGhhcyBzb21lIGtpbmQgb2YgY2hhbmdlLCBlZy4gYW4gdXBkYXRlLCByZW1vdmFsIG9yIGFkZGl0aW9uKVxuICAgICAqL1xuICAgIHNob3VsZFN5bmNEYXRhT25Mb2FkID8gOiAob3B0aW9uczogeyBzdG9yZTogU3RvcmUsIHJlY29yZHM6IE1vZGVsLCBkYXRhOiBvYmplY3RbXSB9KSA9PiBTZXQ8YW55Pnxib29sZWFuXG4gICAgLyoqXG4gICAgICogU2lsZW5jZXMgcHJvcGFnYXRpb25zIGNhdXNlZCBieSB0aGUgcHJvamVjdCBsb2FkaW5nLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zaWxlbmNlSW5pdGlhbENvbW1pdClcbiAgICAgKi9cbiAgICBzaWxlbmNlSW5pdGlhbENvbW1pdCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgIHRyZWF0cyBwYXJzZWQgcmVzcG9uc2VzIHdpdGhvdXQgYHN1Y2Nlc3NgIHByb3BlcnR5IGFzIHN1Y2Nlc3NmdWwuXG4gICAgICogSW4gdGhpcyBtb2RlIGEgcGFyc2VkIHJlc3BvbnNlIGlzIHRyZWF0ZWQgYXMgaW52YWxpZCBpZiBpdCBoYXMgZXhwbGljaXRseSBzZXQgYHN1Y2Nlc3MgOiBmYWxzZWAuXG4gICAgICovXG4gICAgc2tpcFN1Y2Nlc3NQcm9wZXJ0eSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBwcm92aWRlIHRvIHRoZSBTVE0gbWFuYWdlclxuICAgICAqL1xuICAgIHN0bSA/IDogU3RhdGVUcmFja2luZ01hbmFnZXJDb25maWd8U3RhdGVUcmFja2luZ01hbmFnZXJcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGEgc3RvcmUgcHJvcGVydHkgdG8gcmV0cmlldmUgc3RvcmUgaWRlbnRpZmllcnMgZnJvbS4gTWFrZSBzdXJlIHlvdSBoYXZlIGFuIGluc3RhbmNlIG9mIGFcbiAgICAgKiBzdG9yZSB0byB1c2UgaXQgYnkgaWQuIFN0b3JlIGlkZW50aWZpZXIgaXMgdXNlZCBhcyBhIGNvbnRhaW5lciBuYW1lIGhvbGRpbmcgY29ycmVzcG9uZGluZyBzdG9yZSBkYXRhXG4gICAgICogd2hpbGUgdHJhbnNmZXJyaW5nIHRoZW0gdG8vZnJvbSB0aGUgc2VydmVyLiBCeSBkZWZhdWx0LCBgaWRgIHByb3BlcnR5IGlzIHVzZWQuIEFuZCBpbiBjYXNlIGFcbiAgICAgKiBjb250YWluZXIgaWRlbnRpZmllciBoYXMgdG8gZGlmZmVyIHRoaXMgY29uZmlnIGNhbiBiZSB1c2VkOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zdG9yZUlkUHJvcGVydHkpXG4gICAgICovXG4gICAgc3RvcmVJZFByb3BlcnR5ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCB0aGUgQ3J1ZCBNYW5hZ2VyIGRvZXMgbm90IHJlcXVpcmUgYWxsIHVwZGF0ZWQgYW5kIHJlbW92ZWQgcmVjb3JkcyB0byBiZSBtZW50aW9uZWQgaW4gdGhlXG4gICAgICogKnN5bmMqIHJlc3BvbnNlLiBJbiB0aGlzIGNhc2UgcmVzcG9uc2Ugc2hvdWxkIGluY2x1ZGUgb25seSBzZXJ2ZXIgc2lkZSBjaGFuZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zdXBwb3J0U2hvcnRTeW5jUmVzcG9uc2UpXG4gICAgICovXG4gICAgc3VwcG9ydFNob3J0U3luY1Jlc3BvbnNlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygc3RvcmUgaWRlbnRpZmllcnMgc2V0cyBhbiBhbHRlcm5hdGl2ZSBzeW5jIHJlc3BvbnNlcyBhcHBseSBvcmRlci5cbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgb3JkZXIgaW4gd2hpY2ggc3luYyByZXNwb25zZXMgYXJlIGFwcGxpZWQgdG8gdGhlIHN0b3JlcyBpcyB0aGUgc2FtZSBhcyB0aGV5XG4gICAgICogcmVnaXN0ZXJlZCBpbi4gQnV0IGluIGNhc2Ugb2Ygc29tZSB0cmlja3kgZGVwZW5kZW5jaWVzIGJldHdlZW4gc3RvcmVzIHRoaXMgb3JkZXIgY2FuIGJlIGNoYW5nZWQ6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXN5bmNBcHBseVNlcXVlbmNlKVxuICAgICAqL1xuICAgIHN5bmNBcHBseVNlcXVlbmNlID8gOiBzdHJpbmdbXXxDcnVkTWFuYWdlclN0b3JlRGVzY3JpcHRvcltdXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2hvcnRjdXQgdG8gc2V0IG9ubHkgdGhlIHVybCB0byBzeW5jIHRvLCB3aGVuIHlvdSBkbyBub3QgbmVlZCB0byBzdXBwbHkgYW55IG90aGVyIGNvbmZpZ1xuICAgICAqIG9wdGlvbnMgaW4gdGhlIGBzeW5jYCBzZWN0aW9uIG9mIHRoZSBgdHJhbnNwb3J0YCBjb25maWcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXN5bmNVcmwpXG4gICAgICovXG4gICAgc3luY1VybCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSB0YXNrIG1vZGVsIGNsYXNzLCB0byBiZSB1c2VkIGluIHRoZSBwcm9qZWN0LlxuICAgICAqIFdpbGwgYmUgc2V0IGFzIHRoZSBbbW9kZWxDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1tb2RlbENsYXNzKVxuICAgICAqIHByb3BlcnR5IG9mIHRoZSBbdGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXRhc2tTdG9yZSkuXG4gICAgICovXG4gICAgdGFza01vZGVsQ2xhc3MgPyA6IHR5cGVvZiBUYXNrTW9kZWxcbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbdGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXRhc2tTdG9yZSkgd2l0aC4gU2hvdWxkIGJlIGFuIGFycmF5IG9mXG4gICAgICogW1Rhc2tNb2RlbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Rhc2tNb2RlbCkgb3IgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKi9cbiAgICB0YXNrcyA/IDogVGFza01vZGVsW118VGFza01vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbdGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXRhc2tTdG9yZSkgd2l0aC5cbiAgICAgKiBTaG91bGQgYmUgYW4gYXJyYXkgb2YgW1Rhc2tNb2RlbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Rhc2tNb2RlbCkgaW5zdGFuY2VzIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICogQGRlcHJlY2F0ZWQgNi4zLjAgVXNlIFt0YXNrc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdGFza3MpIGluc3RlYWRcbiAgICAgKi9cbiAgICB0YXNrc0RhdGEgPyA6IFRhc2tNb2RlbFtdfFRhc2tNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogQW4gW1Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3N0b3JlL1Rhc2tTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIHRhc2tTdG9yZSA/IDogVGFza1N0b3JlQ29uZmlnfFRhc2tTdG9yZVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSB0YXNrIHN0b3JlIGluc3RhbmNlIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGEgY2xhc3MsIHN1YmNsYXNzaW5nIHRoZSBbVGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvc3RvcmUvVGFza1N0b3JlKS5cbiAgICAgKi9cbiAgICB0YXNrU3RvcmVDbGFzcyA/IDogdHlwZW9mIFRhc2tTdG9yZVxuICAgIC8qKlxuICAgICAqIFNldCB0byBhIElBTkEgdGltZSB6b25lIChpLmUuIGBFdXJvcGUvU3RvY2tob2xtYCkgb3IgYSBVVEMgb2Zmc2V0IGluIG1pbnV0ZXMgKGkuZS4gYC0xMjBgKS4gVGhpcyB3aWxsXG4gICAgICogY29udmVydCBhbGwgZXZlbnRzLCB0YXNrcyBhbmQgdGltZSByYW5nZXMgdG8gdGhlIHNwZWNpZmllZCB0aW1lIHpvbmUgb3Igb2Zmc2V0LiBJdCB3aWxsIGFsc28gYWZmZWN0IHRoZVxuICAgICAqIGRpc3BsYXllZCB0aW1lbGluZSdzIGhlYWRlcnMgYXMgd2VsbCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlIG9mIGl0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy10aW1lWm9uZSlcbiAgICAgKi9cbiAgICB0aW1lWm9uZSA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiBbdG9KU09OXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9taXhpbi9Qcm9qZWN0TW9kZWxDb21tb24jZnVuY3Rpb24tdG9KU09OKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdG9KU09OUmVzdWx0Rm9ybWF0KVxuICAgICAqL1xuICAgIHRvSlNPTlJlc3VsdEZvcm1hdCA/IDogJ2lubGluZURhdGEnfCdtb2RlbCdcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCBmb3JjZXMgdGhlIENSVUQgbWFuYWdlciB0byBwcm9jZXNzIHJlc3BvbnNlcyBkZXBlbmRpbmcgb24gdGhlaXIgYHR5cGVgIGF0dHJpYnV0ZS5cbiAgICAgKiBTbyBgbG9hZGAgcmVxdWVzdCBtYXkgYmUgcmVzcG9uZGVkIHdpdGggYHN5bmNgIHJlc3BvbnNlIGZvciBleGFtcGxlLlxuICAgICAqIENhbiBiZSB1c2VkIGZvciBzbWFydCBzZXJ2ZXIgbG9naWMgYWxsb3dpbmcgdGhlIHNlcnZlciB0byBkZWNpZGUgd2hlbiBpdCdzIGJldHRlciB0byByZXNwb25kIHdpdGggYVxuICAgICAqIGNvbXBsZXRlIGRhdGEgc2V0IChgbG9hZGAgcmVzcG9uc2UpIG9yIGl0J3MgZW5vdWdoIHRvIHJldHVybiBqdXN0IGEgZGVsdGEgKGBzeW5jYCByZXNwb25zZSkuXG4gICAgICovXG4gICAgdHJhY2tSZXNwb25zZVR5cGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIG9mIHRoZSBBSkFYIHJlcXVlc3RzIHVzZWQgYnkgKkNydWQgTWFuYWdlciogdG8gY29tbXVuaWNhdGUgd2l0aCBhIHNlcnZlci1zaWRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy10cmFuc3BvcnQpXG4gICAgICovXG4gICAgdHJhbnNwb3J0ID8gOiB7XG4gICAgICAgIGxvYWQ/OiBvYmplY3RcbiAgICAgICAgc3luYz86IG9iamVjdFxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgc3RvcmVzIG9mIGEgcHJvamVjdCB1c2UgdGhlIHJhdyBkYXRhIG9iamVjdHMgcGFzc2VkIHRvIHRoZW0gYXMgdGhlIGRhdGEgc291cmNlIGZvciB0aGVpclxuICAgICAqIHJlY29yZHMgaWYgZGF0YSBpcyBsb2FkZWQgcmVtb3RlbHkgKHVzaW5nIGFuIGBBamF4U3RvcmVgIG9yIGEgYENydWRNYW5hZ2VyYCkuIEZvciBkYXRhIHN1cHBsaWVkIGlubGluZSxcbiAgICAgKiB0aGUgZGF0YSBvYmplY3RzIGFyZSBpbnN0ZWFkIGJ5IGRlZmF1bHQgY2xvbmVkIHRvIGF2b2lkIHRoZSBvcmlnaW5hbCBkYXRhIG9iamVjdCBiZWluZyBtb2RpZmllZCBieSB0aGVcbiAgICAgKiBzdG9yZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdXNlUmF3RGF0YSlcbiAgICAgKi9cbiAgICB1c2VSYXdEYXRhID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgdmFsaWRhdGVzIHRoZSByZXNwb25zZSBzdHJ1Y3R1cmUgZm9yIHJlcXVlc3RzIG1hZGUgYnkgdGhlIENydWQgTWFuYWdlci5cbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIENydWQgTWFuYWdlciBjaGVja3MgZXZlcnkgcGFyc2VkIHJlc3BvbnNlIHN0cnVjdHVyZSBmb3IgZXJyb3JzXG4gICAgICogYW5kIGlmIHRoZSByZXNwb25zZSBmb3JtYXQgaXMgaW52YWxpZCwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgYnJvd3NlciBjb25zb2xlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy12YWxpZGF0ZVJlc3BvbnNlKVxuICAgICAqL1xuICAgIHZhbGlkYXRlUmVzcG9uc2UgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgdG8gd3JpdGUgYWxsIGZpZWxkcyBmcm9tIHRoZSByZWNvcmQgdG8gdGhlIHNlcnZlci5cbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCBpdCB3aWxsIG9ubHkgc2VuZCB0aGUgZmllbGRzIHRoYXQgd2VyZSBtb2RpZmllZC5cbiAgICAgKiBOb3RlIHRoYXQgYW55IGZpZWxkcyB0aGF0IGhhdmUgW3BlcnNpc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9maWVsZC9EYXRhRmllbGQjY29uZmlnLXBlcnNpc3QpIHNldCB0byBgZmFsc2VgIHdpbGxcbiAgICAgKiBzdGlsbCBiZSBpZ25vcmVkIGFuZCBmaWVsZHMgaGF2aW5nIFthbHdheXNXcml0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL2ZpZWxkL0RhdGFGaWVsZCNjb25maWctYWx3YXlzV3JpdGUpIHNldCB0byBgdHJ1ZWBcbiAgICAgKiB3aWxsIGFsd2F5cyBiZSBpbmNsdWRlZC5cbiAgICAgKi9cbiAgICB3cml0ZUFsbEZpZWxkcyA/IDogYm9vbGVhblxuXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yIDogJ2JyeW50dW0tdGFzay1ib2FyZC1wcm9qZWN0LW1vZGVsJyxcbiAgICB0ZW1wbGF0ZSA6ICcnXG59KVxuZXhwb3J0IGNsYXNzIEJyeW50dW1UYXNrQm9hcmRQcm9qZWN0TW9kZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlQ2xhc3MgPSBQcm9qZWN0TW9kZWw7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlTmFtZSA9ICdQcm9qZWN0TW9kZWwnO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUV2ZW50czogc3RyaW5nW10gPSBbXG4gICAgICAgICdvbkJlZm9yZURlc3Ryb3knLFxuICAgICAgICAnb25CZWZvcmVMb2FkJyxcbiAgICAgICAgJ29uQmVmb3JlTG9hZEFwcGx5JyxcbiAgICAgICAgJ29uQmVmb3JlUmVzcG9uc2VBcHBseScsXG4gICAgICAgICdvbkJlZm9yZVNlbmQnLFxuICAgICAgICAnb25CZWZvcmVTeW5jJyxcbiAgICAgICAgJ29uQmVmb3JlU3luY0FwcGx5JyxcbiAgICAgICAgJ29uQ2F0Y2hBbGwnLFxuICAgICAgICAnb25DaGFuZ2UnLFxuICAgICAgICAnb25EYXRhUmVhZHknLFxuICAgICAgICAnb25EZXN0cm95JyxcbiAgICAgICAgJ29uSGFzQ2hhbmdlcycsXG4gICAgICAgICdvbkxvYWQnLFxuICAgICAgICAnb25Mb2FkQ2FuY2VsZWQnLFxuICAgICAgICAnb25Mb2FkRmFpbCcsXG4gICAgICAgICdvbk5vQ2hhbmdlcycsXG4gICAgICAgICdvblJlcXVlc3REb25lJyxcbiAgICAgICAgJ29uUmVxdWVzdEZhaWwnLFxuICAgICAgICAnb25TeW5jJyxcbiAgICAgICAgJ29uU3luY0NhbmNlbGVkJyxcbiAgICAgICAgJ29uU3luY0RlbGF5ZWQnLFxuICAgICAgICAnb25TeW5jRmFpbCdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUZlYXR1cmVOYW1lczogc3RyaW5nW10gPSBbXG5cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bVRhc2tCb2FyZFByb2plY3RNb2RlbENvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhZGp1c3REdXJhdGlvblRvRFNUJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRNb2RlbENsYXNzJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzRGF0YScsXG4gICAgICAgICdhc3NpZ25tZW50U3RvcmUnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlQ2xhc3MnLFxuICAgICAgICAnYXV0b0xvYWQnLFxuICAgICAgICAnYXV0b1N5bmMnLFxuICAgICAgICAnYXV0b1N5bmNUaW1lb3V0JyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NoaWxkcmVuJyxcbiAgICAgICAgJ2NydWRTdG9yZXMnLFxuICAgICAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ2RlcGVuZGVuY2llc0RhdGEnLFxuICAgICAgICAnZGVwZW5kZW5jeU1vZGVsQ2xhc3MnLFxuICAgICAgICAnZGVwZW5kZW5jeVN0b3JlJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2VuY29kZXInLFxuICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgJ2V2ZW50c0RhdGEnLFxuICAgICAgICAnZXZlbnRTdG9yZScsXG4gICAgICAgICdleHBhbmRlZCcsXG4gICAgICAgICdmb3JjZVN5bmMnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaWdub3JlUmVtb3RlQ2hhbmdlc0luU1RNJyxcbiAgICAgICAgJ2luY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdCcsXG4gICAgICAgICdpbmNsdWRlTGVnYWN5RGF0YVByb3BlcnRpZXMnLFxuICAgICAgICAnaXNGdWxseUxvYWRlZCcsXG4gICAgICAgICdqc29uJyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2FkVXJsJyxcbiAgICAgICAgJ29yZGVyZWRQYXJlbnRJbmRleCcsXG4gICAgICAgICdwYXJlbnRJZCcsXG4gICAgICAgICdwYXJlbnRJbmRleCcsXG4gICAgICAgICdwaGFudG9tSWRGaWVsZCcsXG4gICAgICAgICdwaGFudG9tUGFyZW50SWRGaWVsZCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZW1vdGVDaGlsZENvdW50JyxcbiAgICAgICAgJ3Jlc2V0SWRzQmVmb3JlU3luYycsXG4gICAgICAgICdyZXNvdXJjZU1vZGVsQ2xhc3MnLFxuICAgICAgICAncmVzb3VyY2VzJyxcbiAgICAgICAgJ3Jlc291cmNlc0RhdGEnLFxuICAgICAgICAncmVzb3VyY2VTdG9yZScsXG4gICAgICAgICdyZXNvdXJjZVN0b3JlQ2xhc3MnLFxuICAgICAgICAnc2hvdWxkU3luY0RhdGFPbkxvYWQnLFxuICAgICAgICAnc2lsZW5jZUluaXRpYWxDb21taXQnLFxuICAgICAgICAnc2tpcFN1Y2Nlc3NQcm9wZXJ0eScsXG4gICAgICAgICdzdG0nLFxuICAgICAgICAnc3RvcmVJZFByb3BlcnR5JyxcbiAgICAgICAgJ3N1cHBvcnRTaG9ydFN5bmNSZXNwb25zZScsXG4gICAgICAgICdzeW5jQXBwbHlTZXF1ZW5jZScsXG4gICAgICAgICdzeW5jVXJsJyxcbiAgICAgICAgJ3Rhc2tNb2RlbENsYXNzJyxcbiAgICAgICAgJ3Rhc2tzJyxcbiAgICAgICAgJ3Rhc2tzRGF0YScsXG4gICAgICAgICd0YXNrU3RvcmUnLFxuICAgICAgICAndGFza1N0b3JlQ2xhc3MnLFxuICAgICAgICAndGltZVpvbmUnLFxuICAgICAgICAndG9KU09OUmVzdWx0Rm9ybWF0JyxcbiAgICAgICAgJ3RyYWNrUmVzcG9uc2VUeXBlJyxcbiAgICAgICAgJ3RyYW5zcG9ydCcsXG4gICAgICAgICd1c2VSYXdEYXRhJyxcbiAgICAgICAgJ3ZhbGlkYXRlUmVzcG9uc2UnLFxuICAgICAgICAnd3JpdGVBbGxGaWVsZHMnXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtQ29uZmlnc09ubHk6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWRqdXN0RHVyYXRpb25Ub0RTVCcsXG4gICAgICAgICdhc3NpZ25tZW50TW9kZWxDbGFzcycsXG4gICAgICAgICdhc3NpZ25tZW50c0RhdGEnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlQ2xhc3MnLFxuICAgICAgICAnYXV0b0xvYWQnLFxuICAgICAgICAnYXV0b1N5bmMnLFxuICAgICAgICAnYXV0b1N5bmNUaW1lb3V0JyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjaGlsZHJlbicsXG4gICAgICAgICdkZXBlbmRlbmNpZXNEYXRhJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lNb2RlbENsYXNzJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2VuY29kZXInLFxuICAgICAgICAnZXZlbnRzRGF0YScsXG4gICAgICAgICdleHBhbmRlZCcsXG4gICAgICAgICdpZ25vcmVSZW1vdGVDaGFuZ2VzSW5TVE0nLFxuICAgICAgICAnaW5jbHVkZUNoaWxkcmVuSW5SZW1vdmVSZXF1ZXN0JyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdvcmRlcmVkUGFyZW50SW5kZXgnLFxuICAgICAgICAncGFyZW50SW5kZXgnLFxuICAgICAgICAncGhhbnRvbUlkRmllbGQnLFxuICAgICAgICAncGhhbnRvbVBhcmVudElkRmllbGQnLFxuICAgICAgICAncmVzZXRJZHNCZWZvcmVTeW5jJyxcbiAgICAgICAgJ3Jlc291cmNlTW9kZWxDbGFzcycsXG4gICAgICAgICdyZXNvdXJjZXNEYXRhJyxcbiAgICAgICAgJ3Jlc291cmNlU3RvcmVDbGFzcycsXG4gICAgICAgICdzaWxlbmNlSW5pdGlhbENvbW1pdCcsXG4gICAgICAgICdza2lwU3VjY2Vzc1Byb3BlcnR5JyxcbiAgICAgICAgJ3N0b3JlSWRQcm9wZXJ0eScsXG4gICAgICAgICdzdXBwb3J0U2hvcnRTeW5jUmVzcG9uc2UnLFxuICAgICAgICAndGFza01vZGVsQ2xhc3MnLFxuICAgICAgICAndGFza3NEYXRhJyxcbiAgICAgICAgJ3Rhc2tTdG9yZUNsYXNzJyxcbiAgICAgICAgJ3RvSlNPTlJlc3VsdEZvcm1hdCcsXG4gICAgICAgICd0cmFja1Jlc3BvbnNlVHlwZScsXG4gICAgICAgICd0cmFuc3BvcnQnLFxuICAgICAgICAndXNlUmF3RGF0YScsXG4gICAgICAgICd2YWxpZGF0ZVJlc3BvbnNlJyxcbiAgICAgICAgJ3dyaXRlQWxsRmllbGRzJ1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtUHJvcHM6IHN0cmluZ1tdID0gQnJ5bnR1bVRhc2tCb2FyZFByb2plY3RNb2RlbENvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhbGxDaGlsZHJlbicsXG4gICAgICAgICdhbGxVbmZpbHRlcmVkQ2hpbGRyZW4nLFxuICAgICAgICAnYXNzaWdubWVudHMnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY3J1ZFN0b3JlcycsXG4gICAgICAgICdkZXBlbmRlbmNpZXMnLFxuICAgICAgICAnZGVwZW5kZW5jeVN0b3JlJyxcbiAgICAgICAgJ2Rlc2NlbmRhbnRDb3VudCcsXG4gICAgICAgICdldmVudHMnLFxuICAgICAgICAnZXZlbnRTdG9yZScsXG4gICAgICAgICdmb3JjZVN5bmMnLFxuICAgICAgICAnaGFzR2VuZXJhdGVkSWQnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5jbHVkZUxlZ2FjeURhdGFQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ2lubGluZURhdGEnLFxuICAgICAgICAnaW50ZXJuYWxJZCcsXG4gICAgICAgICdpc0NvbW1pdHRpbmcnLFxuICAgICAgICAnaXNDcmVhdGluZycsXG4gICAgICAgICdpc0Z1bGx5TG9hZGVkJyxcbiAgICAgICAgJ2lzVmFsaWQnLFxuICAgICAgICAnanNvbicsXG4gICAgICAgICdsb2FkVXJsJyxcbiAgICAgICAgJ3BhcmVudElkJyxcbiAgICAgICAgJ3ByZXZpb3VzU2libGluZ3NUb3RhbENvdW50JyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlbW90ZUNoaWxkQ291bnQnLFxuICAgICAgICAncmVzb3VyY2VzJyxcbiAgICAgICAgJ3Jlc291cmNlU3RvcmUnLFxuICAgICAgICAncmVzb3VyY2VUaW1lUmFuZ2VzJyxcbiAgICAgICAgJ3Nob3VsZFN5bmNEYXRhT25Mb2FkJyxcbiAgICAgICAgJ3N0bScsXG4gICAgICAgICdzeW5jQXBwbHlTZXF1ZW5jZScsXG4gICAgICAgICdzeW5jVXJsJyxcbiAgICAgICAgJ3Rhc2tzJyxcbiAgICAgICAgJ3Rhc2tTdG9yZScsXG4gICAgICAgICd0aW1lUmFuZ2VzJyxcbiAgICAgICAgJ3RpbWVab25lJyxcbiAgICAgICAgJ3Zpc2libGVEZXNjZW5kYW50Q291bnQnXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIGluc3RhbmNlITogUHJvamVjdE1vZGVsO1xuXG4gICAgcHJpdmF0ZSBicnludHVtQ29uZmlnID0ge1xuICAgICAgICBhZG9wdCAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhcHBlbmRUbyAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBocmVmICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhbmd1bGFyQ29tcG9uZW50IDogdGhpcyxcbiAgICAgICAgZmVhdHVyZXMgICAgICAgICA6IHt9LFxuICAgICAgICBsaXN0ZW5lcnMgICAgICAgIDoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIENvbmZpZ3Mgb25seVxuICAgIEBJbnB1dCgpIGFkanVzdER1cmF0aW9uVG9EU1QgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhc3NpZ25tZW50TW9kZWxDbGFzcyAgICAgICAgICAgISA6IHR5cGVvZiBBc3NpZ25tZW50TW9kZWw7XG4gICAgQElucHV0KCkgYXNzaWdubWVudHNEYXRhICAgICAgICAgICAgICAgICEgOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBhc3NpZ25tZW50U3RvcmVDbGFzcyAgICAgICAgICAgISA6IHR5cGVvZiBBc3NpZ25tZW50U3RvcmV8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGF1dG9Mb2FkICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhdXRvU3luYyAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b1N5bmNUaW1lb3V0ICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgYnViYmxlRXZlbnRzICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY2hpbGRyZW4gICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdFtdfE1vZGVsW118TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBkZXBlbmRlbmNpZXNEYXRhICAgICAgICAgICAgICAgISA6IERlcGVuZGVuY3lNb2RlbFtdfERlcGVuZGVuY3lNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGRlcGVuZGVuY3lNb2RlbENsYXNzICAgICAgICAgICAhIDogdHlwZW9mIERlcGVuZGVuY3lNb2RlbDtcbiAgICBASW5wdXQoKSBkZXBlbmRlbmN5U3RvcmVDbGFzcyAgICAgICAgICAgISA6IHR5cGVvZiBEZXBlbmRlbmN5U3RvcmV8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGVuY29kZXIgICAgICAgICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICByZXF1ZXN0RGF0YT86IG9iamVjdFxuICAgIH07XG4gICAgQElucHV0KCkgZXZlbnRzRGF0YSAgICAgICAgICAgICAgICAgICAgICEgOiBFdmVudE1vZGVsW118RXZlbnRNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGV4cGFuZGVkICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpZ25vcmVSZW1vdGVDaGFuZ2VzSW5TVE0gICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5jbHVkZUNoaWxkcmVuSW5SZW1vdmVSZXF1ZXN0ICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGxpc3RlbmVycyAgICAgICAgICAgICAgICAgICAgICAhIDogUHJvamVjdE1vZGVsTGlzdGVuZXJzO1xuICAgIEBJbnB1dCgpIG9yZGVyZWRQYXJlbnRJbmRleCAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHBhcmVudEluZGV4ICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHBoYW50b21JZEZpZWxkICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHBoYW50b21QYXJlbnRJZEZpZWxkICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJlc2V0SWRzQmVmb3JlU3luYyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNvdXJjZU1vZGVsQ2xhc3MgICAgICAgICAgICAgISA6IHR5cGVvZiBSZXNvdXJjZU1vZGVsO1xuICAgIEBJbnB1dCgpIHJlc291cmNlc0RhdGEgICAgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSByZXNvdXJjZVN0b3JlQ2xhc3MgICAgICAgICAgICAgISA6IHR5cGVvZiBSZXNvdXJjZVN0b3JlfG9iamVjdDtcbiAgICBASW5wdXQoKSBzaWxlbmNlSW5pdGlhbENvbW1pdCAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2tpcFN1Y2Nlc3NQcm9wZXJ0eSAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0b3JlSWRQcm9wZXJ0eSAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHN1cHBvcnRTaG9ydFN5bmNSZXNwb25zZSAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0YXNrTW9kZWxDbGFzcyAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBUYXNrTW9kZWw7XG4gICAgQElucHV0KCkgdGFza3NEYXRhICAgICAgICAgICAgICAgICAgICAgICEgOiBUYXNrTW9kZWxbXXxUYXNrTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSB0YXNrU3RvcmVDbGFzcyAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBUYXNrU3RvcmU7XG4gICAgQElucHV0KCkgdG9KU09OUmVzdWx0Rm9ybWF0ICAgICAgICAgICAgICEgOiAnaW5saW5lRGF0YSd8J21vZGVsJztcbiAgICBASW5wdXQoKSB0cmFja1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdHJhbnNwb3J0ICAgICAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGxvYWQ/OiBvYmplY3RcbiAgICAgICAgc3luYz86IG9iamVjdFxuICAgIH07XG4gICAgQElucHV0KCkgdXNlUmF3RGF0YSAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHZhbGlkYXRlUmVzcG9uc2UgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB3cml0ZUFsbEZpZWxkcyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG5cbiAgICAvLyBDb25maWdzIGFuZCBwcm9wZXJ0aWVzXG4gICAgQElucHV0KCkgYXNzaWdubWVudHMgICAgICAgICAgICAgICAgICEgOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBhc3NpZ25tZW50U3RvcmUgICAgICAgICAgICAgISA6IEFzc2lnbm1lbnRTdG9yZXxBc3NpZ25tZW50U3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgY2FsbE9uRnVuY3Rpb25zICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjcnVkU3RvcmVzICAgICAgICAgICAgICAgICAgISA6IENydWRNYW5hZ2VyU3RvcmVEZXNjcmlwdG9yW118U3RvcmVbXXxzdHJpbmdbXXxTdG9yZUNvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGRlcGVuZGVuY2llcyAgICAgICAgICAgICAgICAhIDogRGVwZW5kZW5jeU1vZGVsW118RGVwZW5kZW5jeU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgZGVwZW5kZW5jeVN0b3JlICAgICAgICAgICAgICEgOiBEZXBlbmRlbmN5U3RvcmV8RGVwZW5kZW5jeVN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGV2ZW50cyAgICAgICAgICAgICAgICAgICAgICAhIDogRXZlbnRNb2RlbFtdfEV2ZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBldmVudFN0b3JlICAgICAgICAgICAgICAgICAgISA6IEV2ZW50U3RvcmV8RXZlbnRTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBmb3JjZVN5bmMgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIGluY2x1ZGVMZWdhY3lEYXRhUHJvcGVydGllcyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc0Z1bGx5TG9hZGVkICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkganNvbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbG9hZFVybCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcGFyZW50SWQgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nfG51bGw7XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbW90ZUNoaWxkQ291bnQgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHJlc291cmNlcyAgICAgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSByZXNvdXJjZVN0b3JlICAgICAgICAgICAgICAgISA6IFJlc291cmNlU3RvcmV8UmVzb3VyY2VTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBzaG91bGRTeW5jRGF0YU9uTG9hZCAgICAgICAgISA6IChvcHRpb25zOiB7IHN0b3JlOiBTdG9yZSwgcmVjb3JkczogTW9kZWwsIGRhdGE6IG9iamVjdFtdIH0pID0+IFNldDxhbnk+fGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RtICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBTdGF0ZVRyYWNraW5nTWFuYWdlcnxTdGF0ZVRyYWNraW5nTWFuYWdlckNvbmZpZztcbiAgICBASW5wdXQoKSBzeW5jQXBwbHlTZXF1ZW5jZSAgICAgICAgICAgISA6IHN0cmluZ1tdfENydWRNYW5hZ2VyU3RvcmVEZXNjcmlwdG9yW107XG4gICAgQElucHV0KCkgc3luY1VybCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICEgOiBUYXNrTW9kZWxbXXxUYXNrTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSB0YXNrU3RvcmUgICAgICAgICAgICAgICAgICAgISA6IFRhc2tTdG9yZXxUYXNrU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgdGltZVpvbmUgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuXG4gICAgLy8gUHJvcGVydGllcyBvbmx5XG4gICAgQElucHV0KCkgYWxsQ2hpbGRyZW4gICAgICAgICAgICAgICAgISA6IE1vZGVsW107XG4gICAgQElucHV0KCkgYWxsVW5maWx0ZXJlZENoaWxkcmVuICAgICAgISA6IE1vZGVsW107XG4gICAgQElucHV0KCkgZGVzY2VuZGFudENvdW50ICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBoYXNHZW5lcmF0ZWRJZCAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbmxpbmVEYXRhICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGludGVybmFsSWQgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgaXNDb21taXR0aW5nICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNDcmVhdGluZyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNWYWxpZCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHJldmlvdXNTaWJsaW5nc1RvdGFsQ291bnQgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSByZXNvdXJjZVRpbWVSYW5nZXMgICAgICAgICAhIDogUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbFtdfFJlc291cmNlVGltZVJhbmdlTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSB0aW1lUmFuZ2VzICAgICAgICAgICAgICAgICAhIDogVGltZVJhbmdlTW9kZWxbXXxUaW1lUmFuZ2VNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHZpc2libGVEZXNjZW5kYW50Q291bnQgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBFdmVudHMgZW1pdHRlcnNcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBbbG9hZCByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBpcyBzZW50LiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgbG9hZCByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlTG9hZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFjazogb2JqZWN0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGxvYWRlZCBkYXRhIGdldCBhcHBsaWVkIHRvIHRoZSBzdG9yZXMuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgZGF0YSBhcHBseWluZy5cbiAgICAgKiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIGZvciBzZXJ2ZXIgZGF0YSBwcmVwcm9jZXNzaW5nLiBUbyBhY2hpZXZlIGl0IHVzZXIgY2FuIG1vZGlmeSB0aGUgYHJlc3BvbnNlYCBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm9wdGlvbnMgT3B0aW9ucyBwcm92aWRlZCB0byB0aGUgW2xvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIG1ldGhvZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVMb2FkQXBwbHk6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlc3BvbnNlOiBvYmplY3QsIG9wdGlvbnM6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBzZXJ2ZXIgcmVzcG9uc2UgZ2V0cyBhcHBsaWVkIHRvIHRoZSBzdG9yZXMuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgZGF0YSBhcHBseWluZy5cbiAgICAgKiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIGZvciBzZXJ2ZXIgZGF0YSBwcmVwcm9jZXNzaW5nLiBUbyBhY2hpZXZlIGl0IHVzZXIgY2FuIG1vZGlmeSB0aGUgYHJlc3BvbnNlYCBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHsnc3luYycsJ2xvYWQnfSBldmVudC5yZXF1ZXN0VHlwZSBUaGUgcmVxdWVzdCB0eXBlIChgc3luY2Agb3IgYGxvYWRgKS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2UgVGhlIGRlY29kZWQgc2VydmVyIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVSZXNwb25zZUFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXF1ZXN0VHlwZTogJ3N5bmMnfCdsb2FkJywgcmVzcG9uc2U6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhIHJlcXVlc3QgaXMgc2VudCB0byB0aGUgc2VydmVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2V2ZW50LWJlZm9yZVNlbmQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuY3J1ZE1hbmFnZXIgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucGFyYW1zIEhUVFAgcmVxdWVzdCBwYXJhbXMgdG8gYmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0IFVSTC5cbiAgICAgKiBAcGFyYW0geydzeW5jJywnbG9hZCd9IGV2ZW50LnJlcXVlc3RUeXBlIENydWRNYW5hZ2VyIHJlcXVlc3QgdHlwZSAoYGxvYWRgL2BzeW5jYClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdENvbmZpZyBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgQWpheCByZXF1ZXN0IGNhbGxcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTZW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY3J1ZE1hbmFnZXI6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHBhcmFtczogb2JqZWN0LCByZXF1ZXN0VHlwZTogJ3N5bmMnfCdsb2FkJywgcmVxdWVzdENvbmZpZzogb2JqZWN0IH0pID0+IFByb21pc2U8dm9pZD4pfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgW3N5bmMgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgaXMgc2VudC4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIHN5bmMgcmVxdWVzdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1iZWZvcmVTeW5jKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3luYzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFjazogb2JqZWN0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIHN5bmMgcmVzcG9uc2UgZGF0YSBnZXQgYXBwbGllZCB0byB0aGUgc3RvcmVzLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGRhdGEgYXBwbHlpbmcuXG4gICAgICogVGhpcyBldmVudCBjYW4gYmUgdXNlZCBmb3Igc2VydmVyIGRhdGEgcHJlcHJvY2Vzc2luZy4gVG8gYWNoaWV2ZSBpdCB1c2VyIGNhbiBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN5bmNBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW55IG90aGVyIGV2ZW50IGlzIGZpcmVkIGZyb20gdGhlIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1jYXRjaEFsbClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHt7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9fSBldmVudC5ldmVudCBUaGUgT2JqZWN0IHRoYXQgY29udGFpbnMgZXZlbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5ldmVudC50eXBlIFRoZSB0eXBlIG9mIHRoZSBldmVudCB3aGljaCBpcyBjYXVnaHQgYnkgdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2F0Y2hBbGw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDoge1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZGF0YSBpbiBhbnkgb2YgdGhlIHByb2plY3RzIHN0b3JlcyBjaGFuZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2V2ZW50LWNoYW5nZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuU2NoZWR1bGVyUHJvamVjdE1vZGVsLGFueX0gZXZlbnQuc291cmNlIFRoaXMgcHJvamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLlN0b3JlfSBldmVudC5zdG9yZSBBZmZlY3RlZCBzdG9yZVxuICAgICAqIEBwYXJhbSB7J3JlbW92ZScsJ3JlbW92ZUFsbCcsJ2FkZCcsJ2NsZWFyY2hhbmdlcycsJ2ZpbHRlcicsJ3VwZGF0ZScsJ2RhdGFzZXQnLCdyZXBsYWNlJ30gZXZlbnQuYWN0aW9uIE5hbWUgb2YgYWN0aW9uIHdoaWNoIHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBNYXkgYmUgb25lIG9mOiAgKiBgJ3JlbW92ZSdgICogYCdyZW1vdmVBbGwnYCAqIGAnYWRkJ2AgKiBgJ2NsZWFyY2hhbmdlcydgICogYCdmaWx0ZXInYCAqIGAndXBkYXRlJ2AgKiBgJ2RhdGFzZXQnYCAqIGAncmVwbGFjZSdgXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBDaGFuZ2VkIHJlY29yZCwgZm9yIGFjdGlvbnMgdGhhdCBhZmZlY3RzIGV4YWN0bHkgb25lIHJlY29yZCAoYCd1cGRhdGUnYClcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yZWNvcmRzIENoYW5nZWQgcmVjb3JkcywgcGFzc2VkIGZvciBhbGwgYWN0aW9ucyBleGNlcHQgYCdyZW1vdmVBbGwnYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jaGFuZ2VzIFBhc3NlZCBmb3IgdGhlIGAndXBkYXRlJ2AgYWN0aW9uLCBpbmZvIG9uIHdoaWNoIHJlY29yZCBmaWVsZHMgY2hhbmdlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyUHJvamVjdE1vZGVsfGFueSwgc3RvcmU6IFN0b3JlLCBhY3Rpb246ICdyZW1vdmUnfCdyZW1vdmVBbGwnfCdhZGQnfCdjbGVhcmNoYW5nZXMnfCdmaWx0ZXInfCd1cGRhdGUnfCdkYXRhc2V0J3wncmVwbGFjZScsIHJlY29yZDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIGNoYW5nZXM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZW5naW5lIGhhcyBmaW5pc2hlZCBpdHMgY2FsY3VsYXRpb25zIGFuZCB0aGUgcmVzdWx0cyBoYXMgYmVlbiB3cml0dGVuIGJhY2sgdG8gdGhlIHJlY29yZHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtZGF0YVJlYWR5KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5TY2hlZHVsZXJQcm9qZWN0TW9kZWwsYW55fSBldmVudC5zb3VyY2UgVGhlIHByb2plY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzSW5pdGlhbENvbW1pdCBGbGFnIHRoYXQgc2hvd3MgaWYgdGhpcyBjb21taXQgaXMgaW5pdGlhbFxuICAgICAqIEBwYXJhbSB7U2V0PGFueT59IGV2ZW50LnJlY29yZHMgU2V0IG9mIGFsbCBbTW9kZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9Nb2RlbClzIHRoYXQgd2VyZSBtb2RpZmllZCBpbiB0aGUgY29tcGxldGVkIHRyYW5zYWN0aW9uLiBVc2UgdGhlIFttb2RpZmljYXRpb25zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvTW9kZWwjcHJvcGVydHktbW9kaWZpY2F0aW9ucykgcHJvcGVydHkgb2YgZWFjaCBNb2RlbCB0byBpZGVudGlmeSBtb2RpZmllZCBmaWVsZHMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0YVJlYWR5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXJQcm9qZWN0TW9kZWx8YW55LCBpc0luaXRpYWxDb21taXQ6IGJvb2xlYW4sIHJlY29yZHM6IFNldDxhbnk+IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGRhdGEgaW4gYW55IG9mIHRoZSByZWdpc3RlcmVkIGRhdGEgc3RvcmVzIGlzIGNoYW5nZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtaGFzQ2hhbmdlcylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IYXNDaGFuZ2VzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiBzdWNjZXNzZnVsIFtsb2FkIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIGNvbXBsZXRpb24gYWZ0ZXIgZGF0YSBnZXRzIGxvYWRlZCB0byB0aGUgc3RvcmVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTG9hZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VPcHRpb25zOiBvYmplY3QsIHJlcXVlc3RPcHRpb25zOiBvYmplY3QsIHJhd1Jlc3BvbnNlOiBhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIFtsb2FkIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIHdhcyBjYW5jZWxlZCBieSBzb21lIFtiZWZvcmVMb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNldmVudC1iZWZvcmVMb2FkKVxuICAgICAqIGxpc3RlbmVyIG9yIGR1ZSB0byBpbmNvbXBsZXRlIHByaW9yIGxvYWQgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucGFjayBUaGUgZGF0YSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIGRhdGEgZm9yIGFsbCBzdG9yZXMgbWFuYWdlZCBieSB0aGUgY3J1ZCBtYW5hZ2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkxvYWRDYW5jZWxlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFjazogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgW2xvYWQgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tbG9hZCkgZmFpbHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnJlc3BvbnNlVGV4dCBUaGUgcmF3IHNlcnZlciByZXNwb25zZSB0ZXh0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Mb2FkRmFpbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VUZXh0OiBzdHJpbmcsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHJlZ2lzdGVyZWQgc3RvcmVzIGdldCBpbnRvIHN0YXRlIHdoZW4gdGhleSBkb24ndCBoYXZlIGFueVxuICAgICAqIG5vdCBwZXJzaXN0ZWQgY2hhbmdlLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgW2xvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIG9yIFtzeW5jXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1zeW5jKSByZXF1ZXN0XG4gICAgICogY29tcGxldGlvbi4gT3IgdGhpcyBtYXkgaGFwcGVuIGFmdGVyIGEgcmVjb3JkIHVwZGF0ZSB3aGljaCB0dXJucyBpdHMgZmllbGRzIGJhY2sgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtbm9DaGFuZ2VzKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbk5vQ2hhbmdlczogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gc3VjY2Vzc2Z1bCByZXF1ZXN0IGNvbXBsZXRpb24gYWZ0ZXIgZGF0YSBnZXRzIGFwcGxpZWQgdG8gdGhlIHN0b3Jlcy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0geydzeW5jJywnbG9hZCd9IGV2ZW50LnJlcXVlc3RUeXBlIFRoZSByZXF1ZXN0IHR5cGUgKGBzeW5jYCBvciBgbG9hZGApLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVxdWVzdERvbmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlcXVlc3RUeXBlOiAnc3luYyd8J2xvYWQnLCByZXNwb25zZTogb2JqZWN0LCByZXNwb25zZU9wdGlvbnM6IG9iamVjdCwgcmVxdWVzdE9wdGlvbnM6IG9iamVjdCwgcmF3UmVzcG9uc2U6IGFueSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIHJlcXVlc3QgZmFpbHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHsnc3luYycsJ2xvYWQnfSBldmVudC5yZXF1ZXN0VHlwZSBUaGUgcmVxdWVzdCB0eXBlIChgc3luY2Agb3IgYGxvYWRgKS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2UgVGhlIGRlY29kZWQgc2VydmVyIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQucmVzcG9uc2VUZXh0IFRoZSByYXcgc2VydmVyIHJlc3BvbnNlIHRleHRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2VPcHRpb25zIFtERVBSRUNBVEVEXSBzZWUgYHJlcXVlc3RPcHRpb25zYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXF1ZXN0T3B0aW9ucyBUaGUgcmVxdWVzdCBvcHRpb25zIHBhc3NlZCB0byB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yYXdSZXNwb25zZSBUaGUgbmF0aXZlIFJlc3BvbnNlIG9iamVjdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlcXVlc3RGYWlsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXF1ZXN0VHlwZTogJ3N5bmMnfCdsb2FkJywgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VUZXh0OiBzdHJpbmcsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiBzdWNjZXNzZnVsIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIGNvbXBsZXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TeW5jOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXNwb25zZTogb2JqZWN0LCByZXNwb25zZU9wdGlvbnM6IG9iamVjdCwgcmVxdWVzdE9wdGlvbnM6IG9iamVjdCwgcmF3UmVzcG9uc2U6IGFueSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgW3N5bmMgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgd2FzIGNhbmNlbGVkIGJ5IHNvbWUgW2JlZm9yZVN5bmNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2V2ZW50LWJlZm9yZVN5bmMpIGxpc3RlbmVyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luY0NhbmNlbGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCBwYWNrOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIHdhcyBkZWxheWVkIGR1ZSB0byBpbmNvbXBsZXRlIHByZXZpb3VzIG9uZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuYXJndW1lbnRzIFRoZSBhcmd1bWVudHMgb2YgW3N5bmNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIGNhbGwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luY0RlbGF5ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIGFyZ3VtZW50czogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgW3N5bmMgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgZmFpbHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnJlc3BvbnNlVGV4dCBUaGUgcmF3IHNlcnZlciByZXNwb25zZSB0ZXh0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TeW5jRmFpbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VUZXh0OiBzdHJpbmcsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bmRlcmx5aW5nIHdpZGdldFxuICAgICAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgbWUgPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ1xuICAgICAgICAgICAgfSA9IG1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2xhc3MsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdzLFxuICAgICAgICAgICAgICAgIGJyeW50dW1FdmVudHNcbiAgICAgICAgICAgIH0gPSBCcnludHVtVGFza0JvYXJkUHJvamVjdE1vZGVsQ29tcG9uZW50O1xuXG4gICAgICAgIGJyeW50dW1Db25maWdzLmZpbHRlcihwcm9wID0+IHByb3AgaW4gdGhpcykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuYXBwbHlQcm9wVmFsdWUoYnJ5bnR1bUNvbmZpZywgcHJvcCwgdGhpc1twcm9wXSk7XG4gICAgICAgICAgICBpZiAoWydmZWF0dXJlcycsICdjb25maWcnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ0NvbmZpZ1Byb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYnJ5bnR1bUV2ZW50cy5maWx0ZXIoZXZlbnQgPT4gdGhpc1tldmVudF0gJiYgdGhpc1tldmVudF0ub2JzZXJ2ZXJzLmxlbmd0aCA+IDApLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3RcbiAgICAgICAgICAgICAgICB1bmNhcGl0YWxpemUgPSAoc3RyOiBzdHJpbmcpID0+IHN0ci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHN0ci5zbGljZSgxKSxcbiAgICAgICAgICAgICAgICBldmVudE5hbWUgPSAoc3RyOiBzdHJpbmcpID0+IHVuY2FwaXRhbGl6ZShzdHIuc2xpY2UoMikpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBicnludHVtQ29uZmlnLmxpc3RlbmVyc1tldmVudE5hbWUoZXZlbnQpXSA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBtZVtldmVudF0uZW1pdChlKTtcbiAgICAgICAgICAgICAgICAvLyBFdmVudEVtaXR0ZXIgZG9lcyBub3QgcmV0dXJuIHZhbHVlcyBpbiB0aGUgbm9ybWFsIHdheSwgd29yayBhcm91bmQgaXQgYnkgc2V0dGluZyBgcmV0dXJuVmFsdWVgIGZsYWdcbiAgICAgICAgICAgICAgICAvLyBpbiBBbmd1bGFyIGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnJldHVyblZhbHVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgY29tcG9uZW50IGhhcyBubyBjb250YWluZXIgc3BlY2lmaWVkIGluIGNvbmZpZyB0aGVuIHVzZSBhZG9wdCB0byBXcmFwcGVyJ3MgZWxlbWVudFxuICAgICAgICBjb25zdFxuICAgICAgICAgICAgY29udGFpbmVyUGFyYW0gPSBbXG4gICAgICAgICAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAgICAgICAgICdpbnNlcnRBZnRlcicsXG4gICAgICAgICAgICAgICAgJ2luc2VydEJlZm9yZSdcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBdLmZpbmQocHJvcCA9PiBicnludHVtQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgaWYgKCFjb250YWluZXJQYXJhbSkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlTmFtZSA9PT0gJ0J1dHRvbicgfHwgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldFJvb3ROb2RlKCkgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgLy8gQnV0dG9uIHNob3VsZCBhbHdheXMgYmUgPGE+IG9yIDxidXR0b24+IGluc2lkZSBvd25lciBlbGVtZW50XG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5hcHBlbmRUbyA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYWRvcHQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb250YWluZXIoaW5zdGFuY2VOYW1lLCBjb250YWluZXJQYXJhbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lLmluc3RhbmNlID0gaW5zdGFuY2VOYW1lID09PSAnV2lkZ2V0JyA/IFdpZGdldC5jcmVhdGUoYnJ5bnR1bUNvbmZpZykgOiBuZXcgaW5zdGFuY2VDbGFzcyhicnludHVtQ29uZmlnKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdhdGNoIGZvciBjaGFuZ2VzXG4gICAgICogQHBhcmFtIGNoYW5nZXNcbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgeyBpbnN0YW5jZU5hbWUgfSA9IEJyeW50dW1UYXNrQm9hcmRQcm9qZWN0TW9kZWxDb21wb25lbnQ7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGNoYW5nZXNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykuZm9yRWFjaCgoW3Byb3AsIGNoYW5nZV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSAoY2hhbmdlIGFzIFNpbXBsZUNoYW5nZSkuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICAgICAgeyBicnludHVtQ29uZmlnc09ubHksIGJyeW50dW1Qcm9wcyB9ID0gQnJ5bnR1bVRhc2tCb2FyZFByb2plY3RNb2RlbENvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChicnludHVtUHJvcHMuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGluc3RhbmNlLCBwcm9wLCBuZXdWYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChicnludHVtQ29uZmlnc09ubHkuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nVXBkYXRlUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5pbnN0YW5jZS5kZXN0cm95KSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==