@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,1679 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /**
3
+ * Angular wrapper for Bryntum TaskBoardBase
4
+ */
5
+ import { Component, EventEmitter, Output, Input } from '@angular/core';
6
+ import WrapperHelper from './wrapper.helper';
7
+ import { Widget } from '@bryntum/core-thin';
8
+ import { TaskBoardBase } from '@bryntum/taskboard-thin';
9
+ import { StringHelper } from '@bryntum/core-thin';
10
+ import * as i0 from "@angular/core";
11
+ export class BryntumTaskBoardBaseComponent {
12
+ constructor(element) {
13
+ this.bryntumConfig = {
14
+ adopt: undefined,
15
+ appendTo: undefined,
16
+ href: undefined,
17
+ angularComponent: this,
18
+ features: {},
19
+ listeners: {}
20
+ };
21
+ // Events emitters
22
+ /**
23
+ * Triggered when a task is "activated" by pressing `Enter` or double clicking it.
24
+ * ...
25
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-activateTask)
26
+ * @param {object} event Event object
27
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
28
+ * @param {TaskBoard.model.TaskModel} event.taskRecord Task record
29
+ * @param {MouseEvent} event.event Browser event
30
+ */
31
+ this.onActivateTask = new EventEmitter();
32
+ /**
33
+ * Fires on the owning TaskBoard before column dragging starts. Return `false` to prevent the action
34
+ * @param {object} event Event object
35
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
36
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column to be dragged
37
+ */
38
+ this.onBeforeColumnDrag = new EventEmitter();
39
+ /**
40
+ * Fires on the owning TaskBoard when dropping a column, before the operation completes. Handles async
41
+ * listeners, returning `false` from one will abort the operation
42
+ * ...
43
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeColumnDrop)
44
+ * @param {object} event Event object
45
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
46
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Dropped column
47
+ * @param {TaskBoard.model.ColumnModel} event.beforeColumn Dropped before this column
48
+ */
49
+ this.onBeforeColumnDrop = new EventEmitter();
50
+ /**
51
+ * This event is fired prior to starting a column resize gesture. The resize is canceled if a listener returns
52
+ * `false`.
53
+ * @param {object} event Event object
54
+ * @param {TaskBoard.view.TaskBoard} event.source The TaskBoard instance
55
+ * @param {TaskBoard.model.ColumnModel} event.column The column
56
+ * @param {Event} event.domEvent The browser event
57
+ */
58
+ this.onBeforeColumnResize = new EventEmitter();
59
+ /**
60
+ * Fires before an object is destroyed.
61
+ * @param {object} event Event object
62
+ * @param {Core.Base} event.source The Object that is being destroyed.
63
+ */
64
+ this.onBeforeDestroy = new EventEmitter();
65
+ /**
66
+ * Triggered before a widget is hidden. Return `false` to prevent the action.
67
+ * @param {object} event Event object
68
+ * @param {Core.widget.Widget} event.source The widget being hidden.
69
+ */
70
+ this.onBeforeHide = new EventEmitter();
71
+ /**
72
+ * Triggered before a new [responsiveState](https://bryntum.com/products/taskboard/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
73
+ * @param {object} event Event object
74
+ * @param {Core.widget.Widget} event.source The widget whose `responsiveState` is to be changed
75
+ * @param {string} event.state The new value for the widget's `responsiveState`
76
+ * @param {string} event.oldState The previous value for the widget's `responsiveState`
77
+ */
78
+ this.onBeforeResponsiveStateChange = new EventEmitter();
79
+ /**
80
+ * Triggered before a widget is shown. Return `false` to prevent the action.
81
+ * @param {object} event Event object
82
+ * @param {Core.widget.Widget,any} event.source The widget being shown
83
+ */
84
+ this.onBeforeShow = new EventEmitter();
85
+ /**
86
+ * Fires on the owning TaskBoard before displaying an inline editor. Returning `false` stops the editor from
87
+ * being shown.
88
+ * ...
89
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeSimpleTaskEdit)
90
+ * @param {object} event Event object
91
+ * @param {TaskBoard.view.TaskBoard} event.source The task board
92
+ * @param {TaskBoard.feature.SimpleTaskEdit} event.simpleTaskEdit The simpleTaskEdit feature
93
+ * @param {TaskBoard.model.TaskModel} event.taskRecord The record about to be shown in the editor
94
+ * @param {string} event.field Field name being edited
95
+ */
96
+ this.onBeforeSimpleTaskEdit = new EventEmitter();
97
+ /**
98
+ * Fired before state is applied to the source. Allows editing the state object or preventing the operation.
99
+ * @param {object} event Event object
100
+ * @param {any} event.state State object config
101
+ */
102
+ this.onBeforeStateApply = new EventEmitter();
103
+ /**
104
+ * Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
105
+ * @param {object} event Event object
106
+ * @param {any} event.state State object config
107
+ */
108
+ this.onBeforeStateSave = new EventEmitter();
109
+ /**
110
+ * Fires on the owning TaskBoard before task dragging starts. Return `false` to prevent the action
111
+ * @param {object} event Event object
112
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
113
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Tasks to be dragged
114
+ * @param {Event} event.domEvent The mouse event
115
+ */
116
+ this.onBeforeTaskDrag = new EventEmitter();
117
+ /**
118
+ * Fires on the owning TaskBoard when tasks are dropped, before the operation completes. Handles async
119
+ * listeners, returning `false` from one will abort the operation
120
+ * ...
121
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeTaskDrop)
122
+ * @param {object} event Event object
123
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
124
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Dropped tasks
125
+ * @param {TaskBoard.model.ColumnModel} event.targetColumn Dropped on this column
126
+ * @param {TaskBoard.model.SwimlaneModel} event.targetSwimlane Dropped in this swimlane (if used)
127
+ * @param {Event} event.domEvent The mouse event
128
+ */
129
+ this.onBeforeTaskDrop = new EventEmitter();
130
+ /**
131
+ * Fires on the owning TaskBoard before a task is displayed in an editor.
132
+ * ...
133
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeTaskEdit)
134
+ * @param {object} event Event object
135
+ * @param {TaskBoard.view.TaskBoard} event.source The owning TaskBoard
136
+ * @param {TaskBoard.model.TaskModel} event.taskRecord The record about to be shown in the task editor
137
+ */
138
+ this.onBeforeTaskEdit = new EventEmitter();
139
+ /**
140
+ * Fires on the owning TaskBoard when the editor for a task is available, but before it is populated with data
141
+ * and shown. Allows manipulating fields etc.
142
+ * ...
143
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeTaskEditShow)
144
+ * @param {object} event Event object
145
+ * @param {TaskBoard.view.TaskBoard} event.source The owning TaskBoard
146
+ * @param {TaskBoard.model.TaskModel} event.taskRecord The record about to be shown in the task editor
147
+ * @param {TaskBoard.widget.TaskEditor} event.editor The editor
148
+ */
149
+ this.onBeforeTaskEditShow = new EventEmitter();
150
+ /**
151
+ * Triggered when one or more tasks are to be removed by a call to `removeTask()`.
152
+ * ...
153
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeTaskRemove)
154
+ * @param {object} event Event object
155
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
156
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Task records to be removed
157
+ */
158
+ this.onBeforeTaskRemove = new EventEmitter();
159
+ /**
160
+ * Fires when any other event is fired from the object.
161
+ * ...
162
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-catchAll)
163
+ * @param {object} event Event object
164
+ * @param {{[key: string]: any, type: string}} event.event The Object that contains event details
165
+ * @param {string} event.event.type The type of the event which is caught by the listener
166
+ */
167
+ this.onCatchAll = new EventEmitter();
168
+ /**
169
+ * This event fires on the owning TaskBoard when an item is selected in the column header menu.
170
+ * @param {object} event Event object
171
+ * @param {TaskBoard.view.TaskBoard} event.source The grid
172
+ * @param {Core.widget.Menu} event.menu The menu
173
+ * @param {Core.widget.MenuItem} event.item Selected menu item
174
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord The column
175
+ */
176
+ this.onCellMenuItem = new EventEmitter();
177
+ /**
178
+ * This event fires on the owning TaskBoard after the context menu is shown for a column header.
179
+ * @param {object} event Event object
180
+ * @param {TaskBoard.view.TaskBoard} event.source The grid
181
+ * @param {Core.widget.Menu} event.menu The menu
182
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
183
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord The column
184
+ */
185
+ this.onCellMenuShow = new EventEmitter();
186
+ /**
187
+ * This event fires on the owning TaskBoard when a check item is toggled in the column header menu.
188
+ * @param {object} event Event object
189
+ * @param {TaskBoard.view.TaskBoard} event.source The grid
190
+ * @param {Core.widget.Menu} event.menu The menu
191
+ * @param {Core.widget.MenuItem} event.item Selected menu item
192
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord The column
193
+ * @param {boolean} event.checked Checked or not
194
+ */
195
+ this.onCellMenuToggleItem = new EventEmitter();
196
+ /**
197
+ * Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/taskboard/docs/api/Core/widget/Panel#config-collapsible) setting.
198
+ * @param {object} event Event object
199
+ * @param {Core.widget.Panel} event.source This Panel.
200
+ */
201
+ this.onCollapse = new EventEmitter();
202
+ /**
203
+ * Triggered when a column is collapsed.
204
+ * @param {object} event Event object
205
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
206
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
207
+ */
208
+ this.onColumnCollapse = new EventEmitter();
209
+ /**
210
+ * Fires on the owning TaskBoard when a column is dragged, if the drag leads to a change compared to
211
+ * the last columnDrag event.
212
+ * ...
213
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnDrag)
214
+ * @param {object} event Event object
215
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
216
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column being dragged
217
+ * @param {TaskBoard.model.ColumnModel} event.beforeColumn Insert before this column on drop, `null` if last
218
+ */
219
+ this.onColumnDrag = new EventEmitter();
220
+ /**
221
+ * Fires on the owning TaskBoard when a drag operation is aborted (invalid drop or aborted using ESC)
222
+ * @param {object} event Event object
223
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
224
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Dragged column
225
+ */
226
+ this.onColumnDragAbort = new EventEmitter();
227
+ /**
228
+ * Fires on the owning TaskBoard when a previously started drag operation ends, no matter the
229
+ * outcome of it (whether valid, invalid or aborted)
230
+ * @param {object} event Event object
231
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
232
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Affected column
233
+ */
234
+ this.onColumnDragEnd = new EventEmitter();
235
+ /**
236
+ * Fires on the owning TaskBoard when column dragging starts
237
+ * @param {object} event Event object
238
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
239
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column to be dragged
240
+ */
241
+ this.onColumnDragStart = new EventEmitter();
242
+ /**
243
+ * Fires on the owning TaskBoard when a column is successfully dropped (after the drop transition
244
+ * has finished)
245
+ * @param {object} event Event object
246
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
247
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Dropped column
248
+ * @param {TaskBoard.model.ColumnModel} event.beforeColumn Dropped before this column (`null` if last)
249
+ * @param {TaskBoard.model.SwimlaneModel} event.targetSwimlane Dropped in this swimlane (if used)
250
+ */
251
+ this.onColumnDrop = new EventEmitter();
252
+ /**
253
+ * Triggered when a column is expanded.
254
+ * @param {object} event Event object
255
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
256
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
257
+ */
258
+ this.onColumnExpand = new EventEmitter();
259
+ /**
260
+ * Triggered when the column filter is hidden.
261
+ * @param {object} event Event object
262
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
263
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
264
+ */
265
+ this.onColumnFilterHide = new EventEmitter();
266
+ /**
267
+ * Triggered when the column filter is displayed.
268
+ * @param {object} event Event object
269
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
270
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
271
+ */
272
+ this.onColumnFilterShow = new EventEmitter();
273
+ /**
274
+ * Triggered when the column filter visibility is toggled.
275
+ * @param {object} event Event object
276
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
277
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
278
+ * @param {boolean} event.visible True if filter popup is visible, false otherwise
279
+ */
280
+ this.onColumnFilterToggle = new EventEmitter();
281
+ /**
282
+ * Triggered when a column header is clicked.
283
+ * ...
284
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnHeaderClick)
285
+ * @param {object} event Event object
286
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
287
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
288
+ * @param {MouseEvent} event.event Browser event
289
+ */
290
+ this.onColumnHeaderClick = new EventEmitter();
291
+ /**
292
+ * Triggered when a column header is right-clicked.
293
+ * ...
294
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnHeaderContextMenu)
295
+ * @param {object} event Event object
296
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
297
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
298
+ * @param {MouseEvent} event.event Browser event
299
+ */
300
+ this.onColumnHeaderContextMenu = new EventEmitter();
301
+ /**
302
+ * Triggered when a column header is double-clicked.
303
+ * ...
304
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnHeaderDblClick)
305
+ * @param {object} event Event object
306
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
307
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
308
+ * @param {MouseEvent} event.event Browser event
309
+ */
310
+ this.onColumnHeaderDblClick = new EventEmitter();
311
+ /**
312
+ * This event fires on the owning TaskBoard before the menu is shown for a column header.
313
+ * Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/taskboard/docs/api/TaskBoard/feature/ColumnHeaderMenu#config-processItems).
314
+ * ...
315
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnHeaderMenuBeforeShow)
316
+ * @param {object} event Event object
317
+ * @param {TaskBoard.view.TaskBoard} event.source The grid
318
+ * @param {Core.widget.Menu} event.menu The menu
319
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
320
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord The column
321
+ */
322
+ this.onColumnHeaderMenuBeforeShow = new EventEmitter();
323
+ /**
324
+ * This event is fired after a resize gesture is completed.
325
+ * @param {object} event Event object
326
+ * @param {TaskBoard.view.TaskBoard} event.source The TaskBoard instance
327
+ * @param {TaskBoard.model.ColumnModel} event.column The column
328
+ * @param {Event} event.domEvent The browser event
329
+ */
330
+ this.onColumnResize = new EventEmitter();
331
+ /**
332
+ * This event is fired when a column resize gesture starts.
333
+ * @param {object} event Event object
334
+ * @param {TaskBoard.view.TaskBoard} event.source The TaskBoard instance
335
+ * @param {TaskBoard.model.ColumnModel} event.column The column
336
+ * @param {Event} event.domEvent The browser event
337
+ */
338
+ this.onColumnResizeStart = new EventEmitter();
339
+ /**
340
+ * Triggered when a column title element is clicked.
341
+ * ...
342
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnTitleClick)
343
+ * @param {object} event Event object
344
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
345
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
346
+ * @param {MouseEvent} event.event Browser event
347
+ */
348
+ this.onColumnTitleClick = new EventEmitter();
349
+ /**
350
+ * Triggered when a column title element is right-clicked.
351
+ * ...
352
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnTitleContextMenu)
353
+ * @param {object} event Event object
354
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
355
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
356
+ * @param {MouseEvent} event.event Browser event
357
+ */
358
+ this.onColumnTitleContextMenu = new EventEmitter();
359
+ /**
360
+ * Triggered when a column title element is double-clicked.
361
+ * ...
362
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnTitleDblClick)
363
+ * @param {object} event Event object
364
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
365
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
366
+ * @param {MouseEvent} event.event Browser event
367
+ */
368
+ this.onColumnTitleDblClick = new EventEmitter();
369
+ /**
370
+ * Triggered when the column collapsed state is toggled.
371
+ * @param {object} event Event object
372
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
373
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
374
+ * @param {boolean} event.collapse `true` if the column is being collapsed.
375
+ */
376
+ this.onColumnToggle = new EventEmitter();
377
+ /**
378
+ * Fires when an object is destroyed.
379
+ * @param {object} event Event object
380
+ * @param {Core.Base} event.source The Object that is being destroyed.
381
+ */
382
+ this.onDestroy = new EventEmitter();
383
+ /**
384
+ * Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/taskboard/docs/api/Core/widget/Container#property-hasChanges) property changes
385
+ * @param {object} event Event object
386
+ * @param {Core.widget.Container} event.source The container.
387
+ * @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
388
+ */
389
+ this.onDirtyStateChange = new EventEmitter();
390
+ /**
391
+ * Triggered when a widget's [element](https://bryntum.com/products/taskboard/docs/api/Core/widget/Widget#property-element) is available.
392
+ * @param {object} event Event object
393
+ * @param {HTMLElement} event.element The Widget's element.
394
+ */
395
+ this.onElementCreated = new EventEmitter();
396
+ /**
397
+ * Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/taskboard/docs/api/Core/widget/Panel#config-collapsible) setting.
398
+ * @param {object} event Event object
399
+ * @param {Core.widget.Panel} event.source This Panel.
400
+ */
401
+ this.onExpand = new EventEmitter();
402
+ /**
403
+ * Fired when focus enters this Widget.
404
+ * @param {object} event Event object
405
+ * @param {Core.widget.Widget} event.source This Widget
406
+ * @param {HTMLElement} event.fromElement The element which lost focus.
407
+ * @param {HTMLElement} event.toElement The element which gained focus.
408
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
409
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
410
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
411
+ */
412
+ this.onFocusIn = new EventEmitter();
413
+ /**
414
+ * Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
415
+ * focus moving from within this Widget's ownership tree, even if there are floating widgets
416
+ * will not trigger this event. This is when focus exits this widget completely.
417
+ * @param {object} event Event object
418
+ * @param {Core.widget.Widget} event.source This Widget
419
+ * @param {HTMLElement} event.fromElement The element which lost focus.
420
+ * @param {HTMLElement} event.toElement The element which gained focus.
421
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
422
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
423
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
424
+ */
425
+ this.onFocusOut = new EventEmitter();
426
+ /**
427
+ * Triggered after a widget was hidden
428
+ * @param {object} event Event object
429
+ * @param {Core.widget.Widget} event.source The widget
430
+ */
431
+ this.onHide = new EventEmitter();
432
+ /**
433
+ * Triggered when a widget which had been in a non-visible state for any reason
434
+ * achieves visibility.
435
+ * ...
436
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-paint)
437
+ * @param {object} event Event object
438
+ * @param {Core.widget.Widget} event.source The widget being painted.
439
+ * @param {boolean} event.firstPaint `true` if this is the first paint.
440
+ */
441
+ this.onPaint = new EventEmitter();
442
+ /**
443
+ * Fired when a Widget's read only state is toggled
444
+ * @param {object} event Event object
445
+ * @param {boolean} event.readOnly Read only or not
446
+ */
447
+ this.onReadOnly = new EventEmitter();
448
+ /**
449
+ * This event is fired after a widget's elements have been synchronized due to a direct or indirect call
450
+ * to [recompose](https://bryntum.com/products/taskboard/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
451
+ */
452
+ this.onRecompose = new EventEmitter();
453
+ /**
454
+ * Triggered when a tasks element is removed.
455
+ * ...
456
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-removeTaskElement)
457
+ * @param {object} event Event object
458
+ * @param {TaskBoard.view.TaskBoard} event.source TaskBoard instance
459
+ * @param {string,number} event.taskId Id of the task (not the record itself since it might be removed)
460
+ * @param {HTMLElement} event.element Tasks element
461
+ */
462
+ this.onRemoveTaskElement = new EventEmitter();
463
+ /**
464
+ * Triggered when a task is rendered.
465
+ * ...
466
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-renderTask)
467
+ * @param {object} event Event object
468
+ * @param {TaskBoard.view.TaskBoard} event.source TaskBoard instance
469
+ * @param {TaskBoard.model.TaskModel} event.taskRecord Task being rendered
470
+ * @param {boolean} event.isRefresh `true` if the element was updated, `false` if it was added
471
+ * @param {HTMLElement} event.element Tasks element
472
+ */
473
+ this.onRenderTask = new EventEmitter();
474
+ /**
475
+ * Triggered when all tasks in the task board are rendered
476
+ * @param {object} event Event object
477
+ * @param {TaskBoard.view.TaskBoard} event.source TaskBoard instance
478
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Tasks being rendered
479
+ */
480
+ this.onRenderTasks = new EventEmitter();
481
+ /**
482
+ * Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/taskboard/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
483
+ * @param {object} event Event object
484
+ * @param {Core.widget.Widget} event.source This Widget
485
+ * @param {number} event.width The new width
486
+ * @param {number} event.height The new height
487
+ * @param {number} event.oldWidth The old width
488
+ * @param {number} event.oldHeight The old height
489
+ */
490
+ this.onResize = new EventEmitter();
491
+ /**
492
+ * Triggered when a new [responsiveState](https://bryntum.com/products/taskboard/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
493
+ * @param {object} event Event object
494
+ * @param {Core.widget.Widget} event.source The widget whose `responsiveState` has changed
495
+ * @param {string} event.state The new value for the widget's `responsiveState`
496
+ * @param {string} event.oldState The previous value for the widget's `responsiveState`
497
+ */
498
+ this.onResponsiveStateChange = new EventEmitter();
499
+ /**
500
+ * Triggered when task selection changes.
501
+ * @param {object} event Event object
502
+ * @param {TaskBoard.view.TaskBoard} event.source TaskBoard instance
503
+ * @param {'select','deselect'} event.action Either 'select' or 'deselect', depending on operation
504
+ * @param {TaskBoard.model.TaskModel[]} event.selection All currently selected tasks
505
+ * @param {TaskBoard.model.TaskModel[]} event.select Tasks selected by the operation
506
+ * @param {TaskBoard.model.TaskModel[]} event.deselect Tasks deselected by the operation
507
+ */
508
+ this.onSelectionChange = new EventEmitter();
509
+ /**
510
+ * Triggered after a widget is shown.
511
+ * @param {object} event Event object
512
+ * @param {Core.widget.Widget} event.source The widget
513
+ */
514
+ this.onShow = new EventEmitter();
515
+ /**
516
+ * Fires on the owning TaskBoard when inline editing of a field is cancelled (by pressing ESC).
517
+ * ...
518
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-simpleTaskEditCancel)
519
+ * @param {object} event Event object
520
+ * @param {TaskBoard.view.TaskBoard} event.source The task board
521
+ * @param {TaskBoard.feature.SimpleTaskEdit} event.simpleTaskEdit The simpleTaskEdit feature
522
+ * @param {TaskBoard.model.TaskModel} event.taskRecord Record that was edited
523
+ * @param {string} event.field Field name being edited
524
+ */
525
+ this.onSimpleTaskEditCancel = new EventEmitter();
526
+ /**
527
+ * Fires on the owning TaskBoard when inline editing of a field has successfully finished.
528
+ * ...
529
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-simpleTaskEditComplete)
530
+ * @param {object} event Event object
531
+ * @param {TaskBoard.view.TaskBoard} event.source The task board
532
+ * @param {TaskBoard.feature.SimpleTaskEdit} event.simpleTaskEdit The simpleTaskEdit feature
533
+ * @param {TaskBoard.model.TaskModel} event.taskRecord Record that was edited
534
+ * @param {string} event.field Field name being edited
535
+ */
536
+ this.onSimpleTaskEditComplete = new EventEmitter();
537
+ /**
538
+ * Triggered when a swimlane is collapsed.
539
+ * @param {object} event Event object
540
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
541
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
542
+ */
543
+ this.onSwimlaneCollapse = new EventEmitter();
544
+ /**
545
+ * Triggered when a swimlane is expanded.
546
+ * @param {object} event Event object
547
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
548
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
549
+ */
550
+ this.onSwimlaneExpand = new EventEmitter();
551
+ /**
552
+ * Triggered when a swimlane header is clicked.
553
+ * ...
554
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-swimlaneHeaderClick)
555
+ * @param {object} event Event object
556
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
557
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
558
+ * @param {MouseEvent} event.event Browser event
559
+ */
560
+ this.onSwimlaneHeaderClick = new EventEmitter();
561
+ /**
562
+ * Triggered when a swimlane header is right-clicked.
563
+ * ...
564
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-swimlaneHeaderContextMenu)
565
+ * @param {object} event Event object
566
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
567
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
568
+ * @param {MouseEvent} event.event Browser event
569
+ */
570
+ this.onSwimlaneHeaderContextMenu = new EventEmitter();
571
+ /**
572
+ * Triggered when a swimlane header is double-clicked.
573
+ * ...
574
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-swimlaneHeaderDblClick)
575
+ * @param {object} event Event object
576
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
577
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
578
+ * @param {MouseEvent} event.event Browser event
579
+ */
580
+ this.onSwimlaneHeaderDblClick = new EventEmitter();
581
+ /**
582
+ * Triggered when the swimlane collapsed state is toggled.
583
+ * @param {object} event Event object
584
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
585
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
586
+ * @param {boolean} event.collapse `true` if the column is being collapsed.
587
+ */
588
+ this.onSwimlaneToggle = new EventEmitter();
589
+ /**
590
+ * Triggered when a card is clicked.
591
+ * ...
592
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskClick)
593
+ * @param {object} event Event object
594
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
595
+ * @param {TaskBoard.model.TaskModel} event.taskRecord Task record
596
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record for the tasks column
597
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record for the tasks swimlane (if used)
598
+ * @param {MouseEvent} event.event Browser event
599
+ */
600
+ this.onTaskClick = new EventEmitter();
601
+ /**
602
+ * Triggered when a card is double-clicked
603
+ * ...
604
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskDblClick)
605
+ * @param {object} event Event object
606
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
607
+ * @param {TaskBoard.model.TaskModel} event.taskRecord Task record
608
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record for the tasks column
609
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record for the tasks swimlane (if used)
610
+ * @param {MouseEvent} event.event Browser event
611
+ */
612
+ this.onTaskDblClick = new EventEmitter();
613
+ /**
614
+ * Fires on the owning TaskBoard when tasks are dragged, if the drag leads to any changes compared to
615
+ * the last taskDrag event (moved to a new column or changed order within a column).
616
+ * ...
617
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskDrag)
618
+ * @param {object} event Event object
619
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
620
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Dragged tasks
621
+ * @param {TaskBoard.model.ColumnModel} event.targetColumn Currently over this column
622
+ * @param {TaskBoard.model.SwimlaneModel} event.targetSwimlane Currently over this swimlane (if used)
623
+ * @param {Event} event.domEvent The mouse event
624
+ */
625
+ this.onTaskDrag = new EventEmitter();
626
+ /**
627
+ * Fires on the owning TaskBoard when a drag operation is aborted (invalid drop or aborted using ESC)
628
+ * @param {object} event Event object
629
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
630
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Dragged tasks
631
+ */
632
+ this.onTaskDragAbort = new EventEmitter();
633
+ /**
634
+ * Fires on the owning TaskBoard when a previously started drag operation ends, no matter the
635
+ * outcome of it (whether valid, invalid or aborted)
636
+ * @param {object} event Event object
637
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
638
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Affected tasks
639
+ * @param {Event} event.domEvent The mouse event
640
+ */
641
+ this.onTaskDragEnd = new EventEmitter();
642
+ /**
643
+ * Fires on the owning TaskBoard when task dragging starts
644
+ * @param {object} event Event object
645
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
646
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Tasks to be dragged
647
+ * @param {Event} event.domEvent The mouse event
648
+ */
649
+ this.onTaskDragStart = new EventEmitter();
650
+ /**
651
+ * Fires on the owning TaskBoard when tasks are successfully dropped (after the drop transition has
652
+ * finished)
653
+ * @param {object} event Event object
654
+ * @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
655
+ * @param {TaskBoard.model.TaskModel[]} event.taskRecords Dropped tasks
656
+ * @param {TaskBoard.model.ColumnModel} event.targetColumn Dropped on this column
657
+ * @param {TaskBoard.model.SwimlaneModel} event.targetSwimlane Dropped in this swimlane (if used)
658
+ * @param {Event} event.domEvent The mouse event
659
+ */
660
+ this.onTaskDrop = new EventEmitter();
661
+ /**
662
+ * This event fires on the owning TaskBoard before the context menu is shown for a task.
663
+ * Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/taskboard/docs/api/TaskBoard/feature/TaskMenu#config-processItems).
664
+ * ...
665
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskMenuBeforeShow)
666
+ * @param {object} event Event object
667
+ * @param {TaskBoard.view.TaskBoard} event.source The grid
668
+ * @param {Core.widget.Menu} event.menu The menu
669
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
670
+ * @param {TaskBoard.model.TaskModel} event.taskRecord The task
671
+ */
672
+ this.onTaskMenuBeforeShow = new EventEmitter();
673
+ /**
674
+ * This event fires on the owning TaskBoard when an item is selected in the task context menu.
675
+ * @param {object} event Event object
676
+ * @param {TaskBoard.view.TaskBoard} event.source The grid
677
+ * @param {Core.widget.Menu} event.menu The menu
678
+ * @param {Core.widget.MenuItem} event.item Selected menu item
679
+ * @param {TaskBoard.model.TaskModel} event.taskRecord The task
680
+ */
681
+ this.onTaskMenuItem = new EventEmitter();
682
+ /**
683
+ * This event fires on the owning TaskBoard after the context menu is shown for a task.
684
+ * @param {object} event Event object
685
+ * @param {TaskBoard.view.TaskBoard} event.source The grid
686
+ * @param {Core.widget.Menu} event.menu The menu
687
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
688
+ * @param {TaskBoard.model.TaskModel} event.taskRecord The task
689
+ */
690
+ this.onTaskMenuShow = new EventEmitter();
691
+ /**
692
+ * This event fires on the owning TaskBoard when a check item is toggled in the task context menu.
693
+ * @param {object} event Event object
694
+ * @param {TaskBoard.view.TaskBoard} event.source The grid
695
+ * @param {Core.widget.Menu} event.menu The menu
696
+ * @param {Core.widget.MenuItem} event.item Selected menu item
697
+ * @param {TaskBoard.model.TaskModel} event.taskRecord The task
698
+ * @param {boolean} event.checked Checked or not
699
+ */
700
+ this.onTaskMenuToggleItem = new EventEmitter();
701
+ /**
702
+ * Triggered when the mouse enters a card
703
+ * ...
704
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskMouseEnter)
705
+ * @param {object} event Event object
706
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
707
+ * @param {TaskBoard.model.TaskModel} event.taskRecord Task record
708
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record for the tasks column
709
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record for the tasks swimlane (if used)
710
+ * @param {MouseEvent} event.event Browser event
711
+ */
712
+ this.onTaskMouseEnter = new EventEmitter();
713
+ /**
714
+ * Triggered when the mouse leaves a card
715
+ * ...
716
+ * [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskMouseLeave)
717
+ * @param {object} event Event object
718
+ * @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
719
+ * @param {TaskBoard.model.TaskModel} event.taskRecord Task record
720
+ * @param {TaskBoard.model.ColumnModel} event.columnRecord Column record for the tasks column
721
+ * @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record for the tasks swimlane (if used)
722
+ * @param {MouseEvent} event.event Browser event
723
+ */
724
+ this.onTaskMouseLeave = new EventEmitter();
725
+ /**
726
+ * A header [tool](https://bryntum.com/products/taskboard/docs/api/Core/widget/Panel#config-tools) has been clicked.
727
+ * @param {object} event Event object
728
+ * @param {Core.widget.Tool} event.source This Panel.
729
+ * @param {Core.widget.Tool} event.tool The tool which is being clicked.
730
+ */
731
+ this.onToolClick = new EventEmitter();
732
+ this.elementRef = element;
733
+ }
734
+ /**
735
+ * Create and append the underlying widget
736
+ */
737
+ ngOnInit() {
738
+ const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumTaskBoardBaseComponent;
739
+ bryntumConfigs.filter(prop => prop in this).forEach(prop => {
740
+ // @ts-ignore
741
+ WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
742
+ if (['features', 'config'].includes(prop)) {
743
+ WrapperHelper.devWarningConfigProp(instanceName, prop);
744
+ }
745
+ });
746
+ // @ts-ignore
747
+ bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
748
+ const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
749
+ // @ts-ignore
750
+ bryntumConfig.listeners[eventName(event)] = e => {
751
+ // @ts-ignore
752
+ me[event].emit(e);
753
+ // EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
754
+ // in Angular listeners
755
+ return e.returnValue;
756
+ };
757
+ });
758
+ // If component has no container specified in config then use adopt to Wrapper's element
759
+ const containerParam = [
760
+ 'adopt',
761
+ 'appendTo',
762
+ 'insertAfter',
763
+ 'insertBefore'
764
+ // @ts-ignore
765
+ ].find(prop => bryntumConfig[prop]);
766
+ if (!containerParam) {
767
+ if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
768
+ // Button should always be <a> or <button> inside owner element
769
+ bryntumConfig.appendTo = elementRef.nativeElement;
770
+ }
771
+ else {
772
+ bryntumConfig.adopt = elementRef.nativeElement;
773
+ }
774
+ }
775
+ else {
776
+ WrapperHelper.devWarningContainer(instanceName, containerParam);
777
+ }
778
+ // @ts-ignore
779
+ me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
780
+ // Backwards compatibility for gridInstance, schedulerInstance etc.
781
+ // @ts-ignore
782
+ me[StringHelper.uncapitalize(instanceName) + 'Instance'] = me.instance;
783
+ //
784
+ }
785
+ /**
786
+ * Watch for changes
787
+ * @param changes
788
+ */
789
+ ngOnChanges(changes) {
790
+ const { instance } = this, { instanceName } = BryntumTaskBoardBaseComponent;
791
+ if (!instance) {
792
+ return;
793
+ }
794
+ // Iterate over all changes
795
+ Object.entries(changes).forEach(([prop, change]) => {
796
+ const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumTaskBoardBaseComponent;
797
+ if (bryntumProps.includes(prop)) {
798
+ WrapperHelper.applyPropValue(instance, prop, newValue, false);
799
+ if (bryntumConfigsOnly.includes(prop)) {
800
+ WrapperHelper.devWarningUpdateProp(instanceName, prop);
801
+ }
802
+ }
803
+ });
804
+ }
805
+ /**
806
+ * Destroy the component
807
+ */
808
+ ngOnDestroy() {
809
+ // @ts-ignore
810
+ if (this.instance && this.instance.destroy) {
811
+ this.instance.destroy();
812
+ }
813
+ }
814
+ }
815
+ BryntumTaskBoardBaseComponent.instanceClass = TaskBoardBase;
816
+ BryntumTaskBoardBaseComponent.instanceName = 'TaskBoardBase';
817
+ BryntumTaskBoardBaseComponent.bryntumEvents = [
818
+ 'onActivateTask',
819
+ 'onBeforeColumnDrag',
820
+ 'onBeforeColumnDrop',
821
+ 'onBeforeColumnResize',
822
+ 'onBeforeDestroy',
823
+ 'onBeforeHide',
824
+ 'onBeforeResponsiveStateChange',
825
+ 'onBeforeShow',
826
+ 'onBeforeSimpleTaskEdit',
827
+ 'onBeforeStateApply',
828
+ 'onBeforeStateSave',
829
+ 'onBeforeTaskDrag',
830
+ 'onBeforeTaskDrop',
831
+ 'onBeforeTaskEdit',
832
+ 'onBeforeTaskEditShow',
833
+ 'onBeforeTaskRemove',
834
+ 'onCatchAll',
835
+ 'onCellMenuItem',
836
+ 'onCellMenuShow',
837
+ 'onCellMenuToggleItem',
838
+ 'onCollapse',
839
+ 'onColumnCollapse',
840
+ 'onColumnDrag',
841
+ 'onColumnDragAbort',
842
+ 'onColumnDragEnd',
843
+ 'onColumnDragStart',
844
+ 'onColumnDrop',
845
+ 'onColumnExpand',
846
+ 'onColumnFilterHide',
847
+ 'onColumnFilterShow',
848
+ 'onColumnFilterToggle',
849
+ 'onColumnHeaderClick',
850
+ 'onColumnHeaderContextMenu',
851
+ 'onColumnHeaderDblClick',
852
+ 'onColumnHeaderMenuBeforeShow',
853
+ 'onColumnResize',
854
+ 'onColumnResizeStart',
855
+ 'onColumnTitleClick',
856
+ 'onColumnTitleContextMenu',
857
+ 'onColumnTitleDblClick',
858
+ 'onColumnToggle',
859
+ 'onDestroy',
860
+ 'onDirtyStateChange',
861
+ 'onElementCreated',
862
+ 'onExpand',
863
+ 'onFocusIn',
864
+ 'onFocusOut',
865
+ 'onHide',
866
+ 'onPaint',
867
+ 'onReadOnly',
868
+ 'onRecompose',
869
+ 'onRemoveTaskElement',
870
+ 'onRenderTask',
871
+ 'onRenderTasks',
872
+ 'onResize',
873
+ 'onResponsiveStateChange',
874
+ 'onSelectionChange',
875
+ 'onShow',
876
+ 'onSimpleTaskEditCancel',
877
+ 'onSimpleTaskEditComplete',
878
+ 'onSwimlaneCollapse',
879
+ 'onSwimlaneExpand',
880
+ 'onSwimlaneHeaderClick',
881
+ 'onSwimlaneHeaderContextMenu',
882
+ 'onSwimlaneHeaderDblClick',
883
+ 'onSwimlaneToggle',
884
+ 'onTaskClick',
885
+ 'onTaskDblClick',
886
+ 'onTaskDrag',
887
+ 'onTaskDragAbort',
888
+ 'onTaskDragEnd',
889
+ 'onTaskDragStart',
890
+ 'onTaskDrop',
891
+ 'onTaskMenuBeforeShow',
892
+ 'onTaskMenuItem',
893
+ 'onTaskMenuShow',
894
+ 'onTaskMenuToggleItem',
895
+ 'onTaskMouseEnter',
896
+ 'onTaskMouseLeave',
897
+ 'onToolClick'
898
+ ];
899
+ BryntumTaskBoardBaseComponent.bryntumFeatureNames = [
900
+ 'columnDragFeature',
901
+ 'columnFilterFeature',
902
+ 'columnHeaderMenuFeature',
903
+ 'columnLockFeature',
904
+ 'columnRenameFeature',
905
+ 'columnResizeFeature',
906
+ 'columnSortFeature',
907
+ 'columnToolbarsFeature',
908
+ 'filterBarFeature',
909
+ 'simpleTaskEditFeature',
910
+ 'swimlaneDragFeature',
911
+ 'taskDragFeature',
912
+ 'taskDragSelectFeature',
913
+ 'taskEditFeature',
914
+ 'taskMenuFeature',
915
+ 'taskTooltipFeature'
916
+ ];
917
+ BryntumTaskBoardBaseComponent.bryntumConfigs = BryntumTaskBoardBaseComponent.bryntumFeatureNames.concat([
918
+ 'activateTaskEvent',
919
+ 'adopt',
920
+ 'align',
921
+ 'alignSelf',
922
+ 'anchor',
923
+ 'appendTo',
924
+ 'ariaDescription',
925
+ 'ariaLabel',
926
+ 'assignments',
927
+ 'autoGenerateColumns',
928
+ 'autoGenerateSwimlanes',
929
+ 'bbar',
930
+ 'bodyCls',
931
+ 'bodyItems',
932
+ 'bubbleEvents',
933
+ 'callOnFunctions',
934
+ 'cardSizes',
935
+ 'catchEventHandlerExceptions',
936
+ 'centered',
937
+ 'chainFilters',
938
+ 'cls',
939
+ 'collapsed',
940
+ 'collapseTitle',
941
+ 'collapsible',
942
+ 'color',
943
+ 'column',
944
+ 'columnField',
945
+ 'columns',
946
+ 'columnTitleRenderer',
947
+ 'config',
948
+ 'constrainTo',
949
+ 'css',
950
+ 'cssVarPrefix',
951
+ 'dataField',
952
+ 'dataset',
953
+ 'detectCSSCompatibilityIssues',
954
+ 'disabled',
955
+ 'dock',
956
+ 'draggable',
957
+ 'drawer',
958
+ 'drawOnScroll',
959
+ 'elementAttributes',
960
+ 'extraData',
961
+ 'flex',
962
+ 'floating',
963
+ 'footer',
964
+ 'footerItems',
965
+ 'getTaskHeight',
966
+ 'header',
967
+ 'headerItems',
968
+ 'height',
969
+ 'hidden',
970
+ 'hideAnimation',
971
+ 'htmlEncodeHeaderText',
972
+ 'icon',
973
+ 'id',
974
+ 'ignoreParentReadOnly',
975
+ 'inputFieldAlign',
976
+ 'insertBefore',
977
+ 'insertFirst',
978
+ 'isTaskSelectable',
979
+ 'keyMap',
980
+ 'labelPosition',
981
+ 'listeners',
982
+ 'loadMask',
983
+ 'loadMaskDefaults',
984
+ 'loadMaskError',
985
+ 'localeClass',
986
+ 'localizable',
987
+ 'localizableProperties',
988
+ 'margin',
989
+ 'maskDefaults',
990
+ 'masked',
991
+ 'maxHeight',
992
+ 'maximizeOnMobile',
993
+ 'maxWidth',
994
+ 'minHeight',
995
+ 'minWidth',
996
+ 'newTaskDefaults',
997
+ 'owner',
998
+ 'plugins',
999
+ 'positioned',
1000
+ 'processItems',
1001
+ 'project',
1002
+ 'readOnly',
1003
+ 'record',
1004
+ 'relayStoreEvents',
1005
+ 'rendition',
1006
+ 'resourceImagePath',
1007
+ 'resources',
1008
+ 'responsive',
1009
+ 'responsiveRoot',
1010
+ 'responsiveState',
1011
+ 'responsiveTarget',
1012
+ 'rootElement',
1013
+ 'rtl',
1014
+ 'scrollable',
1015
+ 'scrollAction',
1016
+ 'scrollManager',
1017
+ 'scrollOptions',
1018
+ 'selectedTasks',
1019
+ 'selectOnNavigation',
1020
+ 'showAnimation',
1021
+ 'showCollapseInHeader',
1022
+ 'showCollapseTooltip',
1023
+ 'showCountInHeader',
1024
+ 'span',
1025
+ 'stateful',
1026
+ 'statefulEvents',
1027
+ 'stateId',
1028
+ 'stateProvider',
1029
+ 'stickyHeaders',
1030
+ 'stretchCards',
1031
+ 'strictRecordMapping',
1032
+ 'strips',
1033
+ 'swimlaneField',
1034
+ 'swimlaneRenderer',
1035
+ 'swimlanes',
1036
+ 'syncMask',
1037
+ 'tab',
1038
+ 'tabBarItems',
1039
+ 'taskRenderer',
1040
+ 'tasks',
1041
+ 'taskSorterFn',
1042
+ 'tasksPerRow',
1043
+ 'tbar',
1044
+ 'title',
1045
+ 'tools',
1046
+ 'ui',
1047
+ 'useDomTransition',
1048
+ 'virtualize',
1049
+ 'weight',
1050
+ 'width',
1051
+ 'x',
1052
+ 'y'
1053
+ ]);
1054
+ BryntumTaskBoardBaseComponent.bryntumConfigsOnly = [
1055
+ 'activateTaskEvent',
1056
+ 'adopt',
1057
+ 'align',
1058
+ 'anchor',
1059
+ 'ariaDescription',
1060
+ 'ariaLabel',
1061
+ 'autoGenerateColumns',
1062
+ 'autoGenerateSwimlanes',
1063
+ 'bbar',
1064
+ 'bodyCls',
1065
+ 'bubbleEvents',
1066
+ 'cardSizes',
1067
+ 'centered',
1068
+ 'chainFilters',
1069
+ 'collapseTitle',
1070
+ 'collapsible',
1071
+ 'color',
1072
+ 'columnTitleRenderer',
1073
+ 'config',
1074
+ 'constrainTo',
1075
+ 'cssVarPrefix',
1076
+ 'dataField',
1077
+ 'detectCSSCompatibilityIssues',
1078
+ 'dock',
1079
+ 'draggable',
1080
+ 'drawer',
1081
+ 'elementAttributes',
1082
+ 'floating',
1083
+ 'footer',
1084
+ 'header',
1085
+ 'hideAnimation',
1086
+ 'htmlEncodeHeaderText',
1087
+ 'icon',
1088
+ 'ignoreParentReadOnly',
1089
+ 'listeners',
1090
+ 'loadMask',
1091
+ 'loadMaskDefaults',
1092
+ 'loadMaskError',
1093
+ 'localeClass',
1094
+ 'localizable',
1095
+ 'localizableProperties',
1096
+ 'maskDefaults',
1097
+ 'masked',
1098
+ 'newTaskDefaults',
1099
+ 'owner',
1100
+ 'plugins',
1101
+ 'positioned',
1102
+ 'processItems',
1103
+ 'record',
1104
+ 'relayStoreEvents',
1105
+ 'resourceImagePath',
1106
+ 'responsive',
1107
+ 'responsiveRoot',
1108
+ 'responsiveState',
1109
+ 'responsiveTarget',
1110
+ 'rootElement',
1111
+ 'scrollable',
1112
+ 'scrollAction',
1113
+ 'scrollManager',
1114
+ 'scrollOptions',
1115
+ 'selectOnNavigation',
1116
+ 'showAnimation',
1117
+ 'showCollapseInHeader',
1118
+ 'showCountInHeader',
1119
+ 'stateful',
1120
+ 'statefulEvents',
1121
+ 'stateId',
1122
+ 'stateProvider',
1123
+ 'stickyHeaders',
1124
+ 'strips',
1125
+ 'swimlaneRenderer',
1126
+ 'syncMask',
1127
+ 'tab',
1128
+ 'tabBarItems',
1129
+ 'taskRenderer',
1130
+ 'taskSorterFn',
1131
+ 'tasksPerRow',
1132
+ 'tbar',
1133
+ 'ui',
1134
+ 'useDomTransition',
1135
+ 'weight'
1136
+ ];
1137
+ BryntumTaskBoardBaseComponent.bryntumProps = BryntumTaskBoardBaseComponent.bryntumFeatureNames.concat([
1138
+ 'alignSelf',
1139
+ 'anchorSize',
1140
+ 'appendTo',
1141
+ 'assignments',
1142
+ 'bodyItems',
1143
+ 'callOnFunctions',
1144
+ 'catchEventHandlerExceptions',
1145
+ 'cls',
1146
+ 'collapsed',
1147
+ 'column',
1148
+ 'columnField',
1149
+ 'columns',
1150
+ 'css',
1151
+ 'dataset',
1152
+ 'disabled',
1153
+ 'drawOnScroll',
1154
+ 'extraData',
1155
+ 'flex',
1156
+ 'focusVisible',
1157
+ 'footerItems',
1158
+ 'getTaskHeight',
1159
+ 'hasChanges',
1160
+ 'headerItems',
1161
+ 'height',
1162
+ 'hidden',
1163
+ 'id',
1164
+ 'inputFieldAlign',
1165
+ 'insertBefore',
1166
+ 'insertFirst',
1167
+ 'isTaskSelectable',
1168
+ 'keyMap',
1169
+ 'labelPosition',
1170
+ 'margin',
1171
+ 'maxHeight',
1172
+ 'maximizeOnMobile',
1173
+ 'maxWidth',
1174
+ 'minHeight',
1175
+ 'minWidth',
1176
+ 'parent',
1177
+ 'project',
1178
+ 'readOnly',
1179
+ 'rendition',
1180
+ 'resources',
1181
+ 'rtl',
1182
+ 'selectedTasks',
1183
+ 'showCollapseTooltip',
1184
+ 'span',
1185
+ 'state',
1186
+ 'stretchCards',
1187
+ 'strictRecordMapping',
1188
+ 'swimlaneField',
1189
+ 'swimlanes',
1190
+ 'tasks',
1191
+ 'title',
1192
+ 'tools',
1193
+ 'virtualize',
1194
+ 'width',
1195
+ 'x',
1196
+ 'y'
1197
+ ]);
1198
+ BryntumTaskBoardBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTaskBoardBaseComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1199
+ BryntumTaskBoardBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumTaskBoardBaseComponent, selector: "bryntum-task-board-base", inputs: { activateTaskEvent: "activateTaskEvent", adopt: "adopt", align: "align", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", autoGenerateColumns: "autoGenerateColumns", autoGenerateSwimlanes: "autoGenerateSwimlanes", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", cardSizes: "cardSizes", centered: "centered", chainFilters: "chainFilters", collapseTitle: "collapseTitle", collapsible: "collapsible", color: "color", columnTitleRenderer: "columnTitleRenderer", config: "config", constrainTo: "constrainTo", cssVarPrefix: "cssVarPrefix", dataField: "dataField", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", dock: "dock", draggable: "draggable", drawer: "drawer", elementAttributes: "elementAttributes", floating: "floating", footer: "footer", header: "header", hideAnimation: "hideAnimation", htmlEncodeHeaderText: "htmlEncodeHeaderText", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", listeners: "listeners", loadMask: "loadMask", loadMaskDefaults: "loadMaskDefaults", loadMaskError: "loadMaskError", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maskDefaults: "maskDefaults", masked: "masked", newTaskDefaults: "newTaskDefaults", owner: "owner", plugins: "plugins", positioned: "positioned", processItems: "processItems", record: "record", relayStoreEvents: "relayStoreEvents", resourceImagePath: "resourceImagePath", responsive: "responsive", responsiveRoot: "responsiveRoot", responsiveState: "responsiveState", responsiveTarget: "responsiveTarget", rootElement: "rootElement", scrollable: "scrollable", scrollAction: "scrollAction", scrollManager: "scrollManager", scrollOptions: "scrollOptions", selectOnNavigation: "selectOnNavigation", showAnimation: "showAnimation", showCollapseInHeader: "showCollapseInHeader", showCountInHeader: "showCountInHeader", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", stickyHeaders: "stickyHeaders", strips: "strips", swimlaneRenderer: "swimlaneRenderer", syncMask: "syncMask", tab: "tab", tabBarItems: "tabBarItems", taskRenderer: "taskRenderer", taskSorterFn: "taskSorterFn", tasksPerRow: "tasksPerRow", tbar: "tbar", ui: "ui", useDomTransition: "useDomTransition", weight: "weight", alignSelf: "alignSelf", appendTo: "appendTo", assignments: "assignments", bodyItems: "bodyItems", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", collapsed: "collapsed", column: "column", columnField: "columnField", columns: "columns", css: "css", dataset: "dataset", disabled: "disabled", drawOnScroll: "drawOnScroll", extraData: "extraData", flex: "flex", footerItems: "footerItems", getTaskHeight: "getTaskHeight", headerItems: "headerItems", height: "height", hidden: "hidden", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", isTaskSelectable: "isTaskSelectable", keyMap: "keyMap", labelPosition: "labelPosition", margin: "margin", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minHeight: "minHeight", minWidth: "minWidth", project: "project", readOnly: "readOnly", rendition: "rendition", resources: "resources", rtl: "rtl", selectedTasks: "selectedTasks", showCollapseTooltip: "showCollapseTooltip", span: "span", stretchCards: "stretchCards", strictRecordMapping: "strictRecordMapping", swimlaneField: "swimlaneField", swimlanes: "swimlanes", tasks: "tasks", title: "title", tools: "tools", virtualize: "virtualize", width: "width", x: "x", y: "y", anchorSize: "anchorSize", focusVisible: "focusVisible", hasChanges: "hasChanges", parent: "parent", state: "state", columnDragFeature: "columnDragFeature", columnFilterFeature: "columnFilterFeature", columnHeaderMenuFeature: "columnHeaderMenuFeature", columnLockFeature: "columnLockFeature", columnRenameFeature: "columnRenameFeature", columnResizeFeature: "columnResizeFeature", columnSortFeature: "columnSortFeature", columnToolbarsFeature: "columnToolbarsFeature", filterBarFeature: "filterBarFeature", simpleTaskEditFeature: "simpleTaskEditFeature", swimlaneDragFeature: "swimlaneDragFeature", taskDragFeature: "taskDragFeature", taskDragSelectFeature: "taskDragSelectFeature", taskEditFeature: "taskEditFeature", taskMenuFeature: "taskMenuFeature", taskTooltipFeature: "taskTooltipFeature" }, outputs: { onActivateTask: "onActivateTask", onBeforeColumnDrag: "onBeforeColumnDrag", onBeforeColumnDrop: "onBeforeColumnDrop", onBeforeColumnResize: "onBeforeColumnResize", onBeforeDestroy: "onBeforeDestroy", onBeforeHide: "onBeforeHide", onBeforeResponsiveStateChange: "onBeforeResponsiveStateChange", onBeforeShow: "onBeforeShow", onBeforeSimpleTaskEdit: "onBeforeSimpleTaskEdit", onBeforeStateApply: "onBeforeStateApply", onBeforeStateSave: "onBeforeStateSave", onBeforeTaskDrag: "onBeforeTaskDrag", onBeforeTaskDrop: "onBeforeTaskDrop", onBeforeTaskEdit: "onBeforeTaskEdit", onBeforeTaskEditShow: "onBeforeTaskEditShow", onBeforeTaskRemove: "onBeforeTaskRemove", onCatchAll: "onCatchAll", onCellMenuItem: "onCellMenuItem", onCellMenuShow: "onCellMenuShow", onCellMenuToggleItem: "onCellMenuToggleItem", onCollapse: "onCollapse", onColumnCollapse: "onColumnCollapse", onColumnDrag: "onColumnDrag", onColumnDragAbort: "onColumnDragAbort", onColumnDragEnd: "onColumnDragEnd", onColumnDragStart: "onColumnDragStart", onColumnDrop: "onColumnDrop", onColumnExpand: "onColumnExpand", onColumnFilterHide: "onColumnFilterHide", onColumnFilterShow: "onColumnFilterShow", onColumnFilterToggle: "onColumnFilterToggle", onColumnHeaderClick: "onColumnHeaderClick", onColumnHeaderContextMenu: "onColumnHeaderContextMenu", onColumnHeaderDblClick: "onColumnHeaderDblClick", onColumnHeaderMenuBeforeShow: "onColumnHeaderMenuBeforeShow", onColumnResize: "onColumnResize", onColumnResizeStart: "onColumnResizeStart", onColumnTitleClick: "onColumnTitleClick", onColumnTitleContextMenu: "onColumnTitleContextMenu", onColumnTitleDblClick: "onColumnTitleDblClick", onColumnToggle: "onColumnToggle", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onElementCreated: "onElementCreated", onExpand: "onExpand", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onPaint: "onPaint", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRemoveTaskElement: "onRemoveTaskElement", onRenderTask: "onRenderTask", onRenderTasks: "onRenderTasks", onResize: "onResize", onResponsiveStateChange: "onResponsiveStateChange", onSelectionChange: "onSelectionChange", onShow: "onShow", onSimpleTaskEditCancel: "onSimpleTaskEditCancel", onSimpleTaskEditComplete: "onSimpleTaskEditComplete", onSwimlaneCollapse: "onSwimlaneCollapse", onSwimlaneExpand: "onSwimlaneExpand", onSwimlaneHeaderClick: "onSwimlaneHeaderClick", onSwimlaneHeaderContextMenu: "onSwimlaneHeaderContextMenu", onSwimlaneHeaderDblClick: "onSwimlaneHeaderDblClick", onSwimlaneToggle: "onSwimlaneToggle", onTaskClick: "onTaskClick", onTaskDblClick: "onTaskDblClick", onTaskDrag: "onTaskDrag", onTaskDragAbort: "onTaskDragAbort", onTaskDragEnd: "onTaskDragEnd", onTaskDragStart: "onTaskDragStart", onTaskDrop: "onTaskDrop", onTaskMenuBeforeShow: "onTaskMenuBeforeShow", onTaskMenuItem: "onTaskMenuItem", onTaskMenuShow: "onTaskMenuShow", onTaskMenuToggleItem: "onTaskMenuToggleItem", onTaskMouseEnter: "onTaskMouseEnter", onTaskMouseLeave: "onTaskMouseLeave", onToolClick: "onToolClick" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
1200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTaskBoardBaseComponent, decorators: [{
1201
+ type: Component,
1202
+ args: [{
1203
+ selector: 'bryntum-task-board-base',
1204
+ template: ''
1205
+ }]
1206
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { activateTaskEvent: [{
1207
+ type: Input
1208
+ }], adopt: [{
1209
+ type: Input
1210
+ }], align: [{
1211
+ type: Input
1212
+ }], anchor: [{
1213
+ type: Input
1214
+ }], ariaDescription: [{
1215
+ type: Input
1216
+ }], ariaLabel: [{
1217
+ type: Input
1218
+ }], autoGenerateColumns: [{
1219
+ type: Input
1220
+ }], autoGenerateSwimlanes: [{
1221
+ type: Input
1222
+ }], bbar: [{
1223
+ type: Input
1224
+ }], bodyCls: [{
1225
+ type: Input
1226
+ }], bubbleEvents: [{
1227
+ type: Input
1228
+ }], cardSizes: [{
1229
+ type: Input
1230
+ }], centered: [{
1231
+ type: Input
1232
+ }], chainFilters: [{
1233
+ type: Input
1234
+ }], collapseTitle: [{
1235
+ type: Input
1236
+ }], collapsible: [{
1237
+ type: Input
1238
+ }], color: [{
1239
+ type: Input
1240
+ }], columnTitleRenderer: [{
1241
+ type: Input
1242
+ }], config: [{
1243
+ type: Input
1244
+ }], constrainTo: [{
1245
+ type: Input
1246
+ }], cssVarPrefix: [{
1247
+ type: Input
1248
+ }], dataField: [{
1249
+ type: Input
1250
+ }], detectCSSCompatibilityIssues: [{
1251
+ type: Input
1252
+ }], dock: [{
1253
+ type: Input
1254
+ }], draggable: [{
1255
+ type: Input
1256
+ }], drawer: [{
1257
+ type: Input
1258
+ }], elementAttributes: [{
1259
+ type: Input
1260
+ }], floating: [{
1261
+ type: Input
1262
+ }], footer: [{
1263
+ type: Input
1264
+ }], header: [{
1265
+ type: Input
1266
+ }], hideAnimation: [{
1267
+ type: Input
1268
+ }], htmlEncodeHeaderText: [{
1269
+ type: Input
1270
+ }], icon: [{
1271
+ type: Input
1272
+ }], ignoreParentReadOnly: [{
1273
+ type: Input
1274
+ }], listeners: [{
1275
+ type: Input
1276
+ }], loadMask: [{
1277
+ type: Input
1278
+ }], loadMaskDefaults: [{
1279
+ type: Input
1280
+ }], loadMaskError: [{
1281
+ type: Input
1282
+ }], localeClass: [{
1283
+ type: Input
1284
+ }], localizable: [{
1285
+ type: Input
1286
+ }], localizableProperties: [{
1287
+ type: Input
1288
+ }], maskDefaults: [{
1289
+ type: Input
1290
+ }], masked: [{
1291
+ type: Input
1292
+ }], newTaskDefaults: [{
1293
+ type: Input
1294
+ }], owner: [{
1295
+ type: Input
1296
+ }], plugins: [{
1297
+ type: Input
1298
+ }], positioned: [{
1299
+ type: Input
1300
+ }], processItems: [{
1301
+ type: Input
1302
+ }], record: [{
1303
+ type: Input
1304
+ }], relayStoreEvents: [{
1305
+ type: Input
1306
+ }], resourceImagePath: [{
1307
+ type: Input
1308
+ }], responsive: [{
1309
+ type: Input
1310
+ }], responsiveRoot: [{
1311
+ type: Input
1312
+ }], responsiveState: [{
1313
+ type: Input
1314
+ }], responsiveTarget: [{
1315
+ type: Input
1316
+ }], rootElement: [{
1317
+ type: Input
1318
+ }], scrollable: [{
1319
+ type: Input
1320
+ }], scrollAction: [{
1321
+ type: Input
1322
+ }], scrollManager: [{
1323
+ type: Input
1324
+ }], scrollOptions: [{
1325
+ type: Input
1326
+ }], selectOnNavigation: [{
1327
+ type: Input
1328
+ }], showAnimation: [{
1329
+ type: Input
1330
+ }], showCollapseInHeader: [{
1331
+ type: Input
1332
+ }], showCountInHeader: [{
1333
+ type: Input
1334
+ }], stateful: [{
1335
+ type: Input
1336
+ }], statefulEvents: [{
1337
+ type: Input
1338
+ }], stateId: [{
1339
+ type: Input
1340
+ }], stateProvider: [{
1341
+ type: Input
1342
+ }], stickyHeaders: [{
1343
+ type: Input
1344
+ }], strips: [{
1345
+ type: Input
1346
+ }], swimlaneRenderer: [{
1347
+ type: Input
1348
+ }], syncMask: [{
1349
+ type: Input
1350
+ }], tab: [{
1351
+ type: Input
1352
+ }], tabBarItems: [{
1353
+ type: Input
1354
+ }], taskRenderer: [{
1355
+ type: Input
1356
+ }], taskSorterFn: [{
1357
+ type: Input
1358
+ }], tasksPerRow: [{
1359
+ type: Input
1360
+ }], tbar: [{
1361
+ type: Input
1362
+ }], ui: [{
1363
+ type: Input
1364
+ }], useDomTransition: [{
1365
+ type: Input
1366
+ }], weight: [{
1367
+ type: Input
1368
+ }], alignSelf: [{
1369
+ type: Input
1370
+ }], appendTo: [{
1371
+ type: Input
1372
+ }], assignments: [{
1373
+ type: Input
1374
+ }], bodyItems: [{
1375
+ type: Input
1376
+ }], callOnFunctions: [{
1377
+ type: Input
1378
+ }], catchEventHandlerExceptions: [{
1379
+ type: Input
1380
+ }], cls: [{
1381
+ type: Input
1382
+ }], collapsed: [{
1383
+ type: Input
1384
+ }], column: [{
1385
+ type: Input
1386
+ }], columnField: [{
1387
+ type: Input
1388
+ }], columns: [{
1389
+ type: Input
1390
+ }], css: [{
1391
+ type: Input
1392
+ }], dataset: [{
1393
+ type: Input
1394
+ }], disabled: [{
1395
+ type: Input
1396
+ }], drawOnScroll: [{
1397
+ type: Input
1398
+ }], extraData: [{
1399
+ type: Input
1400
+ }], flex: [{
1401
+ type: Input
1402
+ }], footerItems: [{
1403
+ type: Input
1404
+ }], getTaskHeight: [{
1405
+ type: Input
1406
+ }], headerItems: [{
1407
+ type: Input
1408
+ }], height: [{
1409
+ type: Input
1410
+ }], hidden: [{
1411
+ type: Input
1412
+ }], id: [{
1413
+ type: Input
1414
+ }], inputFieldAlign: [{
1415
+ type: Input
1416
+ }], insertBefore: [{
1417
+ type: Input
1418
+ }], insertFirst: [{
1419
+ type: Input
1420
+ }], isTaskSelectable: [{
1421
+ type: Input
1422
+ }], keyMap: [{
1423
+ type: Input
1424
+ }], labelPosition: [{
1425
+ type: Input
1426
+ }], margin: [{
1427
+ type: Input
1428
+ }], maxHeight: [{
1429
+ type: Input
1430
+ }], maximizeOnMobile: [{
1431
+ type: Input
1432
+ }], maxWidth: [{
1433
+ type: Input
1434
+ }], minHeight: [{
1435
+ type: Input
1436
+ }], minWidth: [{
1437
+ type: Input
1438
+ }], project: [{
1439
+ type: Input
1440
+ }], readOnly: [{
1441
+ type: Input
1442
+ }], rendition: [{
1443
+ type: Input
1444
+ }], resources: [{
1445
+ type: Input
1446
+ }], rtl: [{
1447
+ type: Input
1448
+ }], selectedTasks: [{
1449
+ type: Input
1450
+ }], showCollapseTooltip: [{
1451
+ type: Input
1452
+ }], span: [{
1453
+ type: Input
1454
+ }], stretchCards: [{
1455
+ type: Input
1456
+ }], strictRecordMapping: [{
1457
+ type: Input
1458
+ }], swimlaneField: [{
1459
+ type: Input
1460
+ }], swimlanes: [{
1461
+ type: Input
1462
+ }], tasks: [{
1463
+ type: Input
1464
+ }], title: [{
1465
+ type: Input
1466
+ }], tools: [{
1467
+ type: Input
1468
+ }], virtualize: [{
1469
+ type: Input
1470
+ }], width: [{
1471
+ type: Input
1472
+ }], x: [{
1473
+ type: Input
1474
+ }], y: [{
1475
+ type: Input
1476
+ }], anchorSize: [{
1477
+ type: Input
1478
+ }], focusVisible: [{
1479
+ type: Input
1480
+ }], hasChanges: [{
1481
+ type: Input
1482
+ }], parent: [{
1483
+ type: Input
1484
+ }], state: [{
1485
+ type: Input
1486
+ }], columnDragFeature: [{
1487
+ type: Input
1488
+ }], columnFilterFeature: [{
1489
+ type: Input
1490
+ }], columnHeaderMenuFeature: [{
1491
+ type: Input
1492
+ }], columnLockFeature: [{
1493
+ type: Input
1494
+ }], columnRenameFeature: [{
1495
+ type: Input
1496
+ }], columnResizeFeature: [{
1497
+ type: Input
1498
+ }], columnSortFeature: [{
1499
+ type: Input
1500
+ }], columnToolbarsFeature: [{
1501
+ type: Input
1502
+ }], filterBarFeature: [{
1503
+ type: Input
1504
+ }], simpleTaskEditFeature: [{
1505
+ type: Input
1506
+ }], swimlaneDragFeature: [{
1507
+ type: Input
1508
+ }], taskDragFeature: [{
1509
+ type: Input
1510
+ }], taskDragSelectFeature: [{
1511
+ type: Input
1512
+ }], taskEditFeature: [{
1513
+ type: Input
1514
+ }], taskMenuFeature: [{
1515
+ type: Input
1516
+ }], taskTooltipFeature: [{
1517
+ type: Input
1518
+ }], onActivateTask: [{
1519
+ type: Output
1520
+ }], onBeforeColumnDrag: [{
1521
+ type: Output
1522
+ }], onBeforeColumnDrop: [{
1523
+ type: Output
1524
+ }], onBeforeColumnResize: [{
1525
+ type: Output
1526
+ }], onBeforeDestroy: [{
1527
+ type: Output
1528
+ }], onBeforeHide: [{
1529
+ type: Output
1530
+ }], onBeforeResponsiveStateChange: [{
1531
+ type: Output
1532
+ }], onBeforeShow: [{
1533
+ type: Output
1534
+ }], onBeforeSimpleTaskEdit: [{
1535
+ type: Output
1536
+ }], onBeforeStateApply: [{
1537
+ type: Output
1538
+ }], onBeforeStateSave: [{
1539
+ type: Output
1540
+ }], onBeforeTaskDrag: [{
1541
+ type: Output
1542
+ }], onBeforeTaskDrop: [{
1543
+ type: Output
1544
+ }], onBeforeTaskEdit: [{
1545
+ type: Output
1546
+ }], onBeforeTaskEditShow: [{
1547
+ type: Output
1548
+ }], onBeforeTaskRemove: [{
1549
+ type: Output
1550
+ }], onCatchAll: [{
1551
+ type: Output
1552
+ }], onCellMenuItem: [{
1553
+ type: Output
1554
+ }], onCellMenuShow: [{
1555
+ type: Output
1556
+ }], onCellMenuToggleItem: [{
1557
+ type: Output
1558
+ }], onCollapse: [{
1559
+ type: Output
1560
+ }], onColumnCollapse: [{
1561
+ type: Output
1562
+ }], onColumnDrag: [{
1563
+ type: Output
1564
+ }], onColumnDragAbort: [{
1565
+ type: Output
1566
+ }], onColumnDragEnd: [{
1567
+ type: Output
1568
+ }], onColumnDragStart: [{
1569
+ type: Output
1570
+ }], onColumnDrop: [{
1571
+ type: Output
1572
+ }], onColumnExpand: [{
1573
+ type: Output
1574
+ }], onColumnFilterHide: [{
1575
+ type: Output
1576
+ }], onColumnFilterShow: [{
1577
+ type: Output
1578
+ }], onColumnFilterToggle: [{
1579
+ type: Output
1580
+ }], onColumnHeaderClick: [{
1581
+ type: Output
1582
+ }], onColumnHeaderContextMenu: [{
1583
+ type: Output
1584
+ }], onColumnHeaderDblClick: [{
1585
+ type: Output
1586
+ }], onColumnHeaderMenuBeforeShow: [{
1587
+ type: Output
1588
+ }], onColumnResize: [{
1589
+ type: Output
1590
+ }], onColumnResizeStart: [{
1591
+ type: Output
1592
+ }], onColumnTitleClick: [{
1593
+ type: Output
1594
+ }], onColumnTitleContextMenu: [{
1595
+ type: Output
1596
+ }], onColumnTitleDblClick: [{
1597
+ type: Output
1598
+ }], onColumnToggle: [{
1599
+ type: Output
1600
+ }], onDestroy: [{
1601
+ type: Output
1602
+ }], onDirtyStateChange: [{
1603
+ type: Output
1604
+ }], onElementCreated: [{
1605
+ type: Output
1606
+ }], onExpand: [{
1607
+ type: Output
1608
+ }], onFocusIn: [{
1609
+ type: Output
1610
+ }], onFocusOut: [{
1611
+ type: Output
1612
+ }], onHide: [{
1613
+ type: Output
1614
+ }], onPaint: [{
1615
+ type: Output
1616
+ }], onReadOnly: [{
1617
+ type: Output
1618
+ }], onRecompose: [{
1619
+ type: Output
1620
+ }], onRemoveTaskElement: [{
1621
+ type: Output
1622
+ }], onRenderTask: [{
1623
+ type: Output
1624
+ }], onRenderTasks: [{
1625
+ type: Output
1626
+ }], onResize: [{
1627
+ type: Output
1628
+ }], onResponsiveStateChange: [{
1629
+ type: Output
1630
+ }], onSelectionChange: [{
1631
+ type: Output
1632
+ }], onShow: [{
1633
+ type: Output
1634
+ }], onSimpleTaskEditCancel: [{
1635
+ type: Output
1636
+ }], onSimpleTaskEditComplete: [{
1637
+ type: Output
1638
+ }], onSwimlaneCollapse: [{
1639
+ type: Output
1640
+ }], onSwimlaneExpand: [{
1641
+ type: Output
1642
+ }], onSwimlaneHeaderClick: [{
1643
+ type: Output
1644
+ }], onSwimlaneHeaderContextMenu: [{
1645
+ type: Output
1646
+ }], onSwimlaneHeaderDblClick: [{
1647
+ type: Output
1648
+ }], onSwimlaneToggle: [{
1649
+ type: Output
1650
+ }], onTaskClick: [{
1651
+ type: Output
1652
+ }], onTaskDblClick: [{
1653
+ type: Output
1654
+ }], onTaskDrag: [{
1655
+ type: Output
1656
+ }], onTaskDragAbort: [{
1657
+ type: Output
1658
+ }], onTaskDragEnd: [{
1659
+ type: Output
1660
+ }], onTaskDragStart: [{
1661
+ type: Output
1662
+ }], onTaskDrop: [{
1663
+ type: Output
1664
+ }], onTaskMenuBeforeShow: [{
1665
+ type: Output
1666
+ }], onTaskMenuItem: [{
1667
+ type: Output
1668
+ }], onTaskMenuShow: [{
1669
+ type: Output
1670
+ }], onTaskMenuToggleItem: [{
1671
+ type: Output
1672
+ }], onTaskMouseEnter: [{
1673
+ type: Output
1674
+ }], onTaskMouseLeave: [{
1675
+ type: Output
1676
+ }], onToolClick: [{
1677
+ type: Output
1678
+ }] } });
1679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS10YXNrLWJvYXJkLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50L3NyYy9saWIvYnJ5bnR1bS10YXNrLWJvYXJkLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RDs7R0FFRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWtELE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBRTdDLE9BQU8sRUFBd1gsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbGEsT0FBTyxFQUEybEIsYUFBYSxFQUF1TyxNQUFNLHlCQUF5QixDQUFDO0FBRXQzQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBbzlCbEQsTUFBTSxPQUFPLDZCQUE2QjtJQW9adEMsWUFBWSxPQUFtQjtRQVR2QixrQkFBYSxHQUFHO1lBQ3BCLEtBQUssRUFBYyxTQUFTO1lBQzVCLFFBQVEsRUFBVyxTQUFTO1lBQzVCLElBQUksRUFBZSxTQUFTO1lBQzVCLGdCQUFnQixFQUFHLElBQUk7WUFDdkIsUUFBUSxFQUFXLEVBQUU7WUFDckIsU0FBUyxFQUFVLEVBQUU7U0FDeEIsQ0FBQztRQWdMRixrQkFBa0I7UUFDbEI7Ozs7Ozs7O1dBUUc7UUFDTyxtQkFBYyxHQUFRLElBQUksWUFBWSxFQUE2RixDQUFDO1FBQzlJOzs7OztXQUtHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQXVHLENBQUM7UUFDNUo7Ozs7Ozs7OztXQVNHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQWtJLENBQUM7UUFDdkw7Ozs7Ozs7V0FPRztRQUNPLHlCQUFvQixHQUFRLElBQUksWUFBWSxFQUFrSCxDQUFDO1FBQ3pLOzs7O1dBSUc7UUFDTyxvQkFBZSxHQUFR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QkFRRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBVUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQU1HLE1BQU07c0JBQWYsTUFBTTtnQkFXRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBV0csd0JBQXdCO3NCQUFqQyxNQUFNO2dCQU9HLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFPRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBVUcscUJBQXFCO3NCQUE5QixNQUFNO2dCQVVHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkFVRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBUUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQVlHLFdBQVc7c0JBQXBCLE1BQU07Z0JBWUcsY0FBYztzQkFBdkIsTUFBTTtnQkFhRyxVQUFVO3NCQUFuQixNQUFNO2dCQU9HLGVBQWU7c0JBQXhCLE1BQU07Z0JBU0csYUFBYTtzQkFBdEIsTUFBTTtnQkFRRyxlQUFlO3NCQUF4QixNQUFNO2dCQVdHLFVBQVU7c0JBQW5CLE1BQU07Z0JBWUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQVNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBU0csY0FBYztzQkFBdkIsTUFBTTtnQkFVRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBWUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQVlHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFPRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBmb3IgQnJ5bnR1bSBUYXNrQm9hcmRCYXNlXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IFdyYXBwZXJIZWxwZXIgZnJvbSAnLi93cmFwcGVyLmhlbHBlcic7XG5cbmltcG9ydCB7IEFsaWduU3BlYywgQmFzZSwgQnJ5bnR1bVNjcm9sbE9wdGlvbnMsIENvbnRhaW5lciwgRG9tQ29uZmlnLCBLZXlNYXBDb25maWcsIE1hc2ssIE1hc2tDb25maWcsIE1lbnUsIE1lbnVJdGVtLCBNZW51SXRlbUVudHJ5LCBNb2RlbCwgUGFnaW5nVG9vbGJhckNvbmZpZywgUGFuZWwsIFBhbmVsQ29sbGFwc2VyQ29uZmlnLCBQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWcsIFBhbmVsSGVhZGVyLCBSZWN0YW5nbGUsIFNjcm9sbE1hbmFnZXJDb25maWcsIFNjcm9sbGVyLCBTY3JvbGxlckNvbmZpZywgU3RhdGVQcm92aWRlciwgU3RvcmUsIFN0b3JlQ29uZmlnLCBUYWJDb25maWcsIFRvb2wsIFRvb2xDb25maWcsIFRvb2xiYXJDb25maWcsIFRvb2xiYXJJdGVtcywgV2lkZ2V0IH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IEFzc2lnbm1lbnRNb2RlbCwgQXNzaWdubWVudE1vZGVsQ29uZmlnLCBDYXJkU2l6ZSwgQ29sdW1uRHJhZywgQ29sdW1uRHJhZ0NvbmZpZywgQ29sdW1uRmlsdGVyLCBDb2x1bW5GaWx0ZXJDb25maWcsIENvbHVtbkhlYWRlck1lbnUsIENvbHVtbkhlYWRlck1lbnVDb25maWcsIENvbHVtbkxvY2ssIENvbHVtbkxvY2tDb25maWcsIENvbHVtbk1vZGVsLCBDb2x1bW5Nb2RlbENvbmZpZywgQ29sdW1uUmVuYW1lLCBDb2x1bW5SZW5hbWVDb25maWcsIENvbHVtblJlc2l6ZSwgQ29sdW1uUmVzaXplQ29uZmlnLCBDb2x1bW5Tb3J0LCBDb2x1bW5Tb3J0Q29uZmlnLCBDb2x1bW5Ub29sYmFycywgQ29sdW1uVG9vbGJhcnNDb25maWcsIFRhc2tCb2FyZENvbnRhaW5lckl0ZW1Db25maWcsIEZpbHRlckJhciwgRmlsdGVyQmFyQ29uZmlnLCBQcm9qZWN0TW9kZWwsIFByb2plY3RNb2RlbENvbmZpZywgUmVzb3VyY2VNb2RlbCwgUmVzb3VyY2VNb2RlbENvbmZpZywgU2ltcGxlVGFza0VkaXQsIFNpbXBsZVRhc2tFZGl0Q29uZmlnLCBTd2ltbGFuZURyYWcsIFN3aW1sYW5lRHJhZ0NvbmZpZywgU3dpbWxhbmVNb2RlbCwgU3dpbWxhbmVNb2RlbENvbmZpZywgVGFza0JvYXJkLCBUYXNrQm9hcmRCYXNlLCBUYXNrQm9hcmRCYXNlTGlzdGVuZXJzLCBUYXNrRHJhZywgVGFza0RyYWdDb25maWcsIFRhc2tEcmFnU2VsZWN0LCBUYXNrRHJhZ1NlbGVjdENvbmZpZywgVGFza0VkaXQsIFRhc2tFZGl0Q29uZmlnLCBUYXNrRWRpdG9yLCBUYXNrSXRlbU9wdGlvbnMsIFRhc2tNZW51LCBUYXNrTWVudUNvbmZpZywgVGFza01vZGVsLCBUYXNrTW9kZWxDb25maWcsIFRhc2tUb29sdGlwLCBUYXNrVG9vbHRpcENvbmZpZyB9IGZyb20gJ0BicnludHVtL3Rhc2tib2FyZC10aGluJztcblxuaW1wb3J0IHsgU3RyaW5nSGVscGVyIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcblxuZXhwb3J0IHR5cGUgQnJ5bnR1bVRhc2tCb2FyZEJhc2VQcm9wcyA9IHtcbiAgICAvLyBDb25maWdzXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRoYXQgc2hvdWxkIGFjdGl2YXRlIGEgdGFzayBhbmQgdHJpZ2dlciBlZGl0aW5nIChpZiBhbiBlZGl0aW5nIGZlYXR1cmUgaXMgYWN0aXZlKS5cbiAgICAgKiBBdmFpbGFibGUgb3B0aW9ucyBhcmU6ICd0YXNrQ2xpY2snLCAndGFza0RibENsaWNrJyBvciBudWxsIChkaXNhYmxlKVxuICAgICAqL1xuICAgIGFjdGl2YXRlVGFza0V2ZW50ID8gOiAndGFza0NsaWNrJ3wndGFza0RibENsaWNrJ3xudWxsXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYWRvcHQgYXMgdGhpcyBXaWRnZXQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQuIFRoZSB3aWRnZXQnc1xuICAgICAqIGNvbnRlbnQgd2lsbCBiZSBwbGFjZWQgaW5zaWRlIHRoaXMgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctYWRvcHQpXG4gICAgICovXG4gICAgYWRvcHQgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1hbGlnbilcbiAgICAgKi9cbiAgICBhbGlnbiA/IDogQWxpZ25TcGVjfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciksIGl0IHdpbGwgYnkgZGVmYXVsdCBiZSBwYXJ0aWNpcGF0aW5nIGluIGFcbiAgICAgKiBmbGV4Ym94IGxheW91dC4gVGhpcyBjb25maWcgYWxsb3dzIHlvdSB0byBzZXQgdGhpcyB3aWRnZXQnc1xuICAgICAqIFthbGlnbi1zZWxmXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYWxpZ24tc2VsZikgc3R5bGUuXG4gICAgICovXG4gICAgYWxpZ25TZWxmID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIGFuZCBiZWluZyBzaG93biB0aHJvdWdoIFtzaG93QnldKCNDb3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tc2hvd0J5KS4qXG4gICAgICogYHRydWVgIHRvIHNob3cgYSBjb25uZWN0b3IgYXJyb3cgcG9pbnRpbmcgdG8gdGhlIGFsaWduIHRhcmdldC5cbiAgICAgKi9cbiAgICBhbmNob3IgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciB0aGUgaWQgb2YgYW4gZWxlbWVudCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0J3MgZWxlbWVudCB0by4gQ2FuIGJlIGNvbmZpZ3VyZWQsIG9yIHNldCBvbmNlIGF0XG4gICAgICogcnVudGltZS4gVG8gYWNjZXNzIHRoZSBlbGVtZW50IG9mIGEgcmVuZGVyZWQgd2lkZ2V0LCBzZWUgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KS5cbiAgICAgKi9cbiAgICBhcHBlbmRUbyA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3RcbiAgICAgKiBpbnRvIGFuIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaW5rZWQgdXNpbmcgdGhlIGBhcmlhLWRlc2NyaWJlZGJ5YCBhdHRyaWJ1dGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWFyaWFEZXNjcmlwdGlvbilcbiAgICAgKi9cbiAgICBhcmlhRGVzY3JpcHRpb24gPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgbG9jYWxpemFibGUgc3RyaW5nIChNYXkgY29udGFpbiBgJ0x7fSdgIHRva2VucyB3aGljaCByZXNvbHZlIGluIHRoZSBsb2NhbGUgZmlsZSkgdG8gaW5qZWN0IGFzXG4gICAgICogdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWFyaWFMYWJlbClcbiAgICAgKi9cbiAgICBhcmlhTGFiZWwgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIElubGluZSBbYXNzaWdubWVudHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL0Fzc2lnbm1lbnRNb2RlbCksIHdpbGwgYmUgbG9hZGVkIGludG8gYW4gaW50ZXJuYWxseSBjcmVhdGVkXG4gICAgICogW0Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvZGF0YS9Bc3NpZ25tZW50U3RvcmUpICBhcyBhIHBhcnQgb2YgYSBbcHJvamVjdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCkuXG4gICAgICovXG4gICAgYXNzaWdubWVudHMgPyA6IEFzc2lnbm1lbnRNb2RlbFtdfG9iamVjdFtdfEFzc2lnbm1lbnRNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhdXRvIGdlbmVyYXRlIGNvbHVtbnMgd2hlbiBbY29sdW1uc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvbWl4aW4vVGFza0JvYXJkQ29sdW1ucyNjb25maWctY29sdW1ucykgaXMgdW5kZWZpbmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1hdXRvR2VuZXJhdGVDb2x1bW5zKVxuICAgICAqL1xuICAgIGF1dG9HZW5lcmF0ZUNvbHVtbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGF1dG8gZ2VuZXJhdGUgc3dpbWxhbmVzIHdoZW4gW3N3aW1sYW5lc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvbWl4aW4vVGFza0JvYXJkU3dpbWxhbmVzI2NvbmZpZy1zd2ltbGFuZXMpIGlzIHVuZGVmaW5lZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctYXV0b0dlbmVyYXRlU3dpbWxhbmVzKVxuICAgICAqL1xuICAgIGF1dG9HZW5lcmF0ZVN3aW1sYW5lcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgQ29uZmlnIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBbVG9vbGJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhciksXG4gICAgICogb3IgYXJyYXkgb2YgY29uZmlnIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZCBpdGVtcyBvZiBhIFRvb2xiYXIuIEFub3RoZXIgd2F5IHRvIGFkZCBhIGJiYXIgaXMgdG8gdXNlIFtzdHJpcHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1iYmFyKVxuICAgICAqL1xuICAgIGJiYXIgPyA6IChUYXNrQm9hcmRDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gdGhlIHBhbmVsJ3MgYm9keSBlbGVtZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1ib2R5Q2xzKVxuICAgICAqL1xuICAgIGJvZHlDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBJdGVtcyB0byBhZGQgdG8gZWFjaCBjYXJkJ3MgYm9keS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctYm9keUl0ZW1zKVxuICAgICAqL1xuICAgIGJvZHlJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPlxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aGVyZSBwcm9wZXJ0eSBuYW1lcyB3aXRoIGEgdHJ1dGh5IHZhbHVlIGluZGljYXRlIHdoaWNoIGV2ZW50cyBzaG91bGQgYnViYmxlIHVwIHRoZSBvd25lcnNoaXBcbiAgICAgKiBoaWVyYXJjaHkgd2hlbiB0cmlnZ2VyZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWJ1YmJsZUV2ZW50cylcbiAgICAgKi9cbiAgICBidWJibGVFdmVudHMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBjYWxsIG9uWFhYIG1ldGhvZCBuYW1lcyAoZS5nLiBgb25TaG93YCwgYG9uQ2xpY2tgKSwgYXMgYW4gZWFzeSB3YXkgdG8gbGlzdGVuIGZvciBldmVudHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNhbGxPbkZ1bmN0aW9ucylcbiAgICAgKi9cbiAgICBjYWxsT25GdW5jdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBbQ2FyZFNpemVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L21peGluL1Jlc3BvbnNpdmVDYXJkcyN0eXBlZGVmLUNhcmRTaXplKSBvYmplY3RzIHRvIHVzZSBhcyByZXNwb25zaXZlIGxldmVscyBiYXNlZCBvbiBjYXJkIHdpZHRocy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY2FyZFNpemVzKVxuICAgICAqL1xuICAgIGNhcmRTaXplcyA/IDogQ2FyZFNpemVcbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiBhbiBldmVudCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBlcnJvciBwcm9wYWdhdGVzIHVwIHRoZSBzdGFjayBhbmQgdGhlXG4gICAgICogYXBwbGljYXRpb24gc3RhdGUgaXMgdW5kZWZpbmVkLiBDb2RlIHdoaWNoIGZvbGxvd3MgdGhlIGV2ZW50IGhhbmRsZXIgd2lsbCAqbm90KiBiZSBleGVjdXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zKVxuICAgICAqL1xuICAgIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gY2VudHJlIHRoZSBXaWRnZXQgaW4gYnJvd3NlciB2aWV3cG9ydCBzcGFjZS5cbiAgICAgKi9cbiAgICBjZW50ZXJlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbHVtbnMgaG9sZCB0aGVpciB0YXNrcyBpbiBzdG9yZXMgY2hhaW5lZCBvZmYgdGhlIHByb2plY3QncyB0YXNrIHN0b3JlLiBGaWx0ZXJzIGFwcGxpZWQgdG8gdGhlIHByb2plY3Qgc3RvcmVcbiAgICAgKiBhcmUgYnkgZGVmYXVsdCBub3QgYXBwbGllZCB0byB0aGUgY29sdW1uIHN0b3JlczsgdGhleSBhcmUgb25seSBhZmZlY3RlZCBieSB0aGVpciBvd24gZmlsdGVycy4gQnkgY29uZmlndXJpbmdcbiAgICAgKiBgY2hhaW5GaWx0ZXJzIDogdHJ1ZWAsIHRoZSBmaWx0ZXJzIGZyb20gdGhlIHByb2plY3Qgc3RvcmUgd2lsbCBhbHNvIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGZpbHRlcmluZyB0aGVcbiAgICAgKiBjb2x1bW5zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1jaGFpbkZpbHRlcnMpXG4gICAgICovXG4gICAgY2hhaW5GaWx0ZXJzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50LlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1jbHMpXG4gICAgICovXG4gICAgY2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgcGFuZWwgaXMgY29sbGFwc2VkICh0aGUgYm9keSBvZiB0aGUgcGFuZWwgaXMgaGlkZGVuIHdoaWxlIG9ubHkgdGhlIGhlYWRlciBpc1xuICAgICAqIHZpc2libGUpLiBPbmx5IHZhbGlkIGlmIHRoZSBwYW5lbCBpcyBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkuXG4gICAgICovXG4gICAgY29sbGFwc2VkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gaGlkZSB0aGUgY29sdW1uIHRpdGxlIGluc3RlYWQgb2Ygcm90YXRpbmcgaXQgb24gY29sbGFwc2UuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNvbGxhcHNlVGl0bGUpXG4gICAgICovXG4gICAgY29sbGFwc2VUaXRsZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIGVuYWJsZXMgY29sbGFwc2liaWxpdHkgZm9yIHRoZSBwYW5lbC4gU2VlIFtjb2xsYXBzZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzZWQpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1jb2xsYXBzaWJsZSlcbiAgICAgKi9cbiAgICBjb2xsYXBzaWJsZSA/IDogYm9vbGVhbnxQYW5lbENvbGxhcHNlckNvbmZpZ3xQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWdcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBzcGVjaWZpZWQgY29sb3IgdG8gdGhlIHdpZGdldCwgYnkgc2V0dGluZyB0aGUgYC0tYi1wcmltYXJ5YCBDU1MgdmFyaWFibGUgaW4gdGhlIHdpZGdldHNcbiAgICAgKiBgc3R5bGVgIGJsb2NrLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1jb2xvcilcbiAgICAgKi9cbiAgICBjb2xvciA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciB3aGljaCBjb2x1bW4gdG8gc3RhcnQgaW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgY29sdW1uID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBGaWVsZCBvbiBhIHRhc2sgcmVjb3JkIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGNvbHVtbiB0aGUgdGFzayBiZWxvbmdzIHRvLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1jb2x1bW5GaWVsZClcbiAgICAgKi9cbiAgICBjb2x1bW5GaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU3RvcmUgY29udGFpbmluZyB0aGUgVGFza0JvYXJkIGNvbHVtbnMuIEEgdGFza3MgW2NvbHVtbkZpZWxkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9taXhpbi9UYXNrQm9hcmRDb2x1bW5zI2NvbmZpZy1jb2x1bW5GaWVsZCkgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgaWRgIG9mIGFcbiAgICAgKiBjb2x1bW4gdG8gZGV0ZXJtaW5lIGluIHdoaWNoIGNvbHVtbiBpdCBpcyBkaXNwbGF5ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNvbHVtbnMpXG4gICAgICovXG4gICAgY29sdW1ucyA/IDogQ29sdW1uTW9kZWxbXXxDb2x1bW5Nb2RlbENvbmZpZ1tdfHN0cmluZ1tdfFN0b3JlfHN0cmluZ3xTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gd2hpY2ggcmVuZGVycyB0aGUgdGV4dCwgSFRNTCwgb3IgYERvbUNvbmZpZ2Agb2JqZWN0IHRvIHNob3cgYXMgdGhlIGNvbHVtbiB0aXRsZS4gSWYgeW91IHByb3ZpZGUgYVxuICAgICAqIGBEb21Db25maWdgIG9iamVjdCwgaXQgd2lsbCByZXBsYWNlIHRoZSB0aXRsZSBlbGVtZW50IGFuZCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBzdHlsaW5nIGl0ICsgbGF5aW5nIGl0IG91dC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY29sdW1uVGl0bGVSZW5kZXJlcilcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gcmVuZGVyRGF0YVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBjb2x1bW5SZWNvcmQgVGhlIGNvbHVtbiBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcsRG9tQ29uZmlnfVxuICAgICAqL1xuICAgIGNvbHVtblRpdGxlUmVuZGVyZXIgPyA6IChyZW5kZXJEYXRhOiBvYmplY3QsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwpID0+IHN0cmluZ3xEb21Db25maWdcbiAgICBjb25maWcgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykgb3IgW3Bvc2l0aW9uZWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXBvc2l0aW9uZWQpLipcbiAgICAgKiBFbGVtZW50LCBXaWRnZXQgb3IgUmVjdGFuZ2xlIHRvIHdoaWNoIHRoaXMgV2lkZ2V0IGlzIGNvbnN0cmFpbmVkLlxuICAgICAqL1xuICAgIGNvbnN0cmFpblRvID8gOiBIVE1MRWxlbWVudHxXaWRnZXR8UmVjdGFuZ2xlXG4gICAgLyoqXG4gICAgICogSW5pdGlhbCBDU1MgdmFyaWFibGVzIHRvIHNldC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY3NzKVxuICAgICAqL1xuICAgIGNzcyA/IDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIC8qKlxuICAgICAqIENTUyB2YXJpYWJsZSBwcmVmaXgsIGFwcGVuZGVkIHRvIHRoZSBrZXlzIHVzZWQgaW4gW2Nzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY3NzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY3NzVmFyUHJlZml4KVxuICAgICAqL1xuICAgIGNzc1ZhclByZWZpeCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIFdpZGdldCBjb25maWd1cmF0aW9uIGlzIHVzZWQgaW4gdGhlIEdyaWQncyBSb3dFeHBhbmRlciBmZWF0dXJlJ3MgYHdpZGdldGAgY29uZmlnLCBwcm92aWRlIHRoZVxuICAgICAqIGZpZWxkIG9uIHRoZSBleHBhbmRlZCByZWNvcmQgdG8gdXNlIGZvciBwb3B1bGF0aW5nIHRoaXMgd2lkZ2V0J3Mgc3RvcmUgKGlmIGFwcGxpY2FibGUpXG4gICAgICovXG4gICAgZGF0YUZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBPYmplY3QgdG8gYXBwbHkgdG8gZWxlbWVudHMgZGF0YXNldCAoZWFjaCBrZXkgd2lsbCBiZSB1c2VkIGFzIGEgZGF0YS1hdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQpXG4gICAgICovXG4gICAgZGF0YXNldCA/IDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBDU1MgY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2hlbiB1cGdyYWRpbmcgdG8gdjcuIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY2hlY2tzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1kZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzKVxuICAgICAqL1xuICAgIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIG9yIGVuYWJsZSB0aGUgd2lkZ2V0LiBJdCBpcyBzaW1pbGFyIHRvIFtyZWFkT25seV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1yZWFkT25seSkgZXhjZXB0IGEgZGlzYWJsZWQgd2lkZ2V0XG4gICAgICogY2Fubm90IGJlIGZvY3VzZWQsIHVzZXMgYSBkaWZmZXJlbnQgcmVuZGl0aW9uICh1c3VhbGx5IGdyZXlpc2gpIGFuZCBkb2VzIG5vdCBhbGxvdyBzZWxlY3RpbmcgaXRzIHZhbHVlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1kaXNhYmxlZClcbiAgICAgKi9cbiAgICBkaXNhYmxlZCA/IDogYm9vbGVhbnwnaW5lcnQnXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIHBsYWNlbWVudCBvZiB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIGFkZGVkIHRvIGEgW3BhbmVsJ3MgXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbClcbiAgICAgKiBbc3RyaXBzIGNvbGxlY3Rpb25dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLiBUeXBpY2FsIHZhbHVlcyBmb3IgdGhpcyBjb25maWcgYXJlIGAndG9wJ2AsXG4gICAgICogYCdib3R0b20nYCwgYCdsZWZ0J2AsIG9yIGAncmlnaHQnYCwgd2hpY2ggY2F1c2UgdGhlIHdpZGdldCB0byBiZSBwbGFjZWQgb24gdGhhdCBzaWRlIG9mIHRoZSBwYW5lbCdzXG4gICAgICogYm9keS4gU3VjaCB3aWRnZXRzIGFyZSBjYWxsZWQgXCJlZGdlIHN0cmlwc1wiLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1kb2NrKVxuICAgICAqL1xuICAgIGRvY2sgPyA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdFxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYmUgYWJsZSB0byBkcmFnIGEgd2lkZ2V0IGZyZWVseSBvbiB0aGUgcGFnZS4gT3Igc2V0IHRvIGFuIG9iamVjdCB3aXRoIGEgwrRoYW5kbGVTZWxlY3RvcsK0XG4gICAgICogcHJvcGVydHkgd2hpY2ggY29udHJvbHMgd2hlbiBhIGRyYWcgc2hvdWxkIHN0YXJ0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1kcmFnZ2FibGUpXG4gICAgICovXG4gICAgZHJhZ2dhYmxlID8gOiBib29sZWFufHtcbiAgICAgICAgaGFuZGxlU2VsZWN0b3I/OiBzdHJpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZSB0aGlzIFBhbmVsIGEgZG9ja2VkIGRyYXdlciB3aGljaCBzbGlkZXMgb3V0IGZyb20gb25lIHNpZGUgb2YgdGhlIGJyb3dzZXIgdmlld3BvcnQgYnkgZGVmYXVsdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctZHJhd2VyKVxuICAgICAqIEBwYXJhbSB7J3N0YXJ0JywnbGVmdCcsJ2VuZCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ30gc2lkZSBUaGUgc2lkZSBvZiB0aGUgdmlld3BvcnQgdG8gZG9jayB0aGUgZHJhd2VyIHRvLiAgKiBgJ3N0YXJ0J2AgbWVhbnMgdGhlIGBpbmxpbmUtc3RhcnRgIHNpZGUuICogYCdlbmQnYCBtZWFucyB0aGUgYGlubGluZS1lbmRgIHNpZGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmcsbnVtYmVyfSBzaXplIFRoZSBzaXplIG9mIHRoZSBkcmF3ZXIgaW4gaXRzIGNvbGxhcHNpYmxlIGF4aXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbmxpbmUgSWYgdXNpbmcgdGhlIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgdG8gcGxhY2UgdGhlIGRyYXdlciBpbnNpZGUgYSBob3N0IHdpZGdldCwgdGhpcyBtYXkgYmUgc2V0IHRvIGB0cnVlYCB0byBtYWtlIHRoZSBkcmF3ZXIgaW5saW5lIHdpdGhpbiB0aGF0IGhvc3QuIE5vdGUgdGhhdCwgaWYgdXNpbmcgdGhpcywgdGhlIGxheW91dCBvZiB0aGUgaG9zdCBlbGVtZW50IG11c3QgaGF2ZSBgZmxleC1kaXJlY3Rpb25gIHNldCBhcHByb3ByaWF0ZWx5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixvYmplY3R9IGF1dG9DbG9zZSBTcGVjaWZpZXMgd2hhdCB1c2VyIGFjdGlvbnMgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIGRyYXdlci4gRGVmYXVsdHMgdG8gY2xvc2luZyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIgb3Igd2hlbiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLm1vdXNlZG93biBJZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgZHJhd2VyLCB0aGUgZHJhd2VyIHdpbGwgYXV0b21hdGljYWxseSBiZSBoaWRkZW4uIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZywgaXQgaXMgdXNlZCBhcyBhIENTUyBzZWxlY3RvciB0byBmaWx0ZXIgY2xpY2tzIHdoaWNoIHNob3VsZCBjbG9zZSB0aGUgZHJhd2VyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixzdHJpbmd9IGF1dG9DbG9zZS5mb2N1c291dCBJZiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0b0Nsb3NlLm1vdXNlb3V0IEhpZGVzIHRoZSBkcmF3ZXIgd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBkcmF3ZXIgYWZ0ZXIgdGhlIGBhdXRvQ2xvc2VEZWxheWAgcGVyaW9kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdXRvQ2xvc2VEZWxheSBXaGVuIHVzaW5nIGBtb3VzZW91dGAsIHRoaXMgaXMgdGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIGRyYXdlciA/IDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZHJhdyBjYXJkcyBvbiBzY3JvbGwsIG9yIG9ubHkgd2hlbiBzY3JvbGxpbmcgZW5kcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctZHJhd09uU2Nyb2xsKVxuICAgICAqL1xuICAgIGRyYXdPblNjcm9sbCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGF0dHJpYnV0ZXMgdG8gYXNzaWduIHRvIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyB3aWRnZXQuXG4gICAgICogU2V0IGBudWxsYCB2YWx1ZSB0byBhdHRyaWJ1dGUgdG8gcmVtb3ZlIGl0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1lbGVtZW50QXR0cmlidXRlcylcbiAgICAgKi9cbiAgICBlbGVtZW50QXR0cmlidXRlcyA/IDogUmVjb3JkPHN0cmluZywgc3RyaW5nfG51bGw+XG4gICAgZXh0cmFEYXRhID8gOiBhbnlcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgd2lkZ2V0IGlzIGEgY2hpbGQgb2YgYSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbZmxleF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZsZXgpIHN0eWxlLlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYCZsdDtmbGV4LWdyb3cmZ3Q7ICZsdDtmbGV4LXNocmluayZndDsgJmx0O2ZsZXgtYmFzaXMmZ3Q7YCBmb3JtYXQgc3RyaW5nLlxuICAgICAqIG51bWVyaWMtb25seSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHRoZSBgZmxleC1ncm93YCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmbGV4ID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtb3ZlIHRoZSB3aWRnZXQgb3V0IG9mIHRoZSBkb2N1bWVudCBmbG93IGFuZCBwb3NpdGlvbiBpdFxuICAgICAqIGFic29sdXRlbHkgaW4gYnJvd3NlciB2aWV3cG9ydCBzcGFjZS5cbiAgICAgKi9cbiAgICBmbG9hdGluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZyBvYmplY3Qgb2YgYSBmb290ZXIuIE1heSBjb250YWluIGEgYGRvY2tgLCBgaHRtbGAgYW5kIGEgYGNsc2AgcHJvcGVydHkuIEEgZm9vdGVyIGlzIG5vdCBhIHdpZGdldCxcbiAgICAgKiBidXQgcmF0aGVyIHBsYWluIEhUTUwgdGhhdCBmb2xsb3dzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhbmVsJ3MgYm9keSBhbmQgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWZvb3RlcilcbiAgICAgKi9cbiAgICBmb290ZXIgPyA6IHtcbiAgICAgICAgZG9jaz86ICd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfCdzdGFydCd8J2VuZCdcbiAgICAgICAgaHRtbD86IHN0cmluZ1xuICAgICAgICBjbHM/OiBzdHJpbmdcbiAgICB9fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEl0ZW1zIHRvIGFkZCB0byBlYWNoIGNhcmQncyBmb290ZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWZvb3Rlckl0ZW1zKVxuICAgICAqL1xuICAgIGZvb3Rlckl0ZW1zID8gOiBSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCB0YXNrIGFzIHBhcnQgb2YgdGhlIHJlbmRlciBsb29wLCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBoZWlnaHQgaW5cbiAgICAgKiBwaXhlbHMgZm9yIHRoZSB0YXNrLiBVc2luZyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgcmVjb21tZW5kZWQgd2hlbiB1c2luZyBwYXJ0aWFsIHZpcnR1YWxpemVkIHJlbmRlcmluZywgc2VlXG4gICAgICogdGhlIFt2aXJ0dWFsaXplXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9taXhpbi9UYXNrQm9hcmRWaXJ0dWFsaXphdGlvbiNjb25maWctdmlydHVhbGl6ZSkgc2V0dGluZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctZ2V0VGFza0hlaWdodClcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IHRhc2tSZWNvcmQgVGhlIHRhc2sgcmVjb3JkXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGhlaWdodCBvZiB0aGUgdGFzayBpbiBwaXhlbHNcbiAgICAgKi9cbiAgICBnZXRUYXNrSGVpZ2h0ID8gOiAodGFza1JlY29yZDogVGFza01vZGVsKSA9PiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBbb2JqZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCN0eXBlZGVmLVBhbmVsSGVhZGVyKSBmb3IgdGhlIHBhbmVsJ3MgaGVhZGVyIG9yIGEgc3RyaW5nIGluIHBsYWNlIG9mIGEgYHRpdGxlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctaGVhZGVyKVxuICAgICAqL1xuICAgIGhlYWRlciA/IDogc3RyaW5nfGJvb2xlYW58UGFuZWxIZWFkZXJcbiAgICAvKipcbiAgICAgKiBJdGVtcyB0byBhZGQgdG8gZWFjaCBjYXJkJ3MgaGVhZGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1oZWFkZXJJdGVtcylcbiAgICAgKi9cbiAgICBoZWFkZXJJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPlxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIGhlaWdodCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUuaGVpZ2h0YC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBoZWlnaHQgc3RyaW5nIG9yIGEgbnVtYmVyLFxuICAgICAqIHdoaWNoIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgaGVpZ2h0LCBidXQgaW4gc29tZVxuICAgICAqIGNhc2VzIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgaGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHdpdGggdHJ1ZSB0byBtYWtlIHdpZGdldCBpbml0aWFsbHkgaGlkZGVuLlxuICAgICAqL1xuICAgIGhpZGRlbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1oaWRlQW5pbWF0aW9uKVxuICAgICAqL1xuICAgIGhpZGVBbmltYXRpb24gPyA6IGJvb2xlYW58b2JqZWN0XG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGhlYWRlciB0ZXh0IGlzIEhUTUwtZW5jb2RlZC4gU2V0IHRoaXMgZmxhZyB0byBgZmFsc2VgIGRpc2FibGUgdGhpcyBhbmQgYWxsb3cgaHRtbFxuICAgICAqIGVsZW1lbnRzIGluIHRoZSBjb2x1bW4gaGVhZGVycy4gQ2FuIGFsc28gYmUgc3BlY2lmaWVkIG9uIGEgc2luZ2xlXG4gICAgICogW2NvbHVtbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL0NvbHVtbk1vZGVsI2ZpZWxkLWh0bWxFbmNvZGVIZWFkZXJUZXh0KS5cbiAgICAgKi9cbiAgICBodG1sRW5jb2RlSGVhZGVyVGV4dCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIGljb24gdG8gc2hvdyBiZWZvcmUgdGhlIFt0aXRsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXRpdGxlKS4gRWl0aGVyIHBhc3MgYSBDU1MgY2xhc3MgYXMgYSBzdHJpbmcsIG9yIHBhc3MgYVxuICAgICAqIFtEb21Db25maWddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RvbUhlbHBlciN0eXBlZGVmLURvbUNvbmZpZykgb2JqZWN0IGRlc2NyaWJpbmcgYW4gZWxlbWVudCB0byByZXByZXNlbnQgdGhlIGljb24uXG4gICAgICovXG4gICAgaWNvbiA/IDogc3RyaW5nfERvbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdpZGdldCBpZCwgaWYgbm90IHNwZWNpZmllZCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuIEFsc28gdXNlZCBmb3IgbG9va3VwcyB0aHJvdWdoIFdpZGdldC5nZXRCeUlkXG4gICAgICovXG4gICAgaWQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHdpZGdldHMgcmVhZC1vbmx5IHN0YXRlIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGl0cyBwYXJlbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWlnbm9yZVBhcmVudFJlYWRPbmx5KVxuICAgICAqL1xuICAgIGlnbm9yZVBhcmVudFJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byBhbGlnbiBpbnB1dCBmaWVsZHMgb2YgY2hpbGQgd2lkZ2V0cy4gQnkgZGVmYXVsdCwgdGhlIEZpZWxkIGlucHV0IGVsZW1lbnQgaXNcbiAgICAgKiBwbGFjZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBgbGFiZWxgLiBJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIGlucHV0IGZpZWxkcyBhbGlnbmVkIHRvIHRoZVxuICAgICAqIHJpZ2h0LCBzZXQgdGhpcyBjb25maWcgdG8gYCdlbmQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctaW5wdXRGaWVsZEFsaWduKVxuICAgICAqL1xuICAgIGlucHV0RmllbGRBbGlnbiA/IDogJ3N0YXJ0J3wnZW5kJ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGluc2VydCB0aGlzIHdpZGdldCBiZWZvcmUuIElmIHByb3ZpZGVkLCBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEJlZm9yZSA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0IGVsZW1lbnQgdG8sIGFzIGEgZmlyc3QgY2hpbGQuIElmIHByb3ZpZGVkLCBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEZpcnN0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIHRlbXBsYXRlIG1ldGhvZCAoZW1wdHkgYnkgZGVmYXVsdCkgYWxsb3dpbmcgeW91IHRvIGNvbnRyb2wgaWYgYSB0YXNrIGNhbiBiZSBzZWxlY3RlZCBvciBub3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWlzVGFza1NlbGVjdGFibGUpXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSB0YXNrUmVjb3JkIFRoZSB0YXNrIHJlY29yZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHRhc2sgY2FuIGJlIHNlbGVjdGVkLCBvdGhlcndpc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGlzVGFza1NlbGVjdGFibGUgPyA6ICh0YXNrUmVjb3JkOiBUYXNrTW9kZWwpID0+IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZWUgW0tleWJvYXJkIHNob3J0Y3V0c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkI2tleWJvYXJkLXNob3J0Y3V0cykgZm9yIGRldGFpbHNcbiAgICAgKi9cbiAgICBrZXlNYXAgPyA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzZXR0aW5nIHRvIHVzZSBzYW1lIGxhYmVsIHBsYWNlbWVudCBvbiBhbGwgY2hpbGQgd2lkZ2V0cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctbGFiZWxQb3NpdGlvbilcbiAgICAgKi9cbiAgICBsYWJlbFBvc2l0aW9uID8gOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3RlbmVyIHNldCBmb3IgdGhpcyBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWxpc3RlbmVycylcbiAgICAgKi9cbiAgICBsaXN0ZW5lcnMgPyA6IFRhc2tCb2FyZEJhc2VMaXN0ZW5lcnNcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LCBvciBhIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2hlbiBhIHN0b3JlIGlzIHBlcmZvcm1pbmcgYSByZW1vdGVcbiAgICAgKiBvcGVyYXRpb24sIG9yIENydWQgTWFuYWdlciBpcyBsb2FkaW5nIGRhdGEgZnJvbSB0aGUgc2V2ZXIuIFNldCB0byBgbnVsbGAgdG8gZGlzYWJsZSBkZWZhdWx0IGxvYWQgbWFzay5cbiAgICAgKi9cbiAgICBsb2FkTWFzayA/IDogc3RyaW5nfE1hc2tDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QgdG8gYWRqdXN0IHRoZSBbbWFza0RlZmF1bHRzXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tYXNrRGVmYXVsdHMpXG4gICAgICogd2hlbiBkYXRhIGlzIGxvYWRpbmcuIFRoZSBtZXNzYWdlIGFuZCBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZyb20gdGhlXG4gICAgICogW2xvYWRNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL21peGluL0xvYWRNYXNrYWJsZSNjb25maWctbG9hZE1hc2spIGNvbmZpZyB0YWtlIHByaW9yaXR5IG92ZXIgdGhlc2Ugb3B0aW9ucywganVzdCBhcyB0aGV5IGRvXG4gICAgICogZm9yIGBtYXNrRGVmYXVsdHNgLCByZXNwZWN0aXZlbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWxvYWRNYXNrRGVmYXVsdHMpXG4gICAgICovXG4gICAgbG9hZE1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QgdG8gYWRqdXN0IHRoZSBbbWFza0RlZmF1bHRzXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tYXNrRGVmYXVsdHMpXG4gICAgICogd2hlbiBhbiBlcnJvciBvY2N1cnMgbG9hZGluZyBkYXRhLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1sb2FkTWFza0Vycm9yKVxuICAgICAqL1xuICAgIGxvYWRNYXNrRXJyb3IgPyA6IE1hc2tDb25maWd8TWFza3xib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBjbGFzcyB0cmFuc2xhdGlvbnMgb2Ygd2hpY2ggYXJlIHVzZWQgZm9yIHRyYW5zbGF0aW5nIHRoaXMgZW50aXR5LlxuICAgICAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCB3aGVuIHRyYW5zbGF0aW9ucyBvZiBhbiBpdGVtIGFyZSBkZWZpbmVkIG9uIGl0cyBjb250YWluZXIgY2xhc3MuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWxvY2FsZUNsYXNzKVxuICAgICAqL1xuICAgIGxvY2FsZUNsYXNzID8gOiB0eXBlb2YgQmFzZVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgbG9jYWxpemF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIHdoaWNoIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNsYXRlZCBhdXRvbWF0aWNhbGx5IHVwb24gYSBsb2NhbGUgYXBwbHlpbmcuXG4gICAgICogSW4gY2FzZSB0aGVyZSBpcyBhIG5lZWQgdG8gbG9jYWxpemUgbm90IHR5cGljYWwgdmFsdWUgKG5vdCBhIFN0cmluZyB2YWx1ZSBvciBhIGZpZWxkIHdpdGggcmUtZGVmaW5lZCBzZXR0ZXIvZ2V0dGVyKSxcbiAgICAgKiB5b3UgY291bGQgdXNlICdsb2NhbGVLZXknIG1ldGEgY29uZmlndXJhdGlvbi5cbiAgICAgKiBFeGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1sb2NhbGl6YWJsZVByb3BlcnRpZXMpXG4gICAgICovXG4gICAgbG9jYWxpemFibGVQcm9wZXJ0aWVzID8gOiBzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIG1hcmdpbi4gVGhpcyBtYXkgYmUgY29uZmlndXJlZCBhcyBhIHNpbmdsZSBudW1iZXIgb3IgYSBgVFJCTGAgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBwaXhlbHMuXG4gICAgICovXG4gICAgbWFyZ2luID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgb2JqZWN0IGNvbnRhaW5zIHRoZSBkZWZhdWx0cyBmb3IgdGhlIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjcmVhdGVkIGZvciB0aGVcbiAgICAgKiBbbWFza2VkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tlZCkgY29uZmlnLiBBbnkgcHJvcGVydGllcyBzcGVjaWZpZWQgaW4gdGhlIGBtYXNrZWRgIGNvbmZpZyB3aWxsIG92ZXJyaWRlIHRoZXNlXG4gICAgICogdmFsdWVzLlxuICAgICAqL1xuICAgIG1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYXBwbHkgdGhlIGRlZmF1bHQgbWFzayB0byB0aGUgd2lkZ2V0LiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSB0aGUgbWFzayBtZXNzYWdlIG9yIGFcbiAgICAgKiBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdC5cbiAgICAgKi9cbiAgICBtYXNrZWQgPyA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudCdzIG1heEhlaWdodC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFtoZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4SGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLW1heGltaXplT25Nb2JpbGUpXG4gICAgICovXG4gICAgbWF4aW1pemVPbk1vYmlsZSA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtYXhXaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtaW5IZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWhlaWdodCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1pbkhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtaW5XaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1pbldpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZXMgdG8gYXBwbHkgdG8gdGFzayByZWNvcmRzIGNyZWF0ZWQgYnkgdGFzayBib2FyZHMgZmVhdHVyZXMgKHN1Y2ggYXMgdGhlIGNvbHVtbiBoZWFkZXIgbWVudSBhbmRcbiAgICAgKiB0aGUgY29sdW1uIHRvb2xiYXIpXG4gICAgICovXG4gICAgbmV3VGFza0RlZmF1bHRzID8gOiBUYXNrTW9kZWxDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGUgb3duaW5nIFdpZGdldCBvZiB0aGlzIFdpZGdldC4gSWYgdGhpcyBXaWRnZXQgaXMgZGlyZWN0bHkgY29udGFpbmVkICh0aGF0IGlzLCBpdCBpcyBvbmUgb2YgdGhlXG4gICAgICogW2l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktaXRlbXMpIG9mIGEgQ29udGFpbmVyKSwgdGhpcyBjb25maWcgd2lsbCBiZSBpZ25vcmVkLiBJbiB0aGlzIGNhc2VcbiAgICAgKiB0aGUgb3duZXIgaXMgPHN0cm9uZz5hbHdheXM8L3N0cm9uZz4gdGhlIGVuY2Fwc3VsYXRpbmcgQ29udGFpbmVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1vd25lcilcbiAgICAgKi9cbiAgICBvd25lciA/IDogV2lkZ2V0fGFueVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgcGx1Z2lucyAoYW4gYXJyYXkgb2YgY2xhc3NlcykgaW4gY29uZmlnXG4gICAgICovXG4gICAgcGx1Z2lucyA/IDogRnVuY3Rpb25bXVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgd2hlbiBhIHdpZGdldCBpcyByZW5kZXJlZCBpbnRvIGFub3RoZXIgd2lkZ2V0J3MgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLCBidXQgbXVzdFxuICAgICAqIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgc3RhbmRhcmQgbGF5b3V0IG9mIHRoYXQgd2lkZ2V0LCBhbmQgbXVzdCBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlbHkgdG8gdGhhdFxuICAgICAqIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctcG9zaXRpb25lZClcbiAgICAgKi9cbiAgICBwb3NpdGlvbmVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiBjYWxsZWQgb24gZWFjaCByZW5kZXIgYmVmb3JlIGFkZGluZyBpdGVtcyB0byBhIHRhc2tzIGNhcmQsIGFsbG93aW5nIHJ1bnRpbWUgbWFuaXB1bGF0aW9uIG9mIHRoZW0uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXByb2Nlc3NJdGVtcylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPn0gY29udGV4dC5oZWFkZXJJdGVtcyBJdGVtIGNvbmZpZyBvYmplY3RzIGZvciB0aGUgdGFzayBoZWFkZXIsIGtleWVkIGJ5IHJlZlxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPn0gY29udGV4dC5ib2R5SXRlbXMgSXRlbSBjb25maWcgb2JqZWN0cyBmb3IgdGhlIHRhc2sgYm9keSwga2V5ZWQgYnkgcmVmXG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+fSBjb250ZXh0LmZvb3Rlckl0ZW1zIEl0ZW0gY29uZmlnIG9iamVjdHMgZm9yIHRoZSB0YXNrIGZvb3Rlciwga2V5ZWQgYnkgcmVmXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBjb250ZXh0LnRhc2tSZWNvcmQgUmVjb3JkIHJlcHJlc2VudGluZyB0YXNrIHRvIGJlIHJlbmRlcmVkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW4sdm9pZH0gUmV0dXJuaW5nIGBmYWxzZWAgZnJvbSB0aGlzIGZ1bmN0aW9uIHByZXZlbnRzIHRoZSBtZW51IGJlaW5nIHNob3duXG4gICAgICovXG4gICAgcHJvY2Vzc0l0ZW1zID8gOiAoY29udGV4dDogeyBoZWFkZXJJdGVtczogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPiwgYm9keUl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+LCBmb290ZXJJdGVtczogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPiwgdGFza1JlY29yZDogVGFza01vZGVsIH0pID0+IGJvb2xlYW58dm9pZFxuICAgIC8qKlxuICAgICAqIEEgW3Byb2plY3QgY29uZmlnIG9iamVjdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWdzKSBvciBhbiBpbnN0YW5jZSB0aGF0IGhvbGRzIGFsbCBzdG9yZXMgYW5kXG4gICAgICogZGF0YSB1c2VkIGJ5IHRoZSBUYXNrQm9hcmQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXByb2plY3QpXG4gICAgICovXG4gICAgcHJvamVjdCA/IDogUHJvamVjdE1vZGVsfFByb2plY3RNb2RlbENvbmZpZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgd2lkZ2V0IGlzIHJlYWQtb25seS4gIFRoaXMgaXMgb25seSB2YWxpZCBpZiB0aGUgd2lkZ2V0IGlzIGFuIGlucHV0XG4gICAgICogZmllbGQsIDxzdHJvbmc+b3IgY29udGFpbnMgaW5wdXQgZmllbGRzIGF0IGFueSBkZXB0aDwvc3Ryb25nPi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctcmVhZE9ubHkpXG4gICAgICovXG4gICAgcmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBbUmVjb3JkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvTW9kZWwpIHdob3NlIHZhbHVlcyB3aWxsIGJlIHVzZWQgdG8gcG9wdWxhdGUgZmllbGRzIGluIHRoZSBjb250YWluZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXJlY29yZClcbiAgICAgKi9cbiAgICByZWNvcmQgPyA6IE1vZGVsXG4gICAgcmVsYXlTdG9yZUV2ZW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIGRlZmF1bHQgYHJlbmRpdGlvbmAgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIHdpZGdldHMsIG9yIGEgbWFwIG9mIHJlbmRpdGlvbnMga2V5ZWQgYnkgY2hpbGQgd2lkZ2V0XG4gICAgICogYHR5cGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1yZW5kaXRpb24pXG4gICAgICovXG4gICAgcmVuZGl0aW9uID8gOiBzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nPnxudWxsXG4gICAgLyoqXG4gICAgICogUGF0aCB0byBsb2FkIHJlc291cmNlIGltYWdlcyBmcm9tLiBVc2VkIGJ5IHRoZSBmb3IgZXhhbXBsZSB0aGUgcmVzb3VyY2UgcGlja2VyIGluIHRoZSB0YXNrIGVkaXRvciBhbmQgYnkgdGhlXG4gICAgICogUmVzb3VyY2VBdmF0YXJzIHRhc2sgaXRlbS4gU2V0IHRoaXMgdG8gZGlzcGxheSBtaW5pYXR1cmUgaW1hZ2VzIGZvciBlYWNoIHJlc291cmNlIHVzaW5nIHRoZWlyIGBpbWFnZWAgZmllbGQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXJlc291cmNlSW1hZ2VQYXRoKVxuICAgICAqL1xuICAgIHJlc291cmNlSW1hZ2VQYXRoID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJbmxpbmUgW3Jlc291cmNlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUmVzb3VyY2VNb2RlbCksIHdpbGwgYmUgbG9hZGVkIGludG8gYW4gaW50ZXJuYWxseSBjcmVhdGVkXG4gICAgICogW1Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvUmVzb3VyY2VTdG9yZSkgYXMgYSBwYXJ0IG9mIGEgW3Byb2plY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwpLlxuICAgICAqL1xuICAgIHJlc291cmNlcyA/IDogUmVzb3VyY2VNb2RlbFtdfG9iamVjdFtdfFJlc291cmNlTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgdmFyaW91cyByZXNwb25zaXZlIHN0YXRlIG9iamVjdHMga2V5ZWQgYnkgdGhlaXIgbmFtZS4gRWFjaCBrZXkgKGV4Y2VwdCBgJyonYCwgc2VlIGJlbG93KSBpblxuICAgICAqIHRoaXMgb2JqZWN0IGlzIGEgc3RhdGUgbmFtZSAoc2VlIFtyZXNwb25zaXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkpIGFuZCBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyB0aGVcbiAgICAgKiBhc3NvY2lhdGVkIFtSZXNwb25zaXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjdHlwZWRlZi1SZXNwb25zaXZlU3RhdGUpIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctcmVzcG9uc2l2ZSlcbiAgICAgKi9cbiAgICByZXNwb25zaXZlID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG1hcmsgdGhpcyBpbnN0YW5jZSBhcyB0aGUgZGVmYXVsdCBbcmVzcG9uc2l2ZVRhcmdldF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVRhcmdldCkgZm9yIGRlc2NlbmRhbnRzIHRoYXQgZG9cbiAgICAgKiBub3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBbcmVzcG9uc2l2ZVRhcmdldF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVRhcmdldCkgb2YgdGhlaXIgb3duLlxuICAgICAqL1xuICAgIHJlc3BvbnNpdmVSb290ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgW3Jlc3BvbnNpdmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmUpIGNvbmZpZy4gVGhpcyBpcyBhc3NpZ25lZCBpbnRlcm5hbGx5XG4gICAgICogYW5kIHNob3VsZCBub3QgYmUgYXNzaWduZWQgZGlyZWN0bHkuXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZVN0YXRlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgd2lkZ2V0IHdob3NlIHNpemUgYW5kIG90aGVyIHByb3BlcnRpZXMgZHJpdmUgdGhpcyBvYmplY3QncyByZXNwb25zaXZlIGJlaGF2aW9yLiBJZiB0aGlzIGNvbmZpZyBpcyBub3RcbiAgICAgKiBzcGVjaWZpZWQsIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHRoYXQgc3BlY2lmaWVkIFtyZXNwb25zaXZlUm9vdD10cnVlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlUm9vdCkgd2lsbCBiZVxuICAgICAqIHVzZWQuIElmIHRoZXJlIGlzIG5vIHN1Y2ggYW5jZXN0b3IsIHRoZW4gdGhlIGluc3RhbmNlIHVzaW5nIHRoaXMgbWl4aW4gaXMgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctcmVzcG9uc2l2ZVRhcmdldClcbiAgICAgKi9cbiAgICByZXNwb25zaXZlVGFyZ2V0ID8gOiBzdHJpbmd8V2lkZ2V0XG4gICAgLyoqXG4gICAgICogSWYgeW91IGFyZSByZW5kZXJpbmcgdGhpcyB3aWRnZXQgdG8gYSBzaGFkb3cgcm9vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgdGhpcyBjb25maWcgdG8gdGhlIHNoYWRvd1Jvb3QuIElmIG5vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgaXQgdG8gYGRvY3VtZW50LmJvZHlgXG4gICAgICovXG4gICAgcm9vdEVsZW1lbnQgPyA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnRcbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGB0cnVlYCB0byBtYWtlIHRoZSB3aWRnZXQncyBlbGVtZW50IHVzZSB0aGUgYGRpcmVjdGlvbjpydGxgIHN0eWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1ydGwpXG4gICAgICovXG4gICAgcnRsID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgKGFuZCBvcHRpb25hbGx5IGluIHdoaWNoIGF4ZXMpIGEgV2lkZ2V0IG1heSBzY3JvbGwuIGB0cnVlYCBtZWFucyB0aGlzIHdpZGdldCBtYXkgc2Nyb2xsXG4gICAgICogaW4gYm90aCBheGVzLiBNYXkgYmUgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYm9vbGVhbiBgb3ZlcmZsb3dYYCBhbmQgYG92ZXJmbG93WWAgcHJvcGVydGllcyB3aGljaCBhcmVcbiAgICAgKiBhcHBsaWVkIHRvIENTUyBzdHlsZSBwcm9wZXJ0aWVzIGBvdmVyZmxvd1hgIGFuZCBgb3ZlcmZsb3dZYC4gSWYgdGhleSBhcmUgYm9vbGVhbiwgdGhleSBhcmUgdHJhbnNsYXRlZCB0b1xuICAgICAqIENTUyBvdmVyZmxvdyBwcm9wZXJ0aWVzIHRodXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXNjcm9sbGFibGUpXG4gICAgICovXG4gICAgc2Nyb2xsYWJsZSA/IDogYm9vbGVhbnxTY3JvbGxlckNvbmZpZ3xTY3JvbGxlclxuICAgIC8qKlxuICAgICAqIERlZmluZXMgd2hhdCB0byBkbyBpZiBkb2N1bWVudCBpcyBzY3JvbGxlZCB3aGlsZSBXaWRnZXQgaXMgdmlzaWJsZSAob25seSByZWxldmFudCB3aGVuIGZsb2F0aW5nIGlzIHNldCB0byBgdHJ1ZWApLlxuICAgICAqIFZhbGlkIHZhbHVlczogwrRudWxswrQ6IGRvIG5vdGhpbmcsIMK0aGlkZcK0OiBoaWRlIHRoZSB3aWRnZXQgb3IgwrRyZWFsaWduwrQ6IHJlYWxpZ24gdG8gdGhlIHRhcmdldCBpZiBwb3NzaWJsZS5cbiAgICAgKi9cbiAgICBzY3JvbGxBY3Rpb24gPyA6ICdoaWRlJ3wncmVhbGlnbid8bnVsbFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciB0aGUgW1Njcm9sbE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvdXRpbC9TY3JvbGxNYW5hZ2VyKSBjbGFzcy4gSXQgaXMgdXNlZCB0byBtYW5hZ2UgY29sdW1uL2JvZHlcbiAgICAgKiBzY3JvbGxpbmcgZHVyaW5nIHRhc2ssIGNvbHVtbiBvciBzd2ltbGFuZSBkcmFnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zY3JvbGxNYW5hZ2VyKVxuICAgICAqL1xuICAgIHNjcm9sbE1hbmFnZXIgPyA6IFNjcm9sbE1hbmFnZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHNjcm9sbCBvcHRpb25zLCBzZWUgdGhlIG9wdGlvbnMgZm9yIFtzY3JvbGxJbnRvVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9oZWxwZXIvdXRpbC9TY3JvbGxlciNmdW5jdGlvbi1zY3JvbGxJbnRvVmlldylcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc2Nyb2xsT3B0aW9ucylcbiAgICAgKi9cbiAgICBzY3JvbGxPcHRpb25zID8gOiBCcnludHVtU2Nyb2xsT3B0aW9uc1xuICAgIC8qKlxuICAgICAqIFNlbGVjdGVkIHRhc2tzLlxuICAgICAqL1xuICAgIHNlbGVjdGVkVGFza3MgPyA6IFRhc2tNb2RlbFtdXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHdpdGggYHRydWVgIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Yga2V5Ym9hcmQgbmF2aWdhdGlvbiBmcm9tIG1vdmluZyBmb2N1cyB0byBzZWxlY3RpbmdcbiAgICAgKiB0YXNrczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc2VsZWN0T25OYXZpZ2F0aW9uKVxuICAgICAqL1xuICAgIHNlbGVjdE9uTmF2aWdhdGlvbiA/IDogYm9vbGVhbnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc2hvd0FuaW1hdGlvbilcbiAgICAgKi9cbiAgICBzaG93QW5pbWF0aW9uID8gOiBib29sZWFufG9iamVjdFxuICAgIC8qKlxuICAgICAqIFNob3cgYW4gaWNvbiB0byBleHBhbmQvY29sbGFwc2UgY29sdW1ucyBhbmQgc3dpbWxhbmVzIGluIHRoZWlyIGhlYWRlcnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXNob3dDb2xsYXBzZUluSGVhZGVyKVxuICAgICAqL1xuICAgIHNob3dDb2xsYXBzZUluSGVhZGVyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgYSB0b29sdGlwIHNob3dpbmcgYEV4cGFuZCBYWGAvYENvbGxhcHNlIFhYYCBpcyBzaG93biB3aGVuIGhvdmVyaW5nIHRoZSBleHBhbmQvY29sbGFwc2UgaWNvbiBmb3JcbiAgICAgKiBhIGNvbHVtbiBvciBzd2ltbGFuZS4gVG8gZGlzYWJsZSB0aGUgdG9vbHRpcCwgc2V0IHRoaXMgdG8gYGZhbHNlYC5cbiAgICAgKi9cbiAgICBzaG93Q29sbGFwc2VUb29sdGlwID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2hvdyB0YXNrIGNvdW50IGZvciBhIGNvbHVtbiBpbiBpdHMgaGVhZGVyLCBhcHBlbmRlZCBhZnRlciB0aGUgdGl0bGVcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc2hvd0NvdW50SW5IZWFkZXIpXG4gICAgICovXG4gICAgc2hvd0NvdW50SW5IZWFkZXIgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIGhvdyBtYW55IGNvbHVtbnMgdG8gc3BhbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBzcGFuID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGlzIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc3RhdGVmdWwpXG4gICAgICovXG4gICAgc3RhdGVmdWwgPyA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50cyB0aGF0LCB3aGVuIGZpcmVkIGJ5IHRoaXMgY29tcG9uZW50LCBzaG91bGQgdHJpZ2dlciBpdCB0byBzYXZlIGl0cyBzdGF0ZSBieSBjYWxsaW5nXG4gICAgICogW3NhdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNmdW5jdGlvbi1zYXZlU3RhdGUpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zdGF0ZWZ1bEV2ZW50cylcbiAgICAgKi9cbiAgICBzdGF0ZWZ1bEV2ZW50cyA/IDogb2JqZWN0fHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGtleSB0byB1c2Ugd2hlbiBzYXZpbmcgdGhpcyBvYmplY3QncyBzdGF0ZSBpbiB0aGUgW3N0YXRlUHJvdmlkZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlUHJvdmlkZXIpLiBJZiB0aGlzIGNvbmZpZyBpc1xuICAgICAqIG5vdCBhc3NpZ25lZCwgYW5kIFtzdGF0ZWZ1bF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNjb25maWctc3RhdGVmdWwpIGlzIG5vdCBzZXQgdG8gYGZhbHNlYCwgdGhlIFtpZF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaWQpXG4gICAgICogKGlmIGV4cGxpY2l0bHkgc3BlY2lmaWVkKSB3aWxsIGJlIHVzZWQgYXMgdGhlIGBzdGF0ZUlkYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc3RhdGVJZClcbiAgICAgKi9cbiAgICBzdGF0ZUlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgYFN0YXRlUHJvdmlkZXJgIHRvIHVzZSB0byBzYXZlIGFuZCByZXN0b3JlIHRoaXMgb2JqZWN0J3MgW3N0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI3Byb3BlcnR5LXN0YXRlKS4gQnkgZGVmYXVsdCwgYHN0YXRlYFxuICAgICAqIHdpbGwgYmUgc2F2ZWQgdXNpbmcgdGhlIFtkZWZhdWx0IHN0YXRlIHByb3ZpZGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3N0YXRlL1N0YXRlUHJvdmlkZXIjcHJvcGVydHktaW5zdGFuY2Utc3RhdGljKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc3RhdGVQcm92aWRlcilcbiAgICAgKi9cbiAgICBzdGF0ZVByb3ZpZGVyID8gOiBTdGF0ZVByb3ZpZGVyXG4gICAgLyoqXG4gICAgICogTWFrZXMgY29sdW1uIGFuZCBzd2ltbGFuZSBoZWFkZXJzIHN0aWNreVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zdGlja3lIZWFkZXJzKVxuICAgICAqL1xuICAgIHN0aWNreUhlYWRlcnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXR0aW5nIHRoaXMgd2lsbCBjYXVzZSBjYXJkcyB0byBleHBhbmQgdG8gc2hhcmUgdGhlIGF2YWlsYWJsZSB3aWR0aCBpZiB0aGVyZSBhcmUgZmV3ZXIgdGhhblxuICAgICAqIFt0YXNrc1BlclJvd10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdGFza3NQZXJSb3cpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zdHJldGNoQ2FyZHMpXG4gICAgICovXG4gICAgc3RyZXRjaENhcmRzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gbWF0Y2ggZmllbGRzIGJ5IHRoZWlyIGBuYW1lYCBwcm9wZXJ0eSBvbmx5IHdoZW4gYXNzaWduaW5nIGEgW3JlY29yZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2NvbmZpZy1yZWNvcmQpLFxuICAgICAqIHdpdGhvdXQgZmFsbGluZyBiYWNrIHRvIGByZWZgLlxuICAgICAqL1xuICAgIHN0cmljdFJlY29yZE1hcHBpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB3aWRnZXRzIGtleWVkIGJ5IG5hbWUuIEJ5IGRlZmF1bHQgKHdoZW4gbm8gYHR5cGVgIGlzIGdpdmVuKSwgc3RyaXBzIGFyZVxuICAgICAqIFt0b29sYmFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhcikuIElmIHlvdSB3YW50IHRvIHBhc3MgYW4gYXJyYXksIHlvdSBjYW4gdXNlXG4gICAgICogdGhlIHRvb2xiYXIncyBbaXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNjb25maWctaXRlbXMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zdHJpcHMpXG4gICAgICovXG4gICAgc3RyaXBzID8gOiBSZWNvcmQ8c3RyaW5nLCBUYXNrQm9hcmRDb250YWluZXJJdGVtQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIEZpZWxkIG9uIGEgdGFzayByZWNvcmQgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggc3dpbWxhbmUgdGhlIHRhc2sgYmVsb25ncyB0by5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc3dpbWxhbmVGaWVsZClcbiAgICAgKi9cbiAgICBzd2ltbGFuZUZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBbiBlbXB0eSBmdW5jdGlvbiBieSBkZWZhdWx0LCBidXQgcHJvdmlkZWQgc28gdGhhdCB5b3UgY2FuIG92ZXJyaWRlIGl0LiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoIHRpbWVcbiAgICAgKiBhIHN3aW1sYW5lIGlzIHJlbmRlcmVkIGludG8gdGhlIHRhc2sgYm9hcmQuIEl0IGFsbG93cyB5b3UgdG8gbWFuaXB1bGF0ZSB0aGUgRE9NIGNvbmZpZyBvYmplY3QgdXNlZCBmb3IgdGhlXG4gICAgICogc3dpbWxhbmUgYmVmb3JlIGl0IGlzIHN5bmNlZCB0byBET00sIHRodXMgZ2l2aW5nIHlvdSBjb250cm9sIG92ZXIgc3R5bGluZyBhbmQgY29udGVudHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXN3aW1sYW5lUmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlbmRlciBhIHN3aW1sYW5lLlxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGRldGFpbC5zd2ltbGFuZVJlY29yZCBUaGUgc3dpbWxhbmUuXG4gICAgICogQHBhcmFtIHtEb21Db25maWd9IGRldGFpbC5zd2ltbGFuZUNvbmZpZyBET00gY29uZmlnIG9iamVjdCBmb3IgdGhlIHN3aW1sYW5lXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3dpbWxhbmVSZW5kZXJlciA/IDogKGRldGFpbDogeyBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgc3dpbWxhbmVDb25maWc6IERvbUNvbmZpZyB9KSA9PiB2b2lkXG4gICAgLyoqXG4gICAgICogU3RvcmUgY29udGFpbmluZyB0aGUgVGFza0JvYXJkIHN3aW1sYW5lcy4gQSB0YXNrcyBbc3dpbWxhbmVGaWVsZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvbWl4aW4vVGFza0JvYXJkU3dpbWxhbmVzI2NvbmZpZy1zd2ltbGFuZUZpZWxkKSBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBpZGBcbiAgICAgKiBvZiBhIHN3aW1sYW5lIHRvIGRldGVybWluZSBpbiB3aGljaCBzd2ltbGFuZSBpdCBpcyBkaXNwbGF5ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXN3aW1sYW5lcylcbiAgICAgKi9cbiAgICBzd2ltbGFuZXMgPyA6IFN3aW1sYW5lTW9kZWxbXXxTd2ltbGFuZU1vZGVsQ29uZmlnW118U3RvcmV8c3RyaW5nfFN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGFza0JvYXJkIGRvZXMgbm90IHVzZSBhIHN5bmMgbWFzayBieSBkZWZhdWx0LiBJZiB5b3Ugd2FudCBvbmUsIHNlZVxuICAgICAqIFtzeW5jTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9taXhpbi9Mb2FkTWFza2FibGUjY29uZmlnLXN5bmNNYXNrKSBmb3IgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgICAqL1xuICAgIHN5bmNNYXNrID8gOiBzdHJpbmd8b2JqZWN0fG51bGxcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbdGFiXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWIpIGNyZWF0ZWQgZm9yIHRoaXMgd2lkZ2V0IHdoZW4gaXQgaXMgcGxhY2VkIGluIGFcbiAgICAgKiBbVGFiUGFuZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYlBhbmVsKS4gRm9yIGV4YW1wbGUsIHRoaXMgY29uZmlnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGljb24gb2YgdGhlIGB0YWJgIGZvclxuICAgICAqIHRoaXMgd2lkZ2V0OlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy10YWIpXG4gICAgICovXG4gICAgdGFiID8gOiBib29sZWFufFRhYkNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBjb250YWluZXIgaXMgdXNlZCBhcyBhIHRhYiBpbiBhIFRhYlBhbmVsLCB0aGVzZSBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlXG4gICAgICogW1RhYkJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiQmFyKSB3aGVuIHRoaXMgY29udGFpbmVyIGlzIHRoZSBhY3RpdmUgdGFiLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy10YWJCYXJJdGVtcylcbiAgICAgKi9cbiAgICB0YWJCYXJJdGVtcyA/IDogVG9vbGJhckl0ZW1zW118V2lkZ2V0W11cbiAgICAvKipcbiAgICAgKiBBbiBlbXB0eSBmdW5jdGlvbiBieSBkZWZhdWx0LCBidXQgcHJvdmlkZWQgc28gdGhhdCB5b3UgY2FuIG92ZXJyaWRlIGl0LiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoIHRpbWVcbiAgICAgKiBhIHRhc2sgaXMgcmVuZGVyZWQgaW50byB0aGUgdGFzayBib2FyZC4gSXQgYWxsb3dzIHlvdSB0byBtYW5pcHVsYXRlIHRoZSBET00gY29uZmlnIG9iamVjdCB1c2VkIGZvciB0aGUgY2FyZFxuICAgICAqIGJlZm9yZSBpdCBpcyBzeW5jZWQgdG8gRE9NLCB0aHVzIGdpdmluZyB5b3UgY29udHJvbCBvdmVyIHN0eWxpbmcgYW5kIGNvbnRlbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy10YXNrUmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlbmRlciBhIHRhc2suXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBkZXRhaWwudGFza1JlY29yZCBUaGUgdGFzayByZWNvcmQuXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGRldGFpbC5jb2x1bW5SZWNvcmQgVGhlIGNvbHVtbiB0aGUgdGFzayB3aWxsIGJlIGRpc3BsYXllZCBpbi5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBkZXRhaWwuc3dpbWxhbmVSZWNvcmQgVGhlIHN3aW1sYW5lIHRoZSB0YXNrIHdpbGwgYmUgZGlzcGxheWVkIGluLlxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnfSBkZXRhaWwuY2FyZENvbmZpZyBET00gY29uZmlnIG9iamVjdCBmb3IgdGhlIGNhcmRzIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB0YXNrUmVuZGVyZXIgPyA6IChkZXRhaWw6IHsgdGFza1JlY29yZDogVGFza01vZGVsLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgY2FyZENvbmZpZzogRG9tQ29uZmlnIH0pID0+IHZvaWRcbiAgICAvKipcbiAgICAgKiBJbmxpbmUgW3Rhc2tzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvVGFza01vZGVsKSwgd2lsbCBiZSBsb2FkZWQgaW50byBhbiBpbnRlcm5hbGx5IGNyZWF0ZWRcbiAgICAgKiBbVGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvc3RvcmUvVGFza1N0b3JlKSBhcyBhIHBhcnQgb2YgYSBbcHJvamVjdF0oI1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwpLlxuICAgICAqL1xuICAgIHRhc2tzID8gOiBUYXNrTW9kZWxbXXxvYmplY3RbXXxUYXNrTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIEFsbG93cyBzb3J0aW5nIHRhc2tzIGluIHRoZSBVSSBpbmRlcGVuZGVudCBvZiBob3cgdGhleSBhcmUgc29ydGVkIGluIHRoZSB0YXNrIHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy10YXNrU29ydGVyRm4pXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBmaXJzdCBUaGUgZmlyc3QgdGFzayB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBzZWNvbmQgVGhlIHNlY29uZCB0YXNrIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm4gYDFgIGlmIGZpcnN0IHRhc2sgaXMgZ3JlYXRlciB0aGFuIHNlY29uZCB0YXNrLCBgLTFgIGlmIHRoZSBvcHBvc2l0ZSBpcyB0cnVlIG9yIGAwYCBpZiB0aGV5IGFyZSBlcXVhbFxuICAgICAqL1xuICAgIHRhc2tTb3J0ZXJGbiA/IDogYm9vbGVhbnwoKGZpcnN0OiBUYXNrTW9kZWwsIHNlY29uZDogVGFza01vZGVsKSA9PiBudW1iZXIpXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgaG93IG1hbnkgY2FyZHMgYXJlIHJlbmRlcmVkIHRvIGEgcm93IGluIGVhY2ggY29sdW1uLiBDYW4gYmUgY29udHJvbGxlZCBvbiBhIHBlciBjb2x1bW4gYmFzaXMgYnlcbiAgICAgKiBzZXR0aW5nIFt0YXNrc1BlclJvd10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL0NvbHVtbk1vZGVsI2ZpZWxkLXRhc2tzUGVyUm93KVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy10YXNrc1BlclJvdylcbiAgICAgKi9cbiAgICB0YXNrc1BlclJvdyA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSBDb25maWcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIFtUb29sYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKSxcbiAgICAgKiBvciBhcnJheSBvZiBjb25maWcgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkIGl0ZW1zIG9mIGEgVG9vbGJhci5cbiAgICAgKiBUaGlzIGNyZWF0ZXMgYSB0b29sYmFyIGRvY2tlZCB0byB0aGUgdG9wIG9mIHRoZSBwYW5lbCBpbW1lZGlhdGVseSBiZWxvdyB0aGUgaGVhZGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy10YmFyKVxuICAgICAqL1xuICAgIHRiYXIgPyA6IChUYXNrQm9hcmRDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgdGl0bGUgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyIG9yIG93bmluZyBUYWJQYW5lbC4gQ2F1c2VzIGNyZWF0aW9uIGFuZCBkb2NraW5nIG9mIGEgaGVhZGVyXG4gICAgICogdG8gdGhlIHRvcCBpZiBubyBoZWFkZXIgaXMgY29uZmlndXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdGl0bGUpXG4gICAgICovXG4gICAgdGl0bGUgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2wpIHRvIGFkZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBgdGl0bGVgIGluIHRoZSBQYW5lbCBoZWFkZXIuIEVhY2hcbiAgICAgKiBwcm9wZXJ0eSBuYW1lIGlzIHRoZSByZWZlcmVuY2UgYnkgd2hpY2ggYW4gaW5zdGFudGlhdGVkIHRvb2wgbWF5IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBsaXZlXG4gICAgICogYFt0b29sc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vVG9vbGFibGUjcHJvcGVydHktdG9vbHMpYCBwcm9wZXJ0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdG9vbHMpXG4gICAgICovXG4gICAgdG9vbHMgPyA6IFJlY29yZDxzdHJpbmcsIFRvb2xDb25maWc+fG51bGxcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzIG5hbWUgc3VmZml4ZXMgdG8gYXBwbHkgdG8gdGhlIGVsZW1lbnRzIHJlbmRlcmVkIGJ5IHRoaXMgd2lkZ2V0LiBUaGlzIG1heSBiZSBzcGVjaWZpZWRcbiAgICAgKiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIGFuIGFycmF5IG9mIHN0cmluZ3MsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lcyB3aXRoIHRydXRoeVxuICAgICAqIHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXVpKVxuICAgICAqL1xuICAgIHVpID8gOiAncGxhaW4nfCd0b29sYmFyJ3xzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogRXhwZXJpbWVudGFsLCBhbmltYXRlIGFjdGlvbnMgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQgdXNpbmcgQ1NTIHRyYW5zaXRpb25zLiBDdXJyZW50bHkgaW5jbHVkZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXVzZURvbVRyYW5zaXRpb24pXG4gICAgICovXG4gICAgdXNlRG9tVHJhbnNpdGlvbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IHR1cm5pbmcgb24gdGhpcyBzZXR0aW5nIHlvdSBlbmFibGUgcGFydGlhbCB2aXJ0dWFsaXplZCByZW5kZXJpbmcgZm9yIHRoZSBib2FyZCwgd2hpY2ggcmVkdWNlcyBpbml0aWFsXG4gICAgICogcmVuZGVyaW5nIHRpbWUgYW5kIG1ha2VzIGludGVyYWN0aW9uIGxlc3Mgc2x1Z2dpc2ggd2hlbiB1c2luZyB0aG91c2FuZHMgb2YgdGFza3MuIFRoZSB0cmFkZW9mZiBpcyB0aGF0XG4gICAgICogc2Nyb2xsaW5nIGluIG1vc3QgY2FzZXMgd2lsbCBiZSBzbG93ZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXZpcnR1YWxpemUpXG4gICAgICovXG4gICAgdmlydHVhbGl6ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgd2lkZ2V0cyB3ZWlnaHQgZGV0ZXJtaW5lcyBpdHMgcG9zaXRpb24gYW1vbmcgc2libGluZ3Mgd2hlbiBhZGRlZCB0byBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lcikuXG4gICAgICogSGlnaGVyIHdlaWdodHMgZ28gZnVydGhlciBkb3duLlxuICAgICAqL1xuICAgIHdlaWdodCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3Mgd2lkdGgsIHVzZWQgdG8gc2V0IGVsZW1lbnQgYHN0eWxlLndpZHRoYC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCB3aWR0aCBzdHJpbmcgb3IgYSBudW1iZXIsIHdoaWNoXG4gICAgICogd2lsbCBnZXQgJ3B4JyBhcHBlbmRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIENTUyBhcyB0aGUgcHJpbWFyeSB3YXkgdG8gY29udHJvbCB3aWR0aCwgYnV0IGluIHNvbWUgY2FzZXNcbiAgICAgKiB0aGlzIGNvbmZpZyBpcyBjb252ZW5pZW50LlxuICAgICAqL1xuICAgIHdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHggcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXgpXG4gICAgICovXG4gICAgeCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHkgcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXkpXG4gICAgICovXG4gICAgeSA/IDogbnVtYmVyXG5cbiAgICAvLyBGZWF0dXJlc1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgdXNlcnMgdG8gZHJhZyBjb2x1bW5zIG9uIHRoZSBUYXNrQm9hcmQgdG8gY2hhbmdlIHRoZSBjb2x1bW4gb3JkZXIuIERyYWcgaXMgaW5pdGlhdGVkIHVwb25cbiAgICAgKiBtb3VzZSBkb3duIGluIHRoZSBjb2x1bW4gaGVhZGVyLiBUcnkgaXQgb3V0IGJlbG93IVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9Db2x1bW5EcmFnKVxuICAgICAqL1xuICAgIGNvbHVtbkRyYWdGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uRHJhZ3xDb2x1bW5EcmFnQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYWJpbGl0eSB0byBmaWx0ZXIgZWFjaCBjb2x1bW4gb2YgdGhlIFRhc2tCb2FyZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvQ29sdW1uRmlsdGVyKVxuICAgICAqL1xuICAgIGNvbHVtbkZpbHRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5GaWx0ZXJ8Q29sdW1uRmlsdGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWRkcyBhIG1lbnUgYnV0dG9uIChgwrfCt8K3YCkgdG8gY29sdW1uIGhlYWRlcnMsIGNsaWNraW5nIGl0IGRpc3BsYXlzIGEgbWVudS4gSXRlbXMgYXJlIHBvcHVsYXRlZCBieSBvdGhlciBmZWF0dXJlc1xuICAgICAqIGFuZC9vciBhcHBsaWNhdGlvbiBjb2RlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9Db2x1bW5IZWFkZXJNZW51KVxuICAgICAqL1xuICAgIGNvbHVtbkhlYWRlck1lbnVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uSGVhZGVyTWVudXxDb2x1bW5IZWFkZXJNZW51Q29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHVzZXIgdG8gbG9jayBjb2x1bW5zIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IHVzaW5nIHRoZSBuZXcgW2xvY2tlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL0NvbHVtbk1vZGVsI2ZpZWxkLWxvY2tlZCkgZmllbGRcbiAgICAgKiBvbiBjb2x1bW5zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9Db2x1bW5Mb2NrKVxuICAgICAqL1xuICAgIGNvbHVtbkxvY2tGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uTG9ja3xDb2x1bW5Mb2NrQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHVzZXIgdG8gcmVuYW1lIGNvbHVtbnMgYnkgZWl0aGVyIGRvdWJsZS1jbGlja2luZyBjb2x1bW4gdGV4dCwgb3IgdmlhIHRoZSBjb2x1bW4gaGVhZGVyIG1lbnUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL0NvbHVtblJlbmFtZSlcbiAgICAgKi9cbiAgICBjb2x1bW5SZW5hbWVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVuYW1lfENvbHVtblJlbmFtZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgdXNlcnMgdG8gY2hhbmdlIHRoZSB3aWR0aCBvZiBpbmRpdmlkdWFsIFRhc2tCb2FyZCBjb2x1bW5zLiBSZXNpemUgaXMgaW5pdGlhdGVkIHVwb24gbW91c2UgZG93biBvblxuICAgICAqIHRoZSBzZXBhcmF0b3IgZWxlbWVudCBiZXR3ZWVuIGNvbHVtbiBoZWFkZXJzLiBUcnkgaXQgb3V0IGJlbG93IVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9Db2x1bW5SZXNpemUpXG4gICAgICovXG4gICAgY29sdW1uUmVzaXplRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlc2l6ZXxDb2x1bW5SZXNpemVDb25maWdcbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBhYmlsaXR5IHRvIHNvcnQgZWFjaCBjb2x1bW4gb2YgdGhlIFRhc2tCb2FyZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvQ29sdW1uU29ydClcbiAgICAgKi9cbiAgICBjb2x1bW5Tb3J0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblNvcnR8Q29sdW1uU29ydENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFkZHMgdG9vbGJhcnMgdG8gdGhlIHRvcCBhbmQvb3IgYm90dG9tIG9mIGVhY2ggY29sdW1uLiBCeSBkZWZhdWx0IGl0IGFkZHMgYSBib3R0b20gdG9vbGJhciBjb250YWluaW5nIGEgc2luZ2xlIGJ1dHRvblxuICAgICAqIGZvciBhZGRpbmcgZXZlbnRzIHRvIHRoYXQgY29sdW1uL3N3aW1sYW5lOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9Db2x1bW5Ub29sYmFycylcbiAgICAgKi9cbiAgICBjb2x1bW5Ub29sYmFyc0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5Ub29sYmFyc3xDb2x1bW5Ub29sYmFyc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGFiaWxpdHkgdG8gcXVpY2sgc2VhcmNoIGluIGNvbmZpZ3VyZWQgZmllbGRzIG9mIHRhc2tzLlxuICAgICAqIFJlbmRlcnMgYSBmaWx0ZXIgYmFyIGJlbG93IGVhY2ggY29sdW1uJ3MgaGVhZGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9GaWx0ZXJCYXIpXG4gICAgICovXG4gICAgZmlsdGVyQmFyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbHRlckJhcnxGaWx0ZXJCYXJDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWxsb3dzIGlubGluZSBlZGl0aW5nIG9mIHRhc2tzLiBEb3VibGUtY2xpY2tpbmcgYW4gaXRlbSBzdGFydHMgZWRpdGluZyBpdDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvU2ltcGxlVGFza0VkaXQpXG4gICAgICovXG4gICAgc2ltcGxlVGFza0VkaXRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U2ltcGxlVGFza0VkaXR8U2ltcGxlVGFza0VkaXRDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHVzZXJzIHRvIGRyYWcgZHJvcCBzd2ltbGFuZXMgb24gdGhlIFRhc2tCb2FyZCBjaGFuZ2luZyB0aGVpciBvcmRlciAoYnkgZ3JhYmJpbmcgdGhlaXIgaGVhZGVyKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvU3dpbWxhbmVEcmFnKVxuICAgICAqL1xuICAgIHN3aW1sYW5lRHJhZ0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTd2ltbGFuZURyYWd8U3dpbWxhbmVEcmFnQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFsbG93cyBjYXJkcyBvbiB0aGUgVGFza0JvYXJkIHRvIGJlIGRyYWdnZWQgYWNyb3NzIHN3aW1sYW5lcyBhbmQgY29sdW1ucyBidXQgYWxzbyB2ZXJ0aWNhbGx5IGluIHRoZVxuICAgICAqIHNhbWUgY29sdW1uIHRvIGNoYW5nZSB0aGUgb3JkZXI6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL1Rhc2tEcmFnKVxuICAgICAqL1xuICAgIHRhc2tEcmFnRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRhc2tEcmFnfFRhc2tEcmFnQ29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB1c2VycyB0byBjbGljayBhbmQgZHJhZyB0byBzZWxlY3QgY2FyZHMgb24gdGhlIFRhc2tCb2FyZCAobWFycXVlZSBzZWxlY3Rpb24pLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9UYXNrRHJhZ1NlbGVjdClcbiAgICAgKi9cbiAgICB0YXNrRHJhZ1NlbGVjdEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUYXNrRHJhZ1NlbGVjdHxUYXNrRHJhZ1NlbGVjdENvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZXMgYWxsb3dzIHRoZSB1c2VyIHRvIGVkaXQgdGFza3MgaW4gYSBwb3B1cCBlZGl0b3IgdGhhdCBjYW4gZWl0aGVyIGJlIHNob3duIGNlbnRlcmVkIG9uIHNjcmVlbiAodGhlXG4gICAgICogZGVmYXVsdCwgZG91YmxlIGNsaWNrIGEgdGFzayB0byBzaG93IHRoZSBlZGl0b3IpOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9UYXNrRWRpdClcbiAgICAgKi9cbiAgICB0YXNrRWRpdEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUYXNrRWRpdHxUYXNrRWRpdENvbmZpZ1xuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgY29udGV4dCBtZW51IGZvciB0YXNrcy4gSXRlbXMgYXJlIHBvcHVsYXRlZCBieSBvdGhlciBmZWF0dXJlcyBhbmQvb3IgYXBwbGljYXRpb24gY29kZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvVGFza01lbnUpXG4gICAgICovXG4gICAgdGFza01lbnVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGFza01lbnV8VGFza01lbnVDb25maWdcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIHRvb2x0aXAgd2hlbiBob3ZlcmluZyBhIHRhc2suIEJ5IGRlZmF1bHQgdGhlIHRvb2x0aXAgZGlzcGxheXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL1Rhc2tUb29sdGlwKVxuICAgICAqL1xuICAgIHRhc2tUb29sdGlwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRhc2tUb29sdGlwfFRhc2tUb29sdGlwQ29uZmlnXG5cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3IgOiAnYnJ5bnR1bS10YXNrLWJvYXJkLWJhc2UnLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bVRhc2tCb2FyZEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlQ2xhc3MgPSBUYXNrQm9hcmRCYXNlO1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZU5hbWUgPSAnVGFza0JvYXJkQmFzZSc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQWN0aXZhdGVUYXNrJyxcbiAgICAgICAgJ29uQmVmb3JlQ29sdW1uRHJhZycsXG4gICAgICAgICdvbkJlZm9yZUNvbHVtbkRyb3AnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5SZXNpemUnLFxuICAgICAgICAnb25CZWZvcmVEZXN0cm95JyxcbiAgICAgICAgJ29uQmVmb3JlSGlkZScsXG4gICAgICAgICdvbkJlZm9yZVJlc3BvbnNpdmVTdGF0ZUNoYW5nZScsXG4gICAgICAgICdvbkJlZm9yZVNob3cnLFxuICAgICAgICAnb25CZWZvcmVTaW1wbGVUYXNrRWRpdCcsXG4gICAgICAgICdvbkJlZm9yZVN0YXRlQXBwbHknLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZVNhdmUnLFxuICAgICAgICAnb25CZWZvcmVUYXNrRHJhZycsXG4gICAgICAgICdvbkJlZm9yZVRhc2tEcm9wJyxcbiAgICAgICAgJ29uQmVmb3JlVGFza0VkaXQnLFxuICAgICAgICAnb25CZWZvcmVUYXNrRWRpdFNob3cnLFxuICAgICAgICAnb25CZWZvcmVUYXNrUmVtb3ZlJyxcbiAgICAgICAgJ29uQ2F0Y2hBbGwnLFxuICAgICAgICAnb25DZWxsTWVudUl0ZW0nLFxuICAgICAgICAnb25DZWxsTWVudVNob3cnLFxuICAgICAgICAnb25DZWxsTWVudVRvZ2dsZUl0ZW0nLFxuICAgICAgICAnb25Db2xsYXBzZScsXG4gICAgICAgICdvbkNvbHVtbkNvbGxhcHNlJyxcbiAgICAgICAgJ29uQ29sdW1uRHJhZycsXG4gICAgICAgICdvbkNvbHVtbkRyYWdBYm9ydCcsXG4gICAgICAgICdvbkNvbHVtbkRyYWdFbmQnLFxuICAgICAgICAnb25Db2x1bW5EcmFnU3RhcnQnLFxuICAgICAgICAnb25Db2x1bW5Ecm9wJyxcbiAgICAgICAgJ29uQ29sdW1uRXhwYW5kJyxcbiAgICAgICAgJ29uQ29sdW1uRmlsdGVySGlkZScsXG4gICAgICAgICdvbkNvbHVtbkZpbHRlclNob3cnLFxuICAgICAgICAnb25Db2x1bW5GaWx0ZXJUb2dnbGUnLFxuICAgICAgICAnb25Db2x1bW5IZWFkZXJDbGljaycsXG4gICAgICAgICdvbkNvbHVtbkhlYWRlckNvbnRleHRNZW51JyxcbiAgICAgICAgJ29uQ29sdW1uSGVhZGVyRGJsQ2xpY2snLFxuICAgICAgICAnb25Db2x1bW5IZWFkZXJNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvbkNvbHVtblJlc2l6ZScsXG4gICAgICAgICdvbkNvbHVtblJlc2l6ZVN0YXJ0JyxcbiAgICAgICAgJ29uQ29sdW1uVGl0bGVDbGljaycsXG4gICAgICAgICdvbkNvbHVtblRpdGxlQ29udGV4dE1lbnUnLFxuICAgICAgICAnb25Db2x1bW5UaXRsZURibENsaWNrJyxcbiAgICAgICAgJ29uQ29sdW1uVG9nZ2xlJyxcbiAgICAgICAgJ29uRGVzdHJveScsXG4gICAgICAgICdvbkRpcnR5U3RhdGVDaGFuZ2UnLFxuICAgICAgICAnb25FbGVtZW50Q3JlYXRlZCcsXG4gICAgICAgICdvbkV4cGFuZCcsXG4gICAgICAgICdvbkZvY3VzSW4nLFxuICAgICAgICAnb25Gb2N1c091dCcsXG4gICAgICAgICdvbkhpZGUnLFxuICAgICAgICAnb25QYWludCcsXG4gICAgICAgICdvblJlYWRPbmx5JyxcbiAgICAgICAgJ29uUmVjb21wb3NlJyxcbiAgICAgICAgJ29uUmVtb3ZlVGFza0VsZW1lbnQnLFxuICAgICAgICAnb25SZW5kZXJUYXNrJyxcbiAgICAgICAgJ29uUmVuZGVyVGFza3MnLFxuICAgICAgICAnb25SZXNpemUnLFxuICAgICAgICAnb25SZXNwb25zaXZlU3RhdGVDaGFuZ2UnLFxuICAgICAgICAnb25TZWxlY3Rpb25DaGFuZ2UnLFxuICAgICAgICAnb25TaG93JyxcbiAgICAgICAgJ29uU2ltcGxlVGFza0VkaXRDYW5jZWwnLFxuICAgICAgICAnb25TaW1wbGVUYXNrRWRpdENvbXBsZXRlJyxcbiAgICAgICAgJ29uU3dpbWxhbmVDb2xsYXBzZScsXG4gICAgICAgICdvblN3aW1sYW5lRXhwYW5kJyxcbiAgICAgICAgJ29uU3dpbWxhbmVIZWFkZXJDbGljaycsXG4gICAgICAgICdvblN3aW1sYW5lSGVhZGVyQ29udGV4dE1lbnUnLFxuICAgICAgICAnb25Td2ltbGFuZUhlYWRlckRibENsaWNrJyxcbiAgICAgICAgJ29uU3dpbWxhbmVUb2dnbGUnLFxuICAgICAgICAnb25UYXNrQ2xpY2snLFxuICAgICAgICAnb25UYXNrRGJsQ2xpY2snLFxuICAgICAgICAnb25UYXNrRHJhZycsXG4gICAgICAgICdvblRhc2tEcmFnQWJvcnQnLFxuICAgICAgICAnb25UYXNrRHJhZ0VuZCcsXG4gICAgICAgICdvblRhc2tEcmFnU3RhcnQnLFxuICAgICAgICAnb25UYXNrRHJvcCcsXG4gICAgICAgICdvblRhc2tNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvblRhc2tNZW51SXRlbScsXG4gICAgICAgICdvblRhc2tNZW51U2hvdycsXG4gICAgICAgICdvblRhc2tNZW51VG9nZ2xlSXRlbScsXG4gICAgICAgICdvblRhc2tNb3VzZUVudGVyJyxcbiAgICAgICAgJ29uVGFza01vdXNlTGVhdmUnLFxuICAgICAgICAnb25Ub29sQ2xpY2snXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1GZWF0dXJlTmFtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAnY29sdW1uRHJhZ0ZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uRmlsdGVyRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5IZWFkZXJNZW51RmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5Mb2NrRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZW5hbWVGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtblJlc2l6ZUZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uU29ydEZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uVG9vbGJhcnNGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbHRlckJhckZlYXR1cmUnLFxuICAgICAgICAnc2ltcGxlVGFza0VkaXRGZWF0dXJlJyxcbiAgICAgICAgJ3N3aW1sYW5lRHJhZ0ZlYXR1cmUnLFxuICAgICAgICAndGFza0RyYWdGZWF0dXJlJyxcbiAgICAgICAgJ3Rhc2tEcmFnU2VsZWN0RmVhdHVyZScsXG4gICAgICAgICd0YXNrRWRpdEZlYXR1cmUnLFxuICAgICAgICAndGFza01lbnVGZWF0dXJlJyxcbiAgICAgICAgJ3Rhc2tUb29sdGlwRmVhdHVyZSdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bVRhc2tCb2FyZEJhc2VDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWN0aXZhdGVUYXNrRXZlbnQnLFxuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYWxpZ24nLFxuICAgICAgICAnYWxpZ25TZWxmJyxcbiAgICAgICAgJ2FuY2hvcicsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdhcmlhRGVzY3JpcHRpb24nLFxuICAgICAgICAnYXJpYUxhYmVsJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzJyxcbiAgICAgICAgJ2F1dG9HZW5lcmF0ZUNvbHVtbnMnLFxuICAgICAgICAnYXV0b0dlbmVyYXRlU3dpbWxhbmVzJyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdib2R5SXRlbXMnLFxuICAgICAgICAnYnViYmxlRXZlbnRzJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXJkU2l6ZXMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NlbnRlcmVkJyxcbiAgICAgICAgJ2NoYWluRmlsdGVycycsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sbGFwc2VkJyxcbiAgICAgICAgJ2NvbGxhcHNlVGl0bGUnLFxuICAgICAgICAnY29sbGFwc2libGUnLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2NvbHVtbkZpZWxkJyxcbiAgICAgICAgJ2NvbHVtbnMnLFxuICAgICAgICAnY29sdW1uVGl0bGVSZW5kZXJlcicsXG4gICAgICAgICdjb25maWcnLFxuICAgICAgICAnY29uc3RyYWluVG8nLFxuICAgICAgICAnY3NzJyxcbiAgICAgICAgJ2Nzc1ZhclByZWZpeCcsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzJyxcbiAgICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICAgJ2RyYXdlcicsXG4gICAgICAgICdkcmF3T25TY3JvbGwnLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2Zvb3Rlckl0ZW1zJyxcbiAgICAgICAgJ2dldFRhc2tIZWlnaHQnLFxuICAgICAgICAnaGVhZGVyJyxcbiAgICAgICAgJ2hlYWRlckl0ZW1zJyxcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICdoaWRkZW4nLFxuICAgICAgICAnaGlkZUFuaW1hdGlvbicsXG4gICAgICAgICdodG1sRW5jb2RlSGVhZGVyVGV4dCcsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2lucHV0RmllbGRBbGlnbicsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAnaXNUYXNrU2VsZWN0YWJsZScsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9hZE1hc2snLFxuICAgICAgICAnbG9hZE1hc2tEZWZhdWx0cycsXG4gICAgICAgICdsb2FkTWFza0Vycm9yJyxcbiAgICAgICAgJ2xvY2FsZUNsYXNzJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlUHJvcGVydGllcycsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ21hc2tlZCcsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbmV3VGFza0RlZmF1bHRzJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3BsdWdpbnMnLFxuICAgICAgICAncG9zaXRpb25lZCcsXG4gICAgICAgICdwcm9jZXNzSXRlbXMnLFxuICAgICAgICAncHJvamVjdCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZWNvcmQnLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyZW5kaXRpb24nLFxuICAgICAgICAncmVzb3VyY2VJbWFnZVBhdGgnLFxuICAgICAgICAncmVzb3VyY2VzJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmUnLFxuICAgICAgICAncmVzcG9uc2l2ZVJvb3QnLFxuICAgICAgICAncmVzcG9uc2l2ZVN0YXRlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVUYXJnZXQnLFxuICAgICAgICAncm9vdEVsZW1lbnQnLFxuICAgICAgICAncnRsJyxcbiAgICAgICAgJ3Njcm9sbGFibGUnLFxuICAgICAgICAnc2Nyb2xsQWN0aW9uJyxcbiAgICAgICAgJ3Njcm9sbE1hbmFnZXInLFxuICAgICAgICAnc2Nyb2xsT3B0aW9ucycsXG4gICAgICAgICdzZWxlY3RlZFRhc2tzJyxcbiAgICAgICAgJ3NlbGVjdE9uTmF2aWdhdGlvbicsXG4gICAgICAgICdzaG93QW5pbWF0aW9uJyxcbiAgICAgICAgJ3Nob3dDb2xsYXBzZUluSGVhZGVyJyxcbiAgICAgICAgJ3Nob3dDb2xsYXBzZVRvb2x0aXAnLFxuICAgICAgICAnc2hvd0NvdW50SW5IZWFkZXInLFxuICAgICAgICAnc3BhbicsXG4gICAgICAgICdzdGF0ZWZ1bCcsXG4gICAgICAgICdzdGF0ZWZ1bEV2ZW50cycsXG4gICAgICAgICdzdGF0ZUlkJyxcbiAgICAgICAgJ3N0YXRlUHJvdmlkZXInLFxuICAgICAgICAnc3RpY2t5SGVhZGVycycsXG4gICAgICAgICdzdHJldGNoQ2FyZHMnLFxuICAgICAgICAnc3RyaWN0UmVjb3JkTWFwcGluZycsXG4gICAgICAgICdzdHJpcHMnLFxuICAgICAgICAnc3dpbWxhbmVGaWVsZCcsXG4gICAgICAgICdzd2ltbGFuZVJlbmRlcmVyJyxcbiAgICAgICAgJ3N3aW1sYW5lcycsXG4gICAgICAgICdzeW5jTWFzaycsXG4gICAgICAgICd0YWInLFxuICAgICAgICAndGFiQmFySXRlbXMnLFxuICAgICAgICAndGFza1JlbmRlcmVyJyxcbiAgICAgICAgJ3Rhc2tzJyxcbiAgICAgICAgJ3Rhc2tTb3J0ZXJGbicsXG4gICAgICAgICd0YXNrc1BlclJvdycsXG4gICAgICAgICd0YmFyJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2xzJyxcbiAgICAgICAgJ3VpJyxcbiAgICAgICAgJ3VzZURvbVRyYW5zaXRpb24nLFxuICAgICAgICAndmlydHVhbGl6ZScsXG4gICAgICAgICd3ZWlnaHQnLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAneCcsXG4gICAgICAgICd5J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3NPbmx5OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FjdGl2YXRlVGFza0V2ZW50JyxcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FsaWduJyxcbiAgICAgICAgJ2FuY2hvcicsXG4gICAgICAgICdhcmlhRGVzY3JpcHRpb24nLFxuICAgICAgICAnYXJpYUxhYmVsJyxcbiAgICAgICAgJ2F1dG9HZW5lcmF0ZUNvbHVtbnMnLFxuICAgICAgICAnYXV0b0dlbmVyYXRlU3dpbWxhbmVzJyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FyZFNpemVzJyxcbiAgICAgICAgJ2NlbnRlcmVkJyxcbiAgICAgICAgJ2NoYWluRmlsdGVycycsXG4gICAgICAgICdjb2xsYXBzZVRpdGxlJyxcbiAgICAgICAgJ2NvbGxhcHNpYmxlJyxcbiAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgJ2NvbHVtblRpdGxlUmVuZGVyZXInLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2Nzc1ZhclByZWZpeCcsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAgICdkcmF3ZXInLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2h0bWxFbmNvZGVIZWFkZXJUZXh0JyxcbiAgICAgICAgJ2ljb24nLFxuICAgICAgICAnaWdub3JlUGFyZW50UmVhZE9ubHknLFxuICAgICAgICAnbGlzdGVuZXJzJyxcbiAgICAgICAgJ2xvYWRNYXNrJyxcbiAgICAgICAgJ2xvYWRNYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbG9hZE1hc2tFcnJvcicsXG4gICAgICAgICdsb2NhbGVDbGFzcycsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb2NhbGl6YWJsZVByb3BlcnRpZXMnLFxuICAgICAgICAnbWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ21hc2tlZCcsXG4gICAgICAgICduZXdUYXNrRGVmYXVsdHMnLFxuICAgICAgICAnb3duZXInLFxuICAgICAgICAncGx1Z2lucycsXG4gICAgICAgICdwb3NpdGlvbmVkJyxcbiAgICAgICAgJ3Byb2Nlc3NJdGVtcycsXG4gICAgICAgICdyZWNvcmQnLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyZXNvdXJjZUltYWdlUGF0aCcsXG4gICAgICAgICdyZXNwb25zaXZlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVSb290JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVTdGF0ZScsXG4gICAgICAgICdyZXNwb25zaXZlVGFyZ2V0JyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3Njcm9sbGFibGUnLFxuICAgICAgICAnc2Nyb2xsQWN0aW9uJyxcbiAgICAgICAgJ3Njcm9sbE1hbmFnZXInLFxuICAgICAgICAnc2Nyb2xsT3B0aW9ucycsXG4gICAgICAgICdzZWxlY3RPbk5hdmlnYXRpb24nLFxuICAgICAgICAnc2hvd0FuaW1hdGlvbicsXG4gICAgICAgICdzaG93Q29sbGFwc2VJbkhlYWRlcicsXG4gICAgICAgICdzaG93Q291bnRJbkhlYWRlcicsXG4gICAgICAgICdzdGF0ZWZ1bCcsXG4gICAgICAgICdzdGF0ZWZ1bEV2ZW50cycsXG4gICAgICAgICdzdGF0ZUlkJyxcbiAgICAgICAgJ3N0YXRlUHJvdmlkZXInLFxuICAgICAgICAnc3RpY2t5SGVhZGVycycsXG4gICAgICAgICdzdHJpcHMnLFxuICAgICAgICAnc3dpbWxhbmVSZW5kZXJlcicsXG4gICAgICAgICdzeW5jTWFzaycsXG4gICAgICAgICd0YWInLFxuICAgICAgICAndGFiQmFySXRlbXMnLFxuICAgICAgICAndGFza1JlbmRlcmVyJyxcbiAgICAgICAgJ3Rhc2tTb3J0ZXJGbicsXG4gICAgICAgICd0YXNrc1BlclJvdycsXG4gICAgICAgICd0YmFyJyxcbiAgICAgICAgJ3VpJyxcbiAgICAgICAgJ3VzZURvbVRyYW5zaXRpb24nLFxuICAgICAgICAnd2VpZ2h0J1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtUHJvcHM6IHN0cmluZ1tdID0gQnJ5bnR1bVRhc2tCb2FyZEJhc2VDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWxpZ25TZWxmJyxcbiAgICAgICAgJ2FuY2hvclNpemUnLFxuICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAnYXNzaWdubWVudHMnLFxuICAgICAgICAnYm9keUl0ZW1zJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbGxhcHNlZCcsXG4gICAgICAgICdjb2x1bW4nLFxuICAgICAgICAnY29sdW1uRmllbGQnLFxuICAgICAgICAnY29sdW1ucycsXG4gICAgICAgICdjc3MnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkcmF3T25TY3JvbGwnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2Zvb3Rlckl0ZW1zJyxcbiAgICAgICAgJ2dldFRhc2tIZWlnaHQnLFxuICAgICAgICAnaGFzQ2hhbmdlcycsXG4gICAgICAgICdoZWFkZXJJdGVtcycsXG4gICAgICAgICdoZWlnaHQnLFxuICAgICAgICAnaGlkZGVuJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2lucHV0RmllbGRBbGlnbicsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAnaXNUYXNrU2VsZWN0YWJsZScsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heGltaXplT25Nb2JpbGUnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbldpZHRoJyxcbiAgICAgICAgJ3BhcmVudCcsXG4gICAgICAgICdwcm9qZWN0JyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlbmRpdGlvbicsXG4gICAgICAgICdyZXNvdXJjZXMnLFxuICAgICAgICAncnRsJyxcbiAgICAgICAgJ3NlbGVjdGVkVGFza3MnLFxuICAgICAgICAnc2hvd0NvbGxhcHNlVG9vbHRpcCcsXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgJ3N0YXRlJyxcbiAgICAgICAgJ3N0cmV0Y2hDYXJkcycsXG4gICAgICAgICdzdHJpY3RSZWNvcmRNYXBwaW5nJyxcbiAgICAgICAgJ3N3aW1sYW5lRmllbGQnLFxuICAgICAgICAnc3dpbWxhbmVzJyxcbiAgICAgICAgJ3Rhc2tzJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2xzJyxcbiAgICAgICAgJ3ZpcnR1YWxpemUnLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAneCcsXG4gICAgICAgICd5J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBpbnN0YW5jZSE6IFRhc2tCb2FyZEJhc2U7XG5cbiAgICBwcml2YXRlIGJyeW50dW1Db25maWcgPSB7XG4gICAgICAgIGFkb3B0ICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGFwcGVuZFRvICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGhyZWYgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGFuZ3VsYXJDb21wb25lbnQgOiB0aGlzLFxuICAgICAgICBmZWF0dXJlcyAgICAgICAgIDoge30sXG4gICAgICAgIGxpc3RlbmVycyAgICAgICAgOiB7fVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlncyBvbmx5XG4gICAgQElucHV0KCkgYWN0aXZhdGVUYXNrRXZlbnQgICAgICAgICAgICAhIDogJ3Rhc2tDbGljayd8J3Rhc2tEYmxDbGljayd8bnVsbDtcbiAgICBASW5wdXQoKSBhZG9wdCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYWxpZ24gICAgICAgICAgICAgICAgICAgICAgICAhIDogQWxpZ25TcGVjfHN0cmluZztcbiAgICBASW5wdXQoKSBhbmNob3IgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFyaWFEZXNjcmlwdGlvbiAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcmlhTGFiZWwgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXV0b0dlbmVyYXRlQ29sdW1ucyAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhdXRvR2VuZXJhdGVTd2ltbGFuZXMgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGJiYXIgICAgICAgICAgICAgICAgICAgICAgICAgISA6IChUYXNrQm9hcmRDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSBib2R5Q2xzICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGJ1YmJsZUV2ZW50cyAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBjYXJkU2l6ZXMgICAgICAgICAgICAgICAgICAgICEgOiBDYXJkU2l6ZTtcbiAgICBASW5wdXQoKSBjZW50ZXJlZCAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNoYWluRmlsdGVycyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sbGFwc2VUaXRsZSAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjb2xsYXBzaWJsZSAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2xvciAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY29sdW1uVGl0bGVSZW5kZXJlciAgICAgICAgICAhIDogKHJlbmRlckRhdGE6IG9iamVjdCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCkgPT4gc3RyaW5nfERvbUNvbmZpZztcbiAgICBASW5wdXQoKSBjb25maWcgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY29uc3RyYWluVG8gICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8V2lkZ2V0fFJlY3RhbmdsZTtcbiAgICBASW5wdXQoKSBjc3NWYXJQcmVmaXggICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGF0YUZpZWxkICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZG9jayAgICAgICAgICAgICAgICAgICAgICAgICAhIDogJ3RvcCd8J2JvdHRvbSd8J2xlZnQnfCdyaWdodCd8J3N0YXJ0J3wnZW5kJ3wnaGVhZGVyJ3wncHJlLWhlYWRlcid8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGRyYWdnYWJsZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgZHJhd2VyICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfTtcbiAgICBASW5wdXQoKSBlbGVtZW50QXR0cmlidXRlcyAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD47XG4gICAgQElucHV0KCkgZmxvYXRpbmcgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmb290ZXIgICAgICAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmc7XG4gICAgQElucHV0KCkgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfGJvb2xlYW58UGFuZWxIZWFkZXI7XG4gICAgQElucHV0KCkgaGlkZUFuaW1hdGlvbiAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgaHRtbEVuY29kZUhlYWRlclRleHQgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpY29uICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8RG9tQ29uZmlnO1xuICAgIEBJbnB1dCgpIGlnbm9yZVBhcmVudFJlYWRPbmx5ICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbGlzdGVuZXJzICAgICAgICAgICAgICAgICAgICAhIDogVGFza0JvYXJkQmFzZUxpc3RlbmVycztcbiAgICBASW5wdXQoKSBsb2FkTWFzayAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8TWFza0NvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIGxvYWRNYXNrRGVmYXVsdHMgICAgICAgICAgICAgISA6IE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbG9hZE1hc2tFcnJvciAgICAgICAgICAgICAgICAhIDogTWFza0NvbmZpZ3xNYXNrfGJvb2xlYW47XG4gICAgQElucHV0KCkgbG9jYWxlQ2xhc3MgICAgICAgICAgICAgICAgICAhIDogdHlwZW9mIEJhc2U7XG4gICAgQElucHV0KCkgbG9jYWxpemFibGUgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZVByb3BlcnRpZXMgICAgICAgICEgOiBzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBtYXNrRGVmYXVsdHMgICAgICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1hc2tlZCAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbmV3VGFza0RlZmF1bHRzICAgICAgICAgICAgICAhIDogVGFza01vZGVsQ29uZmlnO1xuICAgIEBJbnB1dCgpIG93bmVyICAgICAgICAgICAgICAgICAgICAgICAgISA6IFdpZGdldHxhbnk7XG4gICAgQElucHV0KCkgcGx1Z2lucyAgICAgICAgICAgICAgICAgICAgICAhIDogRnVuY3Rpb25bXTtcbiAgICBASW5wdXQoKSBwb3NpdGlvbmVkICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByb2Nlc3NJdGVtcyAgICAgICAgICAgICAgICAgISA6IChjb250ZXh0OiB7IGhlYWRlckl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+LCBib2R5SXRlbXM6IFJlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz4sIGZvb3Rlckl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+LCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwgfSkgPT4gYm9vbGVhbnx2b2lkO1xuICAgIEBJbnB1dCgpIHJlY29yZCAgICAgICAgICAgICAgICAgICAgICAgISA6IE1vZGVsO1xuICAgIEBJbnB1dCgpIHJlbGF5U3RvcmVFdmVudHMgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVzb3VyY2VJbWFnZVBhdGggICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmUgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlUm9vdCAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmVTdGF0ZSAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSByZXNwb25zaXZlVGFyZ2V0ICAgICAgICAgICAgICEgOiBzdHJpbmd8V2lkZ2V0O1xuICAgIEBJbnB1dCgpIHJvb3RFbGVtZW50ICAgICAgICAgICAgICAgICAgISA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxTY3JvbGxlckNvbmZpZ3xTY3JvbGxlcjtcbiAgICBASW5wdXQoKSBzY3JvbGxBY3Rpb24gICAgICAgICAgICAgICAgICEgOiAnaGlkZSd8J3JlYWxpZ24nfG51bGw7XG4gICAgQElucHV0KCkgc2Nyb2xsTWFuYWdlciAgICAgICAgICAgICAgICAhIDogU2Nyb2xsTWFuYWdlckNvbmZpZztcbiAgICBASW5wdXQoKSBzY3JvbGxPcHRpb25zICAgICAgICAgICAgICAgICEgOiBCcnludHVtU2Nyb2xsT3B0aW9ucztcbiAgICBASW5wdXQoKSBzZWxlY3RPbk5hdmlnYXRpb24gICAgICAgICAgICEgOiBib29sZWFufHN0cmluZztcbiAgICBASW5wdXQoKSBzaG93QW5pbWF0aW9uICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdDtcbiAgICBASW5wdXQoKSBzaG93Q29sbGFwc2VJbkhlYWRlciAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNob3dDb3VudEluSGVhZGVyICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RhdGVmdWwgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3R8c3RyaW5nW107XG4gICAgQElucHV0KCkgc3RhdGVmdWxFdmVudHMgICAgICAgICAgICAgICAhIDogb2JqZWN0fHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHN0YXRlSWQgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBzdGF0ZVByb3ZpZGVyICAgICAgICAgICAgICAgICEgOiBTdGF0ZVByb3ZpZGVyO1xuICAgIEBJbnB1dCgpIHN0aWNreUhlYWRlcnMgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RyaXBzICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgVGFza0JvYXJkQ29udGFpbmVySXRlbUNvbmZpZz47XG4gICAgQElucHV0KCkgc3dpbWxhbmVSZW5kZXJlciAgICAgICAgICAgICAhIDogKGRldGFpbDogeyBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgc3dpbWxhbmVDb25maWc6IERvbUNvbmZpZyB9KSA9PiB2b2lkO1xuICAgIEBJbnB1dCgpIHN5bmNNYXNrICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3R8bnVsbDtcbiAgICBASW5wdXQoKSB0YWIgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFRhYkNvbmZpZztcbiAgICBASW5wdXQoKSB0YWJCYXJJdGVtcyAgICAgICAgICAgICAgICAgICEgOiBUb29sYmFySXRlbXNbXXxXaWRnZXRbXTtcbiAgICBASW5wdXQoKSB0YXNrUmVuZGVyZXIgICAgICAgICAgICAgICAgICEgOiAoZGV0YWlsOiB7IHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwsIGNhcmRDb25maWc6IERvbUNvbmZpZyB9KSA9PiB2b2lkO1xuICAgIEBJbnB1dCgpIHRhc2tTb3J0ZXJGbiAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58KChmaXJzdDogVGFza01vZGVsLCBzZWNvbmQ6IFRhc2tNb2RlbCkgPT4gbnVtYmVyKTtcbiAgICBASW5wdXQoKSB0YXNrc1BlclJvdyAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgdGJhciAgICAgICAgICAgICAgICAgICAgICAgICAhIDogKFRhc2tCb2FyZENvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHVpICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdwbGFpbid8J3Rvb2xiYXInfHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgdXNlRG9tVHJhbnNpdGlvbiAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB3ZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBDb25maWdzIGFuZCBwcm9wZXJ0aWVzXG4gICAgQElucHV0KCkgYWxpZ25TZWxmICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXBwZW5kVG8gICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYXNzaWdubWVudHMgICAgICAgICAgICAgICAgICEgOiBBc3NpZ25tZW50TW9kZWxbXXxvYmplY3RbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBib2R5SXRlbXMgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz47XG4gICAgQElucHV0KCkgY2FsbE9uRnVuY3Rpb25zICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjbHMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgY29sbGFwc2VkICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbHVtbiAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGNvbHVtbkZpZWxkICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNvbHVtbnMgICAgICAgICAgICAgICAgICAgICAhIDogU3RvcmV8Q29sdW1uTW9kZWxbXXxDb2x1bW5Nb2RlbENvbmZpZ1tdfHN0cmluZ1tdfHN0cmluZ3xTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBjc3MgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBQcm94eXxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIEBJbnB1dCgpIGRhdGFzZXQgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0fFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgQElucHV0KCkgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufCdpbmVydCc7XG4gICAgQElucHV0KCkgZHJhd09uU2Nyb2xsICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGV4dHJhRGF0YSAgICAgICAgICAgICAgICAgICAhIDogYW55O1xuICAgIEBJbnB1dCgpIGZsZXggICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBmb290ZXJJdGVtcyAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz47XG4gICAgQElucHV0KCkgZ2V0VGFza0hlaWdodCAgICAgICAgICAgICAgICEgOiAodGFza1JlY29yZDogVGFza01vZGVsKSA9PiBudW1iZXI7XG4gICAgQElucHV0KCkgaGVhZGVySXRlbXMgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+O1xuICAgIEBJbnB1dCgpIGhlaWdodCAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBoaWRkZW4gICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRGaWVsZEFsaWduICAgICAgICAgICAgICEgOiAnc3RhcnQnfCdlbmQnO1xuICAgIEBJbnB1dCgpIGluc2VydEJlZm9yZSAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGluc2VydEZpcnN0ICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGlzVGFza1NlbGVjdGFibGUgICAgICAgICAgICAhIDogKHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCkgPT4gYm9vbGVhbjtcbiAgICBASW5wdXQoKSBrZXlNYXAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz47XG4gICAgQElucHV0KCkgbGFiZWxQb3NpdGlvbiAgICAgICAgICAgICAgICEgOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsO1xuICAgIEBJbnB1dCgpIG1hcmdpbiAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWF4aW1pemVPbk1vYmlsZSAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heFdpZHRoICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5IZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWluV2lkdGggICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIHByb2plY3QgICAgICAgICAgICAgICAgICAgICAhIDogUHJvamVjdE1vZGVsfFByb2plY3RNb2RlbENvbmZpZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbmRpdGlvbiAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfFJlY29yZDxzdHJpbmcsIHN0cmluZz58bnVsbDtcbiAgICBASW5wdXQoKSByZXNvdXJjZXMgICAgICAgICAgICAgICAgICAgISA6IFJlc291cmNlTW9kZWxbXXxvYmplY3RbXXxSZXNvdXJjZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgcnRsICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkVGFza3MgICAgICAgICAgICAgICAhIDogVGFza01vZGVsW107XG4gICAgQElucHV0KCkgc2hvd0NvbGxhcHNlVG9vbHRpcCAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNwYW4gICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHN0cmV0Y2hDYXJkcyAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzdHJpY3RSZWNvcmRNYXBwaW5nICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3dpbWxhbmVGaWVsZCAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc3dpbWxhbmVzICAgICAgICAgICAgICAgICAgICEgOiBTdG9yZXxTd2ltbGFuZU1vZGVsW118U3dpbWxhbmVNb2RlbENvbmZpZ1tdfHN0cmluZ3xTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSB0YXNrcyAgICAgICAgICAgICAgICAgICAgICAgISA6IFRhc2tNb2RlbFtdfG9iamVjdFtdfFRhc2tNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHRpdGxlICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHRvb2xzICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgVG9vbHxUb29sQ29uZmlnPnxudWxsfFJlY29yZDxzdHJpbmcsIFRvb2w+fFJlY29yZDxzdHJpbmcsIFRvb2xDb25maWc+O1xuICAgIEBJbnB1dCgpIHZpcnR1YWxpemUgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgeCAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgeSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBQcm9wZXJ0aWVzIG9ubHlcbiAgICBASW5wdXQoKSBhbmNob3JTaXplICAgISA6IG51bWJlcltdO1xuICAgIEBJbnB1dCgpIGZvY3VzVmlzaWJsZSAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoYXNDaGFuZ2VzICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcGFyZW50ICAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgc3RhdGUgICAgICAgICEgOiBhbnk7XG5cbiAgICAvLyBGZWF0dXJlc1xuICAgIEBJbnB1dCgpIGNvbHVtbkRyYWdGZWF0dXJlICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkRyYWd8Q29sdW1uRHJhZ0NvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5GaWx0ZXJGZWF0dXJlICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5GaWx0ZXJ8Q29sdW1uRmlsdGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtbkhlYWRlck1lbnVGZWF0dXJlICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkhlYWRlck1lbnV8Q29sdW1uSGVhZGVyTWVudUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5Mb2NrRmVhdHVyZSAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5Mb2NrfENvbHVtbkxvY2tDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uUmVuYW1lRmVhdHVyZSAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVuYW1lfENvbHVtblJlbmFtZUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5SZXNpemVGZWF0dXJlICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZXNpemV8Q29sdW1uUmVzaXplQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtblNvcnRGZWF0dXJlICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblNvcnR8Q29sdW1uU29ydENvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5Ub29sYmFyc0ZlYXR1cmUgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5Ub29sYmFyc3xDb2x1bW5Ub29sYmFyc0NvbmZpZztcbiAgICBASW5wdXQoKSBmaWx0ZXJCYXJGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJCYXJ8RmlsdGVyQmFyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNpbXBsZVRhc2tFZGl0RmVhdHVyZSAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNpbXBsZVRhc2tFZGl0fFNpbXBsZVRhc2tFZGl0Q29uZmlnO1xuICAgIEBJbnB1dCgpIHN3aW1sYW5lRHJhZ0ZlYXR1cmUgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFN3aW1sYW5lRHJhZ3xTd2ltbGFuZURyYWdDb25maWc7XG4gICAgQElucHV0KCkgdGFza0RyYWdGZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGFza0RyYWd8VGFza0RyYWdDb25maWc7XG4gICAgQElucHV0KCkgdGFza0RyYWdTZWxlY3RGZWF0dXJlICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGFza0RyYWdTZWxlY3R8VGFza0RyYWdTZWxlY3RDb25maWc7XG4gICAgQElucHV0KCkgdGFza0VkaXRGZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGFza0VkaXR8VGFza0VkaXRDb25maWc7XG4gICAgQElucHV0KCkgdGFza01lbnVGZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGFza01lbnV8VGFza01lbnVDb25maWc7XG4gICAgQElucHV0KCkgdGFza1Rvb2x0aXBGZWF0dXJlICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGFza1Rvb2x0aXB8VGFza1Rvb2x0aXBDb25maWc7XG5cbiAgICAvLyBFdmVudHMgZW1pdHRlcnNcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHRhc2sgaXMgXCJhY3RpdmF0ZWRcIiBieSBwcmVzc2luZyBgRW50ZXJgIG9yIGRvdWJsZSBjbGlja2luZyBpdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1hY3RpdmF0ZVRhc2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGFzayByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25BY3RpdmF0ZVRhc2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZDogVGFza01vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgYmVmb3JlIGNvbHVtbiBkcmFnZ2luZyBzdGFydHMuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiB0byBiZSBkcmFnZ2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ29sdW1uRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBkcm9wcGluZyBhIGNvbHVtbiwgYmVmb3JlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLiBIYW5kbGVzIGFzeW5jXG4gICAgICogbGlzdGVuZXJzLCByZXR1cm5pbmcgYGZhbHNlYCBmcm9tIG9uZSB3aWxsIGFib3J0IHRoZSBvcGVyYXRpb25cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1iZWZvcmVDb2x1bW5Ecm9wKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIERyb3BwZWQgY29sdW1uXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmJlZm9yZUNvbHVtbiBEcm9wcGVkIGJlZm9yZSB0aGlzIGNvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNvbHVtbkRyb3A6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgYmVmb3JlQ29sdW1uOiBDb2x1bW5Nb2RlbCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgcHJpb3IgdG8gc3RhcnRpbmcgYSBjb2x1bW4gcmVzaXplIGdlc3R1cmUuIFRoZSByZXNpemUgaXMgY2FuY2VsZWQgaWYgYSBsaXN0ZW5lciByZXR1cm5zXG4gICAgICogYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgVGFza0JvYXJkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb2x1bW5SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uOiBDb2x1bW5Nb2RlbCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIGhpZGRlbi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgaGlkZGVuLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSBuZXcgW3Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVN0YXRlKSBpcyBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgd2hvc2UgYHJlc3BvbnNpdmVTdGF0ZWAgaXMgdG8gYmUgY2hhbmdlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5zdGF0ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgd2lkZ2V0J3MgYHJlc3BvbnNpdmVTdGF0ZWBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQub2xkU3RhdGUgVGhlIHByZXZpb3VzIHZhbHVlIGZvciB0aGUgd2lkZ2V0J3MgYHJlc3BvbnNpdmVTdGF0ZWBcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVSZXNwb25zaXZlU3RhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgc3RhdGU6IHN0cmluZywgb2xkU3RhdGU6IHN0cmluZyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHdpZGdldCBpcyBzaG93bi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldCxhbnl9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHNob3duXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0fGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIGJlZm9yZSBkaXNwbGF5aW5nIGFuIGlubGluZSBlZGl0b3IuIFJldHVybmluZyBgZmFsc2VgIHN0b3BzIHRoZSBlZGl0b3IgZnJvbVxuICAgICAqIGJlaW5nIHNob3duLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWJlZm9yZVNpbXBsZVRhc2tFZGl0KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSB0YXNrIGJvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQuZmVhdHVyZS5TaW1wbGVUYXNrRWRpdH0gZXZlbnQuc2ltcGxlVGFza0VkaXQgVGhlIHNpbXBsZVRhc2tFZGl0IGZlYXR1cmVcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGhlIHJlY29yZCBhYm91dCB0byBiZSBzaG93biBpbiB0aGUgZWRpdG9yXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmZpZWxkIEZpZWxkIG5hbWUgYmVpbmcgZWRpdGVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2ltcGxlVGFza0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgc2ltcGxlVGFza0VkaXQ6IFNpbXBsZVRhc2tFZGl0LCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGZpZWxkOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgYXBwbGllZCB0byB0aGUgc291cmNlLiBBbGxvd3MgZWRpdGluZyB0aGUgc3RhdGUgb2JqZWN0IG9yIHByZXZlbnRpbmcgdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50LnN0YXRlIFN0YXRlIG9iamVjdCBjb25maWdcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTdGF0ZUFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBzdGF0ZSBpcyBzYXZlZCBieSB0aGUgU3RhdGVQcm92aWRlci4gQWxsb3dzIGVkaXRpbmcgdGhlIHN0YXRlIG9iamVjdCBvciBwcmV2ZW50aW5nIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC5zdGF0ZSBTdGF0ZSBvYmplY3QgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhdGVTYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIGJlZm9yZSB0YXNrIGRyYWdnaW5nIHN0YXJ0cy4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbFtdfSBldmVudC50YXNrUmVjb3JkcyBUYXNrcyB0byBiZSBkcmFnZ2VkXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG1vdXNlIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlVGFza0RyYWc6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZHM6IFRhc2tNb2RlbFtdLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIHRhc2tzIGFyZSBkcm9wcGVkLCBiZWZvcmUgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuIEhhbmRsZXMgYXN5bmNcbiAgICAgKiBsaXN0ZW5lcnMsIHJldHVybmluZyBgZmFsc2VgIGZyb20gb25lIHdpbGwgYWJvcnQgdGhlIG9wZXJhdGlvblxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWJlZm9yZVRhc2tEcm9wKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWxbXX0gZXZlbnQudGFza1JlY29yZHMgRHJvcHBlZCB0YXNrc1xuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC50YXJnZXRDb2x1bW4gRHJvcHBlZCBvbiB0aGlzIGNvbHVtblxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnRhcmdldFN3aW1sYW5lIERyb3BwZWQgaW4gdGhpcyBzd2ltbGFuZSAoaWYgdXNlZClcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbW91c2UgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVUYXNrRHJvcDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkczogVGFza01vZGVsW10sIHRhcmdldENvbHVtbjogQ29sdW1uTW9kZWwsIHRhcmdldFN3aW1sYW5lOiBTd2ltbGFuZU1vZGVsLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCBiZWZvcmUgYSB0YXNrIGlzIGRpc3BsYXllZCBpbiBhbiBlZGl0b3IuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtYmVmb3JlVGFza0VkaXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIG93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGhlIHJlY29yZCBhYm91dCB0byBiZSBzaG93biBpbiB0aGUgdGFzayBlZGl0b3JcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVUYXNrRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIHRoZSBlZGl0b3IgZm9yIGEgdGFzayBpcyBhdmFpbGFibGUsIGJ1dCBiZWZvcmUgaXQgaXMgcG9wdWxhdGVkIHdpdGggZGF0YVxuICAgICAqIGFuZCBzaG93bi4gQWxsb3dzIG1hbmlwdWxhdGluZyBmaWVsZHMgZXRjLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWJlZm9yZVRhc2tFZGl0U2hvdylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgb3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZXZlbnQudGFza1JlY29yZCBUaGUgcmVjb3JkIGFib3V0IHRvIGJlIHNob3duIGluIHRoZSB0YXNrIGVkaXRvclxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLndpZGdldC5UYXNrRWRpdG9yfSBldmVudC5lZGl0b3IgVGhlIGVkaXRvclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVRhc2tFZGl0U2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGVkaXRvcjogVGFza0VkaXRvciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gb25lIG9yIG1vcmUgdGFza3MgYXJlIHRvIGJlIHJlbW92ZWQgYnkgYSBjYWxsIHRvIGByZW1vdmVUYXNrKClgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWJlZm9yZVRhc2tSZW1vdmUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWxbXX0gZXZlbnQudGFza1JlY29yZHMgVGFzayByZWNvcmRzIHRvIGJlIHJlbW92ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVUYXNrUmVtb3ZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmRzOiBUYXNrTW9kZWxbXSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW55IG90aGVyIGV2ZW50IGlzIGZpcmVkIGZyb20gdGhlIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1jYXRjaEFsbClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHt7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9fSBldmVudC5ldmVudCBUaGUgT2JqZWN0IHRoYXQgY29udGFpbnMgZXZlbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5ldmVudC50eXBlIFRoZSB0eXBlIG9mIHRoZSBldmVudCB3aGljaCBpcyBjYXVnaHQgYnkgdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2F0Y2hBbGw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDoge1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBjb2x1bW4gaGVhZGVyIG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgVGhlIGNvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCBhZnRlciB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIGNvbHVtbiBoZWFkZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgVGhlIGNvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNZW51U2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBtZW51OiBNZW51LCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBhIGNoZWNrIGl0ZW0gaXMgdG9nZ2xlZCBpbiB0aGUgY29sdW1uIGhlYWRlciBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIFRoZSBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoZWNrZWQgQ2hlY2tlZCBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudVRvZ2dsZUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGNoZWNrZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBjb2xsYXBzZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlBhbmVsfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogUGFuZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgY29sdW1uIGlzIGNvbGxhcHNlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkNvbGxhcHNlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gYSBjb2x1bW4gaXMgZHJhZ2dlZCwgaWYgdGhlIGRyYWcgbGVhZHMgdG8gYSBjaGFuZ2UgY29tcGFyZWQgdG9cbiAgICAgKiB0aGUgbGFzdCBjb2x1bW5EcmFnIGV2ZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWNvbHVtbkRyYWcpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIGJlaW5nIGRyYWdnZWRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuYmVmb3JlQ29sdW1uIEluc2VydCBiZWZvcmUgdGhpcyBjb2x1bW4gb24gZHJvcCwgYG51bGxgIGlmIGxhc3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5EcmFnOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGJlZm9yZUNvbHVtbjogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gYSBkcmFnIG9wZXJhdGlvbiBpcyBhYm9ydGVkIChpbnZhbGlkIGRyb3Agb3IgYWJvcnRlZCB1c2luZyBFU0MpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgRHJhZ2dlZCBjb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5EcmFnQWJvcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBhIHByZXZpb3VzbHkgc3RhcnRlZCBkcmFnIG9wZXJhdGlvbiBlbmRzLCBubyBtYXR0ZXIgdGhlXG4gICAgICogb3V0Y29tZSBvZiBpdCAod2hldGhlciB2YWxpZCwgaW52YWxpZCBvciBhYm9ydGVkKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIEFmZmVjdGVkIGNvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkRyYWdFbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBjb2x1bW4gZHJhZ2dpbmcgc3RhcnRzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHRvIGJlIGRyYWdnZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5EcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBhIGNvbHVtbiBpcyBzdWNjZXNzZnVsbHkgZHJvcHBlZCAoYWZ0ZXIgdGhlIGRyb3AgdHJhbnNpdGlvblxuICAgICAqIGhhcyBmaW5pc2hlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBEcm9wcGVkIGNvbHVtblxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5iZWZvcmVDb2x1bW4gRHJvcHBlZCBiZWZvcmUgdGhpcyBjb2x1bW4gKGBudWxsYCBpZiBsYXN0KVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnRhcmdldFN3aW1sYW5lIERyb3BwZWQgaW4gdGhpcyBzd2ltbGFuZSAoaWYgdXNlZClcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5Ecm9wOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGJlZm9yZUNvbHVtbjogQ29sdW1uTW9kZWwsIHRhcmdldFN3aW1sYW5lOiBTd2ltbGFuZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNvbHVtbiBpcyBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkV4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgY29sdW1uIGZpbHRlciBpcyBoaWRkZW4uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5GaWx0ZXJIaWRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBjb2x1bW4gZmlsdGVyIGlzIGRpc3BsYXllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkZpbHRlclNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGNvbHVtbiBmaWx0ZXIgdmlzaWJpbGl0eSBpcyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBDb2x1bW4gcmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC52aXNpYmxlIFRydWUgaWYgZmlsdGVyIHBvcHVwIGlzIHZpc2libGUsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkZpbHRlclRvZ2dsZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCB2aXNpYmxlOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNvbHVtbiBoZWFkZXIgaXMgY2xpY2tlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1jb2x1bW5IZWFkZXJDbGljaylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkhlYWRlckNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNvbHVtbiBoZWFkZXIgaXMgcmlnaHQtY2xpY2tlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1jb2x1bW5IZWFkZXJDb250ZXh0TWVudSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkhlYWRlckNvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNvbHVtbiBoZWFkZXIgaXMgZG91YmxlLWNsaWNrZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtY29sdW1uSGVhZGVyRGJsQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5IZWFkZXJEYmxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCBiZWZvcmUgdGhlIG1lbnUgaXMgc2hvd24gZm9yIGEgY29sdW1uIGhlYWRlci5cbiAgICAgKiBBbGxvd3MgbWFuaXB1bGF0aW9uIG9mIHRoZSBpdGVtcyB0byBzaG93IGluIHRoZSBzYW1lIHdheSBhcyBpbiB0aGUgW3Byb2Nlc3NJdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvQ29sdW1uSGVhZGVyTWVudSNjb25maWctcHJvY2Vzc0l0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1jb2x1bW5IZWFkZXJNZW51QmVmb3JlU2hvdylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBUaGUgY29sdW1uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uSGVhZGVyTWVudUJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBhZnRlciBhIHJlc2l6ZSBnZXN0dXJlIGlzIGNvbXBsZXRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgVGFza0JvYXJkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uOiBDb2x1bW5Nb2RlbCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBjb2x1bW4gcmVzaXplIGdlc3R1cmUgc3RhcnRzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSBUYXNrQm9hcmQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgYnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtblJlc2l6ZVN0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtbjogQ29sdW1uTW9kZWwsIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb2x1bW4gdGl0bGUgZWxlbWVudCBpcyBjbGlja2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWNvbHVtblRpdGxlQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5UaXRsZUNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNvbHVtbiB0aXRsZSBlbGVtZW50IGlzIHJpZ2h0LWNsaWNrZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtY29sdW1uVGl0bGVDb250ZXh0TWVudSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtblRpdGxlQ29udGV4dE1lbnU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgY29sdW1uIHRpdGxlIGVsZW1lbnQgaXMgZG91YmxlLWNsaWNrZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtY29sdW1uVGl0bGVEYmxDbGljaylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtblRpdGxlRGJsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBjb2x1bW4gY29sbGFwc2VkIHN0YXRlIGlzIHRvZ2dsZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbGxhcHNlIGB0cnVlYCBpZiB0aGUgY29sdW1uIGlzIGJlaW5nIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5Ub2dnbGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgY29sbGFwc2U6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtdXRhdGVkIGFuZCB0aGUgc3RhdGUgb2YgdGhlIFtoYXNDaGFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktaGFzQ2hhbmdlcykgcHJvcGVydHkgY2hhbmdlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbnRhaW5lcn0gZXZlbnQuc291cmNlIFRoZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5kaXJ0eSBUaGUgZGlydHkgc3RhdGUgb2YgdGhlIENvbnRhaW5lciAtIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGZpZWxkcyB3aGljaCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBpbml0aWFsIGxvYWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGlydHlTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCBkaXJ0eTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB3aWRnZXQncyBbZWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZWxlbWVudCBUaGUgV2lkZ2V0J3MgZWxlbWVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FbGVtZW50Q3JlYXRlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgUGFuZWwgaXMgZXhwYW5kZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlBhbmVsfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFBhbmVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGVudGVycyB0aGlzIFdpZGdldC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmZyb21FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudG9FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuZnJvbVdpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnRvV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYmFja3dhcmRzIGB0cnVlYCBpZiB0aGUgYHRvRWxlbWVudGAgaXMgYmVmb3JlIHRoZSBgZnJvbUVsZW1lbnRgIGluIGRvY3VtZW50IG9yZGVyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZvY3VzSW46IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBmb2N1cyBleGl0cyB0aGlzIFdpZGdldCdzIG93bmVyc2hpcCB0cmVlLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgYGJsdXJgIGV2ZW50LlxuICAgICAqIGZvY3VzIG1vdmluZyBmcm9tIHdpdGhpbiB0aGlzIFdpZGdldCdzIG93bmVyc2hpcCB0cmVlLCBldmVuIGlmIHRoZXJlIGFyZSBmbG9hdGluZyB3aWRnZXRzXG4gICAgICogd2lsbCBub3QgdHJpZ2dlciB0aGlzIGV2ZW50LiBUaGlzIGlzIHdoZW4gZm9jdXMgZXhpdHMgdGhpcyB3aWRnZXQgY29tcGxldGVseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmZyb21FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudG9FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuZnJvbVdpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnRvV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYmFja3dhcmRzIGB0cnVlYCBpZiB0aGUgYHRvRWxlbWVudGAgaXMgYmVmb3JlIHRoZSBgZnJvbUVsZW1lbnRgIGluIGRvY3VtZW50IG9yZGVyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZvY3VzT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCwgZnJvbVdpZGdldDogV2lkZ2V0LCB0b1dpZGdldDogV2lkZ2V0LCBiYWNrd2FyZHM6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCB3YXMgaGlkZGVuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB3aWRnZXQgd2hpY2ggaGFkIGJlZW4gaW4gYSBub24tdmlzaWJsZSBzdGF0ZSBmb3IgYW55IHJlYXNvblxuICAgICAqIGFjaGlldmVzIHZpc2liaWxpdHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtcGFpbnQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBwYWludGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZmlyc3RQYWludCBgdHJ1ZWAgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFpbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFpbnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZmlyc3RQYWludDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFdpZGdldCdzIHJlYWQgb25seSBzdGF0ZSBpcyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQucmVhZE9ubHkgUmVhZCBvbmx5IG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlYWRPbmx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVhZE9ubHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB3aWRnZXQncyBlbGVtZW50cyBoYXZlIGJlZW4gc3luY2hyb25pemVkIGR1ZSB0byBhIGRpcmVjdCBvciBpbmRpcmVjdCBjYWxsXG4gICAgICogdG8gW3JlY29tcG9zZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXJlY29tcG9zZSksIGlmIHRoaXMgcmVzdWx0cyBpbiBzb21lIGNoYW5nZSB0byB0aGUgd2lkZ2V0J3MgcmVuZGVyZWQgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlY29tcG9zZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgdGFza3MgZWxlbWVudCBpcyByZW1vdmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXJlbW92ZVRhc2tFbGVtZW50KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRhc2tCb2FyZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nLG51bWJlcn0gZXZlbnQudGFza0lkIElkIG9mIHRoZSB0YXNrIChub3QgdGhlIHJlY29yZCBpdHNlbGYgc2luY2UgaXQgbWlnaHQgYmUgcmVtb3ZlZClcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRhc2tzIGVsZW1lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZW1vdmVUYXNrRWxlbWVudDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrSWQ6IHN0cmluZ3xudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHRhc2sgaXMgcmVuZGVyZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtcmVuZGVyVGFzaylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUYXNrQm9hcmQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGFzayBiZWluZyByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNSZWZyZXNoIGB0cnVlYCBpZiB0aGUgZWxlbWVudCB3YXMgdXBkYXRlZCwgYGZhbHNlYCBpZiBpdCB3YXMgYWRkZWRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRhc2tzIGVsZW1lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZW5kZXJUYXNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCwgaXNSZWZyZXNoOiBib29sZWFuLCBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYWxsIHRhc2tzIGluIHRoZSB0YXNrIGJvYXJkIGFyZSByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRhc2tCb2FyZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbFtdfSBldmVudC50YXNrUmVjb3JkcyBUYXNrcyBiZWluZyByZW5kZXJlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlbmRlclRhc2tzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmRzOiBUYXNrTW9kZWxbXSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZW5jYXBzdWxhdGluZyBlbGVtZW50IG9mIGEgV2lkZ2V0IHJlc2l6ZXMgKm9ubHkgd2hlbiBbbW9uaXRvclJlc2l6ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tb25pdG9yUmVzaXplKSBpcyBgdHJ1ZWAqLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LndpZHRoIFRoZSBuZXcgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZFdpZHRoIFRoZSBvbGQgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBvbGQgaGVpZ2h0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvbGRXaWR0aDogbnVtYmVyLCBvbGRIZWlnaHQ6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBuZXcgW3Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVN0YXRlKSBpcyBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgd2hvc2UgYHJlc3BvbnNpdmVTdGF0ZWAgaGFzIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuc3RhdGUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHdpZGdldCdzIGByZXNwb25zaXZlU3RhdGVgXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50Lm9sZFN0YXRlIFRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIHdpZGdldCdzIGByZXNwb25zaXZlU3RhdGVgXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHN0YXRlOiBzdHJpbmcsIG9sZFN0YXRlOiBzdHJpbmcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRhc2sgc2VsZWN0aW9uIGNoYW5nZXMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGFza0JvYXJkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHsnc2VsZWN0JywnZGVzZWxlY3QnfSBldmVudC5hY3Rpb24gRWl0aGVyICdzZWxlY3QnIG9yICdkZXNlbGVjdCcsIGRlcGVuZGluZyBvbiBvcGVyYXRpb25cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWxbXX0gZXZlbnQuc2VsZWN0aW9uIEFsbCBjdXJyZW50bHkgc2VsZWN0ZWQgdGFza3NcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWxbXX0gZXZlbnQuc2VsZWN0IFRhc2tzIHNlbGVjdGVkIGJ5IHRoZSBvcGVyYXRpb25cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWxbXX0gZXZlbnQuZGVzZWxlY3QgVGFza3MgZGVzZWxlY3RlZCBieSB0aGUgb3BlcmF0aW9uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGFjdGlvbjogJ3NlbGVjdCd8J2Rlc2VsZWN0Jywgc2VsZWN0aW9uOiBUYXNrTW9kZWxbXSwgc2VsZWN0OiBUYXNrTW9kZWxbXSwgZGVzZWxlY3Q6IFRhc2tNb2RlbFtdIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBpbmxpbmUgZWRpdGluZyBvZiBhIGZpZWxkIGlzIGNhbmNlbGxlZCAoYnkgcHJlc3NpbmcgRVNDKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1zaW1wbGVUYXNrRWRpdENhbmNlbClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgdGFzayBib2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLmZlYXR1cmUuU2ltcGxlVGFza0VkaXR9IGV2ZW50LnNpbXBsZVRhc2tFZGl0IFRoZSBzaW1wbGVUYXNrRWRpdCBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFJlY29yZCB0aGF0IHdhcyBlZGl0ZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZmllbGQgRmllbGQgbmFtZSBiZWluZyBlZGl0ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TaW1wbGVUYXNrRWRpdENhbmNlbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBzaW1wbGVUYXNrRWRpdDogU2ltcGxlVGFza0VkaXQsIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCwgZmllbGQ6IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gaW5saW5lIGVkaXRpbmcgb2YgYSBmaWVsZCBoYXMgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXNpbXBsZVRhc2tFZGl0Q29tcGxldGUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIHRhc2sgYm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5mZWF0dXJlLlNpbXBsZVRhc2tFZGl0fSBldmVudC5zaW1wbGVUYXNrRWRpdCBUaGUgc2ltcGxlVGFza0VkaXQgZmVhdHVyZVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZXZlbnQudGFza1JlY29yZCBSZWNvcmQgdGhhdCB3YXMgZWRpdGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmZpZWxkIEZpZWxkIG5hbWUgYmVpbmcgZWRpdGVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2ltcGxlVGFza0VkaXRDb21wbGV0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBzaW1wbGVUYXNrRWRpdDogU2ltcGxlVGFza0VkaXQsIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCwgZmllbGQ6IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgc3dpbWxhbmUgaXMgY29sbGFwc2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQuc3dpbWxhbmVSZWNvcmQgU3dpbWxhbmUgcmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3dpbWxhbmVDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBzd2ltbGFuZSBpcyBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnN3aW1sYW5lUmVjb3JkIFN3aW1sYW5lIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN3aW1sYW5lRXhwYW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHN3aW1sYW5lUmVjb3JkOiBTd2ltbGFuZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHN3aW1sYW5lIGhlYWRlciBpcyBjbGlja2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXN3aW1sYW5lSGVhZGVyQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC5zd2ltbGFuZVJlY29yZCBTd2ltbGFuZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Td2ltbGFuZUhlYWRlckNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHN3aW1sYW5lUmVjb3JkOiBTd2ltbGFuZU1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBzd2ltbGFuZSBoZWFkZXIgaXMgcmlnaHQtY2xpY2tlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1zd2ltbGFuZUhlYWRlckNvbnRleHRNZW51KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQuc3dpbWxhbmVSZWNvcmQgU3dpbWxhbmUgcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3dpbWxhbmVIZWFkZXJDb250ZXh0TWVudTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgc3dpbWxhbmUgaGVhZGVyIGlzIGRvdWJsZS1jbGlja2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXN3aW1sYW5lSGVhZGVyRGJsQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC5zd2ltbGFuZVJlY29yZCBTd2ltbGFuZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Td2ltbGFuZUhlYWRlckRibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHN3aW1sYW5lUmVjb3JkOiBTd2ltbGFuZU1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHN3aW1sYW5lIGNvbGxhcHNlZCBzdGF0ZSBpcyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQuc3dpbWxhbmVSZWNvcmQgU3dpbWxhbmUgcmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb2xsYXBzZSBgdHJ1ZWAgaWYgdGhlIGNvbHVtbiBpcyBiZWluZyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3dpbWxhbmVUb2dnbGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwsIGNvbGxhcHNlOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNhcmQgaXMgY2xpY2tlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC10YXNrQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGFzayByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmQgZm9yIHRoZSB0YXNrcyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC5zd2ltbGFuZVJlY29yZCBTd2ltbGFuZSByZWNvcmQgZm9yIHRoZSB0YXNrcyBzd2ltbGFuZSAoaWYgdXNlZClcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UYXNrQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZDogVGFza01vZGVsLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgY2FyZCBpcyBkb3VibGUtY2xpY2tlZFxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXRhc2tEYmxDbGljaylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZXZlbnQudGFza1JlY29yZCBUYXNrIHJlY29yZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZCBmb3IgdGhlIHRhc2tzIGNvbHVtblxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnN3aW1sYW5lUmVjb3JkIFN3aW1sYW5lIHJlY29yZCBmb3IgdGhlIHRhc2tzIHN3aW1sYW5lIChpZiB1c2VkKVxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRhc2tEYmxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIHN3aW1sYW5lUmVjb3JkOiBTd2ltbGFuZU1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiB0YXNrcyBhcmUgZHJhZ2dlZCwgaWYgdGhlIGRyYWcgbGVhZHMgdG8gYW55IGNoYW5nZXMgY29tcGFyZWQgdG9cbiAgICAgKiB0aGUgbGFzdCB0YXNrRHJhZyBldmVudCAobW92ZWQgdG8gYSBuZXcgY29sdW1uIG9yIGNoYW5nZWQgb3JkZXIgd2l0aGluIGEgY29sdW1uKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC10YXNrRHJhZylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LnRhc2tSZWNvcmRzIERyYWdnZWQgdGFza3NcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQudGFyZ2V0Q29sdW1uIEN1cnJlbnRseSBvdmVyIHRoaXMgY29sdW1uXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQudGFyZ2V0U3dpbWxhbmUgQ3VycmVudGx5IG92ZXIgdGhpcyBzd2ltbGFuZSAoaWYgdXNlZClcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbW91c2UgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UYXNrRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkczogVGFza01vZGVsW10sIHRhcmdldENvbHVtbjogQ29sdW1uTW9kZWwsIHRhcmdldFN3aW1sYW5lOiBTd2ltbGFuZU1vZGVsLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gYSBkcmFnIG9wZXJhdGlvbiBpcyBhYm9ydGVkIChpbnZhbGlkIGRyb3Agb3IgYWJvcnRlZCB1c2luZyBFU0MpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbFtdfSBldmVudC50YXNrUmVjb3JkcyBEcmFnZ2VkIHRhc2tzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza0RyYWdBYm9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkczogVGFza01vZGVsW10gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gYSBwcmV2aW91c2x5IHN0YXJ0ZWQgZHJhZyBvcGVyYXRpb24gZW5kcywgbm8gbWF0dGVyIHRoZVxuICAgICAqIG91dGNvbWUgb2YgaXQgKHdoZXRoZXIgdmFsaWQsIGludmFsaWQgb3IgYWJvcnRlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LnRhc2tSZWNvcmRzIEFmZmVjdGVkIHRhc2tzXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG1vdXNlIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza0RyYWdFbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZHM6IFRhc2tNb2RlbFtdLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gdGFzayBkcmFnZ2luZyBzdGFydHNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LnRhc2tSZWNvcmRzIFRhc2tzIHRvIGJlIGRyYWdnZWRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbW91c2UgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UYXNrRHJhZ1N0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmRzOiBUYXNrTW9kZWxbXSwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIHRhc2tzIGFyZSBzdWNjZXNzZnVsbHkgZHJvcHBlZCAoYWZ0ZXIgdGhlIGRyb3AgdHJhbnNpdGlvbiBoYXNcbiAgICAgKiBmaW5pc2hlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LnRhc2tSZWNvcmRzIERyb3BwZWQgdGFza3NcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQudGFyZ2V0Q29sdW1uIERyb3BwZWQgb24gdGhpcyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC50YXJnZXRTd2ltbGFuZSBEcm9wcGVkIGluIHRoaXMgc3dpbWxhbmUgKGlmIHVzZWQpXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG1vdXNlIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza0Ryb3A6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZHM6IFRhc2tNb2RlbFtdLCB0YXJnZXRDb2x1bW46IENvbHVtbk1vZGVsLCB0YXJnZXRTd2ltbGFuZTogU3dpbWxhbmVNb2RlbCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIGJlZm9yZSB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIHRhc2suXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlIFtwcm9jZXNzSXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL1Rhc2tNZW51I2NvbmZpZy1wcm9jZXNzSXRlbXMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXRhc2tNZW51QmVmb3JlU2hvdylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRoZSB0YXNrXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza01lbnVCZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgdGFza1JlY29yZDogVGFza01vZGVsIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIHRhc2sgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGhlIHRhc2tcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UYXNrTWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCBhZnRlciB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIHRhc2suXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZXZlbnQudGFza1JlY29yZCBUaGUgdGFza1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRhc2tNZW51U2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBtZW51OiBNZW51LCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIGEgY2hlY2sgaXRlbSBpcyB0b2dnbGVkIGluIHRoZSB0YXNrIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRoZSB0YXNrXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGVja2VkIENoZWNrZWQgb3Igbm90XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza01lbnVUb2dnbGVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGNoZWNrZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBtb3VzZSBlbnRlcnMgYSBjYXJkXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtdGFza01vdXNlRW50ZXIpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGFzayByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmQgZm9yIHRoZSB0YXNrcyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC5zd2ltbGFuZVJlY29yZCBTd2ltbGFuZSByZWNvcmQgZm9yIHRoZSB0YXNrcyBzd2ltbGFuZSAoaWYgdXNlZClcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UYXNrTW91c2VFbnRlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIHN3aW1sYW5lUmVjb3JkOiBTd2ltbGFuZU1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyBhIGNhcmRcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC10YXNrTW91c2VMZWF2ZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZXZlbnQudGFza1JlY29yZCBUYXNrIHJlY29yZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZCBmb3IgdGhlIHRhc2tzIGNvbHVtblxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnN3aW1sYW5lUmVjb3JkIFN3aW1sYW5lIHJlY29yZCBmb3IgdGhlIHRhc2tzIHN3aW1sYW5lIChpZiB1c2VkKVxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRhc2tNb3VzZUxlYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBBIGhlYWRlciBbdG9vbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXRvb2xzKSBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlRvb2x9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuVG9vbH0gZXZlbnQudG9vbCBUaGUgdG9vbCB3aGljaCBpcyBiZWluZyBjbGlja2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRvb2xDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVG9vbCwgdG9vbDogVG9vbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5kIGFwcGVuZCB0aGUgdW5kZXJseWluZyB3aWRnZXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIG1lID0gdGhpcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdcbiAgICAgICAgICAgIH0gPSBtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNsYXNzLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlTmFtZSxcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlncyxcbiAgICAgICAgICAgICAgICBicnludHVtRXZlbnRzXG4gICAgICAgICAgICB9ID0gQnJ5bnR1bVRhc2tCb2FyZEJhc2VDb21wb25lbnQ7XG5cbiAgICAgICAgYnJ5bnR1bUNvbmZpZ3MuZmlsdGVyKHByb3AgPT4gcHJvcCBpbiB0aGlzKS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShicnludHVtQ29uZmlnLCBwcm9wLCB0aGlzW3Byb3BdKTtcbiAgICAgICAgICAgIGlmIChbJ2ZlYXR1cmVzJywgJ2NvbmZpZyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29uZmlnUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBicnludHVtRXZlbnRzLmZpbHRlcihldmVudCA9PiB0aGlzW2V2ZW50XSAmJiB0aGlzW2V2ZW50XS5vYnNlcnZlcnMubGVuZ3RoID4gMCkuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIHVuY2FwaXRhbGl6ZSA9IChzdHI6IHN0cmluZykgPT4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLFxuICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IChzdHI6IHN0cmluZykgPT4gdW5jYXBpdGFsaXplKHN0ci5zbGljZSgyKSk7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGJyeW50dW1Db25maWcubGlzdGVuZXJzW2V2ZW50TmFtZShldmVudCldID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG1lW2V2ZW50XS5lbWl0KGUpO1xuICAgICAgICAgICAgICAgIC8vIEV2ZW50RW1pdHRlciBkb2VzIG5vdCByZXR1cm4gdmFsdWVzIGluIHRoZSBub3JtYWwgd2F5LCB3b3JrIGFyb3VuZCBpdCBieSBzZXR0aW5nIGByZXR1cm5WYWx1ZWAgZmxhZ1xuICAgICAgICAgICAgICAgIC8vIGluIEFuZ3VsYXIgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUucmV0dXJuVmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiBjb21wb25lbnQgaGFzIG5vIGNvbnRhaW5lciBzcGVjaWZpZWQgaW4gY29uZmlnIHRoZW4gdXNlIGFkb3B0IHRvIFdyYXBwZXIncyBlbGVtZW50XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBjb250YWluZXJQYXJhbSA9IFtcbiAgICAgICAgICAgICAgICAnYWRvcHQnLFxuICAgICAgICAgICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICAgICAgICAgJ2luc2VydEFmdGVyJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QmVmb3JlJ1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIF0uZmluZChwcm9wID0+IGJyeW50dW1Db25maWdbcHJvcF0pO1xuICAgICAgICBpZiAoIWNvbnRhaW5lclBhcmFtKSB7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VOYW1lID09PSAnQnV0dG9uJyB8fCBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b24gc2hvdWxkIGFsd2F5cyBiZSA8YT4gb3IgPGJ1dHRvbj4gaW5zaWRlIG93bmVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFwcGVuZFRvID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5hZG9wdCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ0NvbnRhaW5lcihpbnN0YW5jZU5hbWUsIGNvbnRhaW5lclBhcmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWUuaW5zdGFuY2UgPSBpbnN0YW5jZU5hbWUgPT09ICdXaWRnZXQnID8gV2lkZ2V0LmNyZWF0ZShicnludHVtQ29uZmlnKSA6IG5ldyBpbnN0YW5jZUNsYXNzKGJyeW50dW1Db25maWcpO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBncmlkSW5zdGFuY2UsIHNjaGVkdWxlckluc3RhbmNlIGV0Yy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZVtTdHJpbmdIZWxwZXIudW5jYXBpdGFsaXplKGluc3RhbmNlTmFtZSkgKyAnSW5zdGFuY2UnXSA9IG1lLmluc3RhbmNlO1xuICAgICAgICAvLyBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtVGFza0JvYXJkQmFzZUNvbXBvbmVudDtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgY2hhbmdlc1xuICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2VzKS5mb3JFYWNoKChbcHJvcCwgY2hhbmdlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3RcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IChjaGFuZ2UgYXMgU2ltcGxlQ2hhbmdlKS5jdXJyZW50VmFsdWUsXG4gICAgICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgICAgICB7IGJyeW50dW1Db25maWdzT25seSwgYnJ5bnR1bVByb3BzIH0gPSBCcnludHVtVGFza0JvYXJkQmFzZUNvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChicnludHVtUHJvcHMuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGluc3RhbmNlLCBwcm9wLCBuZXdWYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChicnludHVtQ29uZmlnc09ubHkuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nVXBkYXRlUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5pbnN0YW5jZS5kZXN0cm95KSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==