@bryntum/calendar-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.
- package/README.md +44 -0
- package/bryntum-calendar-angular-thin.d.ts +5 -0
- package/bundles/bryntum-calendar-angular-thin.umd.js +22195 -0
- package/bundles/bryntum-calendar-angular-thin.umd.js.map +1 -0
- package/esm2015/bryntum-calendar-angular-thin.js +5 -0
- package/esm2015/lib/bryntum-agenda-view.component.js +2503 -0
- package/esm2015/lib/bryntum-calendar-date-picker.component.js +1045 -0
- package/esm2015/lib/bryntum-calendar-project-model.component.js +369 -0
- package/esm2015/lib/bryntum-calendar.component.js +2355 -0
- package/esm2015/lib/bryntum-day-agenda-view.component.js +1338 -0
- package/esm2015/lib/bryntum-day-resource-view.component.js +1347 -0
- package/esm2015/lib/bryntum-day-view.component.js +1323 -0
- package/esm2015/lib/bryntum-event-list.component.js +2453 -0
- package/esm2015/lib/bryntum-mode-selector.component.js +702 -0
- package/esm2015/lib/bryntum-month-agenda-view.component.js +1201 -0
- package/esm2015/lib/bryntum-month-grid.component.js +1262 -0
- package/esm2015/lib/bryntum-month-view.component.js +1337 -0
- package/esm2015/lib/bryntum-range-menu.component.js +884 -0
- package/esm2015/lib/bryntum-resource-view.component.js +1068 -0
- package/esm2015/lib/bryntum-week-view.component.js +1323 -0
- package/esm2015/lib/bryntum-year-view.component.js +1163 -0
- package/esm2015/lib/calendar.module.js +99 -0
- package/esm2015/lib/wrapper.helper.js +74 -0
- package/esm2015/public-api.js +21 -0
- package/fesm2015/bryntum-calendar-angular-thin.js +21714 -0
- package/fesm2015/bryntum-calendar-angular-thin.js.map +1 -0
- package/lib/bryntum-agenda-view.component.d.ts +2953 -0
- package/lib/bryntum-calendar-date-picker.component.d.ts +1525 -0
- package/lib/bryntum-calendar-project-model.component.d.ts +399 -0
- package/lib/bryntum-calendar.component.d.ts +2577 -0
- package/lib/bryntum-day-agenda-view.component.d.ts +1960 -0
- package/lib/bryntum-day-resource-view.component.d.ts +2025 -0
- package/lib/bryntum-day-view.component.d.ts +1980 -0
- package/lib/bryntum-event-list.component.d.ts +2888 -0
- package/lib/bryntum-mode-selector.component.d.ts +851 -0
- package/lib/bryntum-month-agenda-view.component.d.ts +1765 -0
- package/lib/bryntum-month-grid.component.d.ts +1731 -0
- package/lib/bryntum-month-view.component.d.ts +1897 -0
- package/lib/bryntum-range-menu.component.d.ts +1130 -0
- package/lib/bryntum-resource-view.component.d.ts +1512 -0
- package/lib/bryntum-week-view.component.d.ts +1980 -0
- package/lib/bryntum-year-view.component.d.ts +1661 -0
- package/lib/calendar.module.d.ts +22 -0
- package/lib/wrapper.helper.d.ts +26 -0
- package/package.json +33 -0
- package/public-api.d.ts +17 -0
|
@@ -0,0 +1,2355 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/**
|
|
3
|
+
* Angular wrapper for Bryntum Calendar
|
|
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 { Calendar } from '@bryntum/calendar-thin';
|
|
9
|
+
import { StringHelper } from '@bryntum/core-thin';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export class BryntumCalendarComponent {
|
|
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
|
+
* Fired when a change of view (Calendar mode) has completed. By default, view changes are animated and this
|
|
24
|
+
* event fires when the view is fully visible.
|
|
25
|
+
* @param {object} event Event object
|
|
26
|
+
* @param {Calendar.view.Calendar} event.source This Calendar instance.
|
|
27
|
+
* @param {CalendarView} event.prevActiveItem The previously active view.
|
|
28
|
+
* @param {CalendarView} event.activeItem The new active view.
|
|
29
|
+
* @param {boolean} event.containedFocus `true` if the outgoing view contained focus.
|
|
30
|
+
*/
|
|
31
|
+
this.onActiveItemChange = new EventEmitter();
|
|
32
|
+
/**
|
|
33
|
+
* Fires on the owning Scheduler after editor is closed by any action - save, delete or cancel
|
|
34
|
+
* @param {object} event Event object
|
|
35
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler
|
|
36
|
+
* @param {'save','delete','cancel'} event.action The action that was taken to end the edit. One of 'save', 'delete' or 'cancel'
|
|
37
|
+
* @param {Scheduler.feature.SchedulerEventEdit} event.eventEdit The eventEdit feature
|
|
38
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The record that has been edited.
|
|
39
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The Resource record for the event. If the event is being created, it will not contain a resource, so this parameter specifies the resource the event is being created for.
|
|
40
|
+
* @param {HTMLElement} event.eventElement The element which represents the event in the scheduler display.
|
|
41
|
+
* @param {Core.widget.Popup} event.editor The editor
|
|
42
|
+
*/
|
|
43
|
+
this.onAfterEventEdit = new EventEmitter();
|
|
44
|
+
/**
|
|
45
|
+
* Fires on the owning Scheduler after an event is successfully saved
|
|
46
|
+
* @param {object} event Event object
|
|
47
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler instance
|
|
48
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The record about to be saved
|
|
49
|
+
*/
|
|
50
|
+
this.onAfterEventSave = new EventEmitter();
|
|
51
|
+
/**
|
|
52
|
+
* Fired before a change of view (Calendar mode) is initiated.
|
|
53
|
+
* @param {object} event Event object
|
|
54
|
+
* @param {Calendar.view.Calendar} event.source This Calendar instance.
|
|
55
|
+
* @param {CalendarView} event.prevActiveItem The previously active view.
|
|
56
|
+
* @param {CalendarView} event.activeItem The new active view.
|
|
57
|
+
*/
|
|
58
|
+
this.onBeforeActiveItemChange = new EventEmitter();
|
|
59
|
+
/**
|
|
60
|
+
* Fires before an assignment is removed. Can be triggered by user pressing [DELETE] or [BACKSPACE] or
|
|
61
|
+
* by the event editor. Can for example be used to display a custom dialog to confirm deletion, in which
|
|
62
|
+
* case records should be "manually" removed after confirmation:
|
|
63
|
+
* ...
|
|
64
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeAssignmentDelete)
|
|
65
|
+
* @param {object} event Event object
|
|
66
|
+
* @param {Scheduler.view.Scheduler} event.source The Scheduler instance
|
|
67
|
+
* @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment records about to be deleted
|
|
68
|
+
* @param {object} event.context Additional removal context:
|
|
69
|
+
* @param {Function} event.context.finalize Function to call to finalize the removal. Used to asynchronously decide to remove the records or not. Provide `false` to the function to prevent the removal.
|
|
70
|
+
* @param {boolean} event.context.finalize.removeRecords Provide `false` to the function to prevent the removal.
|
|
71
|
+
*/
|
|
72
|
+
this.onBeforeAssignmentDelete = new EventEmitter();
|
|
73
|
+
/**
|
|
74
|
+
* Fired any time there is going to be a change to the assignments selected in the Scheduler.
|
|
75
|
+
* Returning `false` prevents the change
|
|
76
|
+
* @param {object} event Event object
|
|
77
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler instance.
|
|
78
|
+
* @param {'select','deselect','update','clear'} event.action One of the actions 'select', 'deselect', 'update', 'clear'
|
|
79
|
+
* @param {Scheduler.model.AssignmentModel[]} event.selected An array of assignments that will be added to the selection.
|
|
80
|
+
* @param {Scheduler.model.AssignmentModel[]} event.deselected An array of assignments that will be removed from the selection.
|
|
81
|
+
* @param {Scheduler.model.AssignmentModel[]} event.selection The currently selected assignments, before applying `selected` and `deselected`.
|
|
82
|
+
*/
|
|
83
|
+
this.onBeforeAssignmentSelectionChange = new EventEmitter();
|
|
84
|
+
/**
|
|
85
|
+
* This event fires whenever a child view's [autoCreate gesture](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) is detected and also when a [drag-create](#Calendar/feature/CalendarDrag) gesture is detected.
|
|
86
|
+
* ...
|
|
87
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeAutoCreate)
|
|
88
|
+
* @param {object} event Event object
|
|
89
|
+
* @param {CalendarView} event.source The child view on which the event was initiated.
|
|
90
|
+
* @param {Event} event.domEvent The DOM event which initiated the creation.
|
|
91
|
+
* @param {Date} event.date *DEPRECATED in favour of `startDate`.* The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
|
|
92
|
+
* @param {Date} event.startDate The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
|
|
93
|
+
* @param {Date} event.endDate The ending time of the event to be created.
|
|
94
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
|
|
95
|
+
*/
|
|
96
|
+
this.onBeforeAutoCreate = new EventEmitter();
|
|
97
|
+
/**
|
|
98
|
+
* Fires on the owning Scheduler before a copy action is performed, return `false` to prevent the action
|
|
99
|
+
* @param {object} event Event object
|
|
100
|
+
* @param {Scheduler.view.Scheduler} event.source Owner scheduler
|
|
101
|
+
* @param {Scheduler.model.EventModel[]} event.eventRecords The event records about to be copied
|
|
102
|
+
* @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment records about to be copied
|
|
103
|
+
* @param {boolean} event.isCut `true` if this is a cut action
|
|
104
|
+
* @param {string} event.entityName 'event' to distinguish this event from other beforeCopy events
|
|
105
|
+
*/
|
|
106
|
+
this.onBeforeCopy = new EventEmitter();
|
|
107
|
+
/**
|
|
108
|
+
* Fires before a mode is created. The configuration block is passed to the handler for possible modification.
|
|
109
|
+
* @param {object} event Event object
|
|
110
|
+
* @param {Calendar.view.Calendar} event.source This Calendar
|
|
111
|
+
* @param {AgendaViewConfig,DayResourceViewConfig,DayViewConfig,EventListConfig,MonthViewConfig,ResourceViewConfig,WeekViewConfig,YearViewConfig,DayAgendaViewConfig,MonthAgendaViewConfig,CalendarContainerItemConfig} event.config The configuration block of the mode about to be created. Any property, including the `type` may be changed.
|
|
112
|
+
*/
|
|
113
|
+
this.onBeforeCreateMode = new EventEmitter();
|
|
114
|
+
/**
|
|
115
|
+
* Fires on the owning Grid before CSV export starts. Return `false` to cancel the export.
|
|
116
|
+
* @param {object} event Event object
|
|
117
|
+
* @param {ExportConfig} event.config Export config
|
|
118
|
+
* @param {Grid.column.Column[]} event.columns An array of columns to export
|
|
119
|
+
* @param {Core.data.Model[]} event.rows An array of records to export
|
|
120
|
+
* @param {string} event.lineDelimiter The CSV delimiter to separate lines
|
|
121
|
+
* @param {string} event.columnDelimiter The CSV delimiter to separate values on one line
|
|
122
|
+
*/
|
|
123
|
+
this.onBeforeCSVExport = new EventEmitter();
|
|
124
|
+
/**
|
|
125
|
+
* Fires before an object is destroyed.
|
|
126
|
+
* @param {object} event Event object
|
|
127
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
128
|
+
*/
|
|
129
|
+
this.onBeforeDestroy = new EventEmitter();
|
|
130
|
+
/**
|
|
131
|
+
* This event fires on the owning Calendar before a drag creation gesture is started. Return `false` to
|
|
132
|
+
* veto the operation.
|
|
133
|
+
* @param {object} event Event object
|
|
134
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
135
|
+
* @param {Core.util.drag.DragContext} event.drag The drag create context.
|
|
136
|
+
* @param {Event} event.domEvent The browser event.
|
|
137
|
+
* @param {Date} event.date The date at the drag DOM event position.
|
|
138
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
|
|
139
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
140
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag is being started.
|
|
141
|
+
*/
|
|
142
|
+
this.onBeforeDragCreate = new EventEmitter();
|
|
143
|
+
/**
|
|
144
|
+
* This event fires on the owning Calendar before a drag creation gesture is completed. Return `false` to
|
|
145
|
+
* immediately veto the operation or a Promise yielding `true` or `false` for async vetoing.
|
|
146
|
+
* @param {object} event Event object
|
|
147
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
148
|
+
* @param {Core.util.drag.DragContext} event.drag The drag create context.
|
|
149
|
+
* @param {Event} event.event The browser event.
|
|
150
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record being created that has not yet been added in the store.
|
|
151
|
+
* @param {Date} event.newStartDate The new start date.
|
|
152
|
+
* @param {Date} event.newEndDate The new end date.
|
|
153
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
|
|
154
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
155
|
+
* @param {boolean,ValidateCreateResult} event.validation The result of the [validateCreateFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateCreateFn) if one was provided.
|
|
156
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag completed.
|
|
157
|
+
*/
|
|
158
|
+
this.onBeforeDragCreateEnd = new EventEmitter();
|
|
159
|
+
/**
|
|
160
|
+
* This event fires on the owning Calendar before a drag move gesture is started. Return `false` to
|
|
161
|
+
* veto the operation.
|
|
162
|
+
* @param {object} event Event object
|
|
163
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
164
|
+
* @param {Core.util.drag.DragContext} event.drag The drag move context.
|
|
165
|
+
* @param {Event} event.domEvent The browser event.
|
|
166
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record being moved.
|
|
167
|
+
* @param {Date} event.date The date at the drag DOM event position.
|
|
168
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
|
|
169
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
170
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag is being started.
|
|
171
|
+
*/
|
|
172
|
+
this.onBeforeDragMove = new EventEmitter();
|
|
173
|
+
/**
|
|
174
|
+
* This event fires on the owning Calendar before a drag move gesture is completed. Return `false` to immediately veto the operation
|
|
175
|
+
* or a Promise yielding `true` or `false` for async vetoing.
|
|
176
|
+
* @param {object} event Event object
|
|
177
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
178
|
+
* @param {Core.util.drag.DragContext} event.drag The drag create context.
|
|
179
|
+
* @param {Event} event.event The browser event.
|
|
180
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record that has *not yet been updated* in the store.
|
|
181
|
+
* @param {Scheduler.model.EventModel} event.proxyEventRecord The `EventModel` record that is being used as a proxy for the drag operation and being updated on every pointer move. This will contain changed values based on the drag position.
|
|
182
|
+
* @param {Date} event.newStartDate The new start date.
|
|
183
|
+
* @param {Date} event.newEndDate The new end date.
|
|
184
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
|
|
185
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
186
|
+
* @param {boolean,ValidateCreateResult} event.validation The result of the [validateMoveFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateMoveFn) if one was provided.
|
|
187
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag completed.
|
|
188
|
+
*/
|
|
189
|
+
this.onBeforeDragMoveEnd = new EventEmitter();
|
|
190
|
+
/**
|
|
191
|
+
* This event fires on the owning Calendar before a drag resize gesture is started. Return `false` to
|
|
192
|
+
* veto the operation.
|
|
193
|
+
* @param {object} event Event object
|
|
194
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
195
|
+
* @param {Core.util.drag.DragContext} event.drag The drag resize context.
|
|
196
|
+
* @param {Event} event.domEvent The browser event.
|
|
197
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record being resized.
|
|
198
|
+
* @param {Date} event.date The date at the drag DOM event position.
|
|
199
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
|
|
200
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
201
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag is being started.
|
|
202
|
+
*/
|
|
203
|
+
this.onBeforeDragResize = new EventEmitter();
|
|
204
|
+
/**
|
|
205
|
+
* This event fires on the owning Calendar before a drag resize gesture is completed. Return `false` to immediately veto the operation
|
|
206
|
+
* or a Promise yielding `true` or `false` for async vetoing.
|
|
207
|
+
* @param {object} event Event object
|
|
208
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
209
|
+
* @param {Core.util.drag.DragContext} event.drag The drag create context.
|
|
210
|
+
* @param {Event} event.event The browser event.
|
|
211
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record that has *not yet been updated* in the store.
|
|
212
|
+
* @param {Scheduler.model.EventModel} event.proxyEventRecord The `EventModel` record that is being used as a proxy for the drag operation and being updated on every pointer move. This will contain changed values based on the drag position.
|
|
213
|
+
* @param {Date} event.newStartDate The new start date.
|
|
214
|
+
* @param {Date} event.newEndDate The new end date.
|
|
215
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
216
|
+
* @param {boolean,ValidateCreateResult} event.validation The result of the [validateResizeFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateResizeFn) if one was provided.
|
|
217
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag completed.
|
|
218
|
+
*/
|
|
219
|
+
this.onBeforeDragResizeEnd = new EventEmitter();
|
|
220
|
+
/**
|
|
221
|
+
* This event is fired on the owning Calendar when dropping an event from the calendar on the
|
|
222
|
+
* external source <strong>if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) was configured</strong>. Returning `false`
|
|
223
|
+
* prevents the gesture from being completed.
|
|
224
|
+
* ...
|
|
225
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeDropExternal)
|
|
226
|
+
* @param {object} event Event object
|
|
227
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event record being dragged.
|
|
228
|
+
* @param {boolean} event.dropOnCalendar `true` if the drop gesture is over the client Calendar. This feature also allows drag *out* of the Calendar and onto the external event source if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) config is set.
|
|
229
|
+
* @param {HTMLElement} event.itemElement The element in which the drag gesture started.
|
|
230
|
+
* @param {HTMLElement} event.targetElement The current over element.
|
|
231
|
+
* @param {Event} event.domEvent The pointer event associated with the drag point.
|
|
232
|
+
* @param {number} event.overIndex *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the index of the row being moved over;
|
|
233
|
+
* @param {Core.data.Model} event.overRecord *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the record being moved over;
|
|
234
|
+
* @param {boolean} event.isAbove *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, `true` if the pointer position is above the halfway line of the over row.
|
|
235
|
+
* @param {boolean} event.altKey `true` if the Alt key was down when the last event was processed.
|
|
236
|
+
* @param {boolean} event.ctrlKey `true` if the Ctrl key was down when the last event was processed.
|
|
237
|
+
* @param {boolean} event.metaKey `true` if the Meta key was down when the last event was processed.
|
|
238
|
+
* @param {boolean} event.shiftKey `true` if the Shift key was down when the last event was processed.
|
|
239
|
+
*/
|
|
240
|
+
this.onBeforeDropExternal = new EventEmitter();
|
|
241
|
+
/**
|
|
242
|
+
* Fires before an event is removed. Can be triggered by user pressing [DELETE] or [BACKSPACE] or by the
|
|
243
|
+
* event editor. Can for example be used to display a custom dialog to confirm deletion, in which case
|
|
244
|
+
* records should be "manually" removed after confirmation:
|
|
245
|
+
* ...
|
|
246
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeEventDelete)
|
|
247
|
+
* @param {object} event Event object
|
|
248
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance
|
|
249
|
+
* @param {Scheduler.model.EventModel[]} event.eventRecords The records about to be deleted
|
|
250
|
+
* @param {object} event.context Additional removal context:
|
|
251
|
+
* @param {Function} event.context.finalize Function to call to finalize the removal. Used to asynchronously decide to remove the records or not. Provide `false` to the function to prevent the removal.
|
|
252
|
+
* @param {boolean} event.context.finalize.removeRecords Provide `false` to the function to prevent the removal.
|
|
253
|
+
*/
|
|
254
|
+
this.onBeforeEventDelete = new EventEmitter();
|
|
255
|
+
/**
|
|
256
|
+
* Fires on the owning Scheduler before an event is displayed in an editor.
|
|
257
|
+
* This may be listened for to allow an application to take over event editing duties. Returning `false`
|
|
258
|
+
* stops the default editing UI from being shown.
|
|
259
|
+
* ...
|
|
260
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeEventEdit)
|
|
261
|
+
* @param {object} event Event object
|
|
262
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler
|
|
263
|
+
* @param {Scheduler.feature.SchedulerEventEdit} event.eventEdit The eventEdit feature
|
|
264
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The record about to be shown in the event editor.
|
|
265
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The Resource record for the event. If the event is being created, it will not contain a resource, so this parameter specifies the resource the event is being created for.
|
|
266
|
+
* @param {HTMLElement} event.eventElement The element which represents the event in the scheduler display.
|
|
267
|
+
*/
|
|
268
|
+
this.onBeforeEventEdit = new EventEmitter();
|
|
269
|
+
/**
|
|
270
|
+
* Fires on the owning Scheduler when the editor for an event is available but before it is populated with
|
|
271
|
+
* data and shown. Allows manipulating fields etc.
|
|
272
|
+
* @param {object} event Event object
|
|
273
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler
|
|
274
|
+
* @param {Scheduler.feature.SchedulerEventEdit} event.eventEdit The eventEdit feature
|
|
275
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The record about to be shown in the event editor.
|
|
276
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The Resource record for the event. If the event is being created, it will not contain a resource, so this parameter specifies the resource the event is being created for.
|
|
277
|
+
* @param {HTMLElement} event.eventElement The element which represents the event in the scheduler display.
|
|
278
|
+
* @param {Core.widget.Popup} event.editor The editor
|
|
279
|
+
*/
|
|
280
|
+
this.onBeforeEventEditShow = new EventEmitter();
|
|
281
|
+
/**
|
|
282
|
+
* Fires on the owning Scheduler before an event is saved.
|
|
283
|
+
* Return `false` to immediately prevent saving
|
|
284
|
+
* ...
|
|
285
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeEventSave)
|
|
286
|
+
* @param {object} event Event object
|
|
287
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler instance
|
|
288
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The record about to be saved
|
|
289
|
+
* @param {Scheduler.model.ResourceModel[]} event.resourceRecords The resources to which the event is assigned
|
|
290
|
+
* @param {object} event.values The new values
|
|
291
|
+
* @param {object} event.context Extended save context:
|
|
292
|
+
* @param {boolean} event.context.async Set this to `true` in a listener to indicate that the listener will asynchronously decide to prevent or not the event save.
|
|
293
|
+
* @param {Function} event.context.finalize Function to call to finalize the save. Used when `async` is `true`. Provide `false` to the function to prevent the save.
|
|
294
|
+
*/
|
|
295
|
+
this.onBeforeEventSave = new EventEmitter();
|
|
296
|
+
/**
|
|
297
|
+
* Fired any time there is going to be a change to the events selected in the Scheduler.
|
|
298
|
+
* Returning `false` prevents the change
|
|
299
|
+
* @param {object} event Event object
|
|
300
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler instance.
|
|
301
|
+
* @param {'select','deselect','update','clear'} event.action One of the actions 'select', 'deselect', 'update', 'clear'
|
|
302
|
+
* @param {Scheduler.model.EventModel[]} event.selected An array of events that will be added to the selection.
|
|
303
|
+
* @param {Scheduler.model.EventModel[]} event.deselected An array of events that will be removed from the selection.
|
|
304
|
+
* @param {Scheduler.model.EventModel[]} event.selection The currently selected events, before applying `selected` and `deselected`.
|
|
305
|
+
*/
|
|
306
|
+
this.onBeforeEventSelectionChange = new EventEmitter();
|
|
307
|
+
/**
|
|
308
|
+
* Fires on the owning Grid before Excel export starts. Return `false` to cancel the export.
|
|
309
|
+
* @param {object} event Event object
|
|
310
|
+
* @param {ExportConfig} event.config Export config
|
|
311
|
+
* @param {XLSColumn[]} event.columns An array of columns to export
|
|
312
|
+
* @param {any[][]} event.rows An array of records to export
|
|
313
|
+
*/
|
|
314
|
+
this.onBeforeExcelExport = new EventEmitter();
|
|
315
|
+
/**
|
|
316
|
+
* Triggered before a widget is hidden. Return `false` to prevent the action.
|
|
317
|
+
* @param {object} event Event object
|
|
318
|
+
* @param {Core.widget.Widget} event.source The widget being hidden.
|
|
319
|
+
*/
|
|
320
|
+
this.onBeforeHide = new EventEmitter();
|
|
321
|
+
/**
|
|
322
|
+
* Fires on the owning Scheduler before a paste action is performed, return `false` to prevent the action.
|
|
323
|
+
* Depending on if the EventStore is using [singleAssignment](https://bryntum.com/products/calendar/docs/api/Scheduler/data/EventStore#config-singleAssignment) or the
|
|
324
|
+
* configuration of [copyPasteAction](https://bryntum.com/products/calendar/docs/api/Scheduler/feature/EventCopyPaste#config-copyPasteAction), either the `eventRecords` or the `assignmentRecords` param
|
|
325
|
+
* will be populated with record copies.
|
|
326
|
+
* @param {object} event Event object
|
|
327
|
+
* @param {Scheduler.view.Scheduler} event.source Owner scheduler
|
|
328
|
+
* @param {Scheduler.model.EventModel[]} event.eventRecords The events about to be pasted
|
|
329
|
+
* @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignments about to be pasted
|
|
330
|
+
* @param {Scheduler.model.EventModel[]} event.originalEventRecords The original event records
|
|
331
|
+
* @param {Scheduler.model.AssignmentModel[]} event.originalAssignmentRecords The original assignment record
|
|
332
|
+
* @param {Date} event.date The date when the pasted events will be scheduled
|
|
333
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The target resource record, the clipboard event records will be assigned to this resource.
|
|
334
|
+
* @param {boolean} event.isCut `true` if this is a cut action
|
|
335
|
+
* @param {string} event.entityName 'event' to distinguish this event from other beforePaste events
|
|
336
|
+
*/
|
|
337
|
+
this.onBeforePaste = new EventEmitter();
|
|
338
|
+
/**
|
|
339
|
+
* Fires on the owning Calendar before print starts. Return `false` to cancel the print.
|
|
340
|
+
* @param {object} event Event object
|
|
341
|
+
* @param {object} event.config Print config
|
|
342
|
+
*/
|
|
343
|
+
this.onBeforePrint = new EventEmitter();
|
|
344
|
+
/**
|
|
345
|
+
* Triggered before a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
|
|
346
|
+
* @param {object} event Event object
|
|
347
|
+
* @param {Core.widget.Widget} event.source The widget whose `responsiveState` is to be changed
|
|
348
|
+
* @param {string} event.state The new value for the widget's `responsiveState`
|
|
349
|
+
* @param {string} event.oldState The previous value for the widget's `responsiveState`
|
|
350
|
+
*/
|
|
351
|
+
this.onBeforeResponsiveStateChange = new EventEmitter();
|
|
352
|
+
/**
|
|
353
|
+
* Fired before this container will load record values into its child fields. This is useful if you
|
|
354
|
+
* want to modify the UI before data is loaded (e.g. set some input field to be readonly)
|
|
355
|
+
* @param {object} event Event object
|
|
356
|
+
* @param {Core.widget.Container} event.source The container
|
|
357
|
+
* @param {Core.data.Model} event.record The record
|
|
358
|
+
*/
|
|
359
|
+
this.onBeforeSetRecord = new EventEmitter();
|
|
360
|
+
/**
|
|
361
|
+
* Triggered before a widget is shown. Return `false` to prevent the action.
|
|
362
|
+
* @param {object} event Event object
|
|
363
|
+
* @param {Core.widget.Widget,any} event.source The widget being shown
|
|
364
|
+
*/
|
|
365
|
+
this.onBeforeShow = new EventEmitter();
|
|
366
|
+
/**
|
|
367
|
+
* Fired before state is applied to the source. Allows editing the state object or preventing the operation.
|
|
368
|
+
* @param {object} event Event object
|
|
369
|
+
* @param {any} event.state State object config
|
|
370
|
+
*/
|
|
371
|
+
this.onBeforeStateApply = new EventEmitter();
|
|
372
|
+
/**
|
|
373
|
+
* Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
|
|
374
|
+
* @param {object} event Event object
|
|
375
|
+
* @param {any} event.state State object config
|
|
376
|
+
*/
|
|
377
|
+
this.onBeforeStateSave = new EventEmitter();
|
|
378
|
+
/**
|
|
379
|
+
* Fires when any other event is fired from the object.
|
|
380
|
+
* ...
|
|
381
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-catchAll)
|
|
382
|
+
* @param {object} event Event object
|
|
383
|
+
* @param {{[key: string]: any, type: string}} event.event The Object that contains event details
|
|
384
|
+
* @param {string} event.event.type The type of the event which is caught by the listener
|
|
385
|
+
*/
|
|
386
|
+
this.onCatchAll = new EventEmitter();
|
|
387
|
+
/**
|
|
388
|
+
* Fires when a cell overflow indicator is clicked or activated by the <kbd>ENTER</kbd> key in any view. This will include
|
|
389
|
+
* the cells of a [YearView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/YearView) and the `+ n more` overflow
|
|
390
|
+
* indicator of cells in a [MonthView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView), and "all day" events section
|
|
391
|
+
* of a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView).
|
|
392
|
+
* @param {object} event Event object
|
|
393
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
394
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
395
|
+
* @param {Date} event.date The date clicked on.
|
|
396
|
+
*/
|
|
397
|
+
this.onCellOverflowClick = new EventEmitter();
|
|
398
|
+
/**
|
|
399
|
+
* Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
400
|
+
* @param {object} event Event object
|
|
401
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
402
|
+
*/
|
|
403
|
+
this.onCollapse = new EventEmitter();
|
|
404
|
+
/**
|
|
405
|
+
* This event fires on the owning widget when an item is selected in the context menu.
|
|
406
|
+
* @param {object} event Event object
|
|
407
|
+
* @param {Core.widget.Widget} event.source The owning widget
|
|
408
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
409
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
410
|
+
*/
|
|
411
|
+
this.onContextMenuItem = new EventEmitter();
|
|
412
|
+
/**
|
|
413
|
+
* This event fires on the owning widget when a check item is toggled in the context menu.
|
|
414
|
+
* @param {object} event Event object
|
|
415
|
+
* @param {Core.widget.Widget} event.source The owning widget
|
|
416
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
417
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
418
|
+
* @param {boolean} event.checked Checked or not
|
|
419
|
+
*/
|
|
420
|
+
this.onContextMenuToggleItem = new EventEmitter();
|
|
421
|
+
/**
|
|
422
|
+
* Fires on the owning Scheduler after a copy action is performed. Depending on if the EventStore is using
|
|
423
|
+
* [singleAssignment](https://bryntum.com/products/calendar/docs/api/Scheduler/data/EventStore#config-singleAssignment) or the configuration of
|
|
424
|
+
* [copyPasteAction](https://bryntum.com/products/calendar/docs/api/Scheduler/feature/EventCopyPaste#config-copyPasteAction), either the `eventRecords` or the `assignmentRecords` param will be populated
|
|
425
|
+
* with record copies.
|
|
426
|
+
* @param {object} event Event object
|
|
427
|
+
* @param {Scheduler.view.Scheduler} event.source Owner scheduler
|
|
428
|
+
* @param {Scheduler.model.EventModel[]} event.eventRecords The event record copies
|
|
429
|
+
* @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment record copies
|
|
430
|
+
* @param {Scheduler.model.EventModel[]} event.originalEventRecords The event records that were copied
|
|
431
|
+
* @param {Scheduler.model.AssignmentModel[]} event.originalAssignmentRecord The assignment records that were copied
|
|
432
|
+
* @param {boolean} event.isCut `true` if this is a cut action
|
|
433
|
+
* @param {string} event.entityName 'event' to distinguish this event from other copy events
|
|
434
|
+
*/
|
|
435
|
+
this.onCopy = new EventEmitter();
|
|
436
|
+
/**
|
|
437
|
+
* Fires on the owning Scheduler/Gantt when the line indicating the current time is updated (see [currentTimeLineUpdateInterval](https://bryntum.com/products/calendar/docs/api/Scheduler/feature/TimeRanges#config-currentTimeLineUpdateInterval)).
|
|
438
|
+
* @param {object} event Event object
|
|
439
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler
|
|
440
|
+
* @param {Date} event.date The current date
|
|
441
|
+
*/
|
|
442
|
+
this.onCurrentTimelineUpdate = new EventEmitter();
|
|
443
|
+
/**
|
|
444
|
+
* Fired when data in any of the projects stores changes.
|
|
445
|
+
* ...
|
|
446
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dataChange)
|
|
447
|
+
* @param {object} event Event object
|
|
448
|
+
* @param {typeof Scheduler.data.mixin.ProjectConsumer,any} event.source Owning component
|
|
449
|
+
* @param {typeof Scheduler.model.mixin.ProjectModelMixin,any} event.project Project model
|
|
450
|
+
* @param {Core.data.Store} event.store Affected store
|
|
451
|
+
* @param {'remove','removeAll','add','clearchanges','filter','update','dataset','replace'} event.action Name of action which triggered the change. May be one of: * `'remove'` * `'removeAll'` * `'add'` * `'clearchanges'` * `'filter'` * `'update'` * `'dataset'` * `'replace'`
|
|
452
|
+
* @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
|
|
453
|
+
* @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
|
|
454
|
+
* @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
|
|
455
|
+
*/
|
|
456
|
+
this.onDataChange = new EventEmitter();
|
|
457
|
+
/**
|
|
458
|
+
* Fires when the calendar changes the date that it orientates its views around.
|
|
459
|
+
* ...
|
|
460
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dateChange)
|
|
461
|
+
* @param {object} event Event object
|
|
462
|
+
* @param {Calendar.view.Calendar} event.source This Calendar.
|
|
463
|
+
* @param {Date} event.oldDate The previous Calendar date.
|
|
464
|
+
* @param {Date} event.date The new Calendar date.
|
|
465
|
+
*/
|
|
466
|
+
this.onDateChange = new EventEmitter();
|
|
467
|
+
/**
|
|
468
|
+
* Fired when the eventStore is queried for events by date range, and the date range
|
|
469
|
+
* requested is different from the last time the store was queried.
|
|
470
|
+
* ...
|
|
471
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dateRangeChange)
|
|
472
|
+
* @param {object} event Event object
|
|
473
|
+
* @param {Calendar.view.Calendar} event.source This Calendar instance
|
|
474
|
+
* @param {object} event.old The old date range
|
|
475
|
+
* @param {Date} event.old.startDate the old start date
|
|
476
|
+
* @param {Date} event.old.endDate the old end date
|
|
477
|
+
* @param {object} event.new The new date range
|
|
478
|
+
* @param {Date} event.new.startDate the new start date
|
|
479
|
+
* @param {Date} event.new.endDate the new end date
|
|
480
|
+
*/
|
|
481
|
+
this.onDateRangeChange = new EventEmitter();
|
|
482
|
+
/**
|
|
483
|
+
* Fires when the [LoadOnDemand](https://bryntum.com/products/calendar/docs/api/Calendar/feature/LoadOnDemand) feature has loaded a range of events.
|
|
484
|
+
* @param {object} event Event object
|
|
485
|
+
* @param {object} event.response The decoded JSON response.
|
|
486
|
+
* @param {object} event.options The options object passed into the CrudManager [CrudManager](https://bryntum.com/products/calendar/docs/api/Scheduler/data/CrudManager) [load](https://bryntum.com/products/calendar/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-load) method.
|
|
487
|
+
* @param {Date} event.startDate The start date of the range to request.
|
|
488
|
+
* @param {Date} event.endDate The end date of the range to request. <strong>Note that Dates are timestamps</strong>.
|
|
489
|
+
*/
|
|
490
|
+
this.onDateRangeLoad = new EventEmitter();
|
|
491
|
+
/**
|
|
492
|
+
* Fired <strong>every</strong> time the eventStore is queried for events by date range.
|
|
493
|
+
* ...
|
|
494
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dateRangeRequested)
|
|
495
|
+
* @param {object} event Event object
|
|
496
|
+
* @param {Calendar.view.Calendar} event.source This Calendar instance
|
|
497
|
+
* @param {object} event.old The old date range
|
|
498
|
+
* @param {Date} event.old.startDate the old start date
|
|
499
|
+
* @param {Date} event.old.endDate the old end date
|
|
500
|
+
* @param {object} event.new The new date range
|
|
501
|
+
* @param {Date} event.new.startDate the new start date
|
|
502
|
+
* @param {Date} event.new.endDate the new end date
|
|
503
|
+
* @param {boolean} event.changed `true` if the date range is different from the last time a request was made
|
|
504
|
+
*/
|
|
505
|
+
this.onDateRangeRequested = new EventEmitter();
|
|
506
|
+
/**
|
|
507
|
+
* Fired by the active view after one day cell's events are collected in sorted order according to the
|
|
508
|
+
* [eventSorter](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-eventSorter)
|
|
509
|
+
* ...
|
|
510
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dayCellPopulated)
|
|
511
|
+
* @param {object} event Event object
|
|
512
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
513
|
+
* @param {Scheduler.model.EventModel[]} event.events The events to be shown for the passed date
|
|
514
|
+
* @param {Date} event.The date the events are to be shown in.
|
|
515
|
+
*/
|
|
516
|
+
this.onDayCellPopulated = new EventEmitter();
|
|
517
|
+
/**
|
|
518
|
+
* Fires when a day number is clicked or activated by the <kbd>ENTER</kbd> key in a view which shows day numbers.
|
|
519
|
+
* This will include the cells of a [YearView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/YearView), the cell header of cells
|
|
520
|
+
* in a [MonthView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView), and the day header in a [DayView](#Calendar/widget/DayView).
|
|
521
|
+
* ...
|
|
522
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dayNumberClick)
|
|
523
|
+
* @param {object} event Event object
|
|
524
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
525
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
526
|
+
* @param {Date} event.date The date clicked on.
|
|
527
|
+
* @param {DayCell} event.cellData An object that contains data about the calendar cell for the date.
|
|
528
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
529
|
+
*/
|
|
530
|
+
this.onDayNumberClick = new EventEmitter();
|
|
531
|
+
/**
|
|
532
|
+
* Fires when an object is destroyed.
|
|
533
|
+
* @param {object} event Event object
|
|
534
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
535
|
+
*/
|
|
536
|
+
this.onDestroy = new EventEmitter();
|
|
537
|
+
/**
|
|
538
|
+
* Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/calendar/docs/api/Core/widget/Container#property-hasChanges) property changes
|
|
539
|
+
* @param {object} event Event object
|
|
540
|
+
* @param {Core.widget.Container} event.source The container.
|
|
541
|
+
* @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
|
|
542
|
+
*/
|
|
543
|
+
this.onDirtyStateChange = new EventEmitter();
|
|
544
|
+
/**
|
|
545
|
+
* This event fires on the owning Calendar when a drag creation gesture is completed.
|
|
546
|
+
* @param {object} event Event object
|
|
547
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
548
|
+
* @param {Core.util.drag.DragContext} event.drag The drag create context.
|
|
549
|
+
* @param {Event} event.event The browser event.
|
|
550
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The new `EventModel` record added in the store.
|
|
551
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
|
|
552
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
553
|
+
* @param {boolean,ValidateCreateResult} event.validation The result of the [validateCreateFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateCreateFn) if one was provided.
|
|
554
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag completed.
|
|
555
|
+
*/
|
|
556
|
+
this.onDragCreateEnd = new EventEmitter();
|
|
557
|
+
/**
|
|
558
|
+
* This event fires on the owning Calendar when a drag move gesture is completed. The `eventRecord` has already been added
|
|
559
|
+
* to the `eventStore` of the owning calendar.
|
|
560
|
+
* @param {object} event Event object
|
|
561
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
562
|
+
* @param {Core.util.drag.DragContext} event.drag The drag create context.
|
|
563
|
+
* @param {Event} event.event The browser event.
|
|
564
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The updated `EventModel` record.
|
|
565
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
|
|
566
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
567
|
+
* @param {boolean,ValidateCreateResult} event.validation The result of the [validateMoveFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateMoveFn) if one was provided.
|
|
568
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag completed.
|
|
569
|
+
*/
|
|
570
|
+
this.onDragMoveEnd = new EventEmitter();
|
|
571
|
+
/**
|
|
572
|
+
* This event is fired on the owning Calendar when dragging an event from the calendar over the
|
|
573
|
+
* external source <strong>if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) was configured</strong>.
|
|
574
|
+
* ...
|
|
575
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dragMoveExternal)
|
|
576
|
+
* @param {object} event Event object
|
|
577
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event record being dragged.
|
|
578
|
+
* @param {HTMLElement} event.itemElement The element in which the drag gesture started.
|
|
579
|
+
* @param {HTMLElement} event.targetElement The current over element.
|
|
580
|
+
* @param {Event} event.domEvent The pointer event associated with the drag point.
|
|
581
|
+
* @param {number} event.overIndex *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the index of the row being moved over;
|
|
582
|
+
* @param {Core.data.Model} event.overRecord *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the record being moved over;
|
|
583
|
+
* @param {boolean} event.isAbove *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, `true` if the pointer position is above the halfway line of the over row.
|
|
584
|
+
* @param {boolean} event.altKey `true` if the Alt key was down when the last event was processed.
|
|
585
|
+
* @param {boolean} event.ctrlKey `true` if the Ctrl key was down when the last event was processed.
|
|
586
|
+
* @param {boolean} event.metaKey `true` if the Meta key was down when the last event was processed.
|
|
587
|
+
* @param {boolean} event.shiftKey `true` if the Shift key was down when the last event was processed.
|
|
588
|
+
*/
|
|
589
|
+
this.onDragMoveExternal = new EventEmitter();
|
|
590
|
+
/**
|
|
591
|
+
* This event fires on the owning Calendar when a drag resize gesture is completed.
|
|
592
|
+
* @param {object} event Event object
|
|
593
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
|
|
594
|
+
* @param {Core.util.drag.DragContext} event.drag The drag create context.
|
|
595
|
+
* @param {Event} event.event The browser event.
|
|
596
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The updated `EventModel` record.
|
|
597
|
+
* @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
|
|
598
|
+
* @param {boolean,ValidateCreateResult} event.validation The result of the [validateResizeFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateResizeFn) if one was provided.
|
|
599
|
+
* @param {CalendarView} event.view The Calendar widget in which the drag completed.
|
|
600
|
+
*/
|
|
601
|
+
this.onDragResizeEnd = new EventEmitter();
|
|
602
|
+
/**
|
|
603
|
+
* This event is fired on the owning Calendar after dropping an event from the calendar on the
|
|
604
|
+
* external source has been completed <strong>if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) was configured</strong>.
|
|
605
|
+
* ...
|
|
606
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dropExternal)
|
|
607
|
+
* @param {object} event Event object
|
|
608
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event record that was dropped.
|
|
609
|
+
* @param {boolean} event.dropOnCalendar `true` if the drop gesture is over the client Calendar. This feature also allows drag *out* of the Calendar and onto the external event source if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) config is set.
|
|
610
|
+
* @param {HTMLElement} event.itemElement The element in which the drag gesture started.
|
|
611
|
+
* @param {HTMLElement} event.targetElement The current over element.
|
|
612
|
+
* @param {Event} event.domEvent The pointer event associated with the drag point.
|
|
613
|
+
* @param {number} event.overIndex *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the index of the row being moved over;
|
|
614
|
+
* @param {Core.data.Model} event.overRecord *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the record being moved over;
|
|
615
|
+
* @param {boolean} event.isAbove *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, `true` if the pointer position is above the halfway line of the over row.
|
|
616
|
+
* @param {boolean} event.altKey `true` if the Alt key was down when the last event was processed.
|
|
617
|
+
* @param {boolean} event.ctrlKey `true` if the Ctrl key was down when the last event was processed.
|
|
618
|
+
* @param {boolean} event.metaKey `true` if the Meta key was down when the last event was processed.
|
|
619
|
+
* @param {boolean} event.shiftKey `true` if the Shift key was down when the last event was processed.
|
|
620
|
+
*/
|
|
621
|
+
this.onDropExternal = new EventEmitter();
|
|
622
|
+
/**
|
|
623
|
+
* Triggered when a widget's [element](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#property-element) is available.
|
|
624
|
+
* @param {object} event Event object
|
|
625
|
+
* @param {HTMLElement} event.element The Widget's element.
|
|
626
|
+
*/
|
|
627
|
+
this.onElementCreated = new EventEmitter();
|
|
628
|
+
/**
|
|
629
|
+
* Fired when an empty cell content area is clicked on in a [MonthView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView) or a
|
|
630
|
+
* [CalendarRow](https://bryntum.com/products/calendar/docs/api/Calendar/widget/CalendarRow).
|
|
631
|
+
* @param {object} event Event object
|
|
632
|
+
* @param {CalendarView} event.source The child view on which the event was initiated.
|
|
633
|
+
* @param {Event} event.domEvent The triggering DOM event.
|
|
634
|
+
* @param {Date} event.date The date which has no visible events
|
|
635
|
+
*/
|
|
636
|
+
this.onEmptyCellClick = new EventEmitter();
|
|
637
|
+
/**
|
|
638
|
+
* Fired when an [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) gesture has
|
|
639
|
+
* created a new event and added it to the event store.
|
|
640
|
+
* ...
|
|
641
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-eventAutoCreated)
|
|
642
|
+
* @param {object} event Event object
|
|
643
|
+
* @param {CalendarView} event.source The child view on which the event was initiated.
|
|
644
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The new event record.
|
|
645
|
+
*/
|
|
646
|
+
this.onEventAutoCreated = new EventEmitter();
|
|
647
|
+
/**
|
|
648
|
+
* Fires when an event bar is clicked in any view.
|
|
649
|
+
* @param {object} event Event object
|
|
650
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
651
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
652
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
653
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
654
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event clicked on.
|
|
655
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource clicked on if the UI includes a resource.
|
|
656
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
657
|
+
*/
|
|
658
|
+
this.onEventClick = new EventEmitter();
|
|
659
|
+
/**
|
|
660
|
+
* Fires when an event bar is right-clicked in any view.
|
|
661
|
+
* @param {object} event Event object
|
|
662
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
663
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
664
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
665
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
666
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event right-clicked on.
|
|
667
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource right-clicked on if the UI includes a resource.
|
|
668
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
669
|
+
*/
|
|
670
|
+
this.onEventContextMenu = new EventEmitter();
|
|
671
|
+
/**
|
|
672
|
+
* Fires when an event bar is double clicked in any view.
|
|
673
|
+
* @param {object} event Event object
|
|
674
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
675
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
676
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
677
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
678
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event double clicked on.
|
|
679
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource double clicked on if the UI includes a resource.
|
|
680
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
681
|
+
*/
|
|
682
|
+
this.onEventDblClick = new EventEmitter();
|
|
683
|
+
/**
|
|
684
|
+
* Fired before the editor will load the event record data into its input fields. This is useful if you
|
|
685
|
+
* want to modify the fields before data is loaded (e.g. set some input field to be readonly)
|
|
686
|
+
* @param {object} event Event object
|
|
687
|
+
* @param {Core.widget.Container} event.source The editor widget
|
|
688
|
+
* @param {Scheduler.model.EventModel} event.record The record
|
|
689
|
+
*/
|
|
690
|
+
this.onEventEditBeforeSetRecord = new EventEmitter();
|
|
691
|
+
/**
|
|
692
|
+
* Fires when a key is pressed while an event bar is focused.
|
|
693
|
+
* @param {object} event Event object
|
|
694
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
695
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
696
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
697
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
698
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event in which the key event was detected.
|
|
699
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource in which the key event was detected if the UI includes a resource.
|
|
700
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
701
|
+
*/
|
|
702
|
+
this.onEventKeyDown = new EventEmitter();
|
|
703
|
+
/**
|
|
704
|
+
* This event fires on the owning Scheduler before the context menu is shown for an event. Allows manipulation of the items
|
|
705
|
+
* to show in the same way as in `processItems`. Returning `false` from a listener prevents the menu from
|
|
706
|
+
* being shown.
|
|
707
|
+
* @param {object} event Event object
|
|
708
|
+
* @param {Scheduler.view.Scheduler} event.source
|
|
709
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
710
|
+
* @param {Scheduler.model.EventModel} event.eventRecord Event record for which the menu was triggered
|
|
711
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
712
|
+
* @param {Scheduler.model.AssignmentModel} event.assignmentRecord Assignment record, if assignments are used
|
|
713
|
+
* @param {HTMLElement} event.eventElement
|
|
714
|
+
* @param {MouseEvent} event.event Pointer event which triggered the context menu (if any)
|
|
715
|
+
*/
|
|
716
|
+
this.onEventMenuBeforeShow = new EventEmitter();
|
|
717
|
+
/**
|
|
718
|
+
* This event fires on the owning Scheduler when an item is selected in the context menu.
|
|
719
|
+
* @param {object} event Event object
|
|
720
|
+
* @param {Scheduler.view.Scheduler} event.source
|
|
721
|
+
* @param {Core.widget.MenuItem} event.item
|
|
722
|
+
* @param {Scheduler.model.EventModel} event.eventRecord
|
|
723
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord
|
|
724
|
+
* @param {Scheduler.model.AssignmentModel} event.assignmentRecord Assignment record, if assignments are used
|
|
725
|
+
* @param {HTMLElement} event.eventElement
|
|
726
|
+
*/
|
|
727
|
+
this.onEventMenuItem = new EventEmitter();
|
|
728
|
+
/**
|
|
729
|
+
* This event fires on the owning Scheduler after showing the context menu for an event
|
|
730
|
+
* @param {object} event Event object
|
|
731
|
+
* @param {Scheduler.view.Scheduler} event.source
|
|
732
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
733
|
+
* @param {Scheduler.model.EventModel} event.eventRecord Event record for which the menu was triggered
|
|
734
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
735
|
+
* @param {Scheduler.model.AssignmentModel} event.assignmentRecord Assignment record, if assignments are used
|
|
736
|
+
* @param {HTMLElement} event.eventElement
|
|
737
|
+
*/
|
|
738
|
+
this.onEventMenuShow = new EventEmitter();
|
|
739
|
+
/**
|
|
740
|
+
* Fires when an event bar is mousedowned in any view.
|
|
741
|
+
* @param {object} event Event object
|
|
742
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
743
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
744
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
745
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
746
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event mousedowned on.
|
|
747
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource mousedowned on if the UI includes a resource.
|
|
748
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
749
|
+
*/
|
|
750
|
+
this.onEventMouseDown = new EventEmitter();
|
|
751
|
+
/**
|
|
752
|
+
* Fires when cursor enters an event bar in any view.
|
|
753
|
+
* @param {object} event Event object
|
|
754
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
755
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
756
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
757
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
758
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event record.
|
|
759
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
|
|
760
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
761
|
+
*/
|
|
762
|
+
this.onEventMouseEnter = new EventEmitter();
|
|
763
|
+
/**
|
|
764
|
+
* Fires when cursor leaves an event bar in any view.
|
|
765
|
+
* @param {object} event Event object
|
|
766
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
767
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
768
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
769
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
770
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event record.
|
|
771
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
|
|
772
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
773
|
+
*/
|
|
774
|
+
this.onEventMouseLeave = new EventEmitter();
|
|
775
|
+
/**
|
|
776
|
+
* Fires when an event bar is mouseouted in any view.
|
|
777
|
+
* @param {object} event Event object
|
|
778
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
779
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
780
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
781
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
782
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event mouseouted.
|
|
783
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource mouseouted if the UI includes a resource.
|
|
784
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
785
|
+
*/
|
|
786
|
+
this.onEventMouseOut = new EventEmitter();
|
|
787
|
+
/**
|
|
788
|
+
* Fires when an event bar is mouseovered in any view.
|
|
789
|
+
* @param {object} event Event object
|
|
790
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
791
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
792
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
793
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
794
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event mouseovered.
|
|
795
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource mouseovered if the UI includes a resource.
|
|
796
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
797
|
+
*/
|
|
798
|
+
this.onEventMouseOver = new EventEmitter();
|
|
799
|
+
/**
|
|
800
|
+
* Fires when an event bar is mouseupped in any view.
|
|
801
|
+
* @param {object} event Event object
|
|
802
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
803
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
804
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
805
|
+
* @param {HTMLElement} event.eventElement The UI element which represents the event.
|
|
806
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event mouseupped.
|
|
807
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource mouseupped if the UI includes a resource.
|
|
808
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
809
|
+
*/
|
|
810
|
+
this.onEventMouseUp = new EventEmitter();
|
|
811
|
+
/**
|
|
812
|
+
* Fires when a day spanning event is found, and the date to which its encapsulating event bar
|
|
813
|
+
* extends has been calculated.
|
|
814
|
+
* ...
|
|
815
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-eventPropagate)
|
|
816
|
+
* @param {object} event Event object
|
|
817
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
818
|
+
* @param {Date} event.eventEndDate The end date for which to calculate the propagate end date.
|
|
819
|
+
* @param {Date} event.propagateEndDate The system-calculated end point of the event bar.
|
|
820
|
+
* @param {boolean} event.isAllDay `true` if the event is an all day event, or spans multiple days.
|
|
821
|
+
* @param {boolean} event.isOverflow `true` if this is being called as part of further propagation.
|
|
822
|
+
* @param {boolean} event.overflows `true` if the event extends into future cells.
|
|
823
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event record being propagated.
|
|
824
|
+
* @param {Date} event.date The date from which the event is being propagated.
|
|
825
|
+
*/
|
|
826
|
+
this.onEventPropagate = new EventEmitter();
|
|
827
|
+
/**
|
|
828
|
+
* Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
829
|
+
* @param {object} event Event object
|
|
830
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
831
|
+
*/
|
|
832
|
+
this.onExpand = new EventEmitter();
|
|
833
|
+
/**
|
|
834
|
+
* Fired when focus enters this Widget.
|
|
835
|
+
* @param {object} event Event object
|
|
836
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
837
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
838
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
839
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
840
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
841
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
842
|
+
*/
|
|
843
|
+
this.onFocusIn = new EventEmitter();
|
|
844
|
+
/**
|
|
845
|
+
* Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
|
|
846
|
+
* focus moving from within this Widget's ownership tree, even if there are floating widgets
|
|
847
|
+
* will not trigger this event. This is when focus exits this widget completely.
|
|
848
|
+
* @param {object} event Event object
|
|
849
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
850
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
851
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
852
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
853
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
854
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
855
|
+
*/
|
|
856
|
+
this.onFocusOut = new EventEmitter();
|
|
857
|
+
/**
|
|
858
|
+
* Triggered after a widget was hidden
|
|
859
|
+
* @param {object} event Event object
|
|
860
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
861
|
+
*/
|
|
862
|
+
this.onHide = new EventEmitter();
|
|
863
|
+
/**
|
|
864
|
+
* Fires when the [LoadOnDemand](https://bryntum.com/products/calendar/docs/api/Calendar/feature/LoadOnDemand) feature detects that a request
|
|
865
|
+
* for data from the server has failed.
|
|
866
|
+
* ...
|
|
867
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-loadOnDemandFail)
|
|
868
|
+
* @param {object} event Event object
|
|
869
|
+
* @param {Response} event.rawResponse The HTTP `fetch` response object.
|
|
870
|
+
* @param {object} event.request The CrudManager load data block.
|
|
871
|
+
* @param {object} event.response The decoded JSON response.
|
|
872
|
+
*/
|
|
873
|
+
this.onLoadOnDemandFail = new EventEmitter();
|
|
874
|
+
/**
|
|
875
|
+
* Fires when a month name header in a [YearView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/YearView) or a [MonthGrid](#Calendar/widget/MonthGrid) is clicked
|
|
876
|
+
* or activated by the <kbd>ENTER</kbd> key.
|
|
877
|
+
* ...
|
|
878
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-monthNameClick)
|
|
879
|
+
* @param {object} event Event object
|
|
880
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
881
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
882
|
+
* @param {number} event.month The month index *(zero based)* clicked on.
|
|
883
|
+
* @param {Date} event.date The date of the first of the month clicked on.
|
|
884
|
+
*/
|
|
885
|
+
this.onMonthNameClick = new EventEmitter();
|
|
886
|
+
/**
|
|
887
|
+
* Fired when a user gesture causes the active item to change.
|
|
888
|
+
* @param {object} event Event object
|
|
889
|
+
* @param {Event} event.event The browser event which instigated navigation. May be a click or key or focus event.
|
|
890
|
+
* @param {HTMLElement,null} event.item The newly active item, or `null` if focus moved out.
|
|
891
|
+
* @param {HTMLElement,null} event.oldItem The previously active item, or `null` if focus is moving in.
|
|
892
|
+
*/
|
|
893
|
+
this.onNavigate = new EventEmitter();
|
|
894
|
+
/**
|
|
895
|
+
* Triggered when a widget which had been in a non-visible state for any reason
|
|
896
|
+
* achieves visibility.
|
|
897
|
+
* ...
|
|
898
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-paint)
|
|
899
|
+
* @param {object} event Event object
|
|
900
|
+
* @param {Core.widget.Widget} event.source The widget being painted.
|
|
901
|
+
* @param {boolean} event.firstPaint `true` if this is the first paint.
|
|
902
|
+
*/
|
|
903
|
+
this.onPaint = new EventEmitter();
|
|
904
|
+
/**
|
|
905
|
+
* Fires on the owning Scheduler after a paste action is performed.
|
|
906
|
+
* @param {object} event Event object
|
|
907
|
+
* @param {Scheduler.view.Scheduler} event.source Owner scheduler
|
|
908
|
+
* @param {Scheduler.model.EventModel[]} event.eventRecords The pasted event records
|
|
909
|
+
* @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The pasted assignment records
|
|
910
|
+
* @param {Scheduler.model.EventModel[]} event.pastedEventRecords (DEPRECATED) Use eventRecords instead
|
|
911
|
+
* @param {Scheduler.model.EventModel[]} event.originalEventRecords The original copied event records
|
|
912
|
+
* @param {Scheduler.model.AssignmentModel[]} event.originalAssignmentRecords The original copied assignment records
|
|
913
|
+
* @param {Date} event.date date Pasted to this date
|
|
914
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The target resource record
|
|
915
|
+
* @param {boolean} event.isCut `true` if this is a cut action
|
|
916
|
+
* @param {string} event.entityName 'event' to distinguish this event from other paste events
|
|
917
|
+
*/
|
|
918
|
+
this.onPaste = new EventEmitter();
|
|
919
|
+
/**
|
|
920
|
+
* Fires on the owning Scheduler if a paste action is not allowed. Depending on if the EventStore is using
|
|
921
|
+
* [singleAssignment](https://bryntum.com/products/calendar/docs/api/Scheduler/data/EventStore#config-singleAssignment) or the configuration of
|
|
922
|
+
* [copyPasteAction](https://bryntum.com/products/calendar/docs/api/Scheduler/feature/EventCopyPaste#config-copyPasteAction), either the `eventRecords` or the `assignmentRecords` param will be populated
|
|
923
|
+
* with record copies.
|
|
924
|
+
* @param {object} event Event object
|
|
925
|
+
* @param {Scheduler.view.Scheduler} event.source Owner scheduler
|
|
926
|
+
* @param {Scheduler.model.EventModel[]} event.eventRecords The event records about to be pasted
|
|
927
|
+
* @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment records about to be pasted
|
|
928
|
+
* @param {Scheduler.model.EventModel[]} event.originalEventRecords The event records that were copied
|
|
929
|
+
* @param {Scheduler.model.AssignmentModel[]} event.originalAssignmentRecords The assignment records that were copied
|
|
930
|
+
* @param {Date} event.date The paste date
|
|
931
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The target resource record
|
|
932
|
+
* @param {boolean} event.isCut `true` if this is a cut action
|
|
933
|
+
* @param {string} event.entityName 'event' to distinguish this event from other `pasteNotAllowed` events
|
|
934
|
+
* @param {'overlappingEvents','resourceReadOnly'} event.reason A string id to use for displaying an error message to the user.
|
|
935
|
+
*/
|
|
936
|
+
this.onPasteNotAllowed = new EventEmitter();
|
|
937
|
+
/**
|
|
938
|
+
* Fired when a Widget's read only state is toggled
|
|
939
|
+
* @param {object} event Event object
|
|
940
|
+
* @param {boolean} event.readOnly Read only or not
|
|
941
|
+
*/
|
|
942
|
+
this.onReadOnly = new EventEmitter();
|
|
943
|
+
/**
|
|
944
|
+
* This event is fired after a widget's elements have been synchronized due to a direct or indirect call
|
|
945
|
+
* to [recompose](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
|
|
946
|
+
*/
|
|
947
|
+
this.onRecompose = new EventEmitter();
|
|
948
|
+
/**
|
|
949
|
+
* Fires when one of the views in this Calendar refreshes.
|
|
950
|
+
* @param {object} event Event object
|
|
951
|
+
* @param {CalendarView} event.source The view which refreshed.
|
|
952
|
+
*/
|
|
953
|
+
this.onRefresh = new EventEmitter();
|
|
954
|
+
/**
|
|
955
|
+
* Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
|
|
956
|
+
* @param {object} event Event object
|
|
957
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
958
|
+
* @param {number} event.width The new width
|
|
959
|
+
* @param {number} event.height The new height
|
|
960
|
+
* @param {number} event.oldWidth The old width
|
|
961
|
+
* @param {number} event.oldHeight The old height
|
|
962
|
+
*/
|
|
963
|
+
this.onResize = new EventEmitter();
|
|
964
|
+
/**
|
|
965
|
+
* Fires when a click event is received by a view which supports resources.
|
|
966
|
+
* ...
|
|
967
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-resourceClick)
|
|
968
|
+
* @param {object} event Event object
|
|
969
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
970
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
971
|
+
* @param {Date} event.date The date of the UI element which contains the event.
|
|
972
|
+
* @param {HTMLElement} event.eventElement *If* an event was interacted with, the UI element which represents the event.
|
|
973
|
+
* @param {Scheduler.model.EventModel} event.eventRecord *If* an event was interacted with.
|
|
974
|
+
* @param {HTMLElement} event.resourceElement The UI element which encapsulates the resource.
|
|
975
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the target element.
|
|
976
|
+
* @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
|
|
977
|
+
*/
|
|
978
|
+
this.onResourceClick = new EventEmitter();
|
|
979
|
+
/**
|
|
980
|
+
* Triggered when a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
|
|
981
|
+
* @param {object} event Event object
|
|
982
|
+
* @param {Core.widget.Widget} event.source The widget whose `responsiveState` has changed
|
|
983
|
+
* @param {string} event.state The new value for the widget's `responsiveState`
|
|
984
|
+
* @param {string} event.oldState The previous value for the widget's `responsiveState`
|
|
985
|
+
*/
|
|
986
|
+
this.onResponsiveStateChange = new EventEmitter();
|
|
987
|
+
/**
|
|
988
|
+
* Fires when a click made its way through to an empty part of any view.
|
|
989
|
+
* @param {object} event Event object
|
|
990
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
991
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
992
|
+
* @param {Date} event.date The date clicked on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
|
|
993
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
|
|
994
|
+
*/
|
|
995
|
+
this.onScheduleClick = new EventEmitter();
|
|
996
|
+
/**
|
|
997
|
+
* Fires when a context menu made its way through to an empty part of any view.
|
|
998
|
+
* @param {object} event Event object
|
|
999
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
1000
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
1001
|
+
* @param {Date} event.date The date clicked on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
|
|
1002
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
|
|
1003
|
+
*/
|
|
1004
|
+
this.onScheduleContextMenu = new EventEmitter();
|
|
1005
|
+
/**
|
|
1006
|
+
* Fires when a dblclick made its way through to an empty part of any view.
|
|
1007
|
+
* @param {object} event Event object
|
|
1008
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
1009
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
1010
|
+
* @param {Date} event.date The date double clicked on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
|
|
1011
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
|
|
1012
|
+
*/
|
|
1013
|
+
this.onScheduleDblClick = new EventEmitter();
|
|
1014
|
+
/**
|
|
1015
|
+
* This event fires on the owning Scheduler or Gantt widget before the context menu is shown for the schedule.
|
|
1016
|
+
* Allows manipulation of the items to show in the same way as in `processItems`. Returning `false` from a listener
|
|
1017
|
+
* prevents the menu from being shown.
|
|
1018
|
+
* @param {object} event Event object
|
|
1019
|
+
* @param {Scheduler.view.Scheduler} event.source
|
|
1020
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
1021
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
1022
|
+
* @param {Date} event.date Clicked date, rounded according to viewPreset's settings
|
|
1023
|
+
* @param {Scheduler.model.AssignmentModel} event.assignmentRecord Assignment record, if assignments are used
|
|
1024
|
+
* @param {HTMLElement} event.eventElement
|
|
1025
|
+
*/
|
|
1026
|
+
this.onScheduleMenuBeforeShow = new EventEmitter();
|
|
1027
|
+
/**
|
|
1028
|
+
* This event fires on the owning Scheduler or Gantt widget when an item is selected in the context menu.
|
|
1029
|
+
* @param {object} event Event object
|
|
1030
|
+
* @param {Scheduler.view.Scheduler} event.source
|
|
1031
|
+
* @param {Core.widget.MenuItem} event.item
|
|
1032
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord
|
|
1033
|
+
* @param {Date} event.date Clicked date, rounded according to viewPreset's settings
|
|
1034
|
+
* @param {HTMLElement} event.element
|
|
1035
|
+
*/
|
|
1036
|
+
this.onScheduleMenuItem = new EventEmitter();
|
|
1037
|
+
/**
|
|
1038
|
+
* This event fires on the owning Scheduler or Gantt widget after showing the context menu for the schedule.
|
|
1039
|
+
* @param {object} event Event object
|
|
1040
|
+
* @param {Scheduler.view.Scheduler} event.source
|
|
1041
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
1042
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
1043
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord
|
|
1044
|
+
* @param {Date} event.date Clicked date, rounded according to viewPreset's settings
|
|
1045
|
+
* @param {HTMLElement} event.targetElement
|
|
1046
|
+
*/
|
|
1047
|
+
this.onScheduleMenuShow = new EventEmitter();
|
|
1048
|
+
/**
|
|
1049
|
+
* Fires when a mousedown made its way through to an empty part of any view.
|
|
1050
|
+
* @param {object} event Event object
|
|
1051
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
1052
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
1053
|
+
* @param {Date} event.date The date mousedowned on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
|
|
1054
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
|
|
1055
|
+
*/
|
|
1056
|
+
this.onScheduleMouseDown = new EventEmitter();
|
|
1057
|
+
/**
|
|
1058
|
+
* Fires when a mouseout made it's way through to an empty part of any view.
|
|
1059
|
+
* @param {object} event Event object
|
|
1060
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
1061
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
1062
|
+
* @param {Date} event.date The date mouseouted. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
|
|
1063
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
|
|
1064
|
+
*/
|
|
1065
|
+
this.onScheduleMouseOut = new EventEmitter();
|
|
1066
|
+
/**
|
|
1067
|
+
* Fires when a mouseover made its way through to an empty part of any view.
|
|
1068
|
+
* @param {object} event Event object
|
|
1069
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
1070
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
1071
|
+
* @param {Date} event.date The date mouseovered. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
|
|
1072
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
|
|
1073
|
+
*/
|
|
1074
|
+
this.onScheduleMouseOver = new EventEmitter();
|
|
1075
|
+
/**
|
|
1076
|
+
* Fires when a mouseup made its way through to an empty part of any view.
|
|
1077
|
+
* @param {object} event Event object
|
|
1078
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
1079
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
1080
|
+
* @param {Date} event.date The date mouseupped on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
|
|
1081
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
|
|
1082
|
+
*/
|
|
1083
|
+
this.onScheduleMouseUp = new EventEmitter();
|
|
1084
|
+
/**
|
|
1085
|
+
* Fired any time there is a change to the events selected in the Calendar.
|
|
1086
|
+
* @param {object} event Event object
|
|
1087
|
+
* @param {Calendar.view.Calendar} event.source The Calendar instance.
|
|
1088
|
+
* @param {'select','deselect','update','clear'} event.action One of the actions 'select', 'deselect', 'update', 'clear'
|
|
1089
|
+
* @param {Scheduler.model.EventModel[]} event.selected An array of the Events added to the selection.
|
|
1090
|
+
* @param {Scheduler.model.EventModel[]} event.deselected An array of the Event removed from the selection.
|
|
1091
|
+
* @param {Scheduler.model.EventModel[]} event.selection The new selection.
|
|
1092
|
+
*/
|
|
1093
|
+
this.onSelectionChange = new EventEmitter();
|
|
1094
|
+
/**
|
|
1095
|
+
* Triggered after a widget is shown.
|
|
1096
|
+
* @param {object} event Event object
|
|
1097
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
1098
|
+
*/
|
|
1099
|
+
this.onShow = new EventEmitter();
|
|
1100
|
+
/**
|
|
1101
|
+
* Fired when the sidebar is collapsed either through the UI or programatically.
|
|
1102
|
+
* @param {object} event Event object
|
|
1103
|
+
* @param {Calendar.view.Calendar} event.source This Calendar instance
|
|
1104
|
+
*/
|
|
1105
|
+
this.onSidebarCollapse = new EventEmitter();
|
|
1106
|
+
/**
|
|
1107
|
+
* Fired when the sidebar is expanded either through the UI or programatically.
|
|
1108
|
+
* @param {object} event Event object
|
|
1109
|
+
* @param {Calendar.view.Calendar} event.source This Calendar instance
|
|
1110
|
+
*/
|
|
1111
|
+
this.onSidebarExpand = new EventEmitter();
|
|
1112
|
+
/**
|
|
1113
|
+
* Fired when a time axis of a DayView or WeekView is clicked on. If the handler returns
|
|
1114
|
+
* `false` the current pointer event is not processed further.
|
|
1115
|
+
* @param {object} event Event object
|
|
1116
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
1117
|
+
* @param {Event} event.domEvent The triggering DOM event.
|
|
1118
|
+
* @param {Date} event.preciseTime The exact date and time at the clicked position
|
|
1119
|
+
* @param {Date} event.time The date and time at the clicked position snapped according to the [increment](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView#config-increment) and [timeSnapType](#Calendar/widget/DayView#config-timeSnapType)
|
|
1120
|
+
*/
|
|
1121
|
+
this.onTimeAxisClick = new EventEmitter();
|
|
1122
|
+
/**
|
|
1123
|
+
* Fired on the owning Scheduler or Gantt widget when a click happens on a time range header element
|
|
1124
|
+
* @param {object} event Event object
|
|
1125
|
+
* @param {Scheduler.view.Scheduler} event.source Scheduler instance
|
|
1126
|
+
* @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
|
|
1127
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1128
|
+
*/
|
|
1129
|
+
this.onTimeRangeHeaderClick = new EventEmitter();
|
|
1130
|
+
/**
|
|
1131
|
+
* Fired on the owning Scheduler or Gantt widget when a right click happens on a time range header element
|
|
1132
|
+
* @param {object} event Event object
|
|
1133
|
+
* @param {Scheduler.view.Scheduler} event.source Scheduler instance
|
|
1134
|
+
* @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
|
|
1135
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1136
|
+
*/
|
|
1137
|
+
this.onTimeRangeHeaderContextMenu = new EventEmitter();
|
|
1138
|
+
/**
|
|
1139
|
+
* Fired on the owning Scheduler or Gantt widget when a double click happens on a time range header element
|
|
1140
|
+
* @param {object} event Event object
|
|
1141
|
+
* @param {Scheduler.view.Scheduler} event.source Scheduler instance
|
|
1142
|
+
* @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
|
|
1143
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1144
|
+
*/
|
|
1145
|
+
this.onTimeRangeHeaderDblClick = new EventEmitter();
|
|
1146
|
+
/**
|
|
1147
|
+
* A header [tool](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-tools) has been clicked.
|
|
1148
|
+
* @param {object} event Event object
|
|
1149
|
+
* @param {Core.widget.Tool} event.source This Panel.
|
|
1150
|
+
* @param {Core.widget.Tool} event.tool The tool which is being clicked.
|
|
1151
|
+
*/
|
|
1152
|
+
this.onToolClick = new EventEmitter();
|
|
1153
|
+
/**
|
|
1154
|
+
* Fires when one of the child views is painted. That is when it becomes visible.
|
|
1155
|
+
* Note that due to the slide-in animation, while the view is visible, it will not
|
|
1156
|
+
* yet be in its final position.
|
|
1157
|
+
* @param {object} event Event object
|
|
1158
|
+
* @param {CalendarView} event.source The widget being painted
|
|
1159
|
+
* @param {boolean} event.firstPaint `true` if this is the first paint
|
|
1160
|
+
*/
|
|
1161
|
+
this.onViewPaint = new EventEmitter();
|
|
1162
|
+
/**
|
|
1163
|
+
* Fires when a week number is clicked or activated by the <kbd>ENTER</kbd> key. This will include the week number cells of a
|
|
1164
|
+
* [YearView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/YearView), the week number in the first cell
|
|
1165
|
+
* in each row of a [MonthView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView)
|
|
1166
|
+
* ...
|
|
1167
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-weekNumberClick)
|
|
1168
|
+
* @param {object} event Event object
|
|
1169
|
+
* @param {CalendarView} event.source The view which triggered the event.
|
|
1170
|
+
* @param {Event} event.domEvent The initiating DOM event.
|
|
1171
|
+
* @param {number[]} event.week The `[year, week]` clicked on.
|
|
1172
|
+
* @param {Date} event.date The date clicked on.
|
|
1173
|
+
*/
|
|
1174
|
+
this.onWeekNumberClick = new EventEmitter();
|
|
1175
|
+
this.elementRef = element;
|
|
1176
|
+
}
|
|
1177
|
+
/**
|
|
1178
|
+
* Create and append the underlying widget
|
|
1179
|
+
*/
|
|
1180
|
+
ngOnInit() {
|
|
1181
|
+
const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumCalendarComponent;
|
|
1182
|
+
bryntumConfigs.filter(prop => prop in this).forEach(prop => {
|
|
1183
|
+
// @ts-ignore
|
|
1184
|
+
WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
|
|
1185
|
+
if (['features', 'config'].includes(prop)) {
|
|
1186
|
+
WrapperHelper.devWarningConfigProp(instanceName, prop);
|
|
1187
|
+
}
|
|
1188
|
+
});
|
|
1189
|
+
// @ts-ignore
|
|
1190
|
+
bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
|
|
1191
|
+
const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
|
|
1192
|
+
// @ts-ignore
|
|
1193
|
+
bryntumConfig.listeners[eventName(event)] = e => {
|
|
1194
|
+
// @ts-ignore
|
|
1195
|
+
me[event].emit(e);
|
|
1196
|
+
// EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
|
|
1197
|
+
// in Angular listeners
|
|
1198
|
+
return e.returnValue;
|
|
1199
|
+
};
|
|
1200
|
+
});
|
|
1201
|
+
// If component has no container specified in config then use adopt to Wrapper's element
|
|
1202
|
+
const containerParam = [
|
|
1203
|
+
'adopt',
|
|
1204
|
+
'appendTo',
|
|
1205
|
+
'insertAfter',
|
|
1206
|
+
'insertBefore'
|
|
1207
|
+
// @ts-ignore
|
|
1208
|
+
].find(prop => bryntumConfig[prop]);
|
|
1209
|
+
if (!containerParam) {
|
|
1210
|
+
if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
|
|
1211
|
+
// Button should always be <a> or <button> inside owner element
|
|
1212
|
+
bryntumConfig.appendTo = elementRef.nativeElement;
|
|
1213
|
+
}
|
|
1214
|
+
else {
|
|
1215
|
+
bryntumConfig.adopt = elementRef.nativeElement;
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
else {
|
|
1219
|
+
WrapperHelper.devWarningContainer(instanceName, containerParam);
|
|
1220
|
+
}
|
|
1221
|
+
// @ts-ignore
|
|
1222
|
+
me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
|
|
1223
|
+
// Backwards compatibility for gridInstance, schedulerInstance etc.
|
|
1224
|
+
// @ts-ignore
|
|
1225
|
+
me[StringHelper.uncapitalize(instanceName) + 'Instance'] = me.instance;
|
|
1226
|
+
//
|
|
1227
|
+
}
|
|
1228
|
+
/**
|
|
1229
|
+
* Watch for changes
|
|
1230
|
+
* @param changes
|
|
1231
|
+
*/
|
|
1232
|
+
ngOnChanges(changes) {
|
|
1233
|
+
const { instance } = this, { instanceName } = BryntumCalendarComponent;
|
|
1234
|
+
if (!instance) {
|
|
1235
|
+
return;
|
|
1236
|
+
}
|
|
1237
|
+
// Iterate over all changes
|
|
1238
|
+
Object.entries(changes).forEach(([prop, change]) => {
|
|
1239
|
+
const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumCalendarComponent;
|
|
1240
|
+
if (bryntumProps.includes(prop)) {
|
|
1241
|
+
WrapperHelper.applyPropValue(instance, prop, newValue, false);
|
|
1242
|
+
if (bryntumConfigsOnly.includes(prop)) {
|
|
1243
|
+
WrapperHelper.devWarningUpdateProp(instanceName, prop);
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
});
|
|
1247
|
+
}
|
|
1248
|
+
/**
|
|
1249
|
+
* Destroy the component
|
|
1250
|
+
*/
|
|
1251
|
+
ngOnDestroy() {
|
|
1252
|
+
// @ts-ignore
|
|
1253
|
+
if (this.instance && this.instance.destroy) {
|
|
1254
|
+
this.instance.destroy();
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
BryntumCalendarComponent.instanceClass = Calendar;
|
|
1259
|
+
BryntumCalendarComponent.instanceName = 'Calendar';
|
|
1260
|
+
BryntumCalendarComponent.bryntumEvents = [
|
|
1261
|
+
'onActiveItemChange',
|
|
1262
|
+
'onAfterEventEdit',
|
|
1263
|
+
'onAfterEventSave',
|
|
1264
|
+
'onBeforeActiveItemChange',
|
|
1265
|
+
'onBeforeAssignmentDelete',
|
|
1266
|
+
'onBeforeAssignmentSelectionChange',
|
|
1267
|
+
'onBeforeAutoCreate',
|
|
1268
|
+
'onBeforeCopy',
|
|
1269
|
+
'onBeforeCreateMode',
|
|
1270
|
+
'onBeforeCSVExport',
|
|
1271
|
+
'onBeforeDestroy',
|
|
1272
|
+
'onBeforeDragCreate',
|
|
1273
|
+
'onBeforeDragCreateEnd',
|
|
1274
|
+
'onBeforeDragMove',
|
|
1275
|
+
'onBeforeDragMoveEnd',
|
|
1276
|
+
'onBeforeDragResize',
|
|
1277
|
+
'onBeforeDragResizeEnd',
|
|
1278
|
+
'onBeforeDropExternal',
|
|
1279
|
+
'onBeforeEventDelete',
|
|
1280
|
+
'onBeforeEventEdit',
|
|
1281
|
+
'onBeforeEventEditShow',
|
|
1282
|
+
'onBeforeEventSave',
|
|
1283
|
+
'onBeforeEventSelectionChange',
|
|
1284
|
+
'onBeforeExcelExport',
|
|
1285
|
+
'onBeforeHide',
|
|
1286
|
+
'onBeforePaste',
|
|
1287
|
+
'onBeforePrint',
|
|
1288
|
+
'onBeforeResponsiveStateChange',
|
|
1289
|
+
'onBeforeSetRecord',
|
|
1290
|
+
'onBeforeShow',
|
|
1291
|
+
'onBeforeStateApply',
|
|
1292
|
+
'onBeforeStateSave',
|
|
1293
|
+
'onCatchAll',
|
|
1294
|
+
'onCellOverflowClick',
|
|
1295
|
+
'onCollapse',
|
|
1296
|
+
'onContextMenuItem',
|
|
1297
|
+
'onContextMenuToggleItem',
|
|
1298
|
+
'onCopy',
|
|
1299
|
+
'onCurrentTimelineUpdate',
|
|
1300
|
+
'onDataChange',
|
|
1301
|
+
'onDateChange',
|
|
1302
|
+
'onDateRangeChange',
|
|
1303
|
+
'onDateRangeLoad',
|
|
1304
|
+
'onDateRangeRequested',
|
|
1305
|
+
'onDayCellPopulated',
|
|
1306
|
+
'onDayNumberClick',
|
|
1307
|
+
'onDestroy',
|
|
1308
|
+
'onDirtyStateChange',
|
|
1309
|
+
'onDragCreateEnd',
|
|
1310
|
+
'onDragMoveEnd',
|
|
1311
|
+
'onDragMoveExternal',
|
|
1312
|
+
'onDragResizeEnd',
|
|
1313
|
+
'onDropExternal',
|
|
1314
|
+
'onElementCreated',
|
|
1315
|
+
'onEmptyCellClick',
|
|
1316
|
+
'onEventAutoCreated',
|
|
1317
|
+
'onEventClick',
|
|
1318
|
+
'onEventContextMenu',
|
|
1319
|
+
'onEventDblClick',
|
|
1320
|
+
'onEventEditBeforeSetRecord',
|
|
1321
|
+
'onEventKeyDown',
|
|
1322
|
+
'onEventMenuBeforeShow',
|
|
1323
|
+
'onEventMenuItem',
|
|
1324
|
+
'onEventMenuShow',
|
|
1325
|
+
'onEventMouseDown',
|
|
1326
|
+
'onEventMouseEnter',
|
|
1327
|
+
'onEventMouseLeave',
|
|
1328
|
+
'onEventMouseOut',
|
|
1329
|
+
'onEventMouseOver',
|
|
1330
|
+
'onEventMouseUp',
|
|
1331
|
+
'onEventPropagate',
|
|
1332
|
+
'onExpand',
|
|
1333
|
+
'onFocusIn',
|
|
1334
|
+
'onFocusOut',
|
|
1335
|
+
'onHide',
|
|
1336
|
+
'onLoadOnDemandFail',
|
|
1337
|
+
'onMonthNameClick',
|
|
1338
|
+
'onNavigate',
|
|
1339
|
+
'onPaint',
|
|
1340
|
+
'onPaste',
|
|
1341
|
+
'onPasteNotAllowed',
|
|
1342
|
+
'onReadOnly',
|
|
1343
|
+
'onRecompose',
|
|
1344
|
+
'onRefresh',
|
|
1345
|
+
'onResize',
|
|
1346
|
+
'onResourceClick',
|
|
1347
|
+
'onResponsiveStateChange',
|
|
1348
|
+
'onScheduleClick',
|
|
1349
|
+
'onScheduleContextMenu',
|
|
1350
|
+
'onScheduleDblClick',
|
|
1351
|
+
'onScheduleMenuBeforeShow',
|
|
1352
|
+
'onScheduleMenuItem',
|
|
1353
|
+
'onScheduleMenuShow',
|
|
1354
|
+
'onScheduleMouseDown',
|
|
1355
|
+
'onScheduleMouseOut',
|
|
1356
|
+
'onScheduleMouseOver',
|
|
1357
|
+
'onScheduleMouseUp',
|
|
1358
|
+
'onSelectionChange',
|
|
1359
|
+
'onShow',
|
|
1360
|
+
'onSidebarCollapse',
|
|
1361
|
+
'onSidebarExpand',
|
|
1362
|
+
'onTimeAxisClick',
|
|
1363
|
+
'onTimeRangeHeaderClick',
|
|
1364
|
+
'onTimeRangeHeaderContextMenu',
|
|
1365
|
+
'onTimeRangeHeaderDblClick',
|
|
1366
|
+
'onToolClick',
|
|
1367
|
+
'onViewPaint',
|
|
1368
|
+
'onWeekNumberClick'
|
|
1369
|
+
];
|
|
1370
|
+
BryntumCalendarComponent.bryntumFeatureNames = [
|
|
1371
|
+
'dragFeature',
|
|
1372
|
+
'eventBufferFeature',
|
|
1373
|
+
'eventCopyPasteFeature',
|
|
1374
|
+
'eventEditFeature',
|
|
1375
|
+
'eventMenuFeature',
|
|
1376
|
+
'eventTooltipFeature',
|
|
1377
|
+
'excelExporterFeature',
|
|
1378
|
+
'externalEventSourceFeature',
|
|
1379
|
+
'loadOnDemandFeature',
|
|
1380
|
+
'printFeature',
|
|
1381
|
+
'scheduleMenuFeature',
|
|
1382
|
+
'scheduleTooltipFeature',
|
|
1383
|
+
'timeRangesFeature',
|
|
1384
|
+
'weekExpanderFeature'
|
|
1385
|
+
];
|
|
1386
|
+
BryntumCalendarComponent.bryntumConfigs = BryntumCalendarComponent.bryntumFeatureNames.concat([
|
|
1387
|
+
'activeDateCls',
|
|
1388
|
+
'adopt',
|
|
1389
|
+
'align',
|
|
1390
|
+
'alignSelf',
|
|
1391
|
+
'anchor',
|
|
1392
|
+
'appendTo',
|
|
1393
|
+
'ariaDescription',
|
|
1394
|
+
'ariaLabel',
|
|
1395
|
+
'assignments',
|
|
1396
|
+
'assignmentStore',
|
|
1397
|
+
'autoCreate',
|
|
1398
|
+
'bbar',
|
|
1399
|
+
'bodyCls',
|
|
1400
|
+
'bubbleEvents',
|
|
1401
|
+
'callOnFunctions',
|
|
1402
|
+
'catchEventHandlerExceptions',
|
|
1403
|
+
'centered',
|
|
1404
|
+
'cls',
|
|
1405
|
+
'collapsed',
|
|
1406
|
+
'collapsible',
|
|
1407
|
+
'color',
|
|
1408
|
+
'column',
|
|
1409
|
+
'config',
|
|
1410
|
+
'constrainTo',
|
|
1411
|
+
'contentElementCls',
|
|
1412
|
+
'contextMenuTriggerEvent',
|
|
1413
|
+
'crudManager',
|
|
1414
|
+
'crudManagerClass',
|
|
1415
|
+
'dataField',
|
|
1416
|
+
'dataset',
|
|
1417
|
+
'date',
|
|
1418
|
+
'dateFormat',
|
|
1419
|
+
'datePicker',
|
|
1420
|
+
'defaultBindProperty',
|
|
1421
|
+
'defaultCalendar',
|
|
1422
|
+
'defaultFocus',
|
|
1423
|
+
'defaults',
|
|
1424
|
+
'deselectAllOnScheduleClick',
|
|
1425
|
+
'deselectOnClick',
|
|
1426
|
+
'destroyStores',
|
|
1427
|
+
'detectCSSCompatibilityIssues',
|
|
1428
|
+
'disabled',
|
|
1429
|
+
'dock',
|
|
1430
|
+
'draggable',
|
|
1431
|
+
'drawer',
|
|
1432
|
+
'elementAttributes',
|
|
1433
|
+
'enableDeleteKey',
|
|
1434
|
+
'enableRecurringEvents',
|
|
1435
|
+
'enableUndoRedoKeys',
|
|
1436
|
+
'events',
|
|
1437
|
+
'eventSelectionDisabled',
|
|
1438
|
+
'eventStore',
|
|
1439
|
+
'extraData',
|
|
1440
|
+
'filterEventResources',
|
|
1441
|
+
'flex',
|
|
1442
|
+
'floating',
|
|
1443
|
+
'footer',
|
|
1444
|
+
'header',
|
|
1445
|
+
'height',
|
|
1446
|
+
'hidden',
|
|
1447
|
+
'hideAnimation',
|
|
1448
|
+
'hideNonWorkingDays',
|
|
1449
|
+
'hideWhenEmpty',
|
|
1450
|
+
'highlightDate',
|
|
1451
|
+
'highlightPredecessors',
|
|
1452
|
+
'highlightSuccessors',
|
|
1453
|
+
'icon',
|
|
1454
|
+
'id',
|
|
1455
|
+
'ignoreParentReadOnly',
|
|
1456
|
+
'includeWeekendsButton',
|
|
1457
|
+
'inputFieldAlign',
|
|
1458
|
+
'insertBefore',
|
|
1459
|
+
'insertFirst',
|
|
1460
|
+
'isEventSelectable',
|
|
1461
|
+
'itemCls',
|
|
1462
|
+
'items',
|
|
1463
|
+
'keyMap',
|
|
1464
|
+
'labelPosition',
|
|
1465
|
+
'layout',
|
|
1466
|
+
'layoutStyle',
|
|
1467
|
+
'lazyItems',
|
|
1468
|
+
'listeners',
|
|
1469
|
+
'loadMask',
|
|
1470
|
+
'loadMaskDefaults',
|
|
1471
|
+
'loadMaskError',
|
|
1472
|
+
'localeClass',
|
|
1473
|
+
'localizable',
|
|
1474
|
+
'localizableProperties',
|
|
1475
|
+
'maintainSelectionOnDatasetChange',
|
|
1476
|
+
'margin',
|
|
1477
|
+
'maskDefaults',
|
|
1478
|
+
'masked',
|
|
1479
|
+
'maxDate',
|
|
1480
|
+
'maxHeight',
|
|
1481
|
+
'maximizeOnMobile',
|
|
1482
|
+
'maxWidth',
|
|
1483
|
+
'minDate',
|
|
1484
|
+
'minHeight',
|
|
1485
|
+
'minWidth',
|
|
1486
|
+
'mode',
|
|
1487
|
+
'modeDefaults',
|
|
1488
|
+
'modes',
|
|
1489
|
+
'monitorResize',
|
|
1490
|
+
'multiEventSelect',
|
|
1491
|
+
'namedItems',
|
|
1492
|
+
'navigatorPlacement',
|
|
1493
|
+
'nonWorkingDays',
|
|
1494
|
+
'overlaySidebar',
|
|
1495
|
+
'owner',
|
|
1496
|
+
'positioned',
|
|
1497
|
+
'preventTooltipOnTouch',
|
|
1498
|
+
'project',
|
|
1499
|
+
'propagatedConfigs',
|
|
1500
|
+
'readOnly',
|
|
1501
|
+
'recurrenceConfirmationPopup',
|
|
1502
|
+
'relayStoreEvents',
|
|
1503
|
+
'rendition',
|
|
1504
|
+
'resourceImagePath',
|
|
1505
|
+
'resources',
|
|
1506
|
+
'resourceStore',
|
|
1507
|
+
'resourceTimeRanges',
|
|
1508
|
+
'resourceTimeRangeStore',
|
|
1509
|
+
'responsive',
|
|
1510
|
+
'responsiveRoot',
|
|
1511
|
+
'responsiveState',
|
|
1512
|
+
'responsiveTarget',
|
|
1513
|
+
'ripple',
|
|
1514
|
+
'rootElement',
|
|
1515
|
+
'rtl',
|
|
1516
|
+
'scrollable',
|
|
1517
|
+
'scrollAction',
|
|
1518
|
+
'selectResourceOnEventNavigate',
|
|
1519
|
+
'selectResourceOnScheduleClick',
|
|
1520
|
+
'showAnimation',
|
|
1521
|
+
'showRecurringUI',
|
|
1522
|
+
'showTooltipWhenDisabled',
|
|
1523
|
+
'sidebar',
|
|
1524
|
+
'span',
|
|
1525
|
+
'stateful',
|
|
1526
|
+
'statefulEvents',
|
|
1527
|
+
'stateId',
|
|
1528
|
+
'stateProvider',
|
|
1529
|
+
'strictRecordMapping',
|
|
1530
|
+
'strips',
|
|
1531
|
+
'syncMask',
|
|
1532
|
+
'tab',
|
|
1533
|
+
'tabBarItems',
|
|
1534
|
+
'tag',
|
|
1535
|
+
'tbar',
|
|
1536
|
+
'textAlign',
|
|
1537
|
+
'timeRanges',
|
|
1538
|
+
'timeRangeStore',
|
|
1539
|
+
'timeZone',
|
|
1540
|
+
'title',
|
|
1541
|
+
'tools',
|
|
1542
|
+
'tooltip',
|
|
1543
|
+
'trapFocus',
|
|
1544
|
+
'triggerSelectionChangeOnRemove',
|
|
1545
|
+
'type',
|
|
1546
|
+
'ui',
|
|
1547
|
+
'useContextualRecurrenceRules',
|
|
1548
|
+
'viewContainer',
|
|
1549
|
+
'weekStartDay',
|
|
1550
|
+
'weight',
|
|
1551
|
+
'width',
|
|
1552
|
+
'x',
|
|
1553
|
+
'y'
|
|
1554
|
+
]);
|
|
1555
|
+
BryntumCalendarComponent.bryntumConfigsOnly = [
|
|
1556
|
+
'adopt',
|
|
1557
|
+
'align',
|
|
1558
|
+
'anchor',
|
|
1559
|
+
'ariaDescription',
|
|
1560
|
+
'ariaLabel',
|
|
1561
|
+
'assignmentStore',
|
|
1562
|
+
'autoCreate',
|
|
1563
|
+
'bbar',
|
|
1564
|
+
'bodyCls',
|
|
1565
|
+
'bubbleEvents',
|
|
1566
|
+
'centered',
|
|
1567
|
+
'collapsible',
|
|
1568
|
+
'color',
|
|
1569
|
+
'config',
|
|
1570
|
+
'constrainTo',
|
|
1571
|
+
'contentElementCls',
|
|
1572
|
+
'contextMenuTriggerEvent',
|
|
1573
|
+
'crudManagerClass',
|
|
1574
|
+
'dataField',
|
|
1575
|
+
'datePicker',
|
|
1576
|
+
'defaultBindProperty',
|
|
1577
|
+
'defaultFocus',
|
|
1578
|
+
'defaults',
|
|
1579
|
+
'deselectOnClick',
|
|
1580
|
+
'destroyStores',
|
|
1581
|
+
'detectCSSCompatibilityIssues',
|
|
1582
|
+
'dock',
|
|
1583
|
+
'draggable',
|
|
1584
|
+
'drawer',
|
|
1585
|
+
'elementAttributes',
|
|
1586
|
+
'enableDeleteKey',
|
|
1587
|
+
'enableRecurringEvents',
|
|
1588
|
+
'enableUndoRedoKeys',
|
|
1589
|
+
'eventSelectionDisabled',
|
|
1590
|
+
'eventStore',
|
|
1591
|
+
'filterEventResources',
|
|
1592
|
+
'floating',
|
|
1593
|
+
'footer',
|
|
1594
|
+
'header',
|
|
1595
|
+
'hideAnimation',
|
|
1596
|
+
'hideWhenEmpty',
|
|
1597
|
+
'highlightDate',
|
|
1598
|
+
'highlightPredecessors',
|
|
1599
|
+
'highlightSuccessors',
|
|
1600
|
+
'icon',
|
|
1601
|
+
'ignoreParentReadOnly',
|
|
1602
|
+
'includeWeekendsButton',
|
|
1603
|
+
'itemCls',
|
|
1604
|
+
'lazyItems',
|
|
1605
|
+
'listeners',
|
|
1606
|
+
'loadMask',
|
|
1607
|
+
'loadMaskDefaults',
|
|
1608
|
+
'loadMaskError',
|
|
1609
|
+
'localeClass',
|
|
1610
|
+
'localizable',
|
|
1611
|
+
'localizableProperties',
|
|
1612
|
+
'maintainSelectionOnDatasetChange',
|
|
1613
|
+
'maskDefaults',
|
|
1614
|
+
'masked',
|
|
1615
|
+
'monitorResize',
|
|
1616
|
+
'multiEventSelect',
|
|
1617
|
+
'namedItems',
|
|
1618
|
+
'navigatorPlacement',
|
|
1619
|
+
'overlaySidebar',
|
|
1620
|
+
'owner',
|
|
1621
|
+
'positioned',
|
|
1622
|
+
'preventTooltipOnTouch',
|
|
1623
|
+
'propagatedConfigs',
|
|
1624
|
+
'relayStoreEvents',
|
|
1625
|
+
'resourceImagePath',
|
|
1626
|
+
'resourceStore',
|
|
1627
|
+
'resourceTimeRangeStore',
|
|
1628
|
+
'responsive',
|
|
1629
|
+
'responsiveRoot',
|
|
1630
|
+
'responsiveState',
|
|
1631
|
+
'responsiveTarget',
|
|
1632
|
+
'ripple',
|
|
1633
|
+
'rootElement',
|
|
1634
|
+
'scrollAction',
|
|
1635
|
+
'showAnimation',
|
|
1636
|
+
'showRecurringUI',
|
|
1637
|
+
'showTooltipWhenDisabled',
|
|
1638
|
+
'sidebar',
|
|
1639
|
+
'stateful',
|
|
1640
|
+
'statefulEvents',
|
|
1641
|
+
'stateId',
|
|
1642
|
+
'stateProvider',
|
|
1643
|
+
'strips',
|
|
1644
|
+
'syncMask',
|
|
1645
|
+
'tab',
|
|
1646
|
+
'tabBarItems',
|
|
1647
|
+
'tag',
|
|
1648
|
+
'tbar',
|
|
1649
|
+
'textAlign',
|
|
1650
|
+
'timeRangeStore',
|
|
1651
|
+
'timeZone',
|
|
1652
|
+
'trapFocus',
|
|
1653
|
+
'triggerSelectionChangeOnRemove',
|
|
1654
|
+
'type',
|
|
1655
|
+
'ui',
|
|
1656
|
+
'viewContainer',
|
|
1657
|
+
'weekStartDay',
|
|
1658
|
+
'weight'
|
|
1659
|
+
];
|
|
1660
|
+
BryntumCalendarComponent.bryntumProps = BryntumCalendarComponent.bryntumFeatureNames.concat([
|
|
1661
|
+
'activeDateCls',
|
|
1662
|
+
'activeSubView',
|
|
1663
|
+
'activeView',
|
|
1664
|
+
'alignSelf',
|
|
1665
|
+
'anchorSize',
|
|
1666
|
+
'appendTo',
|
|
1667
|
+
'assignments',
|
|
1668
|
+
'callOnFunctions',
|
|
1669
|
+
'catchEventHandlerExceptions',
|
|
1670
|
+
'cls',
|
|
1671
|
+
'collapsed',
|
|
1672
|
+
'column',
|
|
1673
|
+
'crudManager',
|
|
1674
|
+
'dataset',
|
|
1675
|
+
'date',
|
|
1676
|
+
'dateFormat',
|
|
1677
|
+
'defaultCalendar',
|
|
1678
|
+
'deselectAllOnScheduleClick',
|
|
1679
|
+
'disabled',
|
|
1680
|
+
'events',
|
|
1681
|
+
'extraData',
|
|
1682
|
+
'flex',
|
|
1683
|
+
'focusVisible',
|
|
1684
|
+
'hasChanges',
|
|
1685
|
+
'height',
|
|
1686
|
+
'hidden',
|
|
1687
|
+
'hideNonWorkingDays',
|
|
1688
|
+
'id',
|
|
1689
|
+
'inputFieldAlign',
|
|
1690
|
+
'insertBefore',
|
|
1691
|
+
'insertFirst',
|
|
1692
|
+
'isEngineReady',
|
|
1693
|
+
'isEventSelectable',
|
|
1694
|
+
'isSettingValues',
|
|
1695
|
+
'isValid',
|
|
1696
|
+
'items',
|
|
1697
|
+
'keyMap',
|
|
1698
|
+
'labelPosition',
|
|
1699
|
+
'layout',
|
|
1700
|
+
'layoutStyle',
|
|
1701
|
+
'margin',
|
|
1702
|
+
'maxDate',
|
|
1703
|
+
'maxHeight',
|
|
1704
|
+
'maximizeOnMobile',
|
|
1705
|
+
'maxWidth',
|
|
1706
|
+
'minDate',
|
|
1707
|
+
'minHeight',
|
|
1708
|
+
'minWidth',
|
|
1709
|
+
'mode',
|
|
1710
|
+
'modeDefaults',
|
|
1711
|
+
'modes',
|
|
1712
|
+
'nonWorkingDays',
|
|
1713
|
+
'parent',
|
|
1714
|
+
'project',
|
|
1715
|
+
'readOnly',
|
|
1716
|
+
'record',
|
|
1717
|
+
'recurrenceConfirmationPopup',
|
|
1718
|
+
'rendition',
|
|
1719
|
+
'resources',
|
|
1720
|
+
'resourceTimeRanges',
|
|
1721
|
+
'rtl',
|
|
1722
|
+
'scrollable',
|
|
1723
|
+
'selectedEvents',
|
|
1724
|
+
'selectResourceOnEventNavigate',
|
|
1725
|
+
'selectResourceOnScheduleClick',
|
|
1726
|
+
'span',
|
|
1727
|
+
'state',
|
|
1728
|
+
'strictRecordMapping',
|
|
1729
|
+
'timeRanges',
|
|
1730
|
+
'title',
|
|
1731
|
+
'tools',
|
|
1732
|
+
'tooltip',
|
|
1733
|
+
'useContextualRecurrenceRules',
|
|
1734
|
+
'values',
|
|
1735
|
+
'views',
|
|
1736
|
+
'width',
|
|
1737
|
+
'x',
|
|
1738
|
+
'y'
|
|
1739
|
+
]);
|
|
1740
|
+
BryntumCalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumCalendarComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1741
|
+
BryntumCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumCalendarComponent, selector: "bryntum-calendar", inputs: { adopt: "adopt", align: "align", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", assignmentStore: "assignmentStore", autoCreate: "autoCreate", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", centered: "centered", collapsible: "collapsible", color: "color", config: "config", constrainTo: "constrainTo", contentElementCls: "contentElementCls", contextMenuTriggerEvent: "contextMenuTriggerEvent", crudManagerClass: "crudManagerClass", dataField: "dataField", datePicker: "datePicker", defaultBindProperty: "defaultBindProperty", defaultFocus: "defaultFocus", defaults: "defaults", deselectOnClick: "deselectOnClick", destroyStores: "destroyStores", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", dock: "dock", draggable: "draggable", drawer: "drawer", elementAttributes: "elementAttributes", enableDeleteKey: "enableDeleteKey", enableRecurringEvents: "enableRecurringEvents", enableUndoRedoKeys: "enableUndoRedoKeys", eventSelectionDisabled: "eventSelectionDisabled", eventStore: "eventStore", filterEventResources: "filterEventResources", floating: "floating", footer: "footer", header: "header", hideAnimation: "hideAnimation", hideWhenEmpty: "hideWhenEmpty", highlightDate: "highlightDate", highlightPredecessors: "highlightPredecessors", highlightSuccessors: "highlightSuccessors", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", includeWeekendsButton: "includeWeekendsButton", itemCls: "itemCls", lazyItems: "lazyItems", listeners: "listeners", loadMask: "loadMask", loadMaskDefaults: "loadMaskDefaults", loadMaskError: "loadMaskError", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maintainSelectionOnDatasetChange: "maintainSelectionOnDatasetChange", maskDefaults: "maskDefaults", masked: "masked", monitorResize: "monitorResize", multiEventSelect: "multiEventSelect", namedItems: "namedItems", navigatorPlacement: "navigatorPlacement", overlaySidebar: "overlaySidebar", owner: "owner", positioned: "positioned", preventTooltipOnTouch: "preventTooltipOnTouch", propagatedConfigs: "propagatedConfigs", relayStoreEvents: "relayStoreEvents", resourceImagePath: "resourceImagePath", resourceStore: "resourceStore", resourceTimeRangeStore: "resourceTimeRangeStore", responsive: "responsive", responsiveRoot: "responsiveRoot", responsiveState: "responsiveState", responsiveTarget: "responsiveTarget", ripple: "ripple", rootElement: "rootElement", scrollAction: "scrollAction", showAnimation: "showAnimation", showRecurringUI: "showRecurringUI", showTooltipWhenDisabled: "showTooltipWhenDisabled", sidebar: "sidebar", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", strips: "strips", syncMask: "syncMask", tab: "tab", tabBarItems: "tabBarItems", tag: "tag", tbar: "tbar", textAlign: "textAlign", timeRangeStore: "timeRangeStore", timeZone: "timeZone", trapFocus: "trapFocus", triggerSelectionChangeOnRemove: "triggerSelectionChangeOnRemove", type: "type", ui: "ui", viewContainer: "viewContainer", weekStartDay: "weekStartDay", weight: "weight", activeDateCls: "activeDateCls", alignSelf: "alignSelf", appendTo: "appendTo", assignments: "assignments", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", collapsed: "collapsed", column: "column", crudManager: "crudManager", dataset: "dataset", date: "date", dateFormat: "dateFormat", defaultCalendar: "defaultCalendar", deselectAllOnScheduleClick: "deselectAllOnScheduleClick", disabled: "disabled", events: "events", extraData: "extraData", flex: "flex", height: "height", hidden: "hidden", hideNonWorkingDays: "hideNonWorkingDays", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", isEventSelectable: "isEventSelectable", items: "items", keyMap: "keyMap", labelPosition: "labelPosition", layout: "layout", layoutStyle: "layoutStyle", margin: "margin", maxDate: "maxDate", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minDate: "minDate", minHeight: "minHeight", minWidth: "minWidth", mode: "mode", modeDefaults: "modeDefaults", modes: "modes", nonWorkingDays: "nonWorkingDays", project: "project", readOnly: "readOnly", recurrenceConfirmationPopup: "recurrenceConfirmationPopup", rendition: "rendition", resources: "resources", resourceTimeRanges: "resourceTimeRanges", rtl: "rtl", scrollable: "scrollable", selectResourceOnEventNavigate: "selectResourceOnEventNavigate", selectResourceOnScheduleClick: "selectResourceOnScheduleClick", span: "span", strictRecordMapping: "strictRecordMapping", timeRanges: "timeRanges", title: "title", tools: "tools", tooltip: "tooltip", useContextualRecurrenceRules: "useContextualRecurrenceRules", width: "width", x: "x", y: "y", activeSubView: "activeSubView", activeView: "activeView", anchorSize: "anchorSize", focusVisible: "focusVisible", hasChanges: "hasChanges", isEngineReady: "isEngineReady", isSettingValues: "isSettingValues", isValid: "isValid", parent: "parent", record: "record", selectedEvents: "selectedEvents", state: "state", values: "values", views: "views", dragFeature: "dragFeature", eventBufferFeature: "eventBufferFeature", eventCopyPasteFeature: "eventCopyPasteFeature", eventEditFeature: "eventEditFeature", eventMenuFeature: "eventMenuFeature", eventTooltipFeature: "eventTooltipFeature", excelExporterFeature: "excelExporterFeature", externalEventSourceFeature: "externalEventSourceFeature", loadOnDemandFeature: "loadOnDemandFeature", printFeature: "printFeature", scheduleMenuFeature: "scheduleMenuFeature", scheduleTooltipFeature: "scheduleTooltipFeature", timeRangesFeature: "timeRangesFeature", weekExpanderFeature: "weekExpanderFeature" }, outputs: { onActiveItemChange: "onActiveItemChange", onAfterEventEdit: "onAfterEventEdit", onAfterEventSave: "onAfterEventSave", onBeforeActiveItemChange: "onBeforeActiveItemChange", onBeforeAssignmentDelete: "onBeforeAssignmentDelete", onBeforeAssignmentSelectionChange: "onBeforeAssignmentSelectionChange", onBeforeAutoCreate: "onBeforeAutoCreate", onBeforeCopy: "onBeforeCopy", onBeforeCreateMode: "onBeforeCreateMode", onBeforeCSVExport: "onBeforeCSVExport", onBeforeDestroy: "onBeforeDestroy", onBeforeDragCreate: "onBeforeDragCreate", onBeforeDragCreateEnd: "onBeforeDragCreateEnd", onBeforeDragMove: "onBeforeDragMove", onBeforeDragMoveEnd: "onBeforeDragMoveEnd", onBeforeDragResize: "onBeforeDragResize", onBeforeDragResizeEnd: "onBeforeDragResizeEnd", onBeforeDropExternal: "onBeforeDropExternal", onBeforeEventDelete: "onBeforeEventDelete", onBeforeEventEdit: "onBeforeEventEdit", onBeforeEventEditShow: "onBeforeEventEditShow", onBeforeEventSave: "onBeforeEventSave", onBeforeEventSelectionChange: "onBeforeEventSelectionChange", onBeforeExcelExport: "onBeforeExcelExport", onBeforeHide: "onBeforeHide", onBeforePaste: "onBeforePaste", onBeforePrint: "onBeforePrint", onBeforeResponsiveStateChange: "onBeforeResponsiveStateChange", onBeforeSetRecord: "onBeforeSetRecord", onBeforeShow: "onBeforeShow", onBeforeStateApply: "onBeforeStateApply", onBeforeStateSave: "onBeforeStateSave", onCatchAll: "onCatchAll", onCellOverflowClick: "onCellOverflowClick", onCollapse: "onCollapse", onContextMenuItem: "onContextMenuItem", onContextMenuToggleItem: "onContextMenuToggleItem", onCopy: "onCopy", onCurrentTimelineUpdate: "onCurrentTimelineUpdate", onDataChange: "onDataChange", onDateChange: "onDateChange", onDateRangeChange: "onDateRangeChange", onDateRangeLoad: "onDateRangeLoad", onDateRangeRequested: "onDateRangeRequested", onDayCellPopulated: "onDayCellPopulated", onDayNumberClick: "onDayNumberClick", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onDragCreateEnd: "onDragCreateEnd", onDragMoveEnd: "onDragMoveEnd", onDragMoveExternal: "onDragMoveExternal", onDragResizeEnd: "onDragResizeEnd", onDropExternal: "onDropExternal", onElementCreated: "onElementCreated", onEmptyCellClick: "onEmptyCellClick", onEventAutoCreated: "onEventAutoCreated", onEventClick: "onEventClick", onEventContextMenu: "onEventContextMenu", onEventDblClick: "onEventDblClick", onEventEditBeforeSetRecord: "onEventEditBeforeSetRecord", onEventKeyDown: "onEventKeyDown", onEventMenuBeforeShow: "onEventMenuBeforeShow", onEventMenuItem: "onEventMenuItem", onEventMenuShow: "onEventMenuShow", onEventMouseDown: "onEventMouseDown", onEventMouseEnter: "onEventMouseEnter", onEventMouseLeave: "onEventMouseLeave", onEventMouseOut: "onEventMouseOut", onEventMouseOver: "onEventMouseOver", onEventMouseUp: "onEventMouseUp", onEventPropagate: "onEventPropagate", onExpand: "onExpand", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onLoadOnDemandFail: "onLoadOnDemandFail", onMonthNameClick: "onMonthNameClick", onNavigate: "onNavigate", onPaint: "onPaint", onPaste: "onPaste", onPasteNotAllowed: "onPasteNotAllowed", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRefresh: "onRefresh", onResize: "onResize", onResourceClick: "onResourceClick", onResponsiveStateChange: "onResponsiveStateChange", onScheduleClick: "onScheduleClick", onScheduleContextMenu: "onScheduleContextMenu", onScheduleDblClick: "onScheduleDblClick", onScheduleMenuBeforeShow: "onScheduleMenuBeforeShow", onScheduleMenuItem: "onScheduleMenuItem", onScheduleMenuShow: "onScheduleMenuShow", onScheduleMouseDown: "onScheduleMouseDown", onScheduleMouseOut: "onScheduleMouseOut", onScheduleMouseOver: "onScheduleMouseOver", onScheduleMouseUp: "onScheduleMouseUp", onSelectionChange: "onSelectionChange", onShow: "onShow", onSidebarCollapse: "onSidebarCollapse", onSidebarExpand: "onSidebarExpand", onTimeAxisClick: "onTimeAxisClick", onTimeRangeHeaderClick: "onTimeRangeHeaderClick", onTimeRangeHeaderContextMenu: "onTimeRangeHeaderContextMenu", onTimeRangeHeaderDblClick: "onTimeRangeHeaderDblClick", onToolClick: "onToolClick", onViewPaint: "onViewPaint", onWeekNumberClick: "onWeekNumberClick" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
|
|
1742
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumCalendarComponent, decorators: [{
|
|
1743
|
+
type: Component,
|
|
1744
|
+
args: [{
|
|
1745
|
+
selector: 'bryntum-calendar',
|
|
1746
|
+
template: ''
|
|
1747
|
+
}]
|
|
1748
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { adopt: [{
|
|
1749
|
+
type: Input
|
|
1750
|
+
}], align: [{
|
|
1751
|
+
type: Input
|
|
1752
|
+
}], anchor: [{
|
|
1753
|
+
type: Input
|
|
1754
|
+
}], ariaDescription: [{
|
|
1755
|
+
type: Input
|
|
1756
|
+
}], ariaLabel: [{
|
|
1757
|
+
type: Input
|
|
1758
|
+
}], assignmentStore: [{
|
|
1759
|
+
type: Input
|
|
1760
|
+
}], autoCreate: [{
|
|
1761
|
+
type: Input
|
|
1762
|
+
}], bbar: [{
|
|
1763
|
+
type: Input
|
|
1764
|
+
}], bodyCls: [{
|
|
1765
|
+
type: Input
|
|
1766
|
+
}], bubbleEvents: [{
|
|
1767
|
+
type: Input
|
|
1768
|
+
}], centered: [{
|
|
1769
|
+
type: Input
|
|
1770
|
+
}], collapsible: [{
|
|
1771
|
+
type: Input
|
|
1772
|
+
}], color: [{
|
|
1773
|
+
type: Input
|
|
1774
|
+
}], config: [{
|
|
1775
|
+
type: Input
|
|
1776
|
+
}], constrainTo: [{
|
|
1777
|
+
type: Input
|
|
1778
|
+
}], contentElementCls: [{
|
|
1779
|
+
type: Input
|
|
1780
|
+
}], contextMenuTriggerEvent: [{
|
|
1781
|
+
type: Input
|
|
1782
|
+
}], crudManagerClass: [{
|
|
1783
|
+
type: Input
|
|
1784
|
+
}], dataField: [{
|
|
1785
|
+
type: Input
|
|
1786
|
+
}], datePicker: [{
|
|
1787
|
+
type: Input
|
|
1788
|
+
}], defaultBindProperty: [{
|
|
1789
|
+
type: Input
|
|
1790
|
+
}], defaultFocus: [{
|
|
1791
|
+
type: Input
|
|
1792
|
+
}], defaults: [{
|
|
1793
|
+
type: Input
|
|
1794
|
+
}], deselectOnClick: [{
|
|
1795
|
+
type: Input
|
|
1796
|
+
}], destroyStores: [{
|
|
1797
|
+
type: Input
|
|
1798
|
+
}], detectCSSCompatibilityIssues: [{
|
|
1799
|
+
type: Input
|
|
1800
|
+
}], dock: [{
|
|
1801
|
+
type: Input
|
|
1802
|
+
}], draggable: [{
|
|
1803
|
+
type: Input
|
|
1804
|
+
}], drawer: [{
|
|
1805
|
+
type: Input
|
|
1806
|
+
}], elementAttributes: [{
|
|
1807
|
+
type: Input
|
|
1808
|
+
}], enableDeleteKey: [{
|
|
1809
|
+
type: Input
|
|
1810
|
+
}], enableRecurringEvents: [{
|
|
1811
|
+
type: Input
|
|
1812
|
+
}], enableUndoRedoKeys: [{
|
|
1813
|
+
type: Input
|
|
1814
|
+
}], eventSelectionDisabled: [{
|
|
1815
|
+
type: Input
|
|
1816
|
+
}], eventStore: [{
|
|
1817
|
+
type: Input
|
|
1818
|
+
}], filterEventResources: [{
|
|
1819
|
+
type: Input
|
|
1820
|
+
}], floating: [{
|
|
1821
|
+
type: Input
|
|
1822
|
+
}], footer: [{
|
|
1823
|
+
type: Input
|
|
1824
|
+
}], header: [{
|
|
1825
|
+
type: Input
|
|
1826
|
+
}], hideAnimation: [{
|
|
1827
|
+
type: Input
|
|
1828
|
+
}], hideWhenEmpty: [{
|
|
1829
|
+
type: Input
|
|
1830
|
+
}], highlightDate: [{
|
|
1831
|
+
type: Input
|
|
1832
|
+
}], highlightPredecessors: [{
|
|
1833
|
+
type: Input
|
|
1834
|
+
}], highlightSuccessors: [{
|
|
1835
|
+
type: Input
|
|
1836
|
+
}], icon: [{
|
|
1837
|
+
type: Input
|
|
1838
|
+
}], ignoreParentReadOnly: [{
|
|
1839
|
+
type: Input
|
|
1840
|
+
}], includeWeekendsButton: [{
|
|
1841
|
+
type: Input
|
|
1842
|
+
}], itemCls: [{
|
|
1843
|
+
type: Input
|
|
1844
|
+
}], lazyItems: [{
|
|
1845
|
+
type: Input
|
|
1846
|
+
}], listeners: [{
|
|
1847
|
+
type: Input
|
|
1848
|
+
}], loadMask: [{
|
|
1849
|
+
type: Input
|
|
1850
|
+
}], loadMaskDefaults: [{
|
|
1851
|
+
type: Input
|
|
1852
|
+
}], loadMaskError: [{
|
|
1853
|
+
type: Input
|
|
1854
|
+
}], localeClass: [{
|
|
1855
|
+
type: Input
|
|
1856
|
+
}], localizable: [{
|
|
1857
|
+
type: Input
|
|
1858
|
+
}], localizableProperties: [{
|
|
1859
|
+
type: Input
|
|
1860
|
+
}], maintainSelectionOnDatasetChange: [{
|
|
1861
|
+
type: Input
|
|
1862
|
+
}], maskDefaults: [{
|
|
1863
|
+
type: Input
|
|
1864
|
+
}], masked: [{
|
|
1865
|
+
type: Input
|
|
1866
|
+
}], monitorResize: [{
|
|
1867
|
+
type: Input
|
|
1868
|
+
}], multiEventSelect: [{
|
|
1869
|
+
type: Input
|
|
1870
|
+
}], namedItems: [{
|
|
1871
|
+
type: Input
|
|
1872
|
+
}], navigatorPlacement: [{
|
|
1873
|
+
type: Input
|
|
1874
|
+
}], overlaySidebar: [{
|
|
1875
|
+
type: Input
|
|
1876
|
+
}], owner: [{
|
|
1877
|
+
type: Input
|
|
1878
|
+
}], positioned: [{
|
|
1879
|
+
type: Input
|
|
1880
|
+
}], preventTooltipOnTouch: [{
|
|
1881
|
+
type: Input
|
|
1882
|
+
}], propagatedConfigs: [{
|
|
1883
|
+
type: Input
|
|
1884
|
+
}], relayStoreEvents: [{
|
|
1885
|
+
type: Input
|
|
1886
|
+
}], resourceImagePath: [{
|
|
1887
|
+
type: Input
|
|
1888
|
+
}], resourceStore: [{
|
|
1889
|
+
type: Input
|
|
1890
|
+
}], resourceTimeRangeStore: [{
|
|
1891
|
+
type: Input
|
|
1892
|
+
}], responsive: [{
|
|
1893
|
+
type: Input
|
|
1894
|
+
}], responsiveRoot: [{
|
|
1895
|
+
type: Input
|
|
1896
|
+
}], responsiveState: [{
|
|
1897
|
+
type: Input
|
|
1898
|
+
}], responsiveTarget: [{
|
|
1899
|
+
type: Input
|
|
1900
|
+
}], ripple: [{
|
|
1901
|
+
type: Input
|
|
1902
|
+
}], rootElement: [{
|
|
1903
|
+
type: Input
|
|
1904
|
+
}], scrollAction: [{
|
|
1905
|
+
type: Input
|
|
1906
|
+
}], showAnimation: [{
|
|
1907
|
+
type: Input
|
|
1908
|
+
}], showRecurringUI: [{
|
|
1909
|
+
type: Input
|
|
1910
|
+
}], showTooltipWhenDisabled: [{
|
|
1911
|
+
type: Input
|
|
1912
|
+
}], sidebar: [{
|
|
1913
|
+
type: Input
|
|
1914
|
+
}], stateful: [{
|
|
1915
|
+
type: Input
|
|
1916
|
+
}], statefulEvents: [{
|
|
1917
|
+
type: Input
|
|
1918
|
+
}], stateId: [{
|
|
1919
|
+
type: Input
|
|
1920
|
+
}], stateProvider: [{
|
|
1921
|
+
type: Input
|
|
1922
|
+
}], strips: [{
|
|
1923
|
+
type: Input
|
|
1924
|
+
}], syncMask: [{
|
|
1925
|
+
type: Input
|
|
1926
|
+
}], tab: [{
|
|
1927
|
+
type: Input
|
|
1928
|
+
}], tabBarItems: [{
|
|
1929
|
+
type: Input
|
|
1930
|
+
}], tag: [{
|
|
1931
|
+
type: Input
|
|
1932
|
+
}], tbar: [{
|
|
1933
|
+
type: Input
|
|
1934
|
+
}], textAlign: [{
|
|
1935
|
+
type: Input
|
|
1936
|
+
}], timeRangeStore: [{
|
|
1937
|
+
type: Input
|
|
1938
|
+
}], timeZone: [{
|
|
1939
|
+
type: Input
|
|
1940
|
+
}], trapFocus: [{
|
|
1941
|
+
type: Input
|
|
1942
|
+
}], triggerSelectionChangeOnRemove: [{
|
|
1943
|
+
type: Input
|
|
1944
|
+
}], type: [{
|
|
1945
|
+
type: Input
|
|
1946
|
+
}], ui: [{
|
|
1947
|
+
type: Input
|
|
1948
|
+
}], viewContainer: [{
|
|
1949
|
+
type: Input
|
|
1950
|
+
}], weekStartDay: [{
|
|
1951
|
+
type: Input
|
|
1952
|
+
}], weight: [{
|
|
1953
|
+
type: Input
|
|
1954
|
+
}], activeDateCls: [{
|
|
1955
|
+
type: Input
|
|
1956
|
+
}], alignSelf: [{
|
|
1957
|
+
type: Input
|
|
1958
|
+
}], appendTo: [{
|
|
1959
|
+
type: Input
|
|
1960
|
+
}], assignments: [{
|
|
1961
|
+
type: Input
|
|
1962
|
+
}], callOnFunctions: [{
|
|
1963
|
+
type: Input
|
|
1964
|
+
}], catchEventHandlerExceptions: [{
|
|
1965
|
+
type: Input
|
|
1966
|
+
}], cls: [{
|
|
1967
|
+
type: Input
|
|
1968
|
+
}], collapsed: [{
|
|
1969
|
+
type: Input
|
|
1970
|
+
}], column: [{
|
|
1971
|
+
type: Input
|
|
1972
|
+
}], crudManager: [{
|
|
1973
|
+
type: Input
|
|
1974
|
+
}], dataset: [{
|
|
1975
|
+
type: Input
|
|
1976
|
+
}], date: [{
|
|
1977
|
+
type: Input
|
|
1978
|
+
}], dateFormat: [{
|
|
1979
|
+
type: Input
|
|
1980
|
+
}], defaultCalendar: [{
|
|
1981
|
+
type: Input
|
|
1982
|
+
}], deselectAllOnScheduleClick: [{
|
|
1983
|
+
type: Input
|
|
1984
|
+
}], disabled: [{
|
|
1985
|
+
type: Input
|
|
1986
|
+
}], events: [{
|
|
1987
|
+
type: Input
|
|
1988
|
+
}], extraData: [{
|
|
1989
|
+
type: Input
|
|
1990
|
+
}], flex: [{
|
|
1991
|
+
type: Input
|
|
1992
|
+
}], height: [{
|
|
1993
|
+
type: Input
|
|
1994
|
+
}], hidden: [{
|
|
1995
|
+
type: Input
|
|
1996
|
+
}], hideNonWorkingDays: [{
|
|
1997
|
+
type: Input
|
|
1998
|
+
}], id: [{
|
|
1999
|
+
type: Input
|
|
2000
|
+
}], inputFieldAlign: [{
|
|
2001
|
+
type: Input
|
|
2002
|
+
}], insertBefore: [{
|
|
2003
|
+
type: Input
|
|
2004
|
+
}], insertFirst: [{
|
|
2005
|
+
type: Input
|
|
2006
|
+
}], isEventSelectable: [{
|
|
2007
|
+
type: Input
|
|
2008
|
+
}], items: [{
|
|
2009
|
+
type: Input
|
|
2010
|
+
}], keyMap: [{
|
|
2011
|
+
type: Input
|
|
2012
|
+
}], labelPosition: [{
|
|
2013
|
+
type: Input
|
|
2014
|
+
}], layout: [{
|
|
2015
|
+
type: Input
|
|
2016
|
+
}], layoutStyle: [{
|
|
2017
|
+
type: Input
|
|
2018
|
+
}], margin: [{
|
|
2019
|
+
type: Input
|
|
2020
|
+
}], maxDate: [{
|
|
2021
|
+
type: Input
|
|
2022
|
+
}], maxHeight: [{
|
|
2023
|
+
type: Input
|
|
2024
|
+
}], maximizeOnMobile: [{
|
|
2025
|
+
type: Input
|
|
2026
|
+
}], maxWidth: [{
|
|
2027
|
+
type: Input
|
|
2028
|
+
}], minDate: [{
|
|
2029
|
+
type: Input
|
|
2030
|
+
}], minHeight: [{
|
|
2031
|
+
type: Input
|
|
2032
|
+
}], minWidth: [{
|
|
2033
|
+
type: Input
|
|
2034
|
+
}], mode: [{
|
|
2035
|
+
type: Input
|
|
2036
|
+
}], modeDefaults: [{
|
|
2037
|
+
type: Input
|
|
2038
|
+
}], modes: [{
|
|
2039
|
+
type: Input
|
|
2040
|
+
}], nonWorkingDays: [{
|
|
2041
|
+
type: Input
|
|
2042
|
+
}], project: [{
|
|
2043
|
+
type: Input
|
|
2044
|
+
}], readOnly: [{
|
|
2045
|
+
type: Input
|
|
2046
|
+
}], recurrenceConfirmationPopup: [{
|
|
2047
|
+
type: Input
|
|
2048
|
+
}], rendition: [{
|
|
2049
|
+
type: Input
|
|
2050
|
+
}], resources: [{
|
|
2051
|
+
type: Input
|
|
2052
|
+
}], resourceTimeRanges: [{
|
|
2053
|
+
type: Input
|
|
2054
|
+
}], rtl: [{
|
|
2055
|
+
type: Input
|
|
2056
|
+
}], scrollable: [{
|
|
2057
|
+
type: Input
|
|
2058
|
+
}], selectResourceOnEventNavigate: [{
|
|
2059
|
+
type: Input
|
|
2060
|
+
}], selectResourceOnScheduleClick: [{
|
|
2061
|
+
type: Input
|
|
2062
|
+
}], span: [{
|
|
2063
|
+
type: Input
|
|
2064
|
+
}], strictRecordMapping: [{
|
|
2065
|
+
type: Input
|
|
2066
|
+
}], timeRanges: [{
|
|
2067
|
+
type: Input
|
|
2068
|
+
}], title: [{
|
|
2069
|
+
type: Input
|
|
2070
|
+
}], tools: [{
|
|
2071
|
+
type: Input
|
|
2072
|
+
}], tooltip: [{
|
|
2073
|
+
type: Input
|
|
2074
|
+
}], useContextualRecurrenceRules: [{
|
|
2075
|
+
type: Input
|
|
2076
|
+
}], width: [{
|
|
2077
|
+
type: Input
|
|
2078
|
+
}], x: [{
|
|
2079
|
+
type: Input
|
|
2080
|
+
}], y: [{
|
|
2081
|
+
type: Input
|
|
2082
|
+
}], activeSubView: [{
|
|
2083
|
+
type: Input
|
|
2084
|
+
}], activeView: [{
|
|
2085
|
+
type: Input
|
|
2086
|
+
}], anchorSize: [{
|
|
2087
|
+
type: Input
|
|
2088
|
+
}], focusVisible: [{
|
|
2089
|
+
type: Input
|
|
2090
|
+
}], hasChanges: [{
|
|
2091
|
+
type: Input
|
|
2092
|
+
}], isEngineReady: [{
|
|
2093
|
+
type: Input
|
|
2094
|
+
}], isSettingValues: [{
|
|
2095
|
+
type: Input
|
|
2096
|
+
}], isValid: [{
|
|
2097
|
+
type: Input
|
|
2098
|
+
}], parent: [{
|
|
2099
|
+
type: Input
|
|
2100
|
+
}], record: [{
|
|
2101
|
+
type: Input
|
|
2102
|
+
}], selectedEvents: [{
|
|
2103
|
+
type: Input
|
|
2104
|
+
}], state: [{
|
|
2105
|
+
type: Input
|
|
2106
|
+
}], values: [{
|
|
2107
|
+
type: Input
|
|
2108
|
+
}], views: [{
|
|
2109
|
+
type: Input
|
|
2110
|
+
}], dragFeature: [{
|
|
2111
|
+
type: Input
|
|
2112
|
+
}], eventBufferFeature: [{
|
|
2113
|
+
type: Input
|
|
2114
|
+
}], eventCopyPasteFeature: [{
|
|
2115
|
+
type: Input
|
|
2116
|
+
}], eventEditFeature: [{
|
|
2117
|
+
type: Input
|
|
2118
|
+
}], eventMenuFeature: [{
|
|
2119
|
+
type: Input
|
|
2120
|
+
}], eventTooltipFeature: [{
|
|
2121
|
+
type: Input
|
|
2122
|
+
}], excelExporterFeature: [{
|
|
2123
|
+
type: Input
|
|
2124
|
+
}], externalEventSourceFeature: [{
|
|
2125
|
+
type: Input
|
|
2126
|
+
}], loadOnDemandFeature: [{
|
|
2127
|
+
type: Input
|
|
2128
|
+
}], printFeature: [{
|
|
2129
|
+
type: Input
|
|
2130
|
+
}], scheduleMenuFeature: [{
|
|
2131
|
+
type: Input
|
|
2132
|
+
}], scheduleTooltipFeature: [{
|
|
2133
|
+
type: Input
|
|
2134
|
+
}], timeRangesFeature: [{
|
|
2135
|
+
type: Input
|
|
2136
|
+
}], weekExpanderFeature: [{
|
|
2137
|
+
type: Input
|
|
2138
|
+
}], onActiveItemChange: [{
|
|
2139
|
+
type: Output
|
|
2140
|
+
}], onAfterEventEdit: [{
|
|
2141
|
+
type: Output
|
|
2142
|
+
}], onAfterEventSave: [{
|
|
2143
|
+
type: Output
|
|
2144
|
+
}], onBeforeActiveItemChange: [{
|
|
2145
|
+
type: Output
|
|
2146
|
+
}], onBeforeAssignmentDelete: [{
|
|
2147
|
+
type: Output
|
|
2148
|
+
}], onBeforeAssignmentSelectionChange: [{
|
|
2149
|
+
type: Output
|
|
2150
|
+
}], onBeforeAutoCreate: [{
|
|
2151
|
+
type: Output
|
|
2152
|
+
}], onBeforeCopy: [{
|
|
2153
|
+
type: Output
|
|
2154
|
+
}], onBeforeCreateMode: [{
|
|
2155
|
+
type: Output
|
|
2156
|
+
}], onBeforeCSVExport: [{
|
|
2157
|
+
type: Output
|
|
2158
|
+
}], onBeforeDestroy: [{
|
|
2159
|
+
type: Output
|
|
2160
|
+
}], onBeforeDragCreate: [{
|
|
2161
|
+
type: Output
|
|
2162
|
+
}], onBeforeDragCreateEnd: [{
|
|
2163
|
+
type: Output
|
|
2164
|
+
}], onBeforeDragMove: [{
|
|
2165
|
+
type: Output
|
|
2166
|
+
}], onBeforeDragMoveEnd: [{
|
|
2167
|
+
type: Output
|
|
2168
|
+
}], onBeforeDragResize: [{
|
|
2169
|
+
type: Output
|
|
2170
|
+
}], onBeforeDragResizeEnd: [{
|
|
2171
|
+
type: Output
|
|
2172
|
+
}], onBeforeDropExternal: [{
|
|
2173
|
+
type: Output
|
|
2174
|
+
}], onBeforeEventDelete: [{
|
|
2175
|
+
type: Output
|
|
2176
|
+
}], onBeforeEventEdit: [{
|
|
2177
|
+
type: Output
|
|
2178
|
+
}], onBeforeEventEditShow: [{
|
|
2179
|
+
type: Output
|
|
2180
|
+
}], onBeforeEventSave: [{
|
|
2181
|
+
type: Output
|
|
2182
|
+
}], onBeforeEventSelectionChange: [{
|
|
2183
|
+
type: Output
|
|
2184
|
+
}], onBeforeExcelExport: [{
|
|
2185
|
+
type: Output
|
|
2186
|
+
}], onBeforeHide: [{
|
|
2187
|
+
type: Output
|
|
2188
|
+
}], onBeforePaste: [{
|
|
2189
|
+
type: Output
|
|
2190
|
+
}], onBeforePrint: [{
|
|
2191
|
+
type: Output
|
|
2192
|
+
}], onBeforeResponsiveStateChange: [{
|
|
2193
|
+
type: Output
|
|
2194
|
+
}], onBeforeSetRecord: [{
|
|
2195
|
+
type: Output
|
|
2196
|
+
}], onBeforeShow: [{
|
|
2197
|
+
type: Output
|
|
2198
|
+
}], onBeforeStateApply: [{
|
|
2199
|
+
type: Output
|
|
2200
|
+
}], onBeforeStateSave: [{
|
|
2201
|
+
type: Output
|
|
2202
|
+
}], onCatchAll: [{
|
|
2203
|
+
type: Output
|
|
2204
|
+
}], onCellOverflowClick: [{
|
|
2205
|
+
type: Output
|
|
2206
|
+
}], onCollapse: [{
|
|
2207
|
+
type: Output
|
|
2208
|
+
}], onContextMenuItem: [{
|
|
2209
|
+
type: Output
|
|
2210
|
+
}], onContextMenuToggleItem: [{
|
|
2211
|
+
type: Output
|
|
2212
|
+
}], onCopy: [{
|
|
2213
|
+
type: Output
|
|
2214
|
+
}], onCurrentTimelineUpdate: [{
|
|
2215
|
+
type: Output
|
|
2216
|
+
}], onDataChange: [{
|
|
2217
|
+
type: Output
|
|
2218
|
+
}], onDateChange: [{
|
|
2219
|
+
type: Output
|
|
2220
|
+
}], onDateRangeChange: [{
|
|
2221
|
+
type: Output
|
|
2222
|
+
}], onDateRangeLoad: [{
|
|
2223
|
+
type: Output
|
|
2224
|
+
}], onDateRangeRequested: [{
|
|
2225
|
+
type: Output
|
|
2226
|
+
}], onDayCellPopulated: [{
|
|
2227
|
+
type: Output
|
|
2228
|
+
}], onDayNumberClick: [{
|
|
2229
|
+
type: Output
|
|
2230
|
+
}], onDestroy: [{
|
|
2231
|
+
type: Output
|
|
2232
|
+
}], onDirtyStateChange: [{
|
|
2233
|
+
type: Output
|
|
2234
|
+
}], onDragCreateEnd: [{
|
|
2235
|
+
type: Output
|
|
2236
|
+
}], onDragMoveEnd: [{
|
|
2237
|
+
type: Output
|
|
2238
|
+
}], onDragMoveExternal: [{
|
|
2239
|
+
type: Output
|
|
2240
|
+
}], onDragResizeEnd: [{
|
|
2241
|
+
type: Output
|
|
2242
|
+
}], onDropExternal: [{
|
|
2243
|
+
type: Output
|
|
2244
|
+
}], onElementCreated: [{
|
|
2245
|
+
type: Output
|
|
2246
|
+
}], onEmptyCellClick: [{
|
|
2247
|
+
type: Output
|
|
2248
|
+
}], onEventAutoCreated: [{
|
|
2249
|
+
type: Output
|
|
2250
|
+
}], onEventClick: [{
|
|
2251
|
+
type: Output
|
|
2252
|
+
}], onEventContextMenu: [{
|
|
2253
|
+
type: Output
|
|
2254
|
+
}], onEventDblClick: [{
|
|
2255
|
+
type: Output
|
|
2256
|
+
}], onEventEditBeforeSetRecord: [{
|
|
2257
|
+
type: Output
|
|
2258
|
+
}], onEventKeyDown: [{
|
|
2259
|
+
type: Output
|
|
2260
|
+
}], onEventMenuBeforeShow: [{
|
|
2261
|
+
type: Output
|
|
2262
|
+
}], onEventMenuItem: [{
|
|
2263
|
+
type: Output
|
|
2264
|
+
}], onEventMenuShow: [{
|
|
2265
|
+
type: Output
|
|
2266
|
+
}], onEventMouseDown: [{
|
|
2267
|
+
type: Output
|
|
2268
|
+
}], onEventMouseEnter: [{
|
|
2269
|
+
type: Output
|
|
2270
|
+
}], onEventMouseLeave: [{
|
|
2271
|
+
type: Output
|
|
2272
|
+
}], onEventMouseOut: [{
|
|
2273
|
+
type: Output
|
|
2274
|
+
}], onEventMouseOver: [{
|
|
2275
|
+
type: Output
|
|
2276
|
+
}], onEventMouseUp: [{
|
|
2277
|
+
type: Output
|
|
2278
|
+
}], onEventPropagate: [{
|
|
2279
|
+
type: Output
|
|
2280
|
+
}], onExpand: [{
|
|
2281
|
+
type: Output
|
|
2282
|
+
}], onFocusIn: [{
|
|
2283
|
+
type: Output
|
|
2284
|
+
}], onFocusOut: [{
|
|
2285
|
+
type: Output
|
|
2286
|
+
}], onHide: [{
|
|
2287
|
+
type: Output
|
|
2288
|
+
}], onLoadOnDemandFail: [{
|
|
2289
|
+
type: Output
|
|
2290
|
+
}], onMonthNameClick: [{
|
|
2291
|
+
type: Output
|
|
2292
|
+
}], onNavigate: [{
|
|
2293
|
+
type: Output
|
|
2294
|
+
}], onPaint: [{
|
|
2295
|
+
type: Output
|
|
2296
|
+
}], onPaste: [{
|
|
2297
|
+
type: Output
|
|
2298
|
+
}], onPasteNotAllowed: [{
|
|
2299
|
+
type: Output
|
|
2300
|
+
}], onReadOnly: [{
|
|
2301
|
+
type: Output
|
|
2302
|
+
}], onRecompose: [{
|
|
2303
|
+
type: Output
|
|
2304
|
+
}], onRefresh: [{
|
|
2305
|
+
type: Output
|
|
2306
|
+
}], onResize: [{
|
|
2307
|
+
type: Output
|
|
2308
|
+
}], onResourceClick: [{
|
|
2309
|
+
type: Output
|
|
2310
|
+
}], onResponsiveStateChange: [{
|
|
2311
|
+
type: Output
|
|
2312
|
+
}], onScheduleClick: [{
|
|
2313
|
+
type: Output
|
|
2314
|
+
}], onScheduleContextMenu: [{
|
|
2315
|
+
type: Output
|
|
2316
|
+
}], onScheduleDblClick: [{
|
|
2317
|
+
type: Output
|
|
2318
|
+
}], onScheduleMenuBeforeShow: [{
|
|
2319
|
+
type: Output
|
|
2320
|
+
}], onScheduleMenuItem: [{
|
|
2321
|
+
type: Output
|
|
2322
|
+
}], onScheduleMenuShow: [{
|
|
2323
|
+
type: Output
|
|
2324
|
+
}], onScheduleMouseDown: [{
|
|
2325
|
+
type: Output
|
|
2326
|
+
}], onScheduleMouseOut: [{
|
|
2327
|
+
type: Output
|
|
2328
|
+
}], onScheduleMouseOver: [{
|
|
2329
|
+
type: Output
|
|
2330
|
+
}], onScheduleMouseUp: [{
|
|
2331
|
+
type: Output
|
|
2332
|
+
}], onSelectionChange: [{
|
|
2333
|
+
type: Output
|
|
2334
|
+
}], onShow: [{
|
|
2335
|
+
type: Output
|
|
2336
|
+
}], onSidebarCollapse: [{
|
|
2337
|
+
type: Output
|
|
2338
|
+
}], onSidebarExpand: [{
|
|
2339
|
+
type: Output
|
|
2340
|
+
}], onTimeAxisClick: [{
|
|
2341
|
+
type: Output
|
|
2342
|
+
}], onTimeRangeHeaderClick: [{
|
|
2343
|
+
type: Output
|
|
2344
|
+
}], onTimeRangeHeaderContextMenu: [{
|
|
2345
|
+
type: Output
|
|
2346
|
+
}], onTimeRangeHeaderDblClick: [{
|
|
2347
|
+
type: Output
|
|
2348
|
+
}], onToolClick: [{
|
|
2349
|
+
type: Output
|
|
2350
|
+
}], onViewPaint: [{
|
|
2351
|
+
type: Output
|
|
2352
|
+
}], onWeekNumberClick: [{
|
|
2353
|
+
type: Output
|
|
2354
|
+
}] } });
|
|
2355
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnQvc3JjL2xpYi9icnludHVtLWNhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzREFBc0Q7QUFDdEQ7O0dBRUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrRCxNQUFNLGVBQWUsQ0FBQztBQUVuSSxPQUFPLGFBQWEsTUFBTSxrQkFBa0IsQ0FBQztBQUU3QyxPQUFPLEVBQTZiLE1BQU0sRUFBZ0IsTUFBTSxvQkFBb0IsQ0FBQztBQUdyZixPQUFPLEVBQW9CLFFBQVEsRUFBKzdCLE1BQU0sd0JBQXdCLENBQUM7QUFFamdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFxbkNsRCxNQUFNLE9BQU8sd0JBQXdCO0lBdWZqQyxZQUFZLE9BQW1CO1FBVHZCLGtCQUFhLEdBQUc7WUFDcEIsS0FBSyxFQUFjLFNBQVM7WUFDNUIsUUFBUSxFQUFXLFNBQVM7WUFDNUIsSUFBSSxFQUFlLFNBQVM7WUFDNUIsZ0JBQWdCLEVBQUcsSUFBSTtZQUN2QixRQUFRLEVBQVcsRUFBRTtZQUNyQixTQUFTLEVBQVUsRUFBRTtTQUN4QixDQUFDO1FBME9GLGtCQUFrQjtRQUNsQjs7Ozs7Ozs7V0FRRztRQUNPLHVCQUFrQixHQUFRLElBQUksWUFBWSxFQUFtSSxDQUFDO1FBQ3hMOzs7Ozs7Ozs7O1dBVUc7UUFDTyxxQkFBZ0IsR0FBUSxJQUFJLFlBQVksRUFBc04sQ0FBQztRQUN6UTs7Ozs7V0FLRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFBWSxFQUE0RSxDQUFDO1FBQy9IOzs7Ozs7V0FNRztRQUNPLDZCQUF3QixHQUFRLElBQUksWUFBWSxFQUFtSSxDQUFDO1FBQzlMOzs7Ozs7Ozs7Ozs7V0FZRztRQUNPLDZCQUF3QixHQUFRLElB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QUFNO2dCQU1HLFNBQVM7c0JBQWxCLE1BQU07Z0JBVUcsUUFBUTtzQkFBakIsTUFBTTtnQkFlRyxlQUFlO3NCQUF4QixNQUFNO2dCQVFHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFTRyxlQUFlO3NCQUF4QixNQUFNO2dCQVNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFTRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBYUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQVVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFXRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBU0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQVNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFTRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBU0csaUJBQWlCO3NCQUExQixNQUFNO2dCQVVHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBTUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQU1HLGVBQWU7c0JBQXhCLE1BQU07Z0JBVUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFRRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBUUcsNEJBQTRCO3NCQUFyQyxNQUFNO2dCQVFHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFPRyxXQUFXO3NCQUFwQixNQUFNO2dCQVNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBYUcsaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBmb3IgQnJ5bnR1bSBDYWxlbmRhclxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCBXcmFwcGVySGVscGVyIGZyb20gJy4vd3JhcHBlci5oZWxwZXInO1xuXG5pbXBvcnQgeyBBbGlnblNwZWMsIEJhc2UsIEJ1dHRvbkNvbmZpZywgQ29udGFpbmVyLCBDb250YWluZXJDb25maWcsIERhdGVQaWNrZXJDb25maWcsIERvbUNvbmZpZywgRHJhZ0NvbnRleHQsIEtleU1hcENvbmZpZywgTGF5b3V0LCBNYXNrLCBNYXNrQ29uZmlnLCBNZW51LCBNZW51SXRlbSwgTWVudUl0ZW1Db25maWcsIE1lbnVJdGVtRW50cnksIE1vZGVsLCBQYWdpbmdUb29sYmFyQ29uZmlnLCBQYW5lbCwgUGFuZWxDb2xsYXBzZXJDb25maWcsIFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZywgUGFuZWxIZWFkZXIsIFBvcHVwLCBSZWN0YW5nbGUsIFNjcm9sbGVyLCBTY3JvbGxlckNvbmZpZywgU3RhdGVQcm92aWRlciwgU3RvcmUsIFRhYkNvbmZpZywgVGV4dEZpZWxkQ29uZmlnLCBUb29sLCBUb29sQ29uZmlnLCBUb29sYmFyQ29uZmlnLCBUb29sYmFySXRlbXMsIFRvb2x0aXBDb25maWcsIFdpZGdldCwgV2lkZ2V0Q29uZmlnIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IENvbHVtbiwgRXhwb3J0Q29uZmlnLCBYTFNDb2x1bW4gfSBmcm9tICdAYnJ5bnR1bS9ncmlkLXRoaW4nO1xuaW1wb3J0IHsgQXNzaWdubWVudE1vZGVsLCBBc3NpZ25tZW50TW9kZWxDb25maWcsIEFzc2lnbm1lbnRTdG9yZSwgQXNzaWdubWVudFN0b3JlQ29uZmlnLCBDcnVkTWFuYWdlciBhcyBTY2hlZHVsZXJDcnVkTWFuYWdlciwgRXZlbnRFZGl0IGFzIFNjaGVkdWxlckV2ZW50RWRpdCwgRXZlbnRNb2RlbCwgRXZlbnRNb2RlbENvbmZpZywgRXZlbnRTdG9yZSwgRXZlbnRTdG9yZUNvbmZpZywgUHJvamVjdENvbnN1bWVyLCBQcm9qZWN0TW9kZWxNaXhpbiwgUmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwLCBSZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXBDb25maWcsIFJlc291cmNlRmlsdGVyQ29uZmlnLCBSZXNvdXJjZU1vZGVsLCBSZXNvdXJjZU1vZGVsQ29uZmlnLCBSZXNvdXJjZVN0b3JlLCBSZXNvdXJjZVN0b3JlQ29uZmlnLCBSZXNvdXJjZVRpbWVSYW5nZU1vZGVsLCBSZXNvdXJjZVRpbWVSYW5nZU1vZGVsQ29uZmlnLCBSZXNvdXJjZVRpbWVSYW5nZVN0b3JlLCBSZXNvdXJjZVRpbWVSYW5nZVN0b3JlQ29uZmlnLCBTY2hlZHVsZXIsIFRpbWVTcGFuIH0gZnJvbSAnQGJyeW50dW0vc2NoZWR1bGVyLXRoaW4nO1xuaW1wb3J0IHsgQWdlbmRhVmlld0NvbmZpZywgQ2FsZW5kYXIsIENhbGVuZGFyRGF0ZVBpY2tlckNvbmZpZywgQ2FsZW5kYXJEcmFnLCBDYWxlbmRhckRyYWdDb25maWcsIENhbGVuZGFyTGlzdGVuZXJzLCBDYWxlbmRhclRvb2xiYXJDb25maWcsIENhbGVuZGFyVmlldywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnLCBDYWxlbmRhckNvbnRhaW5lckxheW91dENvbmZpZywgQ3J1ZE1hbmFnZXJDb25maWcsIERheUFnZW5kYVZpZXdDb25maWcsIERheUNlbGwsIERheVJlc291cmNlVmlld0NvbmZpZywgRGF5Vmlld0NvbmZpZywgRXZlbnRCdWZmZXIsIEV2ZW50QnVmZmVyQ29uZmlnLCBFdmVudENvcHlQYXN0ZSwgRXZlbnRDb3B5UGFzdGVDb25maWcsIEV2ZW50RWRpdCwgRXZlbnRFZGl0Q29uZmlnLCBFdmVudExpc3RDb25maWcsIEV2ZW50TWVudSwgRXZlbnRNZW51Q29uZmlnLCBFdmVudFRvb2x0aXAsIEV2ZW50VG9vbHRpcENvbmZpZywgRXhjZWxFeHBvcnRlciwgRXhjZWxFeHBvcnRlckNvbmZpZywgRXh0ZXJuYWxFdmVudFNvdXJjZSwgRXh0ZXJuYWxFdmVudFNvdXJjZUNvbmZpZywgTG9hZE9uRGVtYW5kLCBMb2FkT25EZW1hbmRDb25maWcsIE1vbnRoQWdlbmRhVmlld0NvbmZpZywgTW9udGhHcmlkQ29uZmlnLCBNb250aFZpZXdDb25maWcsIFByaW50LCBQcmludENvbmZpZywgUHJvamVjdE1vZGVsLCBQcm9qZWN0TW9kZWxDb25maWcsIFJlc291cmNlVmlld0NvbmZpZywgU2NoZWR1bGVNZW51LCBTY2hlZHVsZU1lbnVDb25maWcsIFNjaGVkdWxlVG9vbHRpcCwgU2NoZWR1bGVUb29sdGlwQ29uZmlnLCBUaW1lUmFuZ2VNb2RlbCwgVGltZVJhbmdlTW9kZWxDb25maWcsIFRpbWVSYW5nZVN0b3JlLCBUaW1lUmFuZ2VTdG9yZUNvbmZpZywgVGltZVJhbmdlcywgVGltZVJhbmdlc0NvbmZpZywgVmFsaWRhdGVDcmVhdGVSZXN1bHQsIFdlZWtFeHBhbmRlciwgV2Vla0V4cGFuZGVyQ29uZmlnLCBXZWVrVmlld0NvbmZpZywgWWVhclZpZXdDb25maWcgfSBmcm9tICdAYnJ5bnR1bS9jYWxlbmRhci10aGluJztcblxuaW1wb3J0IHsgU3RyaW5nSGVscGVyIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcblxuZXhwb3J0IHR5cGUgQnJ5bnR1bUNhbGVuZGFyUHJvcHMgPSB7XG4gICAgLy8gQ29uZmlnc1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIENTUyBjbGFzcyBuYW1lIHRvIGFkZCB0byBjYWxlbmRhciBkYXRlIGNlbGxzIHdoaWNoIGVuY2Fwc3VsYXRlIHRoZSBjYWxlbmRhcidzXG4gICAgICogYWN0aXZlIFtkYXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjcHJvcGVydHktZGF0ZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctYWN0aXZlRGF0ZUNscylcbiAgICAgKi9cbiAgICBhY3RpdmVEYXRlQ2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciBlbGVtZW50IGlkKSB0byBhZG9wdCBhcyB0aGlzIFdpZGdldCdzIGVuY2Fwc3VsYXRpbmcgZWxlbWVudC4gVGhlIHdpZGdldCdzXG4gICAgICogY29udGVudCB3aWxsIGJlIHBsYWNlZCBpbnNpZGUgdGhpcyBlbGVtZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWFkb3B0KVxuICAgICAqL1xuICAgIGFkb3B0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWFsaWduKVxuICAgICAqL1xuICAgIGFsaWduID8gOiBBbGlnblNwZWN8c3RyaW5nXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbYWxpZ24tc2VsZl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2FsaWduLXNlbGYpIHN0eWxlLlxuICAgICAqL1xuICAgIGFsaWduU2VsZiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIGFuZCBiZWluZyBzaG93biB0aHJvdWdoIFtzaG93QnldKCNDb3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tc2hvd0J5KS4qXG4gICAgICogYHRydWVgIHRvIHNob3cgYSBjb25uZWN0b3IgYXJyb3cgcG9pbnRpbmcgdG8gdGhlIGFsaWduIHRhcmdldC5cbiAgICAgKi9cbiAgICBhbmNob3IgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciB0aGUgaWQgb2YgYW4gZWxlbWVudCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0J3MgZWxlbWVudCB0by4gQ2FuIGJlIGNvbmZpZ3VyZWQsIG9yIHNldCBvbmNlIGF0XG4gICAgICogcnVudGltZS4gVG8gYWNjZXNzIHRoZSBlbGVtZW50IG9mIGEgcmVuZGVyZWQgd2lkZ2V0LCBzZWUgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpLlxuICAgICAqL1xuICAgIGFwcGVuZFRvID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdFxuICAgICAqIGludG8gYW4gZWxlbWVudCB3aGljaCB3aWxsIGJlIGxpbmtlZCB1c2luZyB0aGUgYGFyaWEtZGVzY3JpYmVkYnlgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1hcmlhRGVzY3JpcHRpb24pXG4gICAgICovXG4gICAgYXJpYURlc2NyaXB0aW9uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdCBhc1xuICAgICAqIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWFyaWFMYWJlbClcbiAgICAgKi9cbiAgICBhcmlhTGFiZWwgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIElubGluZSBhc3NpZ25tZW50cywgd2lsbCBiZSBsb2FkZWQgaW50byB0aGUgW2Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9taXhpbi9DYWxlbmRhclN0b3JlcyNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpLlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRzID8gOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBbQXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9kYXRhL0Fzc2lnbm1lbnRTdG9yZSkgb3IgYSByZWNvbmZpZ3VyaW5nIG9iamVjdCBmb3IgYSBzdG9yZSB3aGljaCB3aWxsIGhvbGQgYXNzaWdubWVudHMgbGlua2luZyByZXNvdXJjZXMgdG8gZXZlbnRzLlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRTdG9yZSA/IDogQXNzaWdubWVudFN0b3JlfEFzc2lnbm1lbnRTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIElmIHRoaXMgY29uZmlnIGlzIHNldCwgdGhlbiB0aGUgYGdlc3R1cmVgIGNvbmZpZ3VyZWQgKHdoaWNoIGRlZmF1bHRzIHRvIGBkYmxjbGlja2ApIGNyZWF0ZXMgYVxuICAgICAqIG5ldyBldmVudCBhdCB0aGUgbW91c2Ugb3IgdG91Y2ggZXZlbnQncyB0aW1lIHBvaW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWF1dG9DcmVhdGUpXG4gICAgICovXG4gICAgYXV0b0NyZWF0ZSA/IDoge1xuICAgICAgICBnZXN0dXJlPzogc3RyaW5nXG4gICAgICAgIG5ld05hbWU/OiBGdW5jdGlvbnxzdHJpbmdcbiAgICAgICAgc3RlcD86IHN0cmluZ1xuICAgICAgICBkdXJhdGlvbj86IHN0cmluZ1xuICAgICAgICBzdGFydEhvdXI/OiBudW1iZXJ8c3RyaW5nXG4gICAgfXxzdHJpbmd8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgQ29uZmlnIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBbVG9vbGJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKSxcbiAgICAgKiBvciBhcnJheSBvZiBjb25maWcgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkIGl0ZW1zIG9mIGEgVG9vbGJhci4gQW5vdGhlciB3YXkgdG8gYWRkIGEgYmJhciBpcyB0byB1c2UgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1iYmFyKVxuICAgICAqL1xuICAgIGJiYXIgPyA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byB0aGUgcGFuZWwncyBib2R5IGVsZW1lbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctYm9keUNscylcbiAgICAgKi9cbiAgICBib2R5Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdoZXJlIHByb3BlcnR5IG5hbWVzIHdpdGggYSB0cnV0aHkgdmFsdWUgaW5kaWNhdGUgd2hpY2ggZXZlbnRzIHNob3VsZCBidWJibGUgdXAgdGhlIG93bmVyc2hpcFxuICAgICAqIGhpZXJhcmNoeSB3aGVuIHRyaWdnZXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1idWJibGVFdmVudHMpXG4gICAgICovXG4gICAgYnViYmxlRXZlbnRzID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBub3QgY2FsbCBvblhYWCBtZXRob2QgbmFtZXMgKGUuZy4gYG9uU2hvd2AsIGBvbkNsaWNrYCksIGFzIGFuIGVhc3kgd2F5IHRvIGxpc3RlbiBmb3IgZXZlbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWNhbGxPbkZ1bmN0aW9ucylcbiAgICAgKi9cbiAgICBjYWxsT25GdW5jdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiBhbiBldmVudCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBlcnJvciBwcm9wYWdhdGVzIHVwIHRoZSBzdGFjayBhbmQgdGhlXG4gICAgICogYXBwbGljYXRpb24gc3RhdGUgaXMgdW5kZWZpbmVkLiBDb2RlIHdoaWNoIGZvbGxvd3MgdGhlIGV2ZW50IGhhbmRsZXIgd2lsbCAqbm90KiBiZSBleGVjdXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1jYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMpXG4gICAgICovXG4gICAgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGNlbnRyZSB0aGUgV2lkZ2V0IGluIGJyb3dzZXIgdmlld3BvcnQgc3BhY2UuXG4gICAgICovXG4gICAgY2VudGVyZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIGVsZW1lbnQuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctY2xzKVxuICAgICAqL1xuICAgIGNscyA/IDogc3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHBhbmVsIGlzIGNvbGxhcHNlZCAodGhlIGJvZHkgb2YgdGhlIHBhbmVsIGlzIGhpZGRlbiB3aGlsZSBvbmx5IHRoZSBoZWFkZXIgaXNcbiAgICAgKiB2aXNpYmxlKS4gT25seSB2YWxpZCBpZiB0aGUgcGFuZWwgaXMgW2NvbGxhcHNpYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkuXG4gICAgICovXG4gICAgY29sbGFwc2VkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgZW5hYmxlcyBjb2xsYXBzaWJpbGl0eSBmb3IgdGhlIHBhbmVsLiBTZWUgW2NvbGxhcHNlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2VkKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1jb2xsYXBzaWJsZSlcbiAgICAgKi9cbiAgICBjb2xsYXBzaWJsZSA/IDogYm9vbGVhbnxQYW5lbENvbGxhcHNlckNvbmZpZ3xQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWdcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBzcGVjaWZpZWQgY29sb3IgdG8gdGhlIHdpZGdldCwgYnkgc2V0dGluZyB0aGUgYC0tYi1wcmltYXJ5YCBDU1MgdmFyaWFibGUgaW4gdGhlIHdpZGdldHNcbiAgICAgKiBgc3R5bGVgIGJsb2NrLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWNvbG9yKVxuICAgICAqL1xuICAgIGNvbG9yID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIHdoaWNoIGNvbHVtbiB0byBzdGFydCBpbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBjb2x1bW4gPyA6IG51bWJlclxuICAgIGNvbmZpZyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIG9yIFtwb3NpdGlvbmVkXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1wb3NpdGlvbmVkKS4qXG4gICAgICogRWxlbWVudCwgV2lkZ2V0IG9yIFJlY3RhbmdsZSB0byB3aGljaCB0aGlzIFdpZGdldCBpcyBjb25zdHJhaW5lZC5cbiAgICAgKi9cbiAgICBjb25zdHJhaW5UbyA/IDogSFRNTEVsZW1lbnR8V2lkZ2V0fFJlY3RhbmdsZVxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gdGhlIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWNvbnRlbnRFbGVtZW50Q2xzKVxuICAgICAqL1xuICAgIGNvbnRlbnRFbGVtZW50Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hpY2ggaXMgdXNlZCB0byBzaG93IGNvbnRleHQgbWVudXMgdmlhIHRoZSBjb250ZXh0IG1lbnUgZmVhdHVyZXNcbiAgICAgKiBbRXZlbnRNZW51XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXZlbnRNZW51KSBhbmQgW1NjaGVkdWxlTWVudV0oI0NhbGVuZGFyL2ZlYXR1cmUvU2NoZWR1bGVNZW51KS5cbiAgICAgKiBBdmFpbGFibGUgb3B0aW9ucyBhcmU6ICdjb250ZXh0bWVudScsICdjbGljaycsICdkYmxjbGljaycuXG4gICAgICovXG4gICAgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgPyA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snXG4gICAgLyoqXG4gICAgICogU3VwcGx5IGEgW0NydWRNYW5hZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9kYXRhL0NydWRNYW5hZ2VyKSBpbnN0YW5jZSBvciBhIGNvbmZpZyBvYmplY3QgaWYgeW91IHdhbnQgdG8gdXNlXG4gICAgICogQ3J1ZE1hbmFnZXIgZm9yIGhhbmRsaW5nIGRhdGEuXG4gICAgICovXG4gICAgY3J1ZE1hbmFnZXIgPyA6IENydWRNYW5hZ2VyQ29uZmlnfFNjaGVkdWxlckNydWRNYW5hZ2VyXG4gICAgLyoqXG4gICAgICogQ2xhc3MgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBhIENydWRNYW5hZ2VyIGluIGNhc2UgaXQncyBwcm92aWRlZCBhcyBhIHNpbXBsZSBvYmplY3QgdG9cbiAgICAgKiBbY3J1ZE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvbWl4aW4vQ2FsZW5kYXJTdG9yZXMjY29uZmlnLWNydWRNYW5hZ2VyKSBjb25maWcuXG4gICAgICovXG4gICAgY3J1ZE1hbmFnZXJDbGFzcyA/IDogU2NoZWR1bGVyQ3J1ZE1hbmFnZXJcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgV2lkZ2V0IGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBpbiB0aGUgR3JpZCdzIFJvd0V4cGFuZGVyIGZlYXR1cmUncyBgd2lkZ2V0YCBjb25maWcsIHByb3ZpZGUgdGhlXG4gICAgICogZmllbGQgb24gdGhlIGV4cGFuZGVkIHJlY29yZCB0byB1c2UgZm9yIHBvcHVsYXRpbmcgdGhpcyB3aWRnZXQncyBzdG9yZSAoaWYgYXBwbGljYWJsZSlcbiAgICAgKi9cbiAgICBkYXRhRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIE9iamVjdCB0byBhcHBseSB0byBlbGVtZW50cyBkYXRhc2V0IChlYWNoIGtleSB3aWxsIGJlIHVzZWQgYXMgYSBkYXRhLWF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudClcbiAgICAgKi9cbiAgICBkYXRhc2V0ID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hpY2ggdGhlIENhbGVuZGFyLCBpdHMgW3NpZGViYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNwcm9wZXJ0eS1zaWRlYmFyKSdzIGRhdGUgcGlja2VyLCBhbmRcbiAgICAgKiBpdHMgYWN0aXZlIHZpZXcgc2hvdWxkIGVuY2Fwc3VsYXRlIHVwb24gY3JlYXRpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZGF0ZSlcbiAgICAgKi9cbiAgICBkYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgW0RhdGVIZWxwZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlcikgZm9ybWF0IHN0cmluZyB0byB1c2UgdG8gY3JlYXRlIGRhdGUgb3V0cHV0IGZvclxuICAgICAqIHZpZXcgZGVzY3JpcHRpb25zLlxuICAgICAqL1xuICAgIGRhdGVGb3JtYXQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGNvbmZpZyBvYmplY3QgdG8gY29uZmlndXJlIHRoZSBbQ2FsZW5kYXJEYXRlUGlja2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9DYWxlbmRhckRhdGVQaWNrZXIpIHdoaWNoIGlzXG4gICAgICogc2hvd24gaW4gdGhlIFtzaWRlYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjcHJvcGVydHktc2lkZWJhcikgbmV4dCB0byB0aGUgY2FsZW5kYXIgdmlld3MuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZGF0ZVBpY2tlcilcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sJ2NvdW50JywnZG90cyd9IGRhdGVQaWNrZXIuc2hvd0V2ZW50cyBEaXNwbGF5cyB0aGUgcHJlc2VuY2Ugb2YgZXZlbnRzIGluIGVhY2ggY2VsbC4gdmFsdWVzIG1heSBiZTogICogYGZhbHNlYCAtIERvIG5vdCBzaG93IGV2ZW50cyBpbiBjZWxscy4gKiBgdHJ1ZWAgLSBTaG93IGEgdGhlbWVhYmxlIGJ1bGxldCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgZXZlbnRzIGZvciBhIGRhdGUuICogYCdjb3VudCdgIC0gU2hvdyBhIHRoZW1lYWJsZSBiYWRnZSBjb250YWluaW5nIHRoZSBldmVudCBjb3VudCBmb3IgYSBkYXRlLiAqICdgZG90cydgIC0gU2hvdyBzbWFsbCBldmVudC1jb2xvdXJlZCBidWxsZXRzICh0byBhIG1heGltdW0gb2YgdGhyZWUpIGJlbG93IHRoZSBkYXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0ZVBpY2tlci5jb2xsYXBzaWJsZSBgdHJ1ZWAgdG8gZW5hYmxlIGNvbGxhcHNlIGludG8gYSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVQaWNrZXIudGl0bGUgVGhlIHRleHQgdG8gcGxhY2UgaW4gYSBoZWFkZXIgYWJvdmUgdGhlIHBpY2tlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRhdGVQaWNrZXIuZWRpdE1vbnRoIGB0cnVlYCB0byBlbmFibGUgc2V0dGluZyB0aGUgZGF0ZSB1c2luZyB0aGUgY29udHJvbHMgaW4gdGhlIERhdGVQaWNrZXIgaGVhZGVyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbiwncmFuZ2UnfSBtdWx0aVNlbGVjdCBUaGUgRGF0ZVBpY2tlciBjYW4gc2VsZWN0IFttdWx0aXBsZSBkYXRlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9EYXRlUGlja2VyI2NvbmZpZy1tdWx0aVNlbGVjdCkgaW4gdHdvIG1vZGVzOiAgKiBgdHJ1ZWAgdG8gbWVhbiBtYW55IGRpc2NvbnRpZ3VvdXMgZGF0ZXMgbWF5IGJlIHNlbGVjdGVkLiAqIGAncmFuZ2UnYCB0byBtZWFuIHRoYXQgYSBzdGFydCBkYXRlIGFuZCBlbmQgZGF0ZSBtYXkgYmUgc2VsZWN0ZWQuICBJZiBzZXQgdXAgdG8gbXVsdGkgc2VsZWN0LCB2aWV3cyB3aGljaCBhcmUgbm90IGZpeGVkIHRvIGEgZGF0ZSBkdXJhdGlvbiB3aWxsIG9iZXkgdGhlIGRhdGUgc2VsZWN0aW9uIGJ5IHVzaW5nIGEgW2RhdGVGaWx0ZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcjcHJvcGVydHktZGF0ZUZpbHRlcikgdG8gc2tpcCBkYXlzIHdoaWNoIGFyZSBub3Qgc2VsZWN0ZWQuIFRoZXNlIGluY2x1ZGU6ICAqIEFnZW5kYVZpZXcgICAgICAobW9kZSB0eXBlIGAnYWdlbmRhJ2ApICogRGF5Vmlld3MgICAgICAgICh2aWV3IHR5cGUgYCdkYXl2aWV3J2ApIHdoaWNoIHlvdSBhZGQgdG8gdGhlIG1vZGVzIC0gVGhlIGRlZmF1bHQgYGRheWAgYW5kIGB3ZWVrYCBtb2RlcyBoYXZlIGEgZml4ZWQgZHVyYXRpb24uICogUmVzb3VyY2VWaWV3ICAgICh2aWV3IHR5cGUgYCdyZXNvdXJjZXZpZXcnYCkgKiBEYXlSZXNvdXJjZVZpZXcgKHZpZXcgdHlwZSBgJ2RheXJlc291cmNldmlldydgKSAgVGhlIGBNb250aFZpZXdgLCBhbmQgdGhlIGBXZWVrVmlld2AgYW5kIHRoZSBidWlsdC1pbiBzaW5nbGUgZGF5IGBEYXlWaWV3YCA8c3Ryb25nPm1vZGU8L3N0cm9uZz4gYWxsIGhhdmUgZml4ZWQgZHVyYXRpb24gYW5kIHdpbGwgbm90IHBhcnRpY2lwYXRlIGluIHRoaXMuIElmIHlvdSBzZWxlY3QgYSBkaXNjb250aWd1b3VzIHJhbmdlLCB0aGVuIHRoZSB2aWV3cyB3aGljaCBhcmUgYW1lbmFibGUgdG8gYmVpbmcgY29udHJvbGxlZCBpbiB0aGlzIHdheSB3aWxsIHN3aXRjaCB0aGVpciByYW5nZSB0byBlbmNvbXBhc3Mgd2hhdCB5b3UgaGF2ZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWxlY3QgdGhlIGZpcnN0IHRvIHRoZSBsYXN0IGRheXMgb2YgYSBtb250aCwgdGhlIHZpZXcncyBbcmFuZ2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0RhdGVSYW5nZU93bmVyI3Byb3BlcnR5LXJhbmdlKSB3aWxsIGJlIHNldCB0byBgJzEgbW9udGgnYC4gVGhpcyBjaG9pY2Ugd2lsbCBiZSBtYWludGFpbmVkLCBhbmQgYnkgbmF2aWdhdGluZyB1c2luZyB0aGUgbmV4dCBhbmQgcHJldmlvdXMgdGJhciBidXR0b25zLCB0aGUgdmlld3Mgd2lsbCBtb3ZlIGJ5IGV4YWN0bHkgb25lIG1vbnRoLiBJZiB5b3VyIHNldCBvZiBzZWxlY3RlZCBkYXRlcyBpcyBlbmNsb3NlZCB3aXRoaW4gYSB0d28gd2VlayBibG9jaywgdGhlbiB0aGUgW3JhbmdlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXRlUmFuZ2VPd25lciNwcm9wZXJ0eS1yYW5nZSkgb2YgdGhlIHZpZXdzIHdpbGwgYmUgc2V0IHRvIGB7IHVuaXQgOiAnd2VlaycsIG1hZ25pdHVkZSA6IDIgfWAuIElmIHlvdSBzZWxlY3QgdGhlIDFzdCwgM3RoIGFuZCA1dGggb2YgdGhlIG1vbnRoLCBhbmQgdGhvc2UgZGF5cyBhcmUgYWxsIG9uIG9uZSB3ZWVrIHJvdywgdGhlIFtyYW5nZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF0ZVJhbmdlT3duZXIjcHJvcGVydHktcmFuZ2UpIG9mIHRoZSB2aWV3cyB3aWxsIGJlIHNldCB0byBgeyB1bml0IDogJ3dlZWsnLCBtYWduaXR1ZGUgOiAxIH1gLiBGb3Igc2VsZWN0aW9uIHJhbmdlcyBvdGhlciB0aGFuIGV4YWN0bHkgb25lIG1vbnRoLCBuYXZpZ2F0aW9uIGluIHRpbWUgd2lsbCBiZSBpbiBpbmNyZW1lbnRzIG9mIG9uZSB3ZWVrIGZvciBpbnR1aXRpdmUgbmF2aWdhdGlvbiB1cCBhbmQgZG93biB0aGUgZGF0ZSBwaWNrZXIuIFdoZW4gbmF2aWdhdGluZyBpbiB0aW1lLCB0aGUgc2VsZWN0ZWQgYmxvY2sgb2YgZGF0ZXMgbW92ZXMgYW5kICpmb2xsb3dzIHRoZSB0aW1lIG5hdmlnYXRpb24qIHNvIHRoYXQgdGhlcmUgYXJlIGFsd2F5cyBkYXRlcyBpbiB2aWV3LCBldmVuIGlmIHRoZXkgYXJlIGVtcHR5LlxuICAgICAqL1xuICAgIGRhdGVQaWNrZXIgPyA6IENhbGVuZGFyRGF0ZVBpY2tlckNvbmZpZ3xib29sZWFufG51bGxcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IHdoZW4gYSBzaW5nbGUgdmFsdWUgaXMgdG8gYmUgYXBwbGllZCB0byB0aGlzIFdpZGdldC4gU3VjaCBhcyB3aGVuIHVzZWRcbiAgICAgKiBpbiBhIGdyaWQgV2lkZ2V0Q29sdW1uLCB0aGlzIGlzIHRoZSBwcm9wZXJ0eSB0byB3aGljaCB0aGUgY29sdW1uJ3MgYGZpZWxkYCBpcyBhcHBsaWVkLlxuICAgICAqL1xuICAgIGRlZmF1bHRCaW5kUHJvcGVydHkgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjYWxlbmRhciAoW1Jlc291cmNlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9SZXNvdXJjZU1vZGVsKSksIChvciBpdHMgYGlkYCkgdG8gdXNlIGFzIHRoZVxuICAgICAqIGRlZmF1bHQgY2FsZW5kYXIgZm9yIG5ldyBldmVudHMgY3JlYXRlZCB1c2luZyBbZGJsY2xpY2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctYXV0b0NyZWF0ZSlcbiAgICAgKiBvciBbZHJhZy1jcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcpLCBvciBbZHJhZ2dpbmcgaW5dKCNDYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWRlZmF1bHRDYWxlbmRhcilcbiAgICAgKi9cbiAgICBkZWZhdWx0Q2FsZW5kYXIgPyA6IHN0cmluZ3xSZXNvdXJjZU1vZGVsXG4gICAgLyoqXG4gICAgICogQSBbcXVlcnldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2Z1bmN0aW9uLXF1ZXJ5KSBzZWxlY3RvciBmdW5jdGlvbiB3aGljaCBjYW4gaWRlbnRpZnkgdGhlIGRlc2NlbmRhbnQgd2lkZ2V0IHRvIHdoaWNoXG4gICAgICogZm9jdXMgc2hvdWxkIGJlIGRpcmVjdGVkIGJ5IGRlZmF1bHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZGVmYXVsdEZvY3VzKVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSB3aWRnZXQgV2lkZ2V0IHBhc3NlZCB0byBtZXRob2RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1dGh5IHZhbHVlIGlmIHdpZGdldCBpcyB0aGUgZGVmYXVsdCBvbmVcbiAgICAgKi9cbiAgICBkZWZhdWx0Rm9jdXMgPyA6ICgod2lkZ2V0OiBXaWRnZXQpID0+IGJvb2xlYW4pfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgY29uZmlnIG9iamVjdCBjb250YWluaW5nIGRlZmF1bHQgc2V0dGluZ3MgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIHdpZGdldHMuXG4gICAgICovXG4gICAgZGVmYXVsdHMgPyA6IENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgZmFsc2VgIHRvIHByZXNlcnZlIHNlbGVjdGlvbiB3aGVuIGNsaWNraW5nIHRoZSBlbXB0eSBzY2hlZHVsZSBhcmVhLlxuICAgICAqL1xuICAgIGRlc2VsZWN0QWxsT25TY2hlZHVsZUNsaWNrID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBkZXNlbGVjdCBhIHNlbGVjdGVkIGV2ZW50IHVwb24gY2xpY2suXG4gICAgICovXG4gICAgZGVzZWxlY3RPbkNsaWNrID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBkZXN0cm95IHRoZSBQcm9qZWN0IGFuZCBzdG9yZXMgd2hlbiBgdGhpc2AgaXMgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIGRlc3Ryb3lTdG9yZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgQ1NTIGNvbXBhdGliaWxpdHkgaXNzdWVzIHdoZW4gdXBncmFkaW5nIHRvIHY3LiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNoZWNrczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1kZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzKVxuICAgICAqL1xuICAgIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIG9yIGVuYWJsZSB0aGUgd2lkZ2V0LiBJdCBpcyBzaW1pbGFyIHRvIFtyZWFkT25seV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXJlYWRPbmx5KSBleGNlcHQgYSBkaXNhYmxlZCB3aWRnZXRcbiAgICAgKiBjYW5ub3QgYmUgZm9jdXNlZCwgdXNlcyBhIGRpZmZlcmVudCByZW5kaXRpb24gKHVzdWFsbHkgZ3JleWlzaCkgYW5kIGRvZXMgbm90IGFsbG93IHNlbGVjdGluZyBpdHMgdmFsdWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBhZGRlZCB0byBhIFtwYW5lbCdzIF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbClcbiAgICAgKiBbc3RyaXBzIGNvbGxlY3Rpb25dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuIFR5cGljYWwgdmFsdWVzIGZvciB0aGlzIGNvbmZpZyBhcmUgYCd0b3AnYCxcbiAgICAgKiBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgb3IgYCdyaWdodCdgLCB3aGljaCBjYXVzZSB0aGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCBvbiB0aGF0IHNpZGUgb2YgdGhlIHBhbmVsJ3NcbiAgICAgKiBib2R5LiBTdWNoIHdpZGdldHMgYXJlIGNhbGxlZCBcImVkZ2Ugc3RyaXBzXCIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZG9jaylcbiAgICAgKi9cbiAgICBkb2NrID8gOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYmUgYWJsZSB0byBkcmFnIGEgd2lkZ2V0IGZyZWVseSBvbiB0aGUgcGFnZS4gT3Igc2V0IHRvIGFuIG9iamVjdCB3aXRoIGEgwrRoYW5kbGVTZWxlY3RvcsK0XG4gICAgICogcHJvcGVydHkgd2hpY2ggY29udHJvbHMgd2hlbiBhIGRyYWcgc2hvdWxkIHN0YXJ0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWRyYWdnYWJsZSlcbiAgICAgKi9cbiAgICBkcmFnZ2FibGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlIHRoaXMgUGFuZWwgYSBkb2NrZWQgZHJhd2VyIHdoaWNoIHNsaWRlcyBvdXQgZnJvbSBvbmUgc2lkZSBvZiB0aGUgYnJvd3NlciB2aWV3cG9ydCBieSBkZWZhdWx0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWRyYXdlcilcbiAgICAgKiBAcGFyYW0geydzdGFydCcsJ2xlZnQnLCdlbmQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSd9IHNpZGUgVGhlIHNpZGUgb2YgdGhlIHZpZXdwb3J0IHRvIGRvY2sgdGhlIGRyYXdlciB0by4gICogYCdzdGFydCdgIG1lYW5zIHRoZSBgaW5saW5lLXN0YXJ0YCBzaWRlLiAqIGAnZW5kJ2AgbWVhbnMgdGhlIGBpbmxpbmUtZW5kYCBzaWRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nLG51bWJlcn0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZHJhd2VyIGluIGl0cyBjb2xsYXBzaWJsZSBheGlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5saW5lIElmIHVzaW5nIHRoZSBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgdG8gcGxhY2UgdGhlIGRyYXdlciBpbnNpZGUgYSBob3N0IHdpZGdldCwgdGhpcyBtYXkgYmUgc2V0IHRvIGB0cnVlYCB0byBtYWtlIHRoZSBkcmF3ZXIgaW5saW5lIHdpdGhpbiB0aGF0IGhvc3QuIE5vdGUgdGhhdCwgaWYgdXNpbmcgdGhpcywgdGhlIGxheW91dCBvZiB0aGUgaG9zdCBlbGVtZW50IG11c3QgaGF2ZSBgZmxleC1kaXJlY3Rpb25gIHNldCBhcHByb3ByaWF0ZWx5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixvYmplY3R9IGF1dG9DbG9zZSBTcGVjaWZpZXMgd2hhdCB1c2VyIGFjdGlvbnMgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIGRyYXdlci4gRGVmYXVsdHMgdG8gY2xvc2luZyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIgb3Igd2hlbiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLm1vdXNlZG93biBJZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgZHJhd2VyLCB0aGUgZHJhd2VyIHdpbGwgYXV0b21hdGljYWxseSBiZSBoaWRkZW4uIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZywgaXQgaXMgdXNlZCBhcyBhIENTUyBzZWxlY3RvciB0byBmaWx0ZXIgY2xpY2tzIHdoaWNoIHNob3VsZCBjbG9zZSB0aGUgZHJhd2VyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixzdHJpbmd9IGF1dG9DbG9zZS5mb2N1c291dCBJZiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0b0Nsb3NlLm1vdXNlb3V0IEhpZGVzIHRoZSBkcmF3ZXIgd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBkcmF3ZXIgYWZ0ZXIgdGhlIGBhdXRvQ2xvc2VEZWxheWAgcGVyaW9kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdXRvQ2xvc2VEZWxheSBXaGVuIHVzaW5nIGBtb3VzZW91dGAsIHRoaXMgaXMgdGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIGRyYXdlciA/IDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfVxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGF0dHJpYnV0ZXMgdG8gYXNzaWduIHRvIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyB3aWRnZXQuXG4gICAgICogU2V0IGBudWxsYCB2YWx1ZSB0byBhdHRyaWJ1dGUgdG8gcmVtb3ZlIGl0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAqL1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD5cbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2luZyBbRGVsZXRlXSBhbmQgW0JhY2tzcGFjZV0gdG8gcmVtb3ZlIGV2ZW50cy9hc3NpZ25tZW50c1xuICAgICAqL1xuICAgIGVuYWJsZURlbGV0ZUtleSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgZXZlbnRzIGJlaW5nIHJlY3VycmluZyBhbmQgYWxzbyBhZGRzIGV4dHJhIHJlY3VycmVuY2UgVUkgZmllbGRzIGluIHRoZSBidWlsdC1pbiBldmVudCBlZGl0b3IuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZW5hYmxlUmVjdXJyaW5nRXZlbnRzKVxuICAgICAqL1xuICAgIGVuYWJsZVJlY3VycmluZ0V2ZW50cyA/IDogYm9vbGVhbnx7XG4gICAgICAgIGRlZmF1bHRBY3Rpb24/OiAnc2luZ2xlJ3wnZnV0dXJlJ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGxpc3RlbiBmb3IgQ1RSTC1aIChDTUQtWiBvbiBNYWMgT1MpIGtleWJvYXJkIGV2ZW50IGFuZCB0cmlnZ2VyIHVuZG8gKHJlZG8gd2hlbiBTSElGVCBpcyBwcmVzc2VkKS5cbiAgICAgKiBPbmx5IGFwcGxpY2FibGUgd2hlbiB1c2luZyBhIFtTdGF0ZVRyYWNraW5nTWFuYWdlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2RhdGEvc3RtL1N0YXRlVHJhY2tpbmdNYW5hZ2VyKS5cbiAgICAgKi9cbiAgICBlbmFibGVVbmRvUmVkb0tleXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBJbmxpbmUgZXZlbnRzLCB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSBbZXZlbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9taXhpbi9DYWxlbmRhclN0b3JlcyNwcm9wZXJ0eS1ldmVudFN0b3JlKS5cbiAgICAgKi9cbiAgICBldmVudHMgPyA6IEV2ZW50TW9kZWxbXXxFdmVudE1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgLCBvciBzZXQgcHJvcGVydHkgdG8gYHRydWVgIHRvIGRpc2FibGUgZXZlbnQgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIGV2ZW50U2VsZWN0aW9uRGlzYWJsZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgW0V2ZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvRXZlbnRTdG9yZSkgb3IgYSByZWNvbmZpZ3VyaW5nIG9iamVjdCBmb3IgYSBzdG9yZSB3aGljaCB3aWxsIGhvbGRcbiAgICAgKiB0aGUgZXZlbnRzIHRvIGJlIHJlbmRlcmVkIGludG8gdGhlIENhbGVuZGFyLlxuICAgICAqL1xuICAgIGV2ZW50U3RvcmUgPyA6IEV2ZW50U3RvcmV8RXZlbnRTdG9yZUNvbmZpZ1xuICAgIGV4dHJhRGF0YSA/IDogYW55XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBpcyBzZXQgdG8gYHRydWVgLCB0aGVuIHdoZW4gZGV0ZXJtaW5pbmcgd2hpY2ggYXNzaWduZWQgcmVzb3VyY2Ugb2YgYSBtdWx0aSBhc3NpZ25lZCBldmVudFxuICAgICAqIHRvIHVzZSB0byBjcmVhdGUgdGhlIGV2ZW50IFVJLCB0aGUgZmlyc3QgcmVzb3VyY2Ugd2hpY2ggaXMgc3RpbGwgc2VsZWN0ZWQgaW4gdGhlXG4gICAgICogW3Jlc291cmNlRmlsdGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9TaWRlYmFyI3Byb3BlcnR5LXJlc291cmNlRmlsdGVyKSBpcyB1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWZpbHRlckV2ZW50UmVzb3VyY2VzKVxuICAgICAqL1xuICAgIGZpbHRlckV2ZW50UmVzb3VyY2VzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbZmxleF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZsZXgpIHN0eWxlLlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYCZsdDtmbGV4LWdyb3cmZ3Q7ICZsdDtmbGV4LXNocmluayZndDsgJmx0O2ZsZXgtYmFzaXMmZ3Q7YCBmb3JtYXQgc3RyaW5nLlxuICAgICAqIG51bWVyaWMtb25seSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHRoZSBgZmxleC1ncm93YCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmbGV4ID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtb3ZlIHRoZSB3aWRnZXQgb3V0IG9mIHRoZSBkb2N1bWVudCBmbG93IGFuZCBwb3NpdGlvbiBpdFxuICAgICAqIGFic29sdXRlbHkgaW4gYnJvd3NlciB2aWV3cG9ydCBzcGFjZS5cbiAgICAgKi9cbiAgICBmbG9hdGluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZyBvYmplY3Qgb2YgYSBmb290ZXIuIE1heSBjb250YWluIGEgYGRvY2tgLCBgaHRtbGAgYW5kIGEgYGNsc2AgcHJvcGVydHkuIEEgZm9vdGVyIGlzIG5vdCBhIHdpZGdldCxcbiAgICAgKiBidXQgcmF0aGVyIHBsYWluIEhUTUwgdGhhdCBmb2xsb3dzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhbmVsJ3MgYm9keSBhbmQgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1mb290ZXIpXG4gICAgICovXG4gICAgZm9vdGVyID8gOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBbb2JqZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI3R5cGVkZWYtUGFuZWxIZWFkZXIpIGZvciB0aGUgcGFuZWwncyBoZWFkZXIgb3IgYSBzdHJpbmcgaW4gcGxhY2Ugb2YgYSBgdGl0bGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWhlYWRlcilcbiAgICAgKi9cbiAgICBoZWFkZXIgPyA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3MgaGVpZ2h0LCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS5oZWlnaHRgLiBFaXRoZXIgc3BlY2lmeSBhIHZhbGlkIGhlaWdodCBzdHJpbmcgb3IgYSBudW1iZXIsXG4gICAgICogd2hpY2ggd2lsbCBnZXQgJ3B4JyBhcHBlbmRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIENTUyBhcyB0aGUgcHJpbWFyeSB3YXkgdG8gY29udHJvbCBoZWlnaHQsIGJ1dCBpbiBzb21lXG4gICAgICogY2FzZXMgdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICBoZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgd2l0aCB0cnVlIHRvIG1ha2Ugd2lkZ2V0IGluaXRpYWxseSBoaWRkZW4uXG4gICAgICovXG4gICAgaGlkZGVuID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1oaWRlQW5pbWF0aW9uKVxuICAgICAqL1xuICAgIGhpZGVBbmltYXRpb24gPyA6IGJvb2xlYW58b2JqZWN0XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBoaWRlIFtub25Xb3JraW5nRGF5c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1ub25Xb3JraW5nRGF5cykgZm9yIGVhY2ggY2FsZW5kYXIgdmlld1xuICAgICAqL1xuICAgIGhpZGVOb25Xb3JraW5nRGF5cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYHRydWVgIHRvIG1ha2UgdGhpcyBjb250YWluZXIgaGlkZSB3aGVuIGl0IGhhcyBubyB2aXNpYmxlIGNoaWxkcmVuIChFaXRoZXIgZW1wdHlcbiAgICAgKiBvciBhbGwgY2hpbGRyZW4gaGlkZGVuKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1oaWRlV2hlbkVtcHR5KVxuICAgICAqL1xuICAgIGhpZGVXaGVuRW1wdHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBhcyBgdHJ1ZWAgdG8gbWFrZSBwaWNraW5nIGEgZGF0ZSBpbiB0aGUgW3NpZGViYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc2lkZWJhciknc1xuICAgICAqIGRhdGUgcGlja2VyIGhpZ2hsaWdodCB0aGUgZGF0ZSBjZWxsIGluIHRoZSBhY3RpdmUgdmlldy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1oaWdobGlnaHREYXRlKVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSBDZWxsIGRhdGVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgdG8gbWFrZSBwaWNraW5nIGEgZGF0ZSBpbiBhIGRhdGUgcGlja2VyXG4gICAgICovXG4gICAgaGlnaGxpZ2h0RGF0ZSA/IDogYm9vbGVhbnwoKGRhdGU6IERhdGUpID0+IGJvb2xlYW4pXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCwgb3Igc2V0IHByb3BlcnR5IHRvIGB0cnVlYCB0byBoaWdobGlnaHQgZGVwZW5kZW50IGV2ZW50cyBhcyB3ZWxsIHdoZW4gc2VsZWN0aW5nIGFuIGV2ZW50LlxuICAgICAqL1xuICAgIGhpZ2hsaWdodFByZWRlY2Vzc29ycyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAsIG9yIHNldCBwcm9wZXJ0eSB0byBgdHJ1ZWAgdG8gaGlnaGxpZ2h0IGRlcGVuZGVudCBldmVudHMgYXMgd2VsbCB3aGVuIHNlbGVjdGluZyBhbiBldmVudC5cbiAgICAgKi9cbiAgICBoaWdobGlnaHRTdWNjZXNzb3JzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gaWNvbiB0byBzaG93IGJlZm9yZSB0aGUgW3RpdGxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy10aXRsZSkuIEVpdGhlciBwYXNzIGEgQ1NTIGNsYXNzIGFzIGEgc3RyaW5nLCBvciBwYXNzIGFcbiAgICAgKiBbRG9tQ29uZmlnXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RvbUhlbHBlciN0eXBlZGVmLURvbUNvbmZpZykgb2JqZWN0IGRlc2NyaWJpbmcgYW4gZWxlbWVudCB0byByZXByZXNlbnQgdGhlIGljb24uXG4gICAgICovXG4gICAgaWNvbiA/IDogc3RyaW5nfERvbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdpZGdldCBpZCwgaWYgbm90IHNwZWNpZmllZCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuIEFsc28gdXNlZCBmb3IgbG9va3VwcyB0aHJvdWdoIFdpZGdldC5nZXRCeUlkXG4gICAgICovXG4gICAgaWQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHdpZGdldHMgcmVhZC1vbmx5IHN0YXRlIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGl0cyBwYXJlbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctaWdub3JlUGFyZW50UmVhZE9ubHkpXG4gICAgICovXG4gICAgaWdub3JlUGFyZW50UmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIHNob3cgdGhlIFwiV2Vla2VuZHNcIiB0b2dnbGUgYnV0dG9uIG9mIHRoZSBtb2RlIHNlbGVjdG9yLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNvbmZpZ1xuICAgICAqIGNhbiBiZSBhIFtCdXR0b25dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQnV0dG9uKSBjb25maWcgb2JqZWN0IHRvIGNvbmZpZ3VyZSB0aGUgYnV0dG9uLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWluY2x1ZGVXZWVrZW5kc0J1dHRvbilcbiAgICAgKi9cbiAgICBpbmNsdWRlV2Vla2VuZHNCdXR0b24gPyA6IGJvb2xlYW58QnV0dG9uQ29uZmlnXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byBhbGlnbiBpbnB1dCBmaWVsZHMgb2YgY2hpbGQgd2lkZ2V0cy4gQnkgZGVmYXVsdCwgdGhlIEZpZWxkIGlucHV0IGVsZW1lbnQgaXNcbiAgICAgKiBwbGFjZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBgbGFiZWxgLiBJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIGlucHV0IGZpZWxkcyBhbGlnbmVkIHRvIHRoZVxuICAgICAqIHJpZ2h0LCBzZXQgdGhpcyBjb25maWcgdG8gYCdlbmQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1pbnB1dEZpZWxkQWxpZ24pXG4gICAgICovXG4gICAgaW5wdXRGaWVsZEFsaWduID8gOiAnc3RhcnQnfCdlbmQnXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gaW5zZXJ0IHRoaXMgd2lkZ2V0IGJlZm9yZS4gSWYgcHJvdmlkZWQsIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRCZWZvcmUgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCBlbGVtZW50IHRvLCBhcyBhIGZpcnN0IGNoaWxkLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEZpcnN0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIHRlbXBsYXRlIG1ldGhvZCAoZW1wdHkgYnkgZGVmYXVsdCkgYWxsb3dpbmcgeW91IHRvIGNvbnRyb2wgaWYgYW4gZXZlbnQgY2FuIGJlIHNlbGVjdGVkIG9yIG5vdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1pc0V2ZW50U2VsZWN0YWJsZSlcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudCBUaGUgZXZlbnQgcmVjb3JkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgZXZlbnQgY2FuIGJlIHNlbGVjdGVkLCBvdGhlcndpc2UgZmFsc2VcbiAgICAgKi9cbiAgICBpc0V2ZW50U2VsZWN0YWJsZSA/IDogKGV2ZW50OiBFdmVudE1vZGVsKSA9PiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgQ1NTIGNsYXNzIHRvIGFkZCB0byBjaGlsZCBpdGVtcyBvZiB0aGlzIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBpdGVtQ2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgY2hpbGQgaXRlbXMgb2YgdGhlIENhbGVuZGFyIHZpZXcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctaXRlbXMpXG4gICAgICovXG4gICAgaXRlbXMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGtleSBzaG9ydGN1dHMgZm9yIHRoZSBDYWxlbmRhci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1rZXlNYXApXG4gICAgICovXG4gICAga2V5TWFwID8gOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+XG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byB1c2Ugc2FtZSBsYWJlbCBwbGFjZW1lbnQgb24gYWxsIGNoaWxkIHdpZGdldHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbGFiZWxQb3NpdGlvbilcbiAgICAgKi9cbiAgICBsYWJlbFBvc2l0aW9uID8gOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIHNob3J0IG5hbWUgb2YgYSBoZWxwZXIgY2xhc3Mgd2hpY2ggbWFuYWdlcyByZW5kZXJpbmcgYW5kIHN0eWxpbmcgb2YgY2hpbGQgaXRlbXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbGF5b3V0KVxuICAgICAqL1xuICAgIGxheW91dCA/IDogc3RyaW5nfENhbGVuZGFyQ29udGFpbmVyTGF5b3V0Q29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIENTUyBzdHlsZSBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIHRoZSBbY29udGVudEVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1sYXlvdXRTdHlsZSlcbiAgICAgKi9cbiAgICBsYXlvdXRTdHlsZSA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgW2NoaWxkIGl0ZW1dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2NvbmZpZy1pdGVtcykgKmNvbmZpZyBvYmplY3RzKiB3aGljaCBpcyB0byBiZSBjb252ZXJ0ZWQgaW50b1xuICAgICAqIGluc3RhbmNlcyBvbmx5IHdoZW4gdGhpcyBDb250YWluZXIgaXMgcmVuZGVyZWQsIHJhdGhlciB0aGFuIGVhZ2VybHkgYXQgY29uc3RydWN0IHRpbWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbGF6eUl0ZW1zKVxuICAgICAqL1xuICAgIGxhenlJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPnxDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWdbXXxXaWRnZXRbXVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWxpc3RlbmVycylcbiAgICAgKi9cbiAgICBsaXN0ZW5lcnMgPyA6IENhbGVuZGFyTGlzdGVuZXJzXG4gICAgLyoqXG4gICAgICogQSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LCBvciBhIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2hlbiBhIHN0b3JlIGlzIHBlcmZvcm1pbmcgYSByZW1vdGVcbiAgICAgKiBvcGVyYXRpb24sIG9yIENydWQgTWFuYWdlciBpcyBsb2FkaW5nIGRhdGEgZnJvbSB0aGUgc2V2ZXIuIFNldCB0byBgbnVsbGAgdG8gZGlzYWJsZSBkZWZhdWx0IGxvYWQgbWFzay5cbiAgICAgKi9cbiAgICBsb2FkTWFzayA/IDogc3RyaW5nfE1hc2tDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCB0byBhZGp1c3QgdGhlIFttYXNrRGVmYXVsdHNdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tEZWZhdWx0cylcbiAgICAgKiB3aGVuIGRhdGEgaXMgbG9hZGluZy4gVGhlIG1lc3NhZ2UgYW5kIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGVcbiAgICAgKiBbbG9hZE1hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9taXhpbi9Mb2FkTWFza2FibGUjY29uZmlnLWxvYWRNYXNrKSBjb25maWcgdGFrZSBwcmlvcml0eSBvdmVyIHRoZXNlIG9wdGlvbnMsIGp1c3QgYXMgdGhleSBkb1xuICAgICAqIGZvciBgbWFza0RlZmF1bHRzYCwgcmVzcGVjdGl2ZWx5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWxvYWRNYXNrRGVmYXVsdHMpXG4gICAgICovXG4gICAgbG9hZE1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCB0byBhZGp1c3QgdGhlIFttYXNrRGVmYXVsdHNdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tEZWZhdWx0cylcbiAgICAgKiB3aGVuIGFuIGVycm9yIG9jY3VycyBsb2FkaW5nIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbG9hZE1hc2tFcnJvcilcbiAgICAgKi9cbiAgICBsb2FkTWFza0Vycm9yID8gOiBNYXNrQ29uZmlnfE1hc2t8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgY2xhc3MgdHJhbnNsYXRpb25zIG9mIHdoaWNoIGFyZSB1c2VkIGZvciB0cmFuc2xhdGluZyB0aGlzIGVudGl0eS5cbiAgICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgd2hlbiB0cmFuc2xhdGlvbnMgb2YgYW4gaXRlbSBhcmUgZGVmaW5lZCBvbiBpdHMgY29udGFpbmVyIGNsYXNzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWxvY2FsZUNsYXNzKVxuICAgICAqL1xuICAgIGxvY2FsZUNsYXNzID8gOiB0eXBlb2YgQmFzZVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgbG9jYWxpemF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIHdoaWNoIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNsYXRlZCBhdXRvbWF0aWNhbGx5IHVwb24gYSBsb2NhbGUgYXBwbHlpbmcuXG4gICAgICogSW4gY2FzZSB0aGVyZSBpcyBhIG5lZWQgdG8gbG9jYWxpemUgbm90IHR5cGljYWwgdmFsdWUgKG5vdCBhIFN0cmluZyB2YWx1ZSBvciBhIGZpZWxkIHdpdGggcmUtZGVmaW5lZCBzZXR0ZXIvZ2V0dGVyKSxcbiAgICAgKiB5b3UgY291bGQgdXNlICdsb2NhbGVLZXknIG1ldGEgY29uZmlndXJhdGlvbi5cbiAgICAgKiBFeGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWxvY2FsaXphYmxlUHJvcGVydGllcylcbiAgICAgKi9cbiAgICBsb2NhbGl6YWJsZVByb3BlcnRpZXMgPyA6IHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgU2NoZWR1bGVyIHNob3VsZCBwcmVzZXJ2ZSBpdHMgc2VsZWN0aW9uIG9mIGV2ZW50cyB3aGVuIGxvYWRpbmcgYSBuZXcgZGF0YXNldFxuICAgICAqIChpZiBzZWxlY3RlZCBldmVudCBpZHMgYXJlIGluY2x1ZGVkIGluIHRoZSBuZXdseSBsb2FkZWQgZGF0YXNldCkuXG4gICAgICovXG4gICAgbWFpbnRhaW5TZWxlY3Rpb25PbkRhdGFzZXRDaGFuZ2UgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyBtYXJnaW4uIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYFRSQkxgIGZvcm1hdCBzdHJpbmcuXG4gICAgICogbnVtZXJpYy1vbmx5IHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzLlxuICAgICAqL1xuICAgIG1hcmdpbiA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIG9iamVjdCBjb250YWlucyB0aGUgZGVmYXVsdHMgZm9yIHRoZSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjcmVhdGVkIGZvciB0aGVcbiAgICAgKiBbbWFza2VkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza2VkKSBjb25maWcuIEFueSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbiB0aGUgYG1hc2tlZGAgY29uZmlnIHdpbGwgb3ZlcnJpZGUgdGhlc2VcbiAgICAgKiB2YWx1ZXMuXG4gICAgICovXG4gICAgbWFza0RlZmF1bHRzID8gOiBNYXNrQ29uZmlnXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhcHBseSB0aGUgZGVmYXVsdCBtYXNrIHRvIHRoZSB3aWRnZXQuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIHRoZSBtYXNrIG1lc3NhZ2Ugb3IgYVxuICAgICAqIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgbWFza2VkID8gOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gZGF0ZSB0byB3aGljaCB0aGUgYGVuZERhdGVgIG9mIGFueSBjaGlsZCB2aWV3IG1heSBiZSBuYXZpZ2F0ZWQuXG4gICAgICovXG4gICAgbWF4RGF0ZSA/IDogRGF0ZXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudCdzIG1heEhlaWdodC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFtoZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1oZWlnaHQpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtYXhIZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLW1heGltaXplT25Nb2JpbGUpXG4gICAgICovXG4gICAgbWF4aW1pemVPbk1vYmlsZSA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtYXhXaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXdpZHRoKSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4V2lkdGggPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBkYXRlIHRvIHdoaWNoIHRoZSBgc3RhcnREYXRlYCBvZiBhbnkgY2hpbGQgdmlldyBtYXkgYmUgbmF2aWdhdGVkLlxuICAgICAqL1xuICAgIG1pbkRhdGUgPyA6IERhdGV8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtaW5IZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWluSGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnRzIG1pbldpZHRoLiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW3dpZHRoXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2lkdGgpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtaW5XaWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFdoaWNoIG9mIHRoZSBidWlsdC1pbiBbbW9kZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbW9kZXMpIHNob3VsZCBiZSB0aGUgaW5pdGlhbGx5IGFjdGl2ZSB2aWV3LlxuICAgICAqL1xuICAgIG1vZGUgPyA6ICdhZ2VuZGEnfCd5ZWFyJ3wnbW9udGgnfCd3ZWVrJ3wnZGF5J3wnbGlzdCd8J3Jlc291cmNlJ3wnZGF5cmVzb3VyY2UnfCdkYXlhZ2VuZGEnfCdtb250aGFnZW5kYSd8J21vbnRoZ3JpZCd8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHRvIHVzZSB0byBjb25maWd1cmUgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBbbW9kZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbW9kZXMpIHByaW9yIHRvIHRoZWlyIGNvbnN0cnVjdGlvbi5cbiAgICAgKi9cbiAgICBtb2RlRGVmYXVsdHMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIHZpZXcgbW9kZXMgd2hpY2ggYXJlIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGlzIENhbGVuZGFyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLW1vZGVzKVxuICAgICAqL1xuICAgIG1vZGVzID8gOiB7XG4gICAgICAgIFttb2RlOiBzdHJpbmddOiBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8Ym9vbGVhbnxudWxsfHVuZGVmaW5lZFxuICAgICAgICBhZ2VuZGE/OiBBZ2VuZGFWaWV3Q29uZmlnfGJvb2xlYW58bnVsbFxuICAgICAgICB5ZWFyPzogWWVhclZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIG1vbnRoPzogTW9udGhWaWV3Q29uZmlnfGJvb2xlYW58bnVsbFxuICAgICAgICB3ZWVrPzogV2Vla1ZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIGRheT86IERheVZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIGxpc3Q/OiBFdmVudExpc3RDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIHJlc291cmNlPzogUmVzb3VyY2VWaWV3Q29uZmlnfGJvb2xlYW58bnVsbFxuICAgICAgICBkYXlyZXNvdXJjZXZpZXc/OiBEYXlSZXNvdXJjZVZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIGRheWFnZW5kYT86IERheUFnZW5kYVZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIG1vbnRoYWdlbmRhPzogTW9udGhBZ2VuZGFWaWV3Q29uZmlnfGJvb2xlYW58bnVsbFxuICAgICAgICBtb250aGdyaWQ/OiBNb250aEdyaWRDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBpcyBjb25maWd1cmVkIGFzIGB0cnVlYCBhIFtSZXNpemVPYnNlcnZlcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Jlc2l6ZU9ic2VydmVyKVxuICAgICAqIGlzIHVzZWQgdG8gbW9uaXRvciB0aGlzIGVsZW1lbnQgZm9yIHNpemUgY2hhbmdlcyBjYXVzZWQgYnkgZWl0aGVyIHN0eWxlIG1hbmlwdWxhdGlvbiwgb3IgYnkgQ1NTXG4gICAgICogbGF5b3V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLW1vbml0b3JSZXNpemUpXG4gICAgICovXG4gICAgbW9uaXRvclJlc2l6ZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGltbWVkaWF0ZT86IGJvb2xlYW5cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBhbGxvdyBgQ1RSTC9DTUQrY2xpY2tgIHRvIHNlbGVjdCBtdWx0aXBsZSBldmVudHMgaW4gdGhlIHNjaGVkdWxlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1tdWx0aUV2ZW50U2VsZWN0KVxuICAgICAqL1xuICAgIG11bHRpRXZlbnRTZWxlY3QgPyA6IGJvb2xlYW58e1xuICAgICAgICBjdHJsS2V5PzogYm9vbGVhblxuICAgICAgICBhbHRLZXk/OiBib29sZWFuXG4gICAgICAgIHNoaWZ0S2V5PzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBkZWZhdWx0IGNvbmZpZyBvYmplY3RzIHdoaWNoIG1heSBiZSByZWZlcmVuY2VkIGJ5IG5hbWUgaW4gdGhlIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKVxuICAgICAqIGNvbmZpZy4gRm9yIGV4YW1wbGUsIGEgc3BlY2lhbGl6ZWQgW01lbnVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWVudSkgc3ViY2xhc3MgbWF5IGhhdmUgYSBgbmFtZWRJdGVtc2AgZGVmYXVsdFxuICAgICAqIHZhbHVlIGRlZmluZWQgbGlrZSB0aGlzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLW5hbWVkSXRlbXMpXG4gICAgICovXG4gICAgbmFtZWRJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGVyZSB0aGUgTmV4dC9QcmV2aW91cy9Ub2RheSBidXR0b25zIHNob3VsZCBiZSBwbGFjZWQuXG4gICAgICovXG4gICAgbmF2aWdhdG9yUGxhY2VtZW50ID8gOiAndG9vbGJhcid8J3NpZGViYXInXG4gICAgLyoqXG4gICAgICogTm9uLXdvcmtpbmcgZGF5cyBhcyBhbiBvYmplY3Qgd2hlcmUga2V5cyBhcmUgZGF5IGluZGljZXMsIDAtNiAoU3VuZGF5LVNhdHVyZGF5KSwgYW5kIHRoZSB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbm9uV29ya2luZ0RheXMpXG4gICAgICovXG4gICAgbm9uV29ya2luZ0RheXMgPyA6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+XG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIFtzaWRlYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjcHJvcGVydHktc2lkZWJhcikgZXhwYW5kcyBhbmQgY29sbGFwc2VzIHRha2luZyB3aWR0aCBmcm9tIHRoZVxuICAgICAqIGNhbGVuZGFyIFVJLiBDb25maWd1cmUgYG92ZXJsYXlTaWRlYmFyYCBhcyBgdHJ1ZWAgdG8gaGF2ZSBpdCBzdGFydCBjb2xsYXBzZWQsIGFuZCB0aGVuXG4gICAgICogPHN0cm9uZz5vdmVybGF5PC9zdHJvbmc+IHRoZSBjYWxlbmRhciBVSSB3aGVuIHRoZSBleHBhbmQvY29sbGFwc2UgYnV0dG9uIGlzIHRvZ2dsZWQuXG4gICAgICovXG4gICAgb3ZlcmxheVNpZGViYXIgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgb3duaW5nIFdpZGdldCBvZiB0aGlzIFdpZGdldC4gSWYgdGhpcyBXaWRnZXQgaXMgZGlyZWN0bHkgY29udGFpbmVkICh0aGF0IGlzLCBpdCBpcyBvbmUgb2YgdGhlXG4gICAgICogW2l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNwcm9wZXJ0eS1pdGVtcykgb2YgYSBDb250YWluZXIpLCB0aGlzIGNvbmZpZyB3aWxsIGJlIGlnbm9yZWQuIEluIHRoaXMgY2FzZVxuICAgICAqIHRoZSBvd25lciBpcyA8c3Ryb25nPmFsd2F5czwvc3Ryb25nPiB0aGUgZW5jYXBzdWxhdGluZyBDb250YWluZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctb3duZXIpXG4gICAgICovXG4gICAgb3duZXIgPyA6IFdpZGdldHxhbnlcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHdoZW4gYSB3aWRnZXQgaXMgcmVuZGVyZWQgaW50byBhbm90aGVyIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLCBidXQgbXVzdFxuICAgICAqIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgc3RhbmRhcmQgbGF5b3V0IG9mIHRoYXQgd2lkZ2V0LCBhbmQgbXVzdCBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlbHkgdG8gdGhhdFxuICAgICAqIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXBvc2l0aW9uZWQpXG4gICAgICovXG4gICAgcG9zaXRpb25lZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdG9vbHRpcCBmcm9tIGJlaW5nIGRpc3BsYXllZCBvbiB0b3VjaCBkZXZpY2VzLiBVc2VmdWwgZm9yIGV4YW1wbGUgZm9yIGJ1dHRvbnMgdGhhdCBkaXNwbGF5IGFcbiAgICAgKiBtZW51IG9uIGNsaWNrIGV0Yywgc2luY2UgdGhlIHRvb2x0aXAgd291bGQgYmUgZGlzcGxheWVkIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICovXG4gICAgcHJldmVudFRvb2x0aXBPblRvdWNoID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBbUHJvamVjdE1vZGVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwpIGluc3RhbmNlIG9yIGEgY29uZmlnIG9iamVjdC4gVGhlIHByb2plY3QgaG9sZHMgYWxsIFNjaGVkdWxlciBkYXRhLlxuICAgICAqIENhbiBiZSBvbWl0dGVkIGluIGZhdm9yIG9mIGluZGl2aWR1YWwgc3RvcmUgY29uZmlncyBvciBbY3J1ZE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vU2NoZWR1bGVyU3RvcmVzI2NvbmZpZy1jcnVkTWFuYWdlcikgY29uZmlnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXByb2plY3QpXG4gICAgICovXG4gICAgcHJvamVjdCA/IDogUHJvamVjdE1vZGVsfFByb2plY3RNb2RlbENvbmZpZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZXMgb2YgcHJvcGVydGllcyB3aGljaCBhcmUgcHJvcGFnYXRlZCBkb3duIGZyb20gdGhlIENhbGVuZGFyIHRvIGNoaWxkIHZpZXdzXG4gICAgICogdW5sZXNzIHRoZSB2aWV3IGhhcyBpdHMgb3duIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIHByb3BhZ2F0ZWRDb25maWdzID8gOiBzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gbWFrZSB0aGUgY2FsZW5kYXIgcmVhZC1vbmx5LCBieSBkaXNhYmxpbmcgYW55IFVJcyBmb3IgbW9kaWZ5aW5nIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctcmVhZE9ubHkpXG4gICAgICovXG4gICAgcmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlybWF0aW9uIGRpYWxvZyBzaG93biB3aGVuIGEgcmVjdXJyaW5nIGV2ZW50IGlzIGVkaXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1yZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXApXG4gICAgICovXG4gICAgcmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwID8gOiBSZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXBDb25maWd8UmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwXG4gICAgcmVsYXlTdG9yZUV2ZW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIGRlZmF1bHQgYHJlbmRpdGlvbmAgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIHdpZGdldHMsIG9yIGEgbWFwIG9mIHJlbmRpdGlvbnMga2V5ZWQgYnkgY2hpbGQgd2lkZ2V0XG4gICAgICogYHR5cGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXJlbmRpdGlvbilcbiAgICAgKi9cbiAgICByZW5kaXRpb24gPyA6IHN0cmluZ3xSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fG51bGxcbiAgICAvKipcbiAgICAgKiBQYXRoIHRvIGxvYWQgcmVzb3VyY2UgaW1hZ2VzIGZyb20uIFVzZWQgYnkgdGhlIHJlc291cmNlIGhlYWRlcnMgaW4gUmVzb3VyY2VWaWV3IGFuZCBieVxuICAgICAqIFtzaG93UmVzb3VyY2VBdmF0YXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1zaG93UmVzb3VyY2VBdmF0YXJzKSBpbiBldmVudC1kaXNwbGF5aW5nXG4gICAgICogbW9kZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctcmVzb3VyY2VJbWFnZVBhdGgpXG4gICAgICovXG4gICAgcmVzb3VyY2VJbWFnZVBhdGggPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIElubGluZSByZXNvdXJjZXMsIHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIFtyZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL21peGluL0NhbGVuZGFyU3RvcmVzI3Byb3BlcnR5LXJlc291cmNlU3RvcmUpLlxuICAgICAqL1xuICAgIHJlc291cmNlcyA/IDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBbUmVzb3VyY2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvZGF0YS9SZXNvdXJjZVN0b3JlKSBvciBhIHJlY29uZmlndXJpbmcgb2JqZWN0IGZvciBhIHN0b3JlIHdoaWNoIHdpbGwgaG9sZCB0aGUgcmVzb3VyY2VzIHRvIGJlIHJlbmRlcmVkIGludG8gdGhlIENhbGVuZGFyLlxuICAgICAqL1xuICAgIHJlc291cmNlU3RvcmUgPyA6IFJlc291cmNlU3RvcmV8UmVzb3VyY2VTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIElubGluZSByZXNvdXJjZSB0aW1lIHJhbmdlcywgd2lsbCBiZSBsb2FkZWQgaW50byBbcmVzb3VyY2VUaW1lUmFuZ2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9taXhpbi9DYWxlbmRhclN0b3JlcyNwcm9wZXJ0eS1yZXNvdXJjZVRpbWVSYW5nZVN0b3JlKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1yZXNvdXJjZVRpbWVSYW5nZXMpXG4gICAgICovXG4gICAgcmVzb3VyY2VUaW1lUmFuZ2VzID8gOiBSZXNvdXJjZVRpbWVSYW5nZU1vZGVsW118UmVzb3VyY2VUaW1lUmFuZ2VNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIFtSZXNvdXJjZVRpbWVSYW5nZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9kYXRhL1Jlc291cmNlVGltZVJhbmdlU3RvcmUpIG9yIGEgcmVjb25maWd1cmluZyBvYmplY3QgZm9yIGEgc3RvcmUgd2hpY2ggd2lsbCBob2xkIHJlc291cmNlIHRpbWUgcmFuZ2VzLlxuICAgICAqIFRoZXNlIG1heSBiZSB1c2VkIGJ5IHRoZSBbVGltZVJhbmdlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL1RpbWVSYW5nZXMpIGZlYXR1cmUuXG4gICAgICovXG4gICAgcmVzb3VyY2VUaW1lUmFuZ2VTdG9yZSA/IDogUmVzb3VyY2VUaW1lUmFuZ2VTdG9yZXxSZXNvdXJjZVRpbWVSYW5nZVN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB2YXJpb3VzIHJlc3BvbnNpdmUgc3RhdGUgb2JqZWN0cyBrZXllZCBieSB0aGVpciBuYW1lLiBFYWNoIGtleSAoZXhjZXB0IGAnKidgLCBzZWUgYmVsb3cpIGluXG4gICAgICogdGhpcyBvYmplY3QgaXMgYSBzdGF0ZSBuYW1lIChzZWUgW3Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlU3RhdGUpKSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgdGhlXG4gICAgICogYXNzb2NpYXRlZCBbUmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjdHlwZWRlZi1SZXNwb25zaXZlU3RhdGUpIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1yZXNwb25zaXZlKVxuICAgICAqL1xuICAgIHJlc3BvbnNpdmUgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbWFyayB0aGlzIGluc3RhbmNlIGFzIHRoZSBkZWZhdWx0IFtyZXNwb25zaXZlVGFyZ2V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpIGZvciBkZXNjZW5kYW50cyB0aGF0IGRvXG4gICAgICogbm90IHNwZWNpZnkgYW4gZXhwbGljaXQgW3Jlc3BvbnNpdmVUYXJnZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVRhcmdldCkgb2YgdGhlaXIgb3duLlxuICAgICAqL1xuICAgIHJlc3BvbnNpdmVSb290ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgW3Jlc3BvbnNpdmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZSkgY29uZmlnLiBUaGlzIGlzIGFzc2lnbmVkIGludGVybmFsbHlcbiAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSBhc3NpZ25lZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICByZXNwb25zaXZlU3RhdGUgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSB3aWRnZXQgd2hvc2Ugc2l6ZSBhbmQgb3RoZXIgcHJvcGVydGllcyBkcml2ZSB0aGlzIG9iamVjdCdzIHJlc3BvbnNpdmUgYmVoYXZpb3IuIElmIHRoaXMgY29uZmlnIGlzIG5vdFxuICAgICAqIHNwZWNpZmllZCwgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgdGhhdCBzcGVjaWZpZWQgW3Jlc3BvbnNpdmVSb290PXRydWVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVJvb3QpIHdpbGwgYmVcbiAgICAgKiB1c2VkLiBJZiB0aGVyZSBpcyBubyBzdWNoIGFuY2VzdG9yLCB0aGVuIHRoZSBpbnN0YW5jZSB1c2luZyB0aGlzIG1peGluIGlzIHVzZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctcmVzcG9uc2l2ZVRhcmdldClcbiAgICAgKi9cbiAgICByZXNwb25zaXZlVGFyZ2V0ID8gOiBzdHJpbmd8V2lkZ2V0XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBoYXZlIHRoZSBjb21wb25lbnQgZGlzcGxheSBhIHRyYW5zbHVjZW50IHJpcHBsZSB3aGVuIGl0c1xuICAgICAqIFtmb2N1c0VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWZvY3VzRWxlbWVudCksIG9yIFtlbGVtZW50XSgjQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpIGlzIHRhcHBlZCA8ZW0+aWYgdGhlXG4gICAgICogY3VycmVudCB0aGVtZSBzdXBwb3J0cyByaXBwbGVzPC9lbT4uIE91dCBvZiB0aGUgYm94LCBvbmx5IHRoZSBNYXRlcmlhbCB0aGVtZSBzdXBwb3J0cyByaXBwbGVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXJpcHBsZSlcbiAgICAgKi9cbiAgICByaXBwbGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBkZWxlZ2F0ZT86IHN0cmluZ1xuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICAgICByYWRpdXM/OiBudW1iZXJcbiAgICAgICAgY2xpcD86IHN0cmluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB5b3UgYXJlIHJlbmRlcmluZyB0aGlzIHdpZGdldCB0byBhIHNoYWRvdyByb290IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCB0aGlzIGNvbmZpZyB0byB0aGUgc2hhZG93Um9vdC4gSWYgbm90IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCBpdCB0byBgZG9jdW1lbnQuYm9keWBcbiAgICAgKi9cbiAgICByb290RWxlbWVudCA/IDogU2hhZG93Um9vdHxIVE1MRWxlbWVudFxuICAgIC8qKlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYHRydWVgIHRvIG1ha2UgdGhlIHdpZGdldCdzIGVsZW1lbnQgdXNlIHRoZSBgZGlyZWN0aW9uOnJ0bGAgc3R5bGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctcnRsKVxuICAgICAqL1xuICAgIHJ0bCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIChhbmQgb3B0aW9uYWxseSBpbiB3aGljaCBheGVzKSBhIFdpZGdldCBtYXkgc2Nyb2xsLiBgdHJ1ZWAgbWVhbnMgdGhpcyB3aWRnZXQgbWF5IHNjcm9sbFxuICAgICAqIGluIGJvdGggYXhlcy4gTWF5IGJlIGFuIG9iamVjdCBjb250YWluaW5nIGJvb2xlYW4gYG92ZXJmbG93WGAgYW5kIGBvdmVyZmxvd1lgIHByb3BlcnRpZXMgd2hpY2ggYXJlXG4gICAgICogYXBwbGllZCB0byBDU1Mgc3R5bGUgcHJvcGVydGllcyBgb3ZlcmZsb3dYYCBhbmQgYG92ZXJmbG93WWAuIElmIHRoZXkgYXJlIGJvb2xlYW4sIHRoZXkgYXJlIHRyYW5zbGF0ZWQgdG9cbiAgICAgKiBDU1Mgb3ZlcmZsb3cgcHJvcGVydGllcyB0aHVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXNjcm9sbGFibGUpXG4gICAgICovXG4gICAgc2Nyb2xsYWJsZSA/IDogYm9vbGVhbnxTY3JvbGxlckNvbmZpZ3xTY3JvbGxlclxuICAgIC8qKlxuICAgICAqIERlZmluZXMgd2hhdCB0byBkbyBpZiBkb2N1bWVudCBpcyBzY3JvbGxlZCB3aGlsZSBXaWRnZXQgaXMgdmlzaWJsZSAob25seSByZWxldmFudCB3aGVuIGZsb2F0aW5nIGlzIHNldCB0byBgdHJ1ZWApLlxuICAgICAqIFZhbGlkIHZhbHVlczogwrRudWxswrQ6IGRvIG5vdGhpbmcsIMK0aGlkZcK0OiBoaWRlIHRoZSB3aWRnZXQgb3IgwrRyZWFsaWduwrQ6IHJlYWxpZ24gdG8gdGhlIHRhcmdldCBpZiBwb3NzaWJsZS5cbiAgICAgKi9cbiAgICBzY3JvbGxBY3Rpb24gPyA6ICdoaWRlJ3wncmVhbGlnbid8bnVsbFxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBzZWxlY3QgdGhlIHJlc291cmNlIG9mIHRoZSBldmVudCB3aGVuIGNsaWNraW5nIGFuIGV2ZW50IGJhci5cbiAgICAgKi9cbiAgICBzZWxlY3RSZXNvdXJjZU9uRXZlbnROYXZpZ2F0ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBzZWxlY3QgdGhlIHJvdy9yZXNvdXJjZSB3aGVuIGNsaWNraW5nIHRoZSBlbXB0eSBhcmVhIGluIGEgdGltZSBheGlzIGNlbGwuXG4gICAgICovXG4gICAgc2VsZWN0UmVzb3VyY2VPblNjaGVkdWxlQ2xpY2sgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXNob3dBbmltYXRpb24pXG4gICAgICovXG4gICAgc2hvd0FuaW1hdGlvbiA/IDogYm9vbGVhbnxvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBoaWRlIHJlY3VycmluZyBmaWVsZHMgaW4gZXZlbnQgZWRpdG9yLCBldmVuIGlmIHRoZVxuICAgICAqIFtSZWN1cnJpbmcgRXZlbnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL1JlY3VycmluZ0V2ZW50cyNjb25maWctZW5hYmxlUmVjdXJyaW5nRXZlbnRzKSBpcyBgdHJ1ZWBcbiAgICAgKiBhbmQgYSByZWN1cnJpbmcgZXZlbnQgaXMgYmVpbmcgZWRpdGVkLlxuICAgICAqL1xuICAgIHNob3dSZWN1cnJpbmdVSSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBzaG93IHRoZSB0b29sdGlwIHdoZW4gdGhpcyB3aWRnZXQgaXMgW2Rpc2FibGVkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1kaXNhYmxlZClcbiAgICAgKi9cbiAgICBzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGNvbmZpZyBvYmplY3QgdG8gY29uZmlndXJlIHRoZSBbU2lkZWJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvU2lkZWJhcikgd2hpY2ggaXNcbiAgICAgKiBzaG93biBuZXh0IHRvIHRoZSBjYWxlbmRhciB2aWV3cyBzcGVjaWZpZWQgYnkgdGhlIFttb2Rlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1tb2RlcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc2lkZWJhcilcbiAgICAgKiBAcGFyYW0geydsZWZ0JywncmlnaHQnfSBzaWRlIFdoaWNoIFtzaWRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9TaWRlYmFyI2NvbmZpZy1zaWRlKSB0byBkb2NrIHRvLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY29sbGFwc2VkIE1heSBiZSBpbml0aWFsbHkgW2NvbGxhcHNlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvU2lkZWJhciNjb25maWctY29sbGFwc2VkKS5cbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZz59IGl0ZW1zIFJlY29uZmlndXJlIG9yIGFkZCB0byB0aGUgc2lkZWJhciBVSS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ30gaXRlbXMuY3VzdG9tIFNldHRpbmdzIHNwZWNpZmljIHRvIGN1c3RvbSBpdGVtLlxuICAgICAqIEBwYXJhbSB7RGF0ZVBpY2tlckNvbmZpZ30gaXRlbXMuZGF0ZVBpY2tlciBUaGUgW0RhdGVQaWNrZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvRGF0ZVBpY2tlcikgbWF5IGJlIHJlY29uZmlndXJlZCB1c2luZyBhbiBvYmplY3QsIG9yIGNvbmZpZ3VyZWQgYXdheSB1c2luZyBgbnVsbGAuIEl0cyBkZWZhdWx0IFt3ZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13ZWlnaHQpIGlzIDEwMC5cbiAgICAgKiBAcGFyYW0ge1RleHRGaWVsZENvbmZpZ30gaXRlbXMuZXZlbnRGaWx0ZXIgVGhlIGV2ZW50RmlsdGVyIGlzIGEgW1RleHRGaWVsZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UZXh0RmllbGQpIHdoaWNoIG1heSBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZXZlbnRzIGJ5IG1hdGNoZWQgbmFtZS4gSXQgbWF5IGJlIHJlY29uZmlndXJlZCB1c2luZyBhbiBvYmplY3QsIG9yIGNvbmZpZ3VyZWQgYXdheSB1c2luZyBgbnVsbGAuIEl0cyBkZWZhdWx0IFt3ZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13ZWlnaHQpIGlzIDE1MC5cbiAgICAgKiBAcGFyYW0ge1Jlc291cmNlRmlsdGVyQ29uZmlnfSBpdGVtcy5yZXNvdXJjZUZpbHRlciBUaGUgW1Jlc291cmNlRmlsdGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci93aWRnZXQvUmVzb3VyY2VGaWx0ZXIpIG1heSBiZSByZWNvbmZpZ3VyZWQgdXNpbmcgYW4gb2JqZWN0LCBvciBjb25maWd1cmVkIGF3YXkgdXNpbmcgYG51bGxgLiBJdHMgZGVmYXVsdCBbd2VpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2VpZ2h0KSBpcyAyMDAuXG4gICAgICovXG4gICAgc2lkZWJhciA/IDoge3NpZGU/OiAnbGVmdCd8J3JpZ2h0JywgY29sbGFwc2VkPzogYm9vbGVhbiwgaXRlbXM6IHsgW21vZGU6IHN0cmluZ106IENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xudWxsfHVuZGVmaW5lZCwgZGF0ZVBpY2tlcj86IERhdGVQaWNrZXJDb25maWcsIGV2ZW50RmlsdGVyPzogVGV4dEZpZWxkQ29uZmlnLCByZXNvdXJjZUZpbHRlcj86IFJlc291cmNlRmlsdGVyQ29uZmlnIH19fGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIGhvdyBtYW55IGNvbHVtbnMgdG8gc3BhbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBzcGFuID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGlzIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1zdGF0ZWZ1bClcbiAgICAgKi9cbiAgICBzdGF0ZWZ1bCA/IDogYm9vbGVhbnxvYmplY3R8c3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnRzIHRoYXQsIHdoZW4gZmlyZWQgYnkgdGhpcyBjb21wb25lbnQsIHNob3VsZCB0cmlnZ2VyIGl0IHRvIHNhdmUgaXRzIHN0YXRlIGJ5IGNhbGxpbmdcbiAgICAgKiBbc2F2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjZnVuY3Rpb24tc2F2ZVN0YXRlKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1zdGF0ZWZ1bEV2ZW50cylcbiAgICAgKi9cbiAgICBzdGF0ZWZ1bEV2ZW50cyA/IDogb2JqZWN0fHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGtleSB0byB1c2Ugd2hlbiBzYXZpbmcgdGhpcyBvYmplY3QncyBzdGF0ZSBpbiB0aGUgW3N0YXRlUHJvdmlkZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNjb25maWctc3RhdGVQcm92aWRlcikuIElmIHRoaXMgY29uZmlnIGlzXG4gICAgICogbm90IGFzc2lnbmVkLCBhbmQgW3N0YXRlZnVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlZnVsKSBpcyBub3Qgc2V0IHRvIGBmYWxzZWAsIHRoZSBbaWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWlkKVxuICAgICAqIChpZiBleHBsaWNpdGx5IHNwZWNpZmllZCkgd2lsbCBiZSB1c2VkIGFzIHRoZSBgc3RhdGVJZGAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc3RhdGVJZClcbiAgICAgKi9cbiAgICBzdGF0ZUlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgYFN0YXRlUHJvdmlkZXJgIHRvIHVzZSB0byBzYXZlIGFuZCByZXN0b3JlIHRoaXMgb2JqZWN0J3MgW3N0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjcHJvcGVydHktc3RhdGUpLiBCeSBkZWZhdWx0LCBgc3RhdGVgXG4gICAgICogd2lsbCBiZSBzYXZlZCB1c2luZyB0aGUgW2RlZmF1bHQgc3RhdGUgcHJvdmlkZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9zdGF0ZS9TdGF0ZVByb3ZpZGVyI3Byb3BlcnR5LWluc3RhbmNlLXN0YXRpYykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc3RhdGVQcm92aWRlcilcbiAgICAgKi9cbiAgICBzdGF0ZVByb3ZpZGVyID8gOiBTdGF0ZVByb3ZpZGVyXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gbWF0Y2ggZmllbGRzIGJ5IHRoZWlyIGBuYW1lYCBwcm9wZXJ0eSBvbmx5IHdoZW4gYXNzaWduaW5nIGEgW3JlY29yZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLXJlY29yZCksXG4gICAgICogd2l0aG91dCBmYWxsaW5nIGJhY2sgdG8gYHJlZmAuXG4gICAgICovXG4gICAgc3RyaWN0UmVjb3JkTWFwcGluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBjb250YWluaW5nIHdpZGdldHMga2V5ZWQgYnkgbmFtZS4gQnkgZGVmYXVsdCAod2hlbiBubyBgdHlwZWAgaXMgZ2l2ZW4pLCBzdHJpcHMgYXJlXG4gICAgICogW3Rvb2xiYXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2xiYXIpLiBJZiB5b3Ugd2FudCB0byBwYXNzIGFuIGFycmF5LCB5b3UgY2FuIHVzZVxuICAgICAqIHRoZSB0b29sYmFyJ3MgW2l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNjb25maWctaXRlbXMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXN0cmlwcylcbiAgICAgKi9cbiAgICBzdHJpcHMgPyA6IFJlY29yZDxzdHJpbmcsIENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZz5cbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QsIG9yIGEgbWVzc2FnZSB0byBiZSBzaG93biB3aGVuIENydWQgTWFuYWdlclxuICAgICAqIGlzIHBlcnNpc3RpbmcgY2hhbmdlcyBvbiB0aGUgc2VydmVyLiBTZXQgdG8gYG51bGxgIHRvIGRpc2FibGUgZGVmYXVsdCBzeW5jIG1hc2suXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc3luY01hc2spXG4gICAgICovXG4gICAgc3luY01hc2sgPyA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbdGFiXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYikgY3JlYXRlZCBmb3IgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBwbGFjZWQgaW4gYVxuICAgICAqIFtUYWJQYW5lbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJQYW5lbCkuIEZvciBleGFtcGxlLCB0aGlzIGNvbmZpZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBpY29uIG9mIHRoZSBgdGFiYCBmb3JcbiAgICAgKiB0aGlzIHdpZGdldDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10YWIpXG4gICAgICovXG4gICAgdGFiID8gOiBib29sZWFufFRhYkNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBjb250YWluZXIgaXMgdXNlZCBhcyBhIHRhYiBpbiBhIFRhYlBhbmVsLCB0aGVzZSBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlXG4gICAgICogW1RhYkJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJCYXIpIHdoZW4gdGhpcyBjb250YWluZXIgaXMgdGhlIGFjdGl2ZSB0YWIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctdGFiQmFySXRlbXMpXG4gICAgICovXG4gICAgdGFiQmFySXRlbXMgPyA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdXG4gICAgLyoqXG4gICAgICogVGhlIHRhZyBuYW1lIG9mIHRoaXMgV2lkZ2V0J3Mgcm9vdCBlbGVtZW50XG4gICAgICovXG4gICAgdGFnID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyBkZWZpbml0aW9ucyBvZiB0aGUgdG9vbGJhciBvZiB0aGUgQ2FsZW5kYXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctdGJhcilcbiAgICAgKi9cbiAgICB0YmFyID8gOiAoQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfENhbGVuZGFyVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogVGV4dCBhbGlnbm1lbnQ6ICdsZWZ0JywgJ2NlbnRlcicgb3IgJ3JpZ2h0Jy4gQWxzbyBhY2NlcHRzIGRpcmVjdGlvbiBuZXV0cmFsICdzdGFydCcgYW5kICdlbmQnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXRleHRBbGlnbilcbiAgICAgKi9cbiAgICB0ZXh0QWxpZ24gPyA6ICdsZWZ0J3wnY2VudGVyJ3wncmlnaHQnfCdzdGFydCd8J2VuZCdcbiAgICAvKipcbiAgICAgKiBJbmxpbmUgdGltZSByYW5nZXMsIHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIFt0aW1lUmFuZ2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9taXhpbi9DYWxlbmRhclN0b3JlcyNwcm9wZXJ0eS10aW1lUmFuZ2VTdG9yZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctdGltZVJhbmdlcylcbiAgICAgKi9cbiAgICB0aW1lUmFuZ2VzID8gOiBUaW1lUmFuZ2VNb2RlbFtdfFRpbWVSYW5nZU1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgW1RpbWVSYW5nZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2RhdGEvVGltZVJhbmdlU3RvcmUpIG9yIGEgcmVjb25maWd1cmluZyBvYmplY3QgZm9yIGEgc3RvcmUgd2hpY2ggd2lsbCBob2xkIHRpbWUgcmFuZ2VzLlxuICAgICAqIFRoZXNlIG1heSBiZSB1c2VkIGJ5IHRoZSBbVGltZVJhbmdlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL1RpbWVSYW5nZXMpIGZlYXR1cmUuXG4gICAgICovXG4gICAgdGltZVJhbmdlU3RvcmUgPyA6IFRpbWVSYW5nZVN0b3JlfFRpbWVSYW5nZVN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgdGltZSB6b25lIG9yIGEgVVRDIG9mZnNldC4gVGhpcyB3aWxsIHNldCB0aGUgcHJvamVjdCdzXG4gICAgICogW3RpbWVab25lXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXRpbWVab25lKSBjb25maWcgYWNjb3JkaW5nbHkuIEFzIHRoaXMgY29uZmlnIGlzIG9ubHkgYSByZWZlcmVyLFxuICAgICAqIHBsZWFzZSBzZWUgcHJvamVjdCdzIGNvbmZpZyBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy10aW1lWm9uZSkgZm9yIG1vcmVcbiAgICAgKiBpbmZvcm1hdGlvbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10aW1lWm9uZSlcbiAgICAgKi9cbiAgICB0aW1lWm9uZSA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIEEgdGl0bGUgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyIG9yIG93bmluZyBUYWJQYW5lbC4gQ2F1c2VzIGNyZWF0aW9uIGFuZCBkb2NraW5nIG9mIGEgaGVhZGVyXG4gICAgICogdG8gdGhlIHRvcCBpZiBubyBoZWFkZXIgaXMgY29uZmlndXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10aXRsZSlcbiAgICAgKi9cbiAgICB0aXRsZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIFt0b29sc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sKSB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgYHRpdGxlYCBpbiB0aGUgUGFuZWwgaGVhZGVyLiBFYWNoXG4gICAgICogcHJvcGVydHkgbmFtZSBpcyB0aGUgcmVmZXJlbmNlIGJ5IHdoaWNoIGFuIGluc3RhbnRpYXRlZCB0b29sIG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbGl2ZVxuICAgICAqIGBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vVG9vbGFibGUjcHJvcGVydHktdG9vbHMpYCBwcm9wZXJ0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10b29scylcbiAgICAgKi9cbiAgICB0b29scyA/IDogUmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz58bnVsbFxuICAgIC8qKlxuICAgICAqIFRvb2x0aXAgZm9yIHRoZSB3aWRnZXQsIGVpdGhlciBhcyBhIHN0cmluZyBvciBhcyBhIFRvb2x0aXAgY29uZmlnIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10b29sdGlwKVxuICAgICAqL1xuICAgIHRvb2x0aXAgPyA6IHN0cmluZ3xUb29sdGlwQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0YWJiaW5nIHdpdGhpbiBhIFBhbmVsIGlzIG5vdCBjb250YWluZWQsIGllIHlvdSBjYW4gVEFCIG91dCBvZiB0aGUgUGFuZWxcbiAgICAgKiBmb3J3YXJkcyBvciBiYWNrd2FyZHMuXG4gICAgICogQ29uZmlndXJlIHRoaXMgYXMgYHRydWVgIHRvIGRpc2FsbG93IHRhYmJpbmcgb3V0IG9mIHRoZSBQYW5lbCwgYW5kIG1ha2UgdGFiYmluZyBjaXJjdWxhciB3aXRoaW4gdGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICB0cmFwRm9jdXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIHRyaWdnZXIgYHNlbGVjdGlvbkNoYW5nZWAgd2hlbiByZW1vdmluZyBhIHNlbGVjdGVkIGV2ZW50L2Fzc2lnbm1lbnQuXG4gICAgICovXG4gICAgdHJpZ2dlclNlbGVjdGlvbkNoYW5nZU9uUmVtb3ZlID8gOiBib29sZWFuXG4gICAgdHlwZSA/IDogJ2NhbGVuZGFyJ1xuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3MgbmFtZSBzdWZmaXhlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudHMgcmVuZGVyZWQgYnkgdGhpcyB3aWRnZXQuIFRoaXMgbWF5IGJlIHNwZWNpZmllZFxuICAgICAqIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZywgYW4gYXJyYXkgb2Ygc3RyaW5ncywgb3IgYXMgYW4gb2JqZWN0IGluIHdoaWNoIHByb3BlcnR5IG5hbWVzIHdpdGggdHJ1dGh5XG4gICAgICogdmFsdWVzIGFyZSB1c2VkIGFzIHRoZSBjbGFzcyBuYW1lcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy11aSlcbiAgICAgKi9cbiAgICB1aSA/IDogJ3BsYWluJ3wndG9vbGJhcid8c3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkYXkgb2Ygd2VlayBhbmQgd2VlayBvZiBtb250aCBvZiB0aGUgZXZlbnQncyBzdGFydCBkYXRlIGFyZSB1c2VkIHRvIGNyZWF0ZVxuICAgICAqIGhlbHBmdWwgY29udGV4dHVhbCByZWN1cnJlbmNlIHR5cGVzIHdoZW4gZWRpdGluZyBhIG5vbi1yZWN1cnJpbmcgZXZlbnQgcmVjb3JkIGFuZCBjaG9vc2luZ1xuICAgICAqIGFuIGluaXRpYWwgcmVjdXJyZW5jZSB0eXBlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXVzZUNvbnRleHR1YWxSZWN1cnJlbmNlUnVsZXMpXG4gICAgICovXG4gICAgdXNlQ29udGV4dHVhbFJlY3VycmVuY2VSdWxlcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBjaGFuZ2UgaG93IHRoZSBzdWJvcmRpbmF0ZSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lcikgd2hpY2ggY29udGFpbnNcbiAgICAgKiB0aGUgY2FsZW5kYXIncyBjaGlsZCB2aWV3cyBpcyBjcmVhdGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXZpZXdDb250YWluZXIpXG4gICAgICovXG4gICAgdmlld0NvbnRhaW5lciA/IDogQ29udGFpbmVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIHdlZWsgc3RhcnQgZGF5IHRvIGJlIHVzZWQgdGhyb3VnaG91dCB0aGlzIENhbGVuZGFyLCAwIG1lYW5pbmcgU3VuZGF5LCA2IG1lYW5pbmcgU2F0dXJkYXkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctd2Vla1N0YXJ0RGF5KVxuICAgICAqL1xuICAgIHdlZWtTdGFydERheSA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSB3aWRnZXRzIHdlaWdodCBkZXRlcm1pbmVzIGl0cyBwb3NpdGlvbiBhbW9uZyBzaWJsaW5ncyB3aGVuIGFkZGVkIHRvIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLlxuICAgICAqIEhpZ2hlciB3ZWlnaHRzIGdvIGZ1cnRoZXIgZG93bi5cbiAgICAgKi9cbiAgICB3ZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIHdpZHRoLCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS53aWR0aGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgd2lkdGggc3RyaW5nIG9yIGEgbnVtYmVyLCB3aGljaFxuICAgICAqIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgd2lkdGgsIGJ1dCBpbiBzb21lIGNhc2VzXG4gICAgICogdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICB3aWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB4IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXgpXG4gICAgICovXG4gICAgeCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHkgcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWcteSlcbiAgICAgKi9cbiAgICB5ID8gOiBudW1iZXJcblxuICAgIC8vIEZlYXR1cmVzXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIHByb3ZpZGVzIGRyYWctYmFzZWQgZXZlbnQgY3JlYXRpb24gYW5kIG1vZGlmaWNhdGlvbiBmb3IgQ2FsZW5kYXJzLiBXaGVuIGVuYWJsZWQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0XG4gICAgICogZm9yIGNhbGVuZGFycyksIHRoZSB1c2VyIGNhbiBkbyB0aGUgZm9sbG93aW5nIHZpYSB0aGUgbW91c2Ugb3IgdG91Y2ggc2NyZWVuOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvQ2FsZW5kYXJEcmFnKVxuICAgICAqL1xuICAgIGRyYWdGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2FsZW5kYXJEcmFnfENhbGVuZGFyRHJhZ0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgRmVhdHVyZSB0aGF0IGFsbG93cyBzaG93aW5nIGFkZGl0aW9uYWwgdGltZSBiZWZvcmUgJmFtcDsgYWZ0ZXIgYW4gZXZlbnQsIHRvIHZpc3VhbGl6ZSB0aGluZ3MgbGlrZSB0cmF2ZWwgdGltZSAtIG9yIHRoZSB0aW1lIHlvdVxuICAgICAqIG5lZWQgdG8gcHJlcGFyZSBhIHJvb20gZm9yIGEgbWVldGluZyArIGNsZWFuIGl0IHVwIGFmdGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXZlbnRCdWZmZXIpXG4gICAgICovXG4gICAgZXZlbnRCdWZmZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXZlbnRCdWZmZXJ8RXZlbnRCdWZmZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2luZyBbQ3RybC9DTUQgKyBDL1gvVl0gdG8gY29weS9jdXQtYW5kLXBhc3RlIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V2ZW50Q29weVBhc3RlKVxuICAgICAqL1xuICAgIGV2ZW50Q29weVBhc3RlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEV2ZW50Q29weVBhc3RlfEV2ZW50Q29weVBhc3RlQ29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IGRpc3BsYXlzIGEgcG9wdXAgY29udGFpbmluZyBmaWVsZHMgZm9yIGVkaXRpbmcgZXZlbnQgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V2ZW50RWRpdClcbiAgICAgKi9cbiAgICBldmVudEVkaXRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXZlbnRFZGl0fEV2ZW50RWRpdENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZmVhdHVyZSB3aGljaCBzaG93cyBhIGNvbnRleHQgbWVudSB3aGVuIHJpZ2h0LWNsaWNraW5nIGV2ZW50cyBpbiB0aGUgY2FsZW5kYXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FdmVudE1lbnUpXG4gICAgICovXG4gICAgZXZlbnRNZW51RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEV2ZW50TWVudXxFdmVudE1lbnVDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgd2hpY2ggZGlzcGxheXMgYSBbdG9vbHRpcF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V2ZW50VG9vbHRpcCNjb25maWctdG9vbHRpcCkgY29udGFpbmluZyBleHRyYSBpbmZvcm1hdGlvbi4gVGhlIHRvb2x0aXAgY2FuXG4gICAgICogYmUgdHJpZ2dlcmVkIGJ5IGNsaWNraW5nIG9yIGhvdmVyaW5nIGFuIGV2ZW50IGJhciBlbGVtZW50IChzZWUgW3Nob3dPbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V2ZW50VG9vbHRpcCNjb25maWctc2hvd09uKSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FdmVudFRvb2x0aXApXG4gICAgICovXG4gICAgZXZlbnRUb29sdGlwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEV2ZW50VG9vbHRpcHxFdmVudFRvb2x0aXBDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgdGhhdCBhbGxvd3MgZXhwb3J0aW5nIENhbGVuZGFyIGRhdGEgdG8gRXhjZWwgb3IgQ1NWIHdpdGhvdXQgaW52b2x2aW5nIHRoZSBzZXJ2ZXIuIEl0IHVzZXNcbiAgICAgKiBbVGFibGVFeHBvcnRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL3V0aWwvVGFibGVFeHBvcnRlcikgY2xhc3MgYXMgZGF0YSBwcm92aWRlciwgM3JkIHBhcnR5IHByb3ZpZGVyIHRvIGdlbmVyYXRlIFhMUyBmaWxlcywgYW5kXG4gICAgICogW01pY3Jvc29mdCBYTUwgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9vZmZpY2UvZG9jdW1lbnRmb3JtYXQub3BlbnhtbC5zcHJlYWRzaGVldC5hc3B4KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL2V4cGVyaW1lbnRhbC9FeGNlbEV4cG9ydGVyKVxuICAgICAqL1xuICAgIGV4Y2VsRXhwb3J0ZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXhjZWxFeHBvcnRlcnxFeGNlbEV4cG9ydGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBDYWxlbmRhciBmZWF0dXJlIHdoaWNoIGFsbG93cyBuZXcgZXZlbnRzIHRvIGJlIGRyYWdnZWQgaW50byB0aGUgQ2FsZW5kYXIgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlKVxuICAgICAqL1xuICAgIGV4dGVybmFsRXZlbnRTb3VyY2VGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXh0ZXJuYWxFdmVudFNvdXJjZXxFeHRlcm5hbEV2ZW50U291cmNlQ29uZmlnXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGhvc3QgQ2FsZW5kYXIncyBbQ3J1ZE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vU2NoZWR1bGVyU3RvcmVzI2NvbmZpZy1jcnVkTWFuYWdlcikgb24gZGVtYW5kXG4gICAgICogYXMgdGhlIGRhdGUgcmFuZ2UgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgVUkgY2hhbmdlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0xvYWRPbkRlbWFuZClcbiAgICAgKi9cbiAgICBsb2FkT25EZW1hbmRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8TG9hZE9uRGVtYW5kfExvYWRPbkRlbWFuZENvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBlbmFibGVzIHByaW50aW5nIG9mIHRoZSBjdXJyZW50IENhbGVuZGFyIG1vZGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9wcmludC9QcmludClcbiAgICAgKi9cbiAgICBwcmludEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xQcmludHxQcmludENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZmVhdHVyZSB3aGljaCBhZGRzIGEgY29udGV4dCBtZW51IHRvIHRoZSB1bm9jY3VwaWVkIHBhcnRzIG9mIGNhbGVuZGFyIHZpZXdzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvU2NoZWR1bGVNZW51KVxuICAgICAqL1xuICAgIHNjaGVkdWxlTWVudUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTY2hlZHVsZU1lbnV8U2NoZWR1bGVNZW51Q29uZmlnXG4gICAgLyoqXG4gICAgICogQSBmZWF0dXJlIHRoYXQgZGlzcGxheXMgYSB0b29sdGlwIGNvbnRhaW5pbmcgdGhlIHRpbWUgYXQgdGhlIG1vdXNlIHBvc2l0aW9uIHdoZW4gaG92ZXJpbmcgZW1wdHkgcGFydHMgb2YgdGhlIHNjaGVkdWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvU2NoZWR1bGVUb29sdGlwKVxuICAgICAqL1xuICAgIHNjaGVkdWxlVG9vbHRpcEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTY2hlZHVsZVRvb2x0aXB8U2NoZWR1bGVUb29sdGlwQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGhpZ2hsaWdodCByYW5nZXMgb2YgdGltZSBpbiBhIGNhbGVuZGFyJ3MgZGF5IGFuZCB3ZWVrIHZpZXdzLiBFYWNoIHRpbWUgcmFuZ2UgaXNcbiAgICAgKiByZXByZXNlbnRlZCB1c2luZyB0aGUgW1RpbWVSYW5nZU1vZGVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL21vZGVsL1RpbWVSYW5nZU1vZGVsKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL1RpbWVSYW5nZXMpXG4gICAgICovXG4gICAgdGltZVJhbmdlc0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUaW1lUmFuZ2VzfFRpbWVSYW5nZXNDb25maWdcbiAgICAvKipcbiAgICAgKiBBIEZlYXR1cmUgd2hpY2gsIHdoZW4gcHJlc2VudCwgYWRkcyBhIHdlZWsgcm93IGV4cGFuc2lvbiB0b29sIHRvIHdlZWsgcm93cyBpblxuICAgICAqIFtNb250aFZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldylzIHNvIHRoYXQgYSByb3cgd2hpY2ggY29udGFpbnMgb3ZlcmZsb3dpbmcgY2VsbHNcbiAgICAgKiBjYW4gYmUgZXhwYW5kZWQgdG8gc2hvdyBhbGwgZXZlbnRzIHdpdGggbm8gb3ZlcmZsb3cuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9XZWVrRXhwYW5kZXIpXG4gICAgICovXG4gICAgd2Vla0V4cGFuZGVyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFdlZWtFeHBhbmRlcnxXZWVrRXhwYW5kZXJDb25maWdcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLWNhbGVuZGFyJyxcbiAgICB0ZW1wbGF0ZSA6ICcnXG59KVxuZXhwb3J0IGNsYXNzIEJyeW50dW1DYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VDbGFzcyA9IENhbGVuZGFyO1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZU5hbWUgPSAnQ2FsZW5kYXInO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUV2ZW50czogc3RyaW5nW10gPSBbXG4gICAgICAgICdvbkFjdGl2ZUl0ZW1DaGFuZ2UnLFxuICAgICAgICAnb25BZnRlckV2ZW50RWRpdCcsXG4gICAgICAgICdvbkFmdGVyRXZlbnRTYXZlJyxcbiAgICAgICAgJ29uQmVmb3JlQWN0aXZlSXRlbUNoYW5nZScsXG4gICAgICAgICdvbkJlZm9yZUFzc2lnbm1lbnREZWxldGUnLFxuICAgICAgICAnb25CZWZvcmVBc3NpZ25tZW50U2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgJ29uQmVmb3JlQXV0b0NyZWF0ZScsXG4gICAgICAgICdvbkJlZm9yZUNvcHknLFxuICAgICAgICAnb25CZWZvcmVDcmVhdGVNb2RlJyxcbiAgICAgICAgJ29uQmVmb3JlQ1NWRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZURyYWdDcmVhdGUnLFxuICAgICAgICAnb25CZWZvcmVEcmFnQ3JlYXRlRW5kJyxcbiAgICAgICAgJ29uQmVmb3JlRHJhZ01vdmUnLFxuICAgICAgICAnb25CZWZvcmVEcmFnTW92ZUVuZCcsXG4gICAgICAgICdvbkJlZm9yZURyYWdSZXNpemUnLFxuICAgICAgICAnb25CZWZvcmVEcmFnUmVzaXplRW5kJyxcbiAgICAgICAgJ29uQmVmb3JlRHJvcEV4dGVybmFsJyxcbiAgICAgICAgJ29uQmVmb3JlRXZlbnREZWxldGUnLFxuICAgICAgICAnb25CZWZvcmVFdmVudEVkaXQnLFxuICAgICAgICAnb25CZWZvcmVFdmVudEVkaXRTaG93JyxcbiAgICAgICAgJ29uQmVmb3JlRXZlbnRTYXZlJyxcbiAgICAgICAgJ29uQmVmb3JlRXZlbnRTZWxlY3Rpb25DaGFuZ2UnLFxuICAgICAgICAnb25CZWZvcmVFeGNlbEV4cG9ydCcsXG4gICAgICAgICdvbkJlZm9yZUhpZGUnLFxuICAgICAgICAnb25CZWZvcmVQYXN0ZScsXG4gICAgICAgICdvbkJlZm9yZVByaW50JyxcbiAgICAgICAgJ29uQmVmb3JlUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uQmVmb3JlU2V0UmVjb3JkJyxcbiAgICAgICAgJ29uQmVmb3JlU2hvdycsXG4gICAgICAgICdvbkJlZm9yZVN0YXRlQXBwbHknLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZVNhdmUnLFxuICAgICAgICAnb25DYXRjaEFsbCcsXG4gICAgICAgICdvbkNlbGxPdmVyZmxvd0NsaWNrJyxcbiAgICAgICAgJ29uQ29sbGFwc2UnLFxuICAgICAgICAnb25Db250ZXh0TWVudUl0ZW0nLFxuICAgICAgICAnb25Db250ZXh0TWVudVRvZ2dsZUl0ZW0nLFxuICAgICAgICAnb25Db3B5JyxcbiAgICAgICAgJ29uQ3VycmVudFRpbWVsaW5lVXBkYXRlJyxcbiAgICAgICAgJ29uRGF0YUNoYW5nZScsXG4gICAgICAgICdvbkRhdGVDaGFuZ2UnLFxuICAgICAgICAnb25EYXRlUmFuZ2VDaGFuZ2UnLFxuICAgICAgICAnb25EYXRlUmFuZ2VMb2FkJyxcbiAgICAgICAgJ29uRGF0ZVJhbmdlUmVxdWVzdGVkJyxcbiAgICAgICAgJ29uRGF5Q2VsbFBvcHVsYXRlZCcsXG4gICAgICAgICdvbkRheU51bWJlckNsaWNrJyxcbiAgICAgICAgJ29uRGVzdHJveScsXG4gICAgICAgICdvbkRpcnR5U3RhdGVDaGFuZ2UnLFxuICAgICAgICAnb25EcmFnQ3JlYXRlRW5kJyxcbiAgICAgICAgJ29uRHJhZ01vdmVFbmQnLFxuICAgICAgICAnb25EcmFnTW92ZUV4dGVybmFsJyxcbiAgICAgICAgJ29uRHJhZ1Jlc2l6ZUVuZCcsXG4gICAgICAgICdvbkRyb3BFeHRlcm5hbCcsXG4gICAgICAgICdvbkVsZW1lbnRDcmVhdGVkJyxcbiAgICAgICAgJ29uRW1wdHlDZWxsQ2xpY2snLFxuICAgICAgICAnb25FdmVudEF1dG9DcmVhdGVkJyxcbiAgICAgICAgJ29uRXZlbnRDbGljaycsXG4gICAgICAgICdvbkV2ZW50Q29udGV4dE1lbnUnLFxuICAgICAgICAnb25FdmVudERibENsaWNrJyxcbiAgICAgICAgJ29uRXZlbnRFZGl0QmVmb3JlU2V0UmVjb3JkJyxcbiAgICAgICAgJ29uRXZlbnRLZXlEb3duJyxcbiAgICAgICAgJ29uRXZlbnRNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvbkV2ZW50TWVudUl0ZW0nLFxuICAgICAgICAnb25FdmVudE1lbnVTaG93JyxcbiAgICAgICAgJ29uRXZlbnRNb3VzZURvd24nLFxuICAgICAgICAnb25FdmVudE1vdXNlRW50ZXInLFxuICAgICAgICAnb25FdmVudE1vdXNlTGVhdmUnLFxuICAgICAgICAnb25FdmVudE1vdXNlT3V0JyxcbiAgICAgICAgJ29uRXZlbnRNb3VzZU92ZXInLFxuICAgICAgICAnb25FdmVudE1vdXNlVXAnLFxuICAgICAgICAnb25FdmVudFByb3BhZ2F0ZScsXG4gICAgICAgICdvbkV4cGFuZCcsXG4gICAgICAgICdvbkZvY3VzSW4nLFxuICAgICAgICAnb25Gb2N1c091dCcsXG4gICAgICAgICdvbkhpZGUnLFxuICAgICAgICAnb25Mb2FkT25EZW1hbmRGYWlsJyxcbiAgICAgICAgJ29uTW9udGhOYW1lQ2xpY2snLFxuICAgICAgICAnb25OYXZpZ2F0ZScsXG4gICAgICAgICdvblBhaW50JyxcbiAgICAgICAgJ29uUGFzdGUnLFxuICAgICAgICAnb25QYXN0ZU5vdEFsbG93ZWQnLFxuICAgICAgICAnb25SZWFkT25seScsXG4gICAgICAgICdvblJlY29tcG9zZScsXG4gICAgICAgICdvblJlZnJlc2gnLFxuICAgICAgICAnb25SZXNpemUnLFxuICAgICAgICAnb25SZXNvdXJjZUNsaWNrJyxcbiAgICAgICAgJ29uUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uU2NoZWR1bGVDbGljaycsXG4gICAgICAgICdvblNjaGVkdWxlQ29udGV4dE1lbnUnLFxuICAgICAgICAnb25TY2hlZHVsZURibENsaWNrJyxcbiAgICAgICAgJ29uU2NoZWR1bGVNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvblNjaGVkdWxlTWVudUl0ZW0nLFxuICAgICAgICAnb25TY2hlZHVsZU1lbnVTaG93JyxcbiAgICAgICAgJ29uU2NoZWR1bGVNb3VzZURvd24nLFxuICAgICAgICAnb25TY2hlZHVsZU1vdXNlT3V0JyxcbiAgICAgICAgJ29uU2NoZWR1bGVNb3VzZU92ZXInLFxuICAgICAgICAnb25TY2hlZHVsZU1vdXNlVXAnLFxuICAgICAgICAnb25TZWxlY3Rpb25DaGFuZ2UnLFxuICAgICAgICAnb25TaG93JyxcbiAgICAgICAgJ29uU2lkZWJhckNvbGxhcHNlJyxcbiAgICAgICAgJ29uU2lkZWJhckV4cGFuZCcsXG4gICAgICAgICdvblRpbWVBeGlzQ2xpY2snLFxuICAgICAgICAnb25UaW1lUmFuZ2VIZWFkZXJDbGljaycsXG4gICAgICAgICdvblRpbWVSYW5nZUhlYWRlckNvbnRleHRNZW51JyxcbiAgICAgICAgJ29uVGltZVJhbmdlSGVhZGVyRGJsQ2xpY2snLFxuICAgICAgICAnb25Ub29sQ2xpY2snLFxuICAgICAgICAnb25WaWV3UGFpbnQnLFxuICAgICAgICAnb25XZWVrTnVtYmVyQ2xpY2snXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1GZWF0dXJlTmFtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAnZHJhZ0ZlYXR1cmUnLFxuICAgICAgICAnZXZlbnRCdWZmZXJGZWF0dXJlJyxcbiAgICAgICAgJ2V2ZW50Q29weVBhc3RlRmVhdHVyZScsXG4gICAgICAgICdldmVudEVkaXRGZWF0dXJlJyxcbiAgICAgICAgJ2V2ZW50TWVudUZlYXR1cmUnLFxuICAgICAgICAnZXZlbnRUb29sdGlwRmVhdHVyZScsXG4gICAgICAgICdleGNlbEV4cG9ydGVyRmVhdHVyZScsXG4gICAgICAgICdleHRlcm5hbEV2ZW50U291cmNlRmVhdHVyZScsXG4gICAgICAgICdsb2FkT25EZW1hbmRGZWF0dXJlJyxcbiAgICAgICAgJ3ByaW50RmVhdHVyZScsXG4gICAgICAgICdzY2hlZHVsZU1lbnVGZWF0dXJlJyxcbiAgICAgICAgJ3NjaGVkdWxlVG9vbHRpcEZlYXR1cmUnLFxuICAgICAgICAndGltZVJhbmdlc0ZlYXR1cmUnLFxuICAgICAgICAnd2Vla0V4cGFuZGVyRmVhdHVyZSdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bUNhbGVuZGFyQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2FjdGl2ZURhdGVDbHMnLFxuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYWxpZ24nLFxuICAgICAgICAnYWxpZ25TZWxmJyxcbiAgICAgICAgJ2FuY2hvcicsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdhcmlhRGVzY3JpcHRpb24nLFxuICAgICAgICAnYXJpYUxhYmVsJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRTdG9yZScsXG4gICAgICAgICdhdXRvQ3JlYXRlJyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sbGFwc2VkJyxcbiAgICAgICAgJ2NvbGxhcHNpYmxlJyxcbiAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb25maWcnLFxuICAgICAgICAnY29uc3RyYWluVG8nLFxuICAgICAgICAnY29udGVudEVsZW1lbnRDbHMnLFxuICAgICAgICAnY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQnLFxuICAgICAgICAnY3J1ZE1hbmFnZXInLFxuICAgICAgICAnY3J1ZE1hbmFnZXJDbGFzcycsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkYXRlJyxcbiAgICAgICAgJ2RhdGVGb3JtYXQnLFxuICAgICAgICAnZGF0ZVBpY2tlcicsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RlZmF1bHRDYWxlbmRhcicsXG4gICAgICAgICdkZWZhdWx0Rm9jdXMnLFxuICAgICAgICAnZGVmYXVsdHMnLFxuICAgICAgICAnZGVzZWxlY3RBbGxPblNjaGVkdWxlQ2xpY2snLFxuICAgICAgICAnZGVzZWxlY3RPbkNsaWNrJyxcbiAgICAgICAgJ2Rlc3Ryb3lTdG9yZXMnLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAgICdkcmF3ZXInLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZW5hYmxlRGVsZXRlS2V5JyxcbiAgICAgICAgJ2VuYWJsZVJlY3VycmluZ0V2ZW50cycsXG4gICAgICAgICdlbmFibGVVbmRvUmVkb0tleXMnLFxuICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgJ2V2ZW50U2VsZWN0aW9uRGlzYWJsZWQnLFxuICAgICAgICAnZXZlbnRTdG9yZScsXG4gICAgICAgICdleHRyYURhdGEnLFxuICAgICAgICAnZmlsdGVyRXZlbnRSZXNvdXJjZXMnLFxuICAgICAgICAnZmxleCcsXG4gICAgICAgICdmbG9hdGluZycsXG4gICAgICAgICdmb290ZXInLFxuICAgICAgICAnaGVhZGVyJyxcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICdoaWRkZW4nLFxuICAgICAgICAnaGlkZUFuaW1hdGlvbicsXG4gICAgICAgICdoaWRlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnaGlkZVdoZW5FbXB0eScsXG4gICAgICAgICdoaWdobGlnaHREYXRlJyxcbiAgICAgICAgJ2hpZ2hsaWdodFByZWRlY2Vzc29ycycsXG4gICAgICAgICdoaWdobGlnaHRTdWNjZXNzb3JzJyxcbiAgICAgICAgJ2ljb24nLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaWdub3JlUGFyZW50UmVhZE9ubHknLFxuICAgICAgICAnaW5jbHVkZVdlZWtlbmRzQnV0dG9uJyxcbiAgICAgICAgJ2lucHV0RmllbGRBbGlnbicsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAnaXNFdmVudFNlbGVjdGFibGUnLFxuICAgICAgICAnaXRlbUNscycsXG4gICAgICAgICdpdGVtcycsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdsYXlvdXQnLFxuICAgICAgICAnbGF5b3V0U3R5bGUnLFxuICAgICAgICAnbGF6eUl0ZW1zJyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2FkTWFzaycsXG4gICAgICAgICdsb2FkTWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ2xvYWRNYXNrRXJyb3InLFxuICAgICAgICAnbG9jYWxlQ2xhc3MnLFxuICAgICAgICAnbG9jYWxpemFibGUnLFxuICAgICAgICAnbG9jYWxpemFibGVQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ21haW50YWluU2VsZWN0aW9uT25EYXRhc2V0Q2hhbmdlJyxcbiAgICAgICAgJ21hcmdpbicsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21heERhdGUnLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heGltaXplT25Nb2JpbGUnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWluRGF0ZScsXG4gICAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbW9kZScsXG4gICAgICAgICdtb2RlRGVmYXVsdHMnLFxuICAgICAgICAnbW9kZXMnLFxuICAgICAgICAnbW9uaXRvclJlc2l6ZScsXG4gICAgICAgICdtdWx0aUV2ZW50U2VsZWN0JyxcbiAgICAgICAgJ25hbWVkSXRlbXMnLFxuICAgICAgICAnbmF2aWdhdG9yUGxhY2VtZW50JyxcbiAgICAgICAgJ25vbldvcmtpbmdEYXlzJyxcbiAgICAgICAgJ292ZXJsYXlTaWRlYmFyJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3Bvc2l0aW9uZWQnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3Byb2plY3QnLFxuICAgICAgICAncHJvcGFnYXRlZENvbmZpZ3MnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwJyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3Jlc291cmNlSW1hZ2VQYXRoJyxcbiAgICAgICAgJ3Jlc291cmNlcycsXG4gICAgICAgICdyZXNvdXJjZVN0b3JlJyxcbiAgICAgICAgJ3Jlc291cmNlVGltZVJhbmdlcycsXG4gICAgICAgICdyZXNvdXJjZVRpbWVSYW5nZVN0b3JlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmUnLFxuICAgICAgICAncmVzcG9uc2l2ZVJvb3QnLFxuICAgICAgICAncmVzcG9uc2l2ZVN0YXRlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVUYXJnZXQnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3Njcm9sbEFjdGlvbicsXG4gICAgICAgICdzZWxlY3RSZXNvdXJjZU9uRXZlbnROYXZpZ2F0ZScsXG4gICAgICAgICdzZWxlY3RSZXNvdXJjZU9uU2NoZWR1bGVDbGljaycsXG4gICAgICAgICdzaG93QW5pbWF0aW9uJyxcbiAgICAgICAgJ3Nob3dSZWN1cnJpbmdVSScsXG4gICAgICAgICdzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCcsXG4gICAgICAgICdzaWRlYmFyJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0cmljdFJlY29yZE1hcHBpbmcnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N5bmNNYXNrJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YWcnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0ZXh0QWxpZ24nLFxuICAgICAgICAndGltZVJhbmdlcycsXG4gICAgICAgICd0aW1lUmFuZ2VTdG9yZScsXG4gICAgICAgICd0aW1lWm9uZScsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICd0b29scycsXG4gICAgICAgICd0b29sdGlwJyxcbiAgICAgICAgJ3RyYXBGb2N1cycsXG4gICAgICAgICd0cmlnZ2VyU2VsZWN0aW9uQ2hhbmdlT25SZW1vdmUnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd1c2VDb250ZXh0dWFsUmVjdXJyZW5jZVJ1bGVzJyxcbiAgICAgICAgJ3ZpZXdDb250YWluZXInLFxuICAgICAgICAnd2Vla1N0YXJ0RGF5JyxcbiAgICAgICAgJ3dlaWdodCcsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgICd4JyxcbiAgICAgICAgJ3knXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtQ29uZmlnc09ubHk6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYWxpZ24nLFxuICAgICAgICAnYW5jaG9yJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlJyxcbiAgICAgICAgJ2F1dG9DcmVhdGUnLFxuICAgICAgICAnYmJhcicsXG4gICAgICAgICdib2R5Q2xzJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjb2xsYXBzaWJsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb25maWcnLFxuICAgICAgICAnY29uc3RyYWluVG8nLFxuICAgICAgICAnY29udGVudEVsZW1lbnRDbHMnLFxuICAgICAgICAnY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQnLFxuICAgICAgICAnY3J1ZE1hbmFnZXJDbGFzcycsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGF0ZVBpY2tlcicsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RlZmF1bHRGb2N1cycsXG4gICAgICAgICdkZWZhdWx0cycsXG4gICAgICAgICdkZXNlbGVjdE9uQ2xpY2snLFxuICAgICAgICAnZGVzdHJveVN0b3JlcycsXG4gICAgICAgICdkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzJyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICAgJ2RyYXdlcicsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdlbmFibGVEZWxldGVLZXknLFxuICAgICAgICAnZW5hYmxlUmVjdXJyaW5nRXZlbnRzJyxcbiAgICAgICAgJ2VuYWJsZVVuZG9SZWRvS2V5cycsXG4gICAgICAgICdldmVudFNlbGVjdGlvbkRpc2FibGVkJyxcbiAgICAgICAgJ2V2ZW50U3RvcmUnLFxuICAgICAgICAnZmlsdGVyRXZlbnRSZXNvdXJjZXMnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2hpZGVXaGVuRW1wdHknLFxuICAgICAgICAnaGlnaGxpZ2h0RGF0ZScsXG4gICAgICAgICdoaWdobGlnaHRQcmVkZWNlc3NvcnMnLFxuICAgICAgICAnaGlnaGxpZ2h0U3VjY2Vzc29ycycsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2luY2x1ZGVXZWVrZW5kc0J1dHRvbicsXG4gICAgICAgICdpdGVtQ2xzJyxcbiAgICAgICAgJ2xhenlJdGVtcycsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9hZE1hc2snLFxuICAgICAgICAnbG9hZE1hc2tEZWZhdWx0cycsXG4gICAgICAgICdsb2FkTWFza0Vycm9yJyxcbiAgICAgICAgJ2xvY2FsZUNsYXNzJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlUHJvcGVydGllcycsXG4gICAgICAgICdtYWludGFpblNlbGVjdGlvbk9uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21vbml0b3JSZXNpemUnLFxuICAgICAgICAnbXVsdGlFdmVudFNlbGVjdCcsXG4gICAgICAgICduYW1lZEl0ZW1zJyxcbiAgICAgICAgJ25hdmlnYXRvclBsYWNlbWVudCcsXG4gICAgICAgICdvdmVybGF5U2lkZWJhcicsXG4gICAgICAgICdvd25lcicsXG4gICAgICAgICdwb3NpdGlvbmVkJyxcbiAgICAgICAgJ3ByZXZlbnRUb29sdGlwT25Ub3VjaCcsXG4gICAgICAgICdwcm9wYWdhdGVkQ29uZmlncycsXG4gICAgICAgICdyZWxheVN0b3JlRXZlbnRzJyxcbiAgICAgICAgJ3Jlc291cmNlSW1hZ2VQYXRoJyxcbiAgICAgICAgJ3Jlc291cmNlU3RvcmUnLFxuICAgICAgICAncmVzb3VyY2VUaW1lUmFuZ2VTdG9yZScsXG4gICAgICAgICdyZXNwb25zaXZlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVSb290JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVTdGF0ZScsXG4gICAgICAgICdyZXNwb25zaXZlVGFyZ2V0JyxcbiAgICAgICAgJ3JpcHBsZScsXG4gICAgICAgICdyb290RWxlbWVudCcsXG4gICAgICAgICdzY3JvbGxBY3Rpb24nLFxuICAgICAgICAnc2hvd0FuaW1hdGlvbicsXG4gICAgICAgICdzaG93UmVjdXJyaW5nVUknLFxuICAgICAgICAnc2hvd1Rvb2x0aXBXaGVuRGlzYWJsZWQnLFxuICAgICAgICAnc2lkZWJhcicsXG4gICAgICAgICdzdGF0ZWZ1bCcsXG4gICAgICAgICdzdGF0ZWZ1bEV2ZW50cycsXG4gICAgICAgICdzdGF0ZUlkJyxcbiAgICAgICAgJ3N0YXRlUHJvdmlkZXInLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N5bmNNYXNrJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YWcnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0ZXh0QWxpZ24nLFxuICAgICAgICAndGltZVJhbmdlU3RvcmUnLFxuICAgICAgICAndGltZVpvbmUnLFxuICAgICAgICAndHJhcEZvY3VzJyxcbiAgICAgICAgJ3RyaWdnZXJTZWxlY3Rpb25DaGFuZ2VPblJlbW92ZScsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ3VpJyxcbiAgICAgICAgJ3ZpZXdDb250YWluZXInLFxuICAgICAgICAnd2Vla1N0YXJ0RGF5JyxcbiAgICAgICAgJ3dlaWdodCdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bVByb3BzOiBzdHJpbmdbXSA9IEJyeW50dW1DYWxlbmRhckNvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhY3RpdmVEYXRlQ2xzJyxcbiAgICAgICAgJ2FjdGl2ZVN1YlZpZXcnLFxuICAgICAgICAnYWN0aXZlVmlldycsXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYW5jaG9yU2l6ZScsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdhc3NpZ25tZW50cycsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NscycsXG4gICAgICAgICdjb2xsYXBzZWQnLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2NydWRNYW5hZ2VyJyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGF0ZScsXG4gICAgICAgICdkYXRlRm9ybWF0JyxcbiAgICAgICAgJ2RlZmF1bHRDYWxlbmRhcicsXG4gICAgICAgICdkZXNlbGVjdEFsbE9uU2NoZWR1bGVDbGljaycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdldmVudHMnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2hhc0NoYW5nZXMnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5wdXRGaWVsZEFsaWduJyxcbiAgICAgICAgJ2luc2VydEJlZm9yZScsXG4gICAgICAgICdpbnNlcnRGaXJzdCcsXG4gICAgICAgICdpc0VuZ2luZVJlYWR5JyxcbiAgICAgICAgJ2lzRXZlbnRTZWxlY3RhYmxlJyxcbiAgICAgICAgJ2lzU2V0dGluZ1ZhbHVlcycsXG4gICAgICAgICdpc1ZhbGlkJyxcbiAgICAgICAgJ2l0ZW1zJyxcbiAgICAgICAgJ2tleU1hcCcsXG4gICAgICAgICdsYWJlbFBvc2l0aW9uJyxcbiAgICAgICAgJ2xheW91dCcsXG4gICAgICAgICdsYXlvdXRTdHlsZScsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWF4RGF0ZScsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5EYXRlJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5XaWR0aCcsXG4gICAgICAgICdtb2RlJyxcbiAgICAgICAgJ21vZGVEZWZhdWx0cycsXG4gICAgICAgICdtb2RlcycsXG4gICAgICAgICdub25Xb3JraW5nRGF5cycsXG4gICAgICAgICdwYXJlbnQnLFxuICAgICAgICAncHJvamVjdCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZWNvcmQnLFxuICAgICAgICAncmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwJyxcbiAgICAgICAgJ3JlbmRpdGlvbicsXG4gICAgICAgICdyZXNvdXJjZXMnLFxuICAgICAgICAncmVzb3VyY2VUaW1lUmFuZ2VzJyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3NlbGVjdGVkRXZlbnRzJyxcbiAgICAgICAgJ3NlbGVjdFJlc291cmNlT25FdmVudE5hdmlnYXRlJyxcbiAgICAgICAgJ3NlbGVjdFJlc291cmNlT25TY2hlZHVsZUNsaWNrJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhdGUnLFxuICAgICAgICAnc3RyaWN0UmVjb3JkTWFwcGluZycsXG4gICAgICAgICd0aW1lUmFuZ2VzJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2xzJyxcbiAgICAgICAgJ3Rvb2x0aXAnLFxuICAgICAgICAndXNlQ29udGV4dHVhbFJlY3VycmVuY2VSdWxlcycsXG4gICAgICAgICd2YWx1ZXMnLFxuICAgICAgICAndmlld3MnLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAneCcsXG4gICAgICAgICd5J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBpbnN0YW5jZSE6IENhbGVuZGFyO1xuXG4gICAgcHJpdmF0ZSBicnludHVtQ29uZmlnID0ge1xuICAgICAgICBhZG9wdCAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhcHBlbmRUbyAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBocmVmICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhbmd1bGFyQ29tcG9uZW50IDogdGhpcyxcbiAgICAgICAgZmVhdHVyZXMgICAgICAgICA6IHt9LFxuICAgICAgICBsaXN0ZW5lcnMgICAgICAgIDoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIENvbmZpZ3Mgb25seVxuICAgIEBJbnB1dCgpIGFkb3B0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYWxpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IEFsaWduU3BlY3xzdHJpbmc7XG4gICAgQElucHV0KCkgYW5jaG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXJpYURlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcmlhTGFiZWwgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFzc2lnbm1lbnRTdG9yZSAgICAgICAgICAgICAgICAgICEgOiBBc3NpZ25tZW50U3RvcmV8QXNzaWdubWVudFN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGF1dG9DcmVhdGUgICAgICAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGdlc3R1cmU/OiBzdHJpbmdcbiAgICAgICAgbmV3TmFtZT86IEZ1bmN0aW9ufHN0cmluZ1xuICAgICAgICBzdGVwPzogc3RyaW5nXG4gICAgICAgIGR1cmF0aW9uPzogc3RyaW5nXG4gICAgICAgIHN0YXJ0SG91cj86IG51bWJlcnxzdHJpbmdcbiAgICB9fHN0cmluZ3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGJiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSBib2R5Q2xzICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBidWJibGVFdmVudHMgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNlbnRlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbGxhcHNpYmxlICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2xvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY29uc3RyYWluVG8gICAgICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fFdpZGdldHxSZWN0YW5nbGU7XG4gICAgQElucHV0KCkgY29udGVudEVsZW1lbnRDbHMgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgICAgICAgICAgISA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snO1xuICAgIEBJbnB1dCgpIGNydWRNYW5hZ2VyQ2xhc3MgICAgICAgICAgICAgICAgICEgOiBTY2hlZHVsZXJDcnVkTWFuYWdlcjtcbiAgICBASW5wdXQoKSBkYXRhRmllbGQgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRhdGVQaWNrZXIgICAgICAgICAgICAgICAgICAgICAgICEgOiBDYWxlbmRhckRhdGVQaWNrZXJDb25maWd8Ym9vbGVhbnxudWxsO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRCaW5kUHJvcGVydHkgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGVmYXVsdEZvY3VzICAgICAgICAgICAgICAgICAgICAgISA6ICgod2lkZ2V0OiBXaWRnZXQpID0+IGJvb2xlYW4pfHN0cmluZztcbiAgICBASW5wdXQoKSBkZWZhdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnO1xuICAgIEBJbnB1dCgpIGRlc2VsZWN0T25DbGljayAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRlc3Ryb3lTdG9yZXMgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3Q7XG4gICAgQElucHV0KCkgZHJhZ2dhYmxlICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgZHJhd2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e3NpZGU/OiAnc3RhcnQnfCdsZWZ0J3wnZW5kJ3wncmlnaHQnfCd0b3AnfCdib3R0b20nLCBzaXplPzogc3RyaW5nfG51bWJlciwgaW5saW5lPzogYm9vbGVhbiwgYXV0b0Nsb3NlOiB7IG1vdXNlZG93bj86IGJvb2xlYW58c3RyaW5nLCBmb2N1c291dD86IGJvb2xlYW58c3RyaW5nLCBtb3VzZW91dD86IHN0cmluZyB9LCBhdXRvQ2xvc2VEZWxheT86IG51bWJlcn07XG4gICAgQElucHV0KCkgZWxlbWVudEF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ3xudWxsPjtcbiAgICBASW5wdXQoKSBlbmFibGVEZWxldGVLZXkgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBlbmFibGVSZWN1cnJpbmdFdmVudHMgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGRlZmF1bHRBY3Rpb24/OiAnc2luZ2xlJ3wnZnV0dXJlJ1xuICAgIH07XG4gICAgQElucHV0KCkgZW5hYmxlVW5kb1JlZG9LZXlzICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZXZlbnRTZWxlY3Rpb25EaXNhYmxlZCAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZXZlbnRTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgISA6IEV2ZW50U3RvcmV8RXZlbnRTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBmaWx0ZXJFdmVudFJlc291cmNlcyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmbG9hdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmb290ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICBkb2NrPzogJ3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J3N0YXJ0J3wnZW5kJ1xuICAgICAgICBodG1sPzogc3RyaW5nXG4gICAgICAgIGNscz86IHN0cmluZ1xuICAgIH18c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8Ym9vbGVhbnxQYW5lbEhlYWRlcjtcbiAgICBASW5wdXQoKSBoaWRlQW5pbWF0aW9uICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgaGlkZVdoZW5FbXB0eSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGlnaGxpZ2h0RGF0ZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58KChkYXRlOiBEYXRlKSA9PiBib29sZWFuKTtcbiAgICBASW5wdXQoKSBoaWdobGlnaHRQcmVkZWNlc3NvcnMgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWdobGlnaHRTdWNjZXNzb3JzICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfERvbUNvbmZpZztcbiAgICBASW5wdXQoKSBpZ25vcmVQYXJlbnRSZWFkT25seSAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbmNsdWRlV2Vla2VuZHNCdXR0b24gICAgICAgICAgICAhIDogYm9vbGVhbnxCdXR0b25Db25maWc7XG4gICAgQElucHV0KCkgaXRlbUNscyAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBsYXp5SXRlbXMgICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPnxDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWdbXXxXaWRnZXRbXTtcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICAgICAhIDogQ2FsZW5kYXJMaXN0ZW5lcnM7XG4gICAgQElucHV0KCkgbG9hZE1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgbG9hZE1hc2tEZWZhdWx0cyAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbG9hZE1hc2tFcnJvciAgICAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWd8TWFza3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGxvY2FsZUNsYXNzICAgICAgICAgICAgICAgICAgICAgICEgOiB0eXBlb2YgQmFzZTtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZSAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZVByb3BlcnRpZXMgICAgICAgICAgICAhIDogc3RyaW5nW107XG4gICAgQElucHV0KCkgbWFpbnRhaW5TZWxlY3Rpb25PbkRhdGFzZXRDaGFuZ2UgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbWFza0RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbWFza2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbW9uaXRvclJlc2l6ZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBpbW1lZGlhdGU/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBtdWx0aUV2ZW50U2VsZWN0ICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGN0cmxLZXk/OiBib29sZWFuXG4gICAgICAgIGFsdEtleT86IGJvb2xlYW5cbiAgICAgICAgc2hpZnRLZXk/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBuYW1lZEl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPjtcbiAgICBASW5wdXQoKSBuYXZpZ2F0b3JQbGFjZW1lbnQgICAgICAgICAgICAgICAhIDogJ3Rvb2xiYXInfCdzaWRlYmFyJztcbiAgICBASW5wdXQoKSBvdmVybGF5U2lkZWJhciAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBvd25lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogV2lkZ2V0fGFueTtcbiAgICBASW5wdXQoKSBwb3NpdGlvbmVkICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwcmV2ZW50VG9vbHRpcE9uVG91Y2ggICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwcm9wYWdhdGVkQ29uZmlncyAgICAgICAgICAgICAgICAhIDogc3RyaW5nW107XG4gICAgQElucHV0KCkgcmVsYXlTdG9yZUV2ZW50cyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVzb3VyY2VJbWFnZVBhdGggICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSByZXNvdXJjZVN0b3JlICAgICAgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VTdG9yZXxSZXNvdXJjZVN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJlc291cmNlVGltZVJhbmdlU3RvcmUgICAgICAgICAgICEgOiBSZXNvdXJjZVRpbWVSYW5nZVN0b3JlfFJlc291cmNlVGltZVJhbmdlU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZSAgICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlUm9vdCAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlU3RhdGUgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmVUYXJnZXQgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8V2lkZ2V0O1xuICAgIEBJbnB1dCgpIHJpcHBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9O1xuICAgIEBJbnB1dCgpIHJvb3RFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICEgOiBTaGFkb3dSb290fEhUTUxFbGVtZW50O1xuICAgIEBJbnB1dCgpIHNjcm9sbEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICEgOiAnaGlkZSd8J3JlYWxpZ24nfG51bGw7XG4gICAgQElucHV0KCkgc2hvd0FuaW1hdGlvbiAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0O1xuICAgIEBJbnB1dCgpIHNob3dSZWN1cnJpbmdVSSAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNob3dUb29sdGlwV2hlbkRpc2FibGVkICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNpZGViYXIgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiB7c2lkZT86ICdsZWZ0J3wncmlnaHQnLCBjb2xsYXBzZWQ/OiBib29sZWFuLCBpdGVtczogeyBbbW9kZTogc3RyaW5nXTogQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfG51bGx8dW5kZWZpbmVkLCBkYXRlUGlja2VyPzogRGF0ZVBpY2tlckNvbmZpZywgZXZlbnRGaWx0ZXI/OiBUZXh0RmllbGRDb25maWcsIHJlc291cmNlRmlsdGVyPzogUmVzb3VyY2VGaWx0ZXJDb25maWcgfX18Ym9vbGVhbjtcbiAgICBASW5wdXQoKSBzdGF0ZWZ1bCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3R8c3RyaW5nW107XG4gICAgQElucHV0KCkgc3RhdGVmdWxFdmVudHMgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdHxzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBzdGF0ZUlkICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHN0YXRlUHJvdmlkZXIgICAgICAgICAgICAgICAgICAgICEgOiBTdGF0ZVByb3ZpZGVyO1xuICAgIEBJbnB1dCgpIHN0cmlwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIHN5bmNNYXNrICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8TWFza0NvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHRhYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFRhYkNvbmZpZztcbiAgICBASW5wdXQoKSB0YWJCYXJJdGVtcyAgICAgICAgICAgICAgICAgICAgICAhIDogVG9vbGJhckl0ZW1zW118V2lkZ2V0W107XG4gICAgQElucHV0KCkgdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSB0YmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogKENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xDYWxlbmRhclRvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB0ZXh0QWxpZ24gICAgICAgICAgICAgICAgICAgICAgICAhIDogJ2xlZnQnfCdjZW50ZXInfCdyaWdodCd8J3N0YXJ0J3wnZW5kJztcbiAgICBASW5wdXQoKSB0aW1lUmFuZ2VTdG9yZSAgICAgICAgICAgICAgICAgICAhIDogVGltZVJhbmdlU3RvcmV8VGltZVJhbmdlU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgdGltZVpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgdHJhcEZvY3VzICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdHJpZ2dlclNlbGVjdGlvbkNoYW5nZU9uUmVtb3ZlICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdjYWxlbmRhcic7XG4gICAgQElucHV0KCkgdWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdwbGFpbid8J3Rvb2xiYXInfHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgdmlld0NvbnRhaW5lciAgICAgICAgICAgICAgICAgICAgISA6IENvbnRhaW5lckNvbmZpZztcbiAgICBASW5wdXQoKSB3ZWVrU3RhcnREYXkgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBDb25maWdzIGFuZCBwcm9wZXJ0aWVzXG4gICAgQElucHV0KCkgYWN0aXZlRGF0ZUNscyAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhbGlnblNlbGYgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFwcGVuZFRvICAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYXNzaWdubWVudHMgICAgICAgICAgICAgICAgICAgISA6IEFzc2lnbm1lbnRNb2RlbFtdfEFzc2lnbm1lbnRNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGNhbGxPbkZ1bmN0aW9ucyAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNscyAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbGxhcHNlZCAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbHVtbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgY3J1ZE1hbmFnZXIgICAgICAgICAgICAgICAgICAgISA6IFNjaGVkdWxlckNydWRNYW5hZ2VyfENydWRNYW5hZ2VyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGRhdGFzZXQgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8UmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogRGF0ZXxzdHJpbmc7XG4gICAgQElucHV0KCkgZGF0ZUZvcm1hdCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZWZhdWx0Q2FsZW5kYXIgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VNb2RlbHxzdHJpbmc7XG4gICAgQElucHV0KCkgZGVzZWxlY3RBbGxPblNjaGVkdWxlQ2xpY2sgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58J2luZXJ0JztcbiAgICBASW5wdXQoKSBldmVudHMgICAgICAgICAgICAgICAgICAgICAgICAhIDogRXZlbnRNb2RlbFtdfEV2ZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBleHRyYURhdGEgICAgICAgICAgICAgICAgICAgICAhIDogYW55O1xuICAgIEBJbnB1dCgpIGZsZXggICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVOb25Xb3JraW5nRGF5cyAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRGaWVsZEFsaWduICAgICAgICAgICAgICAgISA6ICdzdGFydCd8J2VuZCc7XG4gICAgQElucHV0KCkgaW5zZXJ0QmVmb3JlICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBpbnNlcnRGaXJzdCAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGlzRXZlbnRTZWxlY3RhYmxlICAgICAgICAgICAgICEgOiAoZXZlbnQ6IEV2ZW50TW9kZWwpID0+IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8TWVudUl0ZW1Db25maWd8V2lkZ2V0KVtdfFJlY29yZDxzdHJpbmcsIENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xNZW51SXRlbUNvbmZpZz58V2lkZ2V0W118b2JqZWN0fFdpZGdldENvbmZpZztcbiAgICBASW5wdXQoKSBrZXlNYXAgICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgS2V5TWFwQ29uZmlnPjtcbiAgICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uICAgICAgICAgICAgICAgICAhIDogJ2JlZm9yZSd8J2Fib3ZlJ3wnYWxpZ24tYmVmb3JlJ3wnYXV0byd8bnVsbDtcbiAgICBASW5wdXQoKSBsYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAhIDogTGF5b3V0fHN0cmluZ3xDYWxlbmRhckNvbnRhaW5lckxheW91dENvbmZpZztcbiAgICBASW5wdXQoKSBsYXlvdXRTdHlsZSAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIG1hcmdpbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heERhdGUgICAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhIZWlnaHQgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhpbWl6ZU9uTW9iaWxlICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhXaWR0aCAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5EYXRlICAgICAgICAgICAgICAgICAgICAgICAhIDogRGF0ZXxzdHJpbmc7XG4gICAgQElucHV0KCkgbWluSGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWluV2lkdGggICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3wnYWdlbmRhJ3wneWVhcid8J21vbnRoJ3wnd2Vlayd8J2RheSd8J2xpc3QnfCdyZXNvdXJjZSd8J2RheXJlc291cmNlJ3wnZGF5YWdlbmRhJ3wnbW9udGhhZ2VuZGEnfCdtb250aGdyaWQnO1xuICAgIEBJbnB1dCgpIG1vZGVEZWZhdWx0cyAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgbW9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIENhbGVuZGFyVmlldz58b2JqZWN0O1xuICAgIEBJbnB1dCgpIG5vbldvcmtpbmdEYXlzICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPjtcbiAgICBASW5wdXQoKSBwcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAhIDogUHJvamVjdE1vZGVsfFByb2plY3RNb2RlbENvbmZpZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwICAgISA6IFJlY3VycmVuY2VDb25maXJtYXRpb25Qb3B1cENvbmZpZ3xSZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXA7XG4gICAgQElucHV0KCkgcmVuZGl0aW9uICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fG51bGw7XG4gICAgQElucHV0KCkgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgISA6IFJlc291cmNlTW9kZWxbXXxSZXNvdXJjZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgcmVzb3VyY2VUaW1lUmFuZ2VzICAgICAgICAgICAgISA6IFJlc291cmNlVGltZVJhbmdlTW9kZWxbXXxSZXNvdXJjZVRpbWVSYW5nZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgcnRsICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgICAgICAgICAgICAgICAgICAgISA6IFNjcm9sbGVyfGJvb2xlYW58U2Nyb2xsZXJDb25maWc7XG4gICAgQElucHV0KCkgc2VsZWN0UmVzb3VyY2VPbkV2ZW50TmF2aWdhdGUgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2VsZWN0UmVzb3VyY2VPblNjaGVkdWxlQ2xpY2sgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3BhbiAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdHJpY3RSZWNvcmRNYXBwaW5nICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0aW1lUmFuZ2VzICAgICAgICAgICAgICAgICAgICAhIDogVGltZVJhbmdlTW9kZWxbXXxUaW1lUmFuZ2VNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdG9vbHMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIFRvb2x8VG9vbENvbmZpZz58bnVsbHxSZWNvcmQ8c3RyaW5nLCBUb29sPnxSZWNvcmQ8c3RyaW5nLCBUb29sQ29uZmlnPjtcbiAgICBASW5wdXQoKSB0b29sdGlwICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfFRvb2x0aXBDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB1c2VDb250ZXh0dWFsUmVjdXJyZW5jZVJ1bGVzICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBQcm9wZXJ0aWVzIG9ubHlcbiAgICBASW5wdXQoKSBhY3RpdmVTdWJWaWV3ICAgISA6IENhbGVuZGFyVmlldztcbiAgICBASW5wdXQoKSBhY3RpdmVWaWV3ICAgICAgISA6IENhbGVuZGFyVmlldztcbiAgICBASW5wdXQoKSBhbmNob3JTaXplICAgICAgISA6IG51bWJlcltdO1xuICAgIEBJbnB1dCgpIGZvY3VzVmlzaWJsZSAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoYXNDaGFuZ2VzICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNFbmdpbmVSZWFkeSAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzU2V0dGluZ1ZhbHVlcyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc1ZhbGlkICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcGFyZW50ICAgICAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgcmVjb3JkICAgICAgICAgICEgOiBNb2RlbDtcbiAgICBASW5wdXQoKSBzZWxlY3RlZEV2ZW50cyAgISA6IEV2ZW50TW9kZWxbXTtcbiAgICBASW5wdXQoKSBzdGF0ZSAgICAgICAgICAgISA6IGFueTtcbiAgICBASW5wdXQoKSB2YWx1ZXMgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIG9iamVjdD47XG4gICAgQElucHV0KCkgdmlld3MgICAgICAgICAgICEgOiBDYWxlbmRhclZpZXdbXTtcblxuICAgIC8vIEZlYXR1cmVzXG4gICAgQElucHV0KCkgZHJhZ0ZlYXR1cmUgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2FsZW5kYXJEcmFnfENhbGVuZGFyRHJhZ0NvbmZpZztcbiAgICBASW5wdXQoKSBldmVudEJ1ZmZlckZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFdmVudEJ1ZmZlcnxFdmVudEJ1ZmZlckNvbmZpZztcbiAgICBASW5wdXQoKSBldmVudENvcHlQYXN0ZUZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFdmVudENvcHlQYXN0ZXxFdmVudENvcHlQYXN0ZUNvbmZpZztcbiAgICBASW5wdXQoKSBldmVudEVkaXRGZWF0dXJlICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFdmVudEVkaXR8RXZlbnRFZGl0Q29uZmlnO1xuICAgIEBJbnB1dCgpIGV2ZW50TWVudUZlYXR1cmUgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEV2ZW50TWVudXxFdmVudE1lbnVDb25maWc7XG4gICAgQElucHV0KCkgZXZlbnRUb29sdGlwRmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXZlbnRUb29sdGlwfEV2ZW50VG9vbHRpcENvbmZpZztcbiAgICBASW5wdXQoKSBleGNlbEV4cG9ydGVyRmVhdHVyZSAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFeGNlbEV4cG9ydGVyfEV4Y2VsRXhwb3J0ZXJDb25maWc7XG4gICAgQElucHV0KCkgZXh0ZXJuYWxFdmVudFNvdXJjZUZlYXR1cmUgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXh0ZXJuYWxFdmVudFNvdXJjZXxFeHRlcm5hbEV2ZW50U291cmNlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGxvYWRPbkRlbWFuZEZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfExvYWRPbkRlbWFuZHxMb2FkT25EZW1hbmRDb25maWc7XG4gICAgQElucHV0KCkgcHJpbnRGZWF0dXJlICAgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UHJpbnR8UHJpbnRDb25maWc7XG4gICAgQElucHV0KCkgc2NoZWR1bGVNZW51RmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U2NoZWR1bGVNZW51fFNjaGVkdWxlTWVudUNvbmZpZztcbiAgICBASW5wdXQoKSBzY2hlZHVsZVRvb2x0aXBGZWF0dXJlICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTY2hlZHVsZVRvb2x0aXB8U2NoZWR1bGVUb29sdGlwQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRpbWVSYW5nZXNGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRpbWVSYW5nZXN8VGltZVJhbmdlc0NvbmZpZztcbiAgICBASW5wdXQoKSB3ZWVrRXhwYW5kZXJGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xXZWVrRXhwYW5kZXJ8V2Vla0V4cGFuZGVyQ29uZmlnO1xuXG4gICAgLy8gRXZlbnRzIGVtaXR0ZXJzXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIGNoYW5nZSBvZiB2aWV3IChDYWxlbmRhciBtb2RlKSBoYXMgY29tcGxldGVkLiBCeSBkZWZhdWx0LCB2aWV3IGNoYW5nZXMgYXJlIGFuaW1hdGVkIGFuZCB0aGlzXG4gICAgICogZXZlbnQgZmlyZXMgd2hlbiB0aGUgdmlldyBpcyBmdWxseSB2aXNpYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5wcmV2QWN0aXZlSXRlbSBUaGUgcHJldmlvdXNseSBhY3RpdmUgdmlldy5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuYWN0aXZlSXRlbSBUaGUgbmV3IGFjdGl2ZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGFpbmVkRm9jdXMgYHRydWVgIGlmIHRoZSBvdXRnb2luZyB2aWV3IGNvbnRhaW5lZCBmb2N1cy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25BY3RpdmVJdGVtQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgcHJldkFjdGl2ZUl0ZW06IENhbGVuZGFyVmlldywgYWN0aXZlSXRlbTogQ2FsZW5kYXJWaWV3LCBjb250YWluZWRGb2N1czogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYWZ0ZXIgZWRpdG9yIGlzIGNsb3NlZCBieSBhbnkgYWN0aW9uIC0gc2F2ZSwgZGVsZXRlIG9yIGNhbmNlbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBzY2hlZHVsZXJcbiAgICAgKiBAcGFyYW0geydzYXZlJywnZGVsZXRlJywnY2FuY2VsJ30gZXZlbnQuYWN0aW9uIFRoZSBhY3Rpb24gdGhhdCB3YXMgdGFrZW4gdG8gZW5kIHRoZSBlZGl0LiBPbmUgb2YgJ3NhdmUnLCAnZGVsZXRlJyBvciAnY2FuY2VsJ1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmZlYXR1cmUuU2NoZWR1bGVyRXZlbnRFZGl0fSBldmVudC5ldmVudEVkaXQgVGhlIGV2ZW50RWRpdCBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIHJlY29yZCB0aGF0IGhhcyBiZWVuIGVkaXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgUmVzb3VyY2UgcmVjb3JkIGZvciB0aGUgZXZlbnQuIElmIHRoZSBldmVudCBpcyBiZWluZyBjcmVhdGVkLCBpdCB3aWxsIG5vdCBjb250YWluIGEgcmVzb3VyY2UsIHNvIHRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVzb3VyY2UgdGhlIGV2ZW50IGlzIGJlaW5nIGNyZWF0ZWQgZm9yLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudCBpbiB0aGUgc2NoZWR1bGVyIGRpc3BsYXkuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Qb3B1cH0gZXZlbnQuZWRpdG9yIFRoZSBlZGl0b3JcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25BZnRlckV2ZW50RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBhY3Rpb246ICdzYXZlJ3wnZGVsZXRlJ3wnY2FuY2VsJywgZXZlbnRFZGl0OiBTY2hlZHVsZXJFdmVudEVkaXQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgZWRpdG9yOiBQb3B1cCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYWZ0ZXIgYW4gZXZlbnQgaXMgc3VjY2Vzc2Z1bGx5IHNhdmVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIHNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSByZWNvcmQgYWJvdXQgdG8gYmUgc2F2ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25BZnRlckV2ZW50U2F2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBldmVudFJlY29yZDogRXZlbnRNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIGEgY2hhbmdlIG9mIHZpZXcgKENhbGVuZGFyIG1vZGUpIGlzIGluaXRpYXRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhpcyBDYWxlbmRhciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQucHJldkFjdGl2ZUl0ZW0gVGhlIHByZXZpb3VzbHkgYWN0aXZlIHZpZXcuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LmFjdGl2ZUl0ZW0gVGhlIG5ldyBhY3RpdmUgdmlldy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVBY3RpdmVJdGVtQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgcHJldkFjdGl2ZUl0ZW06IENhbGVuZGFyVmlldywgYWN0aXZlSXRlbTogQ2FsZW5kYXJWaWV3IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIGFzc2lnbm1lbnQgaXMgcmVtb3ZlZC4gQ2FuIGJlIHRyaWdnZXJlZCBieSB1c2VyIHByZXNzaW5nIFtERUxFVEVdIG9yIFtCQUNLU1BBQ0VdIG9yXG4gICAgICogYnkgdGhlIGV2ZW50IGVkaXRvci4gQ2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8gZGlzcGxheSBhIGN1c3RvbSBkaWFsb2cgdG8gY29uZmlybSBkZWxldGlvbiwgaW4gd2hpY2hcbiAgICAgKiBjYXNlIHJlY29yZHMgc2hvdWxkIGJlIFwibWFudWFsbHlcIiByZW1vdmVkIGFmdGVyIGNvbmZpcm1hdGlvbjpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWJlZm9yZUFzc2lnbm1lbnREZWxldGUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIFNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5hc3NpZ25tZW50UmVjb3JkcyBUaGUgYXNzaWdubWVudCByZWNvcmRzIGFib3V0IHRvIGJlIGRlbGV0ZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dCBBZGRpdGlvbmFsIHJlbW92YWwgY29udGV4dDpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jb250ZXh0LmZpbmFsaXplIEZ1bmN0aW9uIHRvIGNhbGwgdG8gZmluYWxpemUgdGhlIHJlbW92YWwuIFVzZWQgdG8gYXN5bmNocm9ub3VzbHkgZGVjaWRlIHRvIHJlbW92ZSB0aGUgcmVjb3JkcyBvciBub3QuIFByb3ZpZGUgYGZhbHNlYCB0byB0aGUgZnVuY3Rpb24gdG8gcHJldmVudCB0aGUgcmVtb3ZhbC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbnRleHQuZmluYWxpemUucmVtb3ZlUmVjb3JkcyBQcm92aWRlIGBmYWxzZWAgdG8gdGhlIGZ1bmN0aW9uIHRvIHByZXZlbnQgdGhlIHJlbW92YWwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQXNzaWdubWVudERlbGV0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBhc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIGNvbnRleHQ6IHsgZmluYWxpemU6IHsgcmVtb3ZlUmVjb3Jkcz86IGJvb2xlYW4gfSB9IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYW55IHRpbWUgdGhlcmUgaXMgZ29pbmcgdG8gYmUgYSBjaGFuZ2UgdG8gdGhlIGFzc2lnbm1lbnRzIHNlbGVjdGVkIGluIHRoZSBTY2hlZHVsZXIuXG4gICAgICogUmV0dXJuaW5nIGBmYWxzZWAgcHJldmVudHMgdGhlIGNoYW5nZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7J3NlbGVjdCcsJ2Rlc2VsZWN0JywndXBkYXRlJywnY2xlYXInfSBldmVudC5hY3Rpb24gT25lIG9mIHRoZSBhY3Rpb25zICdzZWxlY3QnLCAnZGVzZWxlY3QnLCAndXBkYXRlJywgJ2NsZWFyJ1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5zZWxlY3RlZCBBbiBhcnJheSBvZiBhc3NpZ25tZW50cyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWxbXX0gZXZlbnQuZGVzZWxlY3RlZCBBbiBhcnJheSBvZiBhc3NpZ25tZW50cyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuQXNzaWdubWVudE1vZGVsW119IGV2ZW50LnNlbGVjdGlvbiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGFzc2lnbm1lbnRzLCBiZWZvcmUgYXBwbHlpbmcgYHNlbGVjdGVkYCBhbmQgYGRlc2VsZWN0ZWRgLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUFzc2lnbm1lbnRTZWxlY3Rpb25DaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgYWN0aW9uOiAnc2VsZWN0J3wnZGVzZWxlY3QnfCd1cGRhdGUnfCdjbGVhcicsIHNlbGVjdGVkOiBBc3NpZ25tZW50TW9kZWxbXSwgZGVzZWxlY3RlZDogQXNzaWdubWVudE1vZGVsW10sIHNlbGVjdGlvbjogQXNzaWdubWVudE1vZGVsW10gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIHdoZW5ldmVyIGEgY2hpbGQgdmlldydzIFthdXRvQ3JlYXRlIGdlc3R1cmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpIGlzIGRldGVjdGVkIGFuZCBhbHNvIHdoZW4gYSBbZHJhZy1jcmVhdGVdKCNDYWxlbmRhci9mZWF0dXJlL0NhbGVuZGFyRHJhZykgZ2VzdHVyZSBpcyBkZXRlY3RlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWJlZm9yZUF1dG9DcmVhdGUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIGNoaWxkIHZpZXcgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBpbml0aWF0ZWQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIERPTSBldmVudCB3aGljaCBpbml0aWF0ZWQgdGhlIGNyZWF0aW9uLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSAqREVQUkVDQVRFRCBpbiBmYXZvdXIgb2YgYHN0YXJ0RGF0ZWAuKiBUaGUgc3RhcnRpbmcgdGltZSBvZiB0aGUgZXZlbnQgdG8gYmUgY3JlYXRlZC4gSWYgdGhpcyBpcyBpbiBhIGBEYXlWaWV3YCwgdGhpcyB3aWxsIGJlIHNuYXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGluIFthdXRvQ3JlYXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1hdXRvQ3JlYXRlKVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuc3RhcnREYXRlIFRoZSBzdGFydGluZyB0aW1lIG9mIHRoZSBldmVudCB0byBiZSBjcmVhdGVkLiBJZiB0aGlzIGlzIGluIGEgYERheVZpZXdgLCB0aGlzIHdpbGwgYmUgc25hcHBlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5lbmREYXRlIFRoZSBlbmRpbmcgdGltZSBvZiB0aGUgZXZlbnQgdG8gYmUgY3JlYXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgaWYgdGhlIFVJIGluY2x1ZGVzIGEgcmVzb3VyY2UuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQXV0b0NyZWF0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBiZWZvcmUgYSBjb3B5IGFjdGlvbiBpcyBwZXJmb3JtZWQsIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIE93bmVyIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRSZWNvcmRzIFRoZSBldmVudCByZWNvcmRzIGFib3V0IHRvIGJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5hc3NpZ25tZW50UmVjb3JkcyBUaGUgYXNzaWdubWVudCByZWNvcmRzIGFib3V0IHRvIGJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgaXMgYSBjdXQgYWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2V2ZW50JyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgYmVmb3JlQ29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGV2ZW50UmVjb3JkczogRXZlbnRNb2RlbFtdLCBhc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIGlzQ3V0OiBib29sZWFuLCBlbnRpdHlOYW1lOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYSBtb2RlIGlzIGNyZWF0ZWQuIFRoZSBjb25maWd1cmF0aW9uIGJsb2NrIGlzIHBhc3NlZCB0byB0aGUgaGFuZGxlciBmb3IgcG9zc2libGUgbW9kaWZpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyXG4gICAgICogQHBhcmFtIHtBZ2VuZGFWaWV3Q29uZmlnLERheVJlc291cmNlVmlld0NvbmZpZyxEYXlWaWV3Q29uZmlnLEV2ZW50TGlzdENvbmZpZyxNb250aFZpZXdDb25maWcsUmVzb3VyY2VWaWV3Q29uZmlnLFdlZWtWaWV3Q29uZmlnLFllYXJWaWV3Q29uZmlnLERheUFnZW5kYVZpZXdDb25maWcsTW9udGhBZ2VuZGFWaWV3Q29uZmlnLENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ30gZXZlbnQuY29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGJsb2NrIG9mIHRoZSBtb2RlIGFib3V0IHRvIGJlIGNyZWF0ZWQuIEFueSBwcm9wZXJ0eSwgaW5jbHVkaW5nIHRoZSBgdHlwZWAgbWF5IGJlIGNoYW5nZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ3JlYXRlTW9kZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIsIGNvbmZpZzogQWdlbmRhVmlld0NvbmZpZ3xEYXlSZXNvdXJjZVZpZXdDb25maWd8RGF5Vmlld0NvbmZpZ3xFdmVudExpc3RDb25maWd8TW9udGhWaWV3Q29uZmlnfFJlc291cmNlVmlld0NvbmZpZ3xXZWVrVmlld0NvbmZpZ3xZZWFyVmlld0NvbmZpZ3xEYXlBZ2VuZGFWaWV3Q29uZmlnfE1vbnRoQWdlbmRhVmlld0NvbmZpZ3xDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIENTViBleHBvcnQgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGV4cG9ydC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFeHBvcnRDb25maWd9IGV2ZW50LmNvbmZpZyBFeHBvcnQgY29uZmlnXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW5bXX0gZXZlbnQuY29sdW1ucyBBbiBhcnJheSBvZiBjb2x1bW5zIHRvIGV4cG9ydFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnJvd3MgQW4gYXJyYXkgb2YgcmVjb3JkcyB0byBleHBvcnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQubGluZURlbGltaXRlciBUaGUgQ1NWIGRlbGltaXRlciB0byBzZXBhcmF0ZSBsaW5lc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5jb2x1bW5EZWxpbWl0ZXIgVGhlIENTViBkZWxpbWl0ZXIgdG8gc2VwYXJhdGUgdmFsdWVzIG9uIG9uZSBsaW5lXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ1NWRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBFeHBvcnRDb25maWcsIGNvbHVtbnM6IENvbHVtbltdLCByb3dzOiBNb2RlbFtdLCBsaW5lRGVsaW1pdGVyOiBzdHJpbmcsIGNvbHVtbkRlbGltaXRlcjogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgQ2FsZW5kYXIgYmVmb3JlIGEgZHJhZyBjcmVhdGlvbiBnZXN0dXJlIGlzIHN0YXJ0ZWQuIFJldHVybiBgZmFsc2VgIHRvXG4gICAgICogdmV0byB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2UgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtDb3JlLnV0aWwuZHJhZy5EcmFnQ29udGV4dH0gZXZlbnQuZHJhZyBUaGUgZHJhZyBjcmVhdGUgY29udGV4dC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgYXQgdGhlIGRyYWcgRE9NIGV2ZW50IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSBgUmVzb3VyY2VNb2RlbGAgcmVjb3JkIGlmIHRoZSBnZXN0dXJlIHdhcyBwZXJmb3JtZWQgaW4gYSByZXNvdXJjZS10eXBlIHZpZXcuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhci5mZWF0dXJlLkNhbGVuZGFyRHJhZ30gZXZlbnQuZmVhdHVyZSBUaGUgQ2FsZW5kYXIgZHJhZyBmZWF0dXJlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC52aWV3IFRoZSBDYWxlbmRhciB3aWRnZXQgaW4gd2hpY2ggdGhlIGRyYWcgaXMgYmVpbmcgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEcmFnQ3JlYXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgZHJhZzogRHJhZ0NvbnRleHQsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ/OiBSZXNvdXJjZU1vZGVsLCBmZWF0dXJlOiBDYWxlbmRhckRyYWcsIHZpZXc6IENhbGVuZGFyVmlldyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgYSBkcmFnIGNyZWF0aW9uIGdlc3R1cmUgaXMgY29tcGxldGVkLiBSZXR1cm4gYGZhbHNlYCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IHZldG8gdGhlIG9wZXJhdGlvbiBvciBhIFByb21pc2UgeWllbGRpbmcgYHRydWVgIG9yIGBmYWxzZWAgZm9yIGFzeW5jIHZldG9pbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIudmlldy5DYWxlbmRhcn0gZXZlbnQuc291cmNlIFRoZSBDYWxlbmRhciBpbnN0YW5jZSB0aGF0IGZpcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0NvcmUudXRpbC5kcmFnLkRyYWdDb250ZXh0fSBldmVudC5kcmFnIFRoZSBkcmFnIGNyZWF0ZSBjb250ZXh0LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBgRXZlbnRNb2RlbGAgcmVjb3JkIGJlaW5nIGNyZWF0ZWQgdGhhdCBoYXMgbm90IHlldCBiZWVuIGFkZGVkIGluIHRoZSBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ld1N0YXJ0RGF0ZSBUaGUgbmV3IHN0YXJ0IGRhdGUuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXdFbmREYXRlIFRoZSBuZXcgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIGBSZXNvdXJjZU1vZGVsYCByZWNvcmQgaWYgdGhlIGdlc3R1cmUgd2FzIHBlcmZvcm1lZCBpbiBhIHJlc291cmNlLXR5cGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLmZlYXR1cmUuQ2FsZW5kYXJEcmFnfSBldmVudC5mZWF0dXJlIFRoZSBDYWxlbmRhciBkcmFnIGZlYXR1cmUgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFuLFZhbGlkYXRlQ3JlYXRlUmVzdWx0fSBldmVudC52YWxpZGF0aW9uIFRoZSByZXN1bHQgb2YgdGhlIFt2YWxpZGF0ZUNyZWF0ZUZuXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvQ2FsZW5kYXJEcmFnI2NvbmZpZy12YWxpZGF0ZUNyZWF0ZUZuKSBpZiBvbmUgd2FzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC52aWV3IFRoZSBDYWxlbmRhciB3aWRnZXQgaW4gd2hpY2ggdGhlIGRyYWcgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURyYWdDcmVhdGVFbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyLCBkcmFnOiBEcmFnQ29udGV4dCwgZXZlbnQ6IEV2ZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgbmV3U3RhcnREYXRlOiBEYXRlLCBuZXdFbmREYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZD86IFJlc291cmNlTW9kZWwsIGZlYXR1cmU6IENhbGVuZGFyRHJhZywgdmFsaWRhdGlvbjogYm9vbGVhbnxWYWxpZGF0ZUNyZWF0ZVJlc3VsdCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIENhbGVuZGFyIGJlZm9yZSBhIGRyYWcgbW92ZSBnZXN0dXJlIGlzIHN0YXJ0ZWQuIFJldHVybiBgZmFsc2VgIHRvXG4gICAgICogdmV0byB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2UgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtDb3JlLnV0aWwuZHJhZy5EcmFnQ29udGV4dH0gZXZlbnQuZHJhZyBUaGUgZHJhZyBtb3ZlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGBFdmVudE1vZGVsYCByZWNvcmQgYmVpbmcgbW92ZWQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGF0IHRoZSBkcmFnIERPTSBldmVudCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgYFJlc291cmNlTW9kZWxgIHJlY29yZCBpZiB0aGUgZ2VzdHVyZSB3YXMgcGVyZm9ybWVkIGluIGEgcmVzb3VyY2UtdHlwZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIuZmVhdHVyZS5DYWxlbmRhckRyYWd9IGV2ZW50LmZlYXR1cmUgVGhlIENhbGVuZGFyIGRyYWcgZmVhdHVyZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGUgQ2FsZW5kYXIgd2lkZ2V0IGluIHdoaWNoIHRoZSBkcmFnIGlzIGJlaW5nIHN0YXJ0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRHJhZ01vdmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyLCBkcmFnOiBEcmFnQ29udGV4dCwgZG9tRXZlbnQ6IEV2ZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ/OiBSZXNvdXJjZU1vZGVsLCBmZWF0dXJlOiBDYWxlbmRhckRyYWcsIHZpZXc6IENhbGVuZGFyVmlldyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgYSBkcmFnIG1vdmUgZ2VzdHVyZSBpcyBjb21wbGV0ZWQuIFJldHVybiBgZmFsc2VgIHRvIGltbWVkaWF0ZWx5IHZldG8gdGhlIG9wZXJhdGlvblxuICAgICAqIG9yIGEgUHJvbWlzZSB5aWVsZGluZyBgdHJ1ZWAgb3IgYGZhbHNlYCBmb3IgYXN5bmMgdmV0b2luZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhlIENhbGVuZGFyIGluc3RhbmNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7Q29yZS51dGlsLmRyYWcuRHJhZ0NvbnRleHR9IGV2ZW50LmRyYWcgVGhlIGRyYWcgY3JlYXRlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGBFdmVudE1vZGVsYCByZWNvcmQgdGhhdCBoYXMgKm5vdCB5ZXQgYmVlbiB1cGRhdGVkKiBpbiB0aGUgc3RvcmUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQucHJveHlFdmVudFJlY29yZCBUaGUgYEV2ZW50TW9kZWxgIHJlY29yZCB0aGF0IGlzIGJlaW5nIHVzZWQgYXMgYSBwcm94eSBmb3IgdGhlIGRyYWcgb3BlcmF0aW9uIGFuZCBiZWluZyB1cGRhdGVkIG9uIGV2ZXJ5IHBvaW50ZXIgbW92ZS4gVGhpcyB3aWxsIGNvbnRhaW4gY2hhbmdlZCB2YWx1ZXMgYmFzZWQgb24gdGhlIGRyYWcgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXdTdGFydERhdGUgVGhlIG5ldyBzdGFydCBkYXRlLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQubmV3RW5kRGF0ZSBUaGUgbmV3IGVuZCBkYXRlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSBgUmVzb3VyY2VNb2RlbGAgcmVjb3JkIGlmIHRoZSBnZXN0dXJlIHdhcyBwZXJmb3JtZWQgaW4gYSByZXNvdXJjZS10eXBlIHZpZXcuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhci5mZWF0dXJlLkNhbGVuZGFyRHJhZ30gZXZlbnQuZmVhdHVyZSBUaGUgQ2FsZW5kYXIgZHJhZyBmZWF0dXJlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixWYWxpZGF0ZUNyZWF0ZVJlc3VsdH0gZXZlbnQudmFsaWRhdGlvbiBUaGUgcmVzdWx0IG9mIHRoZSBbdmFsaWRhdGVNb3ZlRm5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcjY29uZmlnLXZhbGlkYXRlTW92ZUZuKSBpZiBvbmUgd2FzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC52aWV3IFRoZSBDYWxlbmRhciB3aWRnZXQgaW4gd2hpY2ggdGhlIGRyYWcgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURyYWdNb3ZlRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgZHJhZzogRHJhZ0NvbnRleHQsIGV2ZW50OiBFdmVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHByb3h5RXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIG5ld1N0YXJ0RGF0ZTogRGF0ZSwgbmV3RW5kRGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ/OiBSZXNvdXJjZU1vZGVsLCBmZWF0dXJlOiBDYWxlbmRhckRyYWcsIHZhbGlkYXRpb246IGJvb2xlYW58VmFsaWRhdGVDcmVhdGVSZXN1bHQsIHZpZXc6IENhbGVuZGFyVmlldyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgYSBkcmFnIHJlc2l6ZSBnZXN0dXJlIGlzIHN0YXJ0ZWQuIFJldHVybiBgZmFsc2VgIHRvXG4gICAgICogdmV0byB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2UgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtDb3JlLnV0aWwuZHJhZy5EcmFnQ29udGV4dH0gZXZlbnQuZHJhZyBUaGUgZHJhZyByZXNpemUgY29udGV4dC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgYEV2ZW50TW9kZWxgIHJlY29yZCBiZWluZyByZXNpemVkLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBhdCB0aGUgZHJhZyBET00gZXZlbnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIGBSZXNvdXJjZU1vZGVsYCByZWNvcmQgaWYgdGhlIGdlc3R1cmUgd2FzIHBlcmZvcm1lZCBpbiBhIHJlc291cmNlLXR5cGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLmZlYXR1cmUuQ2FsZW5kYXJEcmFnfSBldmVudC5mZWF0dXJlIFRoZSBDYWxlbmRhciBkcmFnIGZlYXR1cmUgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnZpZXcgVGhlIENhbGVuZGFyIHdpZGdldCBpbiB3aGljaCB0aGUgZHJhZyBpcyBiZWluZyBzdGFydGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURyYWdSZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyLCBkcmFnOiBEcmFnQ29udGV4dCwgZG9tRXZlbnQ6IEV2ZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ/OiBSZXNvdXJjZU1vZGVsLCBmZWF0dXJlOiBDYWxlbmRhckRyYWcsIHZpZXc6IENhbGVuZGFyVmlldyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgYSBkcmFnIHJlc2l6ZSBnZXN0dXJlIGlzIGNvbXBsZXRlZC4gUmV0dXJuIGBmYWxzZWAgdG8gaW1tZWRpYXRlbHkgdmV0byB0aGUgb3BlcmF0aW9uXG4gICAgICogb3IgYSBQcm9taXNlIHlpZWxkaW5nIGB0cnVlYCBvciBgZmFsc2VgIGZvciBhc3luYyB2ZXRvaW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2UgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtDb3JlLnV0aWwuZHJhZy5EcmFnQ29udGV4dH0gZXZlbnQuZHJhZyBUaGUgZHJhZyBjcmVhdGUgY29udGV4dC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgYEV2ZW50TW9kZWxgIHJlY29yZCB0aGF0IGhhcyAqbm90IHlldCBiZWVuIHVwZGF0ZWQqIGluIHRoZSBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5wcm94eUV2ZW50UmVjb3JkIFRoZSBgRXZlbnRNb2RlbGAgcmVjb3JkIHRoYXQgaXMgYmVpbmcgdXNlZCBhcyBhIHByb3h5IGZvciB0aGUgZHJhZyBvcGVyYXRpb24gYW5kIGJlaW5nIHVwZGF0ZWQgb24gZXZlcnkgcG9pbnRlciBtb3ZlLiBUaGlzIHdpbGwgY29udGFpbiBjaGFuZ2VkIHZhbHVlcyBiYXNlZCBvbiB0aGUgZHJhZyBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ld1N0YXJ0RGF0ZSBUaGUgbmV3IHN0YXJ0IGRhdGUuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXdFbmREYXRlIFRoZSBuZXcgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhci5mZWF0dXJlLkNhbGVuZGFyRHJhZ30gZXZlbnQuZmVhdHVyZSBUaGUgQ2FsZW5kYXIgZHJhZyBmZWF0dXJlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixWYWxpZGF0ZUNyZWF0ZVJlc3VsdH0gZXZlbnQudmFsaWRhdGlvbiBUaGUgcmVzdWx0IG9mIHRoZSBbdmFsaWRhdGVSZXNpemVGbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0NhbGVuZGFyRHJhZyNjb25maWctdmFsaWRhdGVSZXNpemVGbikgaWYgb25lIHdhcyBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGUgQ2FsZW5kYXIgd2lkZ2V0IGluIHdoaWNoIHRoZSBkcmFnIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEcmFnUmVzaXplRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgZHJhZzogRHJhZ0NvbnRleHQsIGV2ZW50OiBFdmVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHByb3h5RXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIG5ld1N0YXJ0RGF0ZTogRGF0ZSwgbmV3RW5kRGF0ZTogRGF0ZSwgZmVhdHVyZTogQ2FsZW5kYXJEcmFnLCB2YWxpZGF0aW9uOiBib29sZWFufFZhbGlkYXRlQ3JlYXRlUmVzdWx0LCB2aWV3OiBDYWxlbmRhclZpZXcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIG9uIHRoZSBvd25pbmcgQ2FsZW5kYXIgd2hlbiBkcm9wcGluZyBhbiBldmVudCBmcm9tIHRoZSBjYWxlbmRhciBvbiB0aGVcbiAgICAgKiBleHRlcm5hbCBzb3VyY2UgPHN0cm9uZz5pZiB0aGUgW2Ryb3BwYWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UjY29uZmlnLWRyb3BwYWJsZSkgd2FzIGNvbmZpZ3VyZWQ8L3N0cm9uZz4uIFJldHVybmluZyBgZmFsc2VgXG4gICAgICogcHJldmVudHMgdGhlIGdlc3R1cmUgZnJvbSBiZWluZyBjb21wbGV0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1iZWZvcmVEcm9wRXh0ZXJuYWwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmQgYmVpbmcgZHJhZ2dlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmRyb3BPbkNhbGVuZGFyIGB0cnVlYCBpZiB0aGUgZHJvcCBnZXN0dXJlIGlzIG92ZXIgdGhlIGNsaWVudCBDYWxlbmRhci4gVGhpcyBmZWF0dXJlIGFsc28gYWxsb3dzIGRyYWcgKm91dCogb2YgdGhlIENhbGVuZGFyIGFuZCBvbnRvIHRoZSBleHRlcm5hbCBldmVudCBzb3VyY2UgaWYgdGhlIFtkcm9wcGFibGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1kcm9wcGFibGUpIGNvbmZpZyBpcyBzZXQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuaXRlbUVsZW1lbnQgVGhlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIGRyYWcgZ2VzdHVyZSBzdGFydGVkLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldEVsZW1lbnQgVGhlIGN1cnJlbnQgb3ZlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBwb2ludGVyIGV2ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZHJhZyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub3ZlckluZGV4ICpJZiBbZ3JpZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UjY29uZmlnLWdyaWQpIHdhcyBzcGVjaWZpZWQqLCB0aGUgaW5kZXggb2YgdGhlIHJvdyBiZWluZyBtb3ZlZCBvdmVyO1xuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5vdmVyUmVjb3JkICpJZiBbZ3JpZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UjY29uZmlnLWdyaWQpIHdhcyBzcGVjaWZpZWQqLCB0aGUgcmVjb3JkIGJlaW5nIG1vdmVkIG92ZXI7XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc0Fib3ZlICpJZiBbZ3JpZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UjY29uZmlnLWdyaWQpIHdhcyBzcGVjaWZpZWQqLCBgdHJ1ZWAgaWYgdGhlIHBvaW50ZXIgcG9zaXRpb24gaXMgYWJvdmUgdGhlIGhhbGZ3YXkgbGluZSBvZiB0aGUgb3ZlciByb3cuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5hbHRLZXkgYHRydWVgIGlmIHRoZSBBbHQga2V5IHdhcyBkb3duIHdoZW4gdGhlIGxhc3QgZXZlbnQgd2FzIHByb2Nlc3NlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmN0cmxLZXkgYHRydWVgIGlmIHRoZSBDdHJsIGtleSB3YXMgZG93biB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyBwcm9jZXNzZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5tZXRhS2V5IGB0cnVlYCBpZiB0aGUgTWV0YSBrZXkgd2FzIGRvd24gd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcHJvY2Vzc2VkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuc2hpZnRLZXkgYHRydWVgIGlmIHRoZSBTaGlmdCBrZXkgd2FzIGRvd24gd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURyb3BFeHRlcm5hbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCBkcm9wT25DYWxlbmRhcjogYm9vbGVhbiwgaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgZG9tRXZlbnQ6IEV2ZW50LCBvdmVySW5kZXg6IG51bWJlciwgb3ZlclJlY29yZDogTW9kZWwsIGlzQWJvdmU6IGJvb2xlYW4sIGFsdEtleTogYm9vbGVhbiwgY3RybEtleTogYm9vbGVhbiwgbWV0YUtleTogYm9vbGVhbiwgc2hpZnRLZXk6IGJvb2xlYW4gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYW4gZXZlbnQgaXMgcmVtb3ZlZC4gQ2FuIGJlIHRyaWdnZXJlZCBieSB1c2VyIHByZXNzaW5nIFtERUxFVEVdIG9yIFtCQUNLU1BBQ0VdIG9yIGJ5IHRoZVxuICAgICAqIGV2ZW50IGVkaXRvci4gQ2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8gZGlzcGxheSBhIGN1c3RvbSBkaWFsb2cgdG8gY29uZmlybSBkZWxldGlvbiwgaW4gd2hpY2ggY2FzZVxuICAgICAqIHJlY29yZHMgc2hvdWxkIGJlIFwibWFudWFsbHlcIiByZW1vdmVkIGFmdGVyIGNvbmZpcm1hdGlvbjpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWJlZm9yZUV2ZW50RGVsZXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LmV2ZW50UmVjb3JkcyBUaGUgcmVjb3JkcyBhYm91dCB0byBiZSBkZWxldGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHQgQWRkaXRpb25hbCByZW1vdmFsIGNvbnRleHQ6XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY29udGV4dC5maW5hbGl6ZSBGdW5jdGlvbiB0byBjYWxsIHRvIGZpbmFsaXplIHRoZSByZW1vdmFsLiBVc2VkIHRvIGFzeW5jaHJvbm91c2x5IGRlY2lkZSB0byByZW1vdmUgdGhlIHJlY29yZHMgb3Igbm90LiBQcm92aWRlIGBmYWxzZWAgdG8gdGhlIGZ1bmN0aW9uIHRvIHByZXZlbnQgdGhlIHJlbW92YWwuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LmZpbmFsaXplLnJlbW92ZVJlY29yZHMgUHJvdmlkZSBgZmFsc2VgIHRvIHRoZSBmdW5jdGlvbiB0byBwcmV2ZW50IHRoZSByZW1vdmFsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV2ZW50RGVsZXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgZXZlbnRSZWNvcmRzOiBFdmVudE1vZGVsW10sIGNvbnRleHQ6IHsgZmluYWxpemU6IHsgcmVtb3ZlUmVjb3Jkcz86IGJvb2xlYW4gfSB9IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYmVmb3JlIGFuIGV2ZW50IGlzIGRpc3BsYXllZCBpbiBhbiBlZGl0b3IuXG4gICAgICogVGhpcyBtYXkgYmUgbGlzdGVuZWQgZm9yIHRvIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHRha2Ugb3ZlciBldmVudCBlZGl0aW5nIGR1dGllcy4gUmV0dXJuaW5nIGBmYWxzZWBcbiAgICAgKiBzdG9wcyB0aGUgZGVmYXVsdCBlZGl0aW5nIFVJIGZyb20gYmVpbmcgc2hvd24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1iZWZvcmVFdmVudEVkaXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmZlYXR1cmUuU2NoZWR1bGVyRXZlbnRFZGl0fSBldmVudC5ldmVudEVkaXQgVGhlIGV2ZW50RWRpdCBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIHJlY29yZCBhYm91dCB0byBiZSBzaG93biBpbiB0aGUgZXZlbnQgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSBSZXNvdXJjZSByZWNvcmQgZm9yIHRoZSBldmVudC4gSWYgdGhlIGV2ZW50IGlzIGJlaW5nIGNyZWF0ZWQsIGl0IHdpbGwgbm90IGNvbnRhaW4gYSByZXNvdXJjZSwgc28gdGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZXNvdXJjZSB0aGUgZXZlbnQgaXMgYmVpbmcgY3JlYXRlZCBmb3IuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50IGluIHRoZSBzY2hlZHVsZXIgZGlzcGxheS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVFdmVudEVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZXZlbnRFZGl0OiBTY2hlZHVsZXJFdmVudEVkaXQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIHdoZW4gdGhlIGVkaXRvciBmb3IgYW4gZXZlbnQgaXMgYXZhaWxhYmxlIGJ1dCBiZWZvcmUgaXQgaXMgcG9wdWxhdGVkIHdpdGhcbiAgICAgKiBkYXRhIGFuZCBzaG93bi4gQWxsb3dzIG1hbmlwdWxhdGluZyBmaWVsZHMgZXRjLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBzY2hlZHVsZXJcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5mZWF0dXJlLlNjaGVkdWxlckV2ZW50RWRpdH0gZXZlbnQuZXZlbnRFZGl0IFRoZSBldmVudEVkaXQgZmVhdHVyZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSByZWNvcmQgYWJvdXQgdG8gYmUgc2hvd24gaW4gdGhlIGV2ZW50IGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgUmVzb3VyY2UgcmVjb3JkIGZvciB0aGUgZXZlbnQuIElmIHRoZSBldmVudCBpcyBiZWluZyBjcmVhdGVkLCBpdCB3aWxsIG5vdCBjb250YWluIGEgcmVzb3VyY2UsIHNvIHRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVzb3VyY2UgdGhlIGV2ZW50IGlzIGJlaW5nIGNyZWF0ZWQgZm9yLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudCBpbiB0aGUgc2NoZWR1bGVyIGRpc3BsYXkuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Qb3B1cH0gZXZlbnQuZWRpdG9yIFRoZSBlZGl0b3JcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVFdmVudEVkaXRTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGV2ZW50RWRpdDogU2NoZWR1bGVyRXZlbnRFZGl0LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIGVkaXRvcjogUG9wdXAgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIGJlZm9yZSBhbiBldmVudCBpcyBzYXZlZC5cbiAgICAgKiBSZXR1cm4gYGZhbHNlYCB0byBpbW1lZGlhdGVseSBwcmV2ZW50IHNhdmluZ1xuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtYmVmb3JlRXZlbnRTYXZlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBzY2hlZHVsZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgcmVjb3JkIGFib3V0IHRvIGJlIHNhdmVkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbFtdfSBldmVudC5yZXNvdXJjZVJlY29yZHMgVGhlIHJlc291cmNlcyB0byB3aGljaCB0aGUgZXZlbnQgaXMgYXNzaWduZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQudmFsdWVzIFRoZSBuZXcgdmFsdWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHQgRXh0ZW5kZWQgc2F2ZSBjb250ZXh0OlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGV4dC5hc3luYyBTZXQgdGhpcyB0byBgdHJ1ZWAgaW4gYSBsaXN0ZW5lciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBsaXN0ZW5lciB3aWxsIGFzeW5jaHJvbm91c2x5IGRlY2lkZSB0byBwcmV2ZW50IG9yIG5vdCB0aGUgZXZlbnQgc2F2ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jb250ZXh0LmZpbmFsaXplIEZ1bmN0aW9uIHRvIGNhbGwgdG8gZmluYWxpemUgdGhlIHNhdmUuIFVzZWQgd2hlbiBgYXN5bmNgIGlzIGB0cnVlYC4gUHJvdmlkZSBgZmFsc2VgIHRvIHRoZSBmdW5jdGlvbiB0byBwcmV2ZW50IHRoZSBzYXZlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV2ZW50U2F2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmRzOiBSZXNvdXJjZU1vZGVsW10sIHZhbHVlczogb2JqZWN0LCBjb250ZXh0OiB7IGFzeW5jPzogYm9vbGVhbiwgZmluYWxpemU6IEZ1bmN0aW9uIH0gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhbnkgdGltZSB0aGVyZSBpcyBnb2luZyB0byBiZSBhIGNoYW5nZSB0byB0aGUgZXZlbnRzIHNlbGVjdGVkIGluIHRoZSBTY2hlZHVsZXIuXG4gICAgICogUmV0dXJuaW5nIGBmYWxzZWAgcHJldmVudHMgdGhlIGNoYW5nZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7J3NlbGVjdCcsJ2Rlc2VsZWN0JywndXBkYXRlJywnY2xlYXInfSBldmVudC5hY3Rpb24gT25lIG9mIHRoZSBhY3Rpb25zICdzZWxlY3QnLCAnZGVzZWxlY3QnLCAndXBkYXRlJywgJ2NsZWFyJ1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuc2VsZWN0ZWQgQW4gYXJyYXkgb2YgZXZlbnRzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZGVzZWxlY3RlZCBBbiBhcnJheSBvZiBldmVudHMgdGhhdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuc2VsZWN0aW9uIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZXZlbnRzLCBiZWZvcmUgYXBwbHlpbmcgYHNlbGVjdGVkYCBhbmQgYGRlc2VsZWN0ZWRgLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV2ZW50U2VsZWN0aW9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGFjdGlvbjogJ3NlbGVjdCd8J2Rlc2VsZWN0J3wndXBkYXRlJ3wnY2xlYXInLCBzZWxlY3RlZDogRXZlbnRNb2RlbFtdLCBkZXNlbGVjdGVkOiBFdmVudE1vZGVsW10sIHNlbGVjdGlvbjogRXZlbnRNb2RlbFtdIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBFeGNlbCBleHBvcnQgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGV4cG9ydC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFeHBvcnRDb25maWd9IGV2ZW50LmNvbmZpZyBFeHBvcnQgY29uZmlnXG4gICAgICogQHBhcmFtIHtYTFNDb2x1bW5bXX0gZXZlbnQuY29sdW1ucyBBbiBhcnJheSBvZiBjb2x1bW5zIHRvIGV4cG9ydFxuICAgICAqIEBwYXJhbSB7YW55W11bXX0gZXZlbnQucm93cyBBbiBhcnJheSBvZiByZWNvcmRzIHRvIGV4cG9ydFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV4Y2VsRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBFeHBvcnRDb25maWcsIGNvbHVtbnM6IFhMU0NvbHVtbltdLCByb3dzOiBhbnlbXSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSB3aWRnZXQgaXMgaGlkZGVuLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBoaWRkZW4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYmVmb3JlIGEgcGFzdGUgYWN0aW9uIGlzIHBlcmZvcm1lZCwgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIERlcGVuZGluZyBvbiBpZiB0aGUgRXZlbnRTdG9yZSBpcyB1c2luZyBbc2luZ2xlQXNzaWdubWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvZGF0YS9FdmVudFN0b3JlI2NvbmZpZy1zaW5nbGVBc3NpZ25tZW50KSBvciB0aGVcbiAgICAgKiBjb25maWd1cmF0aW9uIG9mIFtjb3B5UGFzdGVBY3Rpb25dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvRXZlbnRDb3B5UGFzdGUjY29uZmlnLWNvcHlQYXN0ZUFjdGlvbiksIGVpdGhlciB0aGUgYGV2ZW50UmVjb3Jkc2Agb3IgdGhlIGBhc3NpZ25tZW50UmVjb3Jkc2AgcGFyYW1cbiAgICAgKiB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHJlY29yZCBjb3BpZXMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgT3duZXIgc2NoZWR1bGVyXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbFtdfSBldmVudC5ldmVudFJlY29yZHMgVGhlIGV2ZW50cyBhYm91dCB0byBiZSBwYXN0ZWRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWxbXX0gZXZlbnQuYXNzaWdubWVudFJlY29yZHMgVGhlIGFzc2lnbm1lbnRzIGFib3V0IHRvIGJlIHBhc3RlZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQub3JpZ2luYWxFdmVudFJlY29yZHMgVGhlIG9yaWdpbmFsIGV2ZW50IHJlY29yZHNcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWxbXX0gZXZlbnQub3JpZ2luYWxBc3NpZ25tZW50UmVjb3JkcyBUaGUgb3JpZ2luYWwgYXNzaWdubWVudCByZWNvcmRcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgd2hlbiB0aGUgcGFzdGVkIGV2ZW50cyB3aWxsIGJlIHNjaGVkdWxlZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSB0YXJnZXQgcmVzb3VyY2UgcmVjb3JkLCB0aGUgY2xpcGJvYXJkIGV2ZW50IHJlY29yZHMgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGlzIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgaXMgYSBjdXQgYWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2V2ZW50JyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgYmVmb3JlUGFzdGUgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUGFzdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZXZlbnRSZWNvcmRzOiBFdmVudE1vZGVsW10sIGFzc2lnbm1lbnRSZWNvcmRzOiBBc3NpZ25tZW50TW9kZWxbXSwgb3JpZ2luYWxFdmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgb3JpZ2luYWxBc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBpc0N1dDogYm9vbGVhbiwgZW50aXR5TmFtZTogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgcHJpbnQgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIHByaW50LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29uZmlnIFByaW50IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVByaW50OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBvYmplY3QgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgbmV3IFtyZXNwb25zaXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVN0YXRlKSBpcyBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgd2hvc2UgYHJlc3BvbnNpdmVTdGF0ZWAgaXMgdG8gYmUgY2hhbmdlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5zdGF0ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgd2lkZ2V0J3MgYHJlc3BvbnNpdmVTdGF0ZWBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQub2xkU3RhdGUgVGhlIHByZXZpb3VzIHZhbHVlIGZvciB0aGUgd2lkZ2V0J3MgYHJlc3BvbnNpdmVTdGF0ZWBcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVSZXNwb25zaXZlU3RhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgc3RhdGU6IHN0cmluZywgb2xkU3RhdGU6IHN0cmluZyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHRoaXMgY29udGFpbmVyIHdpbGwgbG9hZCByZWNvcmQgdmFsdWVzIGludG8gaXRzIGNoaWxkIGZpZWxkcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91XG4gICAgICogd2FudCB0byBtb2RpZnkgdGhlIFVJIGJlZm9yZSBkYXRhIGlzIGxvYWRlZCAoZS5nLiBzZXQgc29tZSBpbnB1dCBmaWVsZCB0byBiZSByZWFkb25seSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db250YWluZXJ9IGV2ZW50LnNvdXJjZSBUaGUgY29udGFpbmVyXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2V0UmVjb3JkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDb250YWluZXIsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSB3aWRnZXQgaXMgc2hvd24uIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXQsYW55fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBzaG93blxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldHxhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgYXBwbGllZCB0byB0aGUgc291cmNlLiBBbGxvd3MgZWRpdGluZyB0aGUgc3RhdGUgb2JqZWN0IG9yIHByZXZlbnRpbmcgdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50LnN0YXRlIFN0YXRlIG9iamVjdCBjb25maWdcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTdGF0ZUFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBzdGF0ZSBpcyBzYXZlZCBieSB0aGUgU3RhdGVQcm92aWRlci4gQWxsb3dzIGVkaXRpbmcgdGhlIHN0YXRlIG9iamVjdCBvciBwcmV2ZW50aW5nIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC5zdGF0ZSBTdGF0ZSBvYmplY3QgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhdGVTYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW55IG90aGVyIGV2ZW50IGlzIGZpcmVkIGZyb20gdGhlIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWNhdGNoQWxsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3tba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ319IGV2ZW50LmV2ZW50IFRoZSBPYmplY3QgdGhhdCBjb250YWlucyBldmVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmV2ZW50LnR5cGUgVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHdoaWNoIGlzIGNhdWdodCBieSB0aGUgbGlzdGVuZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DYXRjaEFsbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGNlbGwgb3ZlcmZsb3cgaW5kaWNhdG9yIGlzIGNsaWNrZWQgb3IgYWN0aXZhdGVkIGJ5IHRoZSA8a2JkPkVOVEVSPC9rYmQ+IGtleSBpbiBhbnkgdmlldy4gVGhpcyB3aWxsIGluY2x1ZGVcbiAgICAgKiB0aGUgY2VsbHMgb2YgYSBbWWVhclZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L1llYXJWaWV3KSBhbmQgdGhlIGArIG4gbW9yZWAgb3ZlcmZsb3dcbiAgICAgKiBpbmRpY2F0b3Igb2YgY2VsbHMgaW4gYSBbTW9udGhWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcpLCBhbmQgXCJhbGwgZGF5XCIgZXZlbnRzIHNlY3Rpb25cbiAgICAgKiBvZiBhIFtEYXlWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9EYXlWaWV3KS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgY2xpY2tlZCBvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsT3ZlcmZsb3dDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBjb2xsYXBzZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpIHNldHRpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuUGFuZWx9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbGxhcHNlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQYW5lbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIHdpZGdldCB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgb3duaW5nIHdpZGdldFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29udGV4dE1lbnVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgd2lkZ2V0IHdoZW4gYSBjaGVjayBpdGVtIGlzIHRvZ2dsZWQgaW4gdGhlIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgb3duaW5nIHdpZGdldFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGVja2VkIENoZWNrZWQgb3Igbm90XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29udGV4dE1lbnVUb2dnbGVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjaGVja2VkOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBhZnRlciBhIGNvcHkgYWN0aW9uIGlzIHBlcmZvcm1lZC4gRGVwZW5kaW5nIG9uIGlmIHRoZSBFdmVudFN0b3JlIGlzIHVzaW5nXG4gICAgICogW3NpbmdsZUFzc2lnbm1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvRXZlbnRTdG9yZSNjb25maWctc2luZ2xlQXNzaWdubWVudCkgb3IgdGhlIGNvbmZpZ3VyYXRpb24gb2ZcbiAgICAgKiBbY29weVBhc3RlQWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL0V2ZW50Q29weVBhc3RlI2NvbmZpZy1jb3B5UGFzdGVBY3Rpb24pLCBlaXRoZXIgdGhlIGBldmVudFJlY29yZHNgIG9yIHRoZSBgYXNzaWdubWVudFJlY29yZHNgIHBhcmFtIHdpbGwgYmUgcG9wdWxhdGVkXG4gICAgICogd2l0aCByZWNvcmQgY29waWVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIE93bmVyIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRSZWNvcmRzIFRoZSBldmVudCByZWNvcmQgY29waWVzXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuQXNzaWdubWVudE1vZGVsW119IGV2ZW50LmFzc2lnbm1lbnRSZWNvcmRzIFRoZSBhc3NpZ25tZW50IHJlY29yZCBjb3BpZXNcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50Lm9yaWdpbmFsRXZlbnRSZWNvcmRzIFRoZSBldmVudCByZWNvcmRzIHRoYXQgd2VyZSBjb3BpZWRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWxbXX0gZXZlbnQub3JpZ2luYWxBc3NpZ25tZW50UmVjb3JkIFRoZSBhc3NpZ25tZW50IHJlY29yZHMgdGhhdCB3ZXJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgaXMgYSBjdXQgYWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2V2ZW50JyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgY29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGV2ZW50UmVjb3JkczogRXZlbnRNb2RlbFtdLCBhc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIG9yaWdpbmFsRXZlbnRSZWNvcmRzOiBFdmVudE1vZGVsW10sIG9yaWdpbmFsQXNzaWdubWVudFJlY29yZDogQXNzaWdubWVudE1vZGVsW10sIGlzQ3V0OiBib29sZWFuLCBlbnRpdHlOYW1lOiBzdHJpbmcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyL0dhbnR0IHdoZW4gdGhlIGxpbmUgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lIGlzIHVwZGF0ZWQgKHNlZSBbY3VycmVudFRpbWVMaW5lVXBkYXRlSW50ZXJ2YWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvVGltZVJhbmdlcyNjb25maWctY3VycmVudFRpbWVMaW5lVXBkYXRlSW50ZXJ2YWwpKS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGUgc2NoZWR1bGVyXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBjdXJyZW50IGRhdGVcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DdXJyZW50VGltZWxpbmVVcGRhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZGF0ZTogRGF0ZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBkYXRhIGluIGFueSBvZiB0aGUgcHJvamVjdHMgc3RvcmVzIGNoYW5nZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1kYXRhQ2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3R5cGVvZiBTY2hlZHVsZXIuZGF0YS5taXhpbi5Qcm9qZWN0Q29uc3VtZXIsYW55fSBldmVudC5zb3VyY2UgT3duaW5nIGNvbXBvbmVudFxuICAgICAqIEBwYXJhbSB7dHlwZW9mIFNjaGVkdWxlci5tb2RlbC5taXhpbi5Qcm9qZWN0TW9kZWxNaXhpbixhbnl9IGV2ZW50LnByb2plY3QgUHJvamVjdCBtb2RlbFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLlN0b3JlfSBldmVudC5zdG9yZSBBZmZlY3RlZCBzdG9yZVxuICAgICAqIEBwYXJhbSB7J3JlbW92ZScsJ3JlbW92ZUFsbCcsJ2FkZCcsJ2NsZWFyY2hhbmdlcycsJ2ZpbHRlcicsJ3VwZGF0ZScsJ2RhdGFzZXQnLCdyZXBsYWNlJ30gZXZlbnQuYWN0aW9uIE5hbWUgb2YgYWN0aW9uIHdoaWNoIHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBNYXkgYmUgb25lIG9mOiAgKiBgJ3JlbW92ZSdgICogYCdyZW1vdmVBbGwnYCAqIGAnYWRkJ2AgKiBgJ2NsZWFyY2hhbmdlcydgICogYCdmaWx0ZXInYCAqIGAndXBkYXRlJ2AgKiBgJ2RhdGFzZXQnYCAqIGAncmVwbGFjZSdgXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBDaGFuZ2VkIHJlY29yZCwgZm9yIGFjdGlvbnMgdGhhdCBhZmZlY3RzIGV4YWN0bHkgb25lIHJlY29yZCAoYCd1cGRhdGUnYClcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yZWNvcmRzIENoYW5nZWQgcmVjb3JkcywgcGFzc2VkIGZvciBhbGwgYWN0aW9ucyBleGNlcHQgYCdyZW1vdmVBbGwnYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jaGFuZ2VzIFBhc3NlZCBmb3IgdGhlIGAndXBkYXRlJ2AgYWN0aW9uLCBpbmZvIG9uIHdoaWNoIHJlY29yZCBmaWVsZHMgY2hhbmdlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRhdGFDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IHR5cGVvZiBQcm9qZWN0Q29uc3VtZXJ8YW55LCBwcm9qZWN0OiB0eXBlb2YgUHJvamVjdE1vZGVsTWl4aW58YW55LCBzdG9yZTogU3RvcmUsIGFjdGlvbjogJ3JlbW92ZSd8J3JlbW92ZUFsbCd8J2FkZCd8J2NsZWFyY2hhbmdlcyd8J2ZpbHRlcid8J3VwZGF0ZSd8J2RhdGFzZXQnfCdyZXBsYWNlJywgcmVjb3JkOiBNb2RlbCwgcmVjb3JkczogTW9kZWxbXSwgY2hhbmdlczogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHRoZSBjYWxlbmRhciBjaGFuZ2VzIHRoZSBkYXRlIHRoYXQgaXQgb3JpZW50YXRlcyBpdHMgdmlld3MgYXJvdW5kLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtZGF0ZUNoYW5nZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhpcyBDYWxlbmRhci5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZERhdGUgVGhlIHByZXZpb3VzIENhbGVuZGFyIGRhdGUuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBuZXcgQ2FsZW5kYXIgZGF0ZS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EYXRlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgb2xkRGF0ZTogRGF0ZSwgZGF0ZTogRGF0ZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZXZlbnRTdG9yZSBpcyBxdWVyaWVkIGZvciBldmVudHMgYnkgZGF0ZSByYW5nZSwgYW5kIHRoZSBkYXRlIHJhbmdlXG4gICAgICogcmVxdWVzdGVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIHN0b3JlIHdhcyBxdWVyaWVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtZGF0ZVJhbmdlQ2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm9sZCBUaGUgb2xkIGRhdGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZC5zdGFydERhdGUgdGhlIG9sZCBzdGFydCBkYXRlXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5vbGQuZW5kRGF0ZSB0aGUgb2xkIGVuZCBkYXRlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm5ldyBUaGUgbmV3IGRhdGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ldy5zdGFydERhdGUgdGhlIG5ldyBzdGFydCBkYXRlXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXcuZW5kRGF0ZSB0aGUgbmV3IGVuZCBkYXRlXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgb2xkOiB7IHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSB9LCBuZXc6IHsgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIFtMb2FkT25EZW1hbmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9Mb2FkT25EZW1hbmQpIGZlYXR1cmUgaGFzIGxvYWRlZCBhIHJhbmdlIG9mIGV2ZW50cy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIEpTT04gcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm9wdGlvbnMgVGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCBpbnRvIHRoZSBDcnVkTWFuYWdlciBbQ3J1ZE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvQ3J1ZE1hbmFnZXIpIFtsb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBtZXRob2QuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5zdGFydERhdGUgVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHJhbmdlIHRvIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5lbmREYXRlIFRoZSBlbmQgZGF0ZSBvZiB0aGUgcmFuZ2UgdG8gcmVxdWVzdC4gPHN0cm9uZz5Ob3RlIHRoYXQgRGF0ZXMgYXJlIHRpbWVzdGFtcHM8L3N0cm9uZz4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlTG9hZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlc3BvbnNlOiBvYmplY3QsIG9wdGlvbnM6IG9iamVjdCwgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCA8c3Ryb25nPmV2ZXJ5PC9zdHJvbmc+IHRpbWUgdGhlIGV2ZW50U3RvcmUgaXMgcXVlcmllZCBmb3IgZXZlbnRzIGJ5IGRhdGUgcmFuZ2UuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1kYXRlUmFuZ2VSZXF1ZXN0ZWQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIudmlldy5DYWxlbmRhcn0gZXZlbnQuc291cmNlIFRoaXMgQ2FsZW5kYXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQub2xkIFRoZSBvbGQgZGF0ZSByYW5nZVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQub2xkLnN0YXJ0RGF0ZSB0aGUgb2xkIHN0YXJ0IGRhdGVcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZC5lbmREYXRlIHRoZSBvbGQgZW5kIGRhdGVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQubmV3IFRoZSBuZXcgZGF0ZSByYW5nZVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQubmV3LnN0YXJ0RGF0ZSB0aGUgbmV3IHN0YXJ0IGRhdGVcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ldy5lbmREYXRlIHRoZSBuZXcgZW5kIGRhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoYW5nZWQgYHRydWVgIGlmIHRoZSBkYXRlIHJhbmdlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IHRpbWUgYSByZXF1ZXN0IHdhcyBtYWRlXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlUmVxdWVzdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgb2xkOiB7IHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSB9LCBuZXc6IHsgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0sIGNoYW5nZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJ5IHRoZSBhY3RpdmUgdmlldyBhZnRlciBvbmUgZGF5IGNlbGwncyBldmVudHMgYXJlIGNvbGxlY3RlZCBpbiBzb3J0ZWQgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZVxuICAgICAqIFtldmVudFNvcnRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctZXZlbnRTb3J0ZXIpXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1kYXlDZWxsUG9wdWxhdGVkKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbFtdfSBldmVudC5ldmVudHMgVGhlIGV2ZW50cyB0byBiZSBzaG93biBmb3IgdGhlIHBhc3NlZCBkYXRlXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5UaGUgZGF0ZSB0aGUgZXZlbnRzIGFyZSB0byBiZSBzaG93biBpbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EYXlDZWxsUG9wdWxhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGV2ZW50czogRXZlbnRNb2RlbFtdLCBUaGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBkYXkgbnVtYmVyIGlzIGNsaWNrZWQgb3IgYWN0aXZhdGVkIGJ5IHRoZSA8a2JkPkVOVEVSPC9rYmQ+IGtleSBpbiBhIHZpZXcgd2hpY2ggc2hvd3MgZGF5IG51bWJlcnMuXG4gICAgICogVGhpcyB3aWxsIGluY2x1ZGUgdGhlIGNlbGxzIG9mIGEgW1llYXJWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9ZZWFyVmlldyksIHRoZSBjZWxsIGhlYWRlciBvZiBjZWxsc1xuICAgICAqIGluIGEgW01vbnRoVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3KSwgYW5kIHRoZSBkYXkgaGVhZGVyIGluIGEgW0RheVZpZXddKCNDYWxlbmRhci93aWRnZXQvRGF5VmlldykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1kYXlOdW1iZXJDbGljaylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgY2xpY2tlZCBvbi5cbiAgICAgKiBAcGFyYW0ge0RheUNlbGx9IGV2ZW50LmNlbGxEYXRhIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRhdGEgYWJvdXQgdGhlIGNhbGVuZGFyIGNlbGwgZm9yIHRoZSBkYXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRheU51bWJlckNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgY2VsbERhdGE6IERheUNlbGwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGZpZWxkIGlzIG11dGF0ZWQgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgW2hhc0NoYW5nZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LWhhc0NoYW5nZXMpIHByb3BlcnR5IGNoYW5nZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db250YWluZXJ9IGV2ZW50LnNvdXJjZSBUaGUgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZGlydHkgVGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBDb250YWluZXIgLSBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGFueSBmaWVsZHMgd2hpY2ggaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgaW5pdGlhbCBsb2FkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRpcnR5U3RhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbnRhaW5lciwgZGlydHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciB3aGVuIGEgZHJhZyBjcmVhdGlvbiBnZXN0dXJlIGlzIGNvbXBsZXRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhlIENhbGVuZGFyIGluc3RhbmNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7Q29yZS51dGlsLmRyYWcuRHJhZ0NvbnRleHR9IGV2ZW50LmRyYWcgVGhlIGRyYWcgY3JlYXRlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIG5ldyBgRXZlbnRNb2RlbGAgcmVjb3JkIGFkZGVkIGluIHRoZSBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgYFJlc291cmNlTW9kZWxgIHJlY29yZCBpZiB0aGUgZ2VzdHVyZSB3YXMgcGVyZm9ybWVkIGluIGEgcmVzb3VyY2UtdHlwZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIuZmVhdHVyZS5DYWxlbmRhckRyYWd9IGV2ZW50LmZlYXR1cmUgVGhlIENhbGVuZGFyIGRyYWcgZmVhdHVyZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sVmFsaWRhdGVDcmVhdGVSZXN1bHR9IGV2ZW50LnZhbGlkYXRpb24gVGhlIHJlc3VsdCBvZiB0aGUgW3ZhbGlkYXRlQ3JlYXRlRm5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcjY29uZmlnLXZhbGlkYXRlQ3JlYXRlRm4pIGlmIG9uZSB3YXMgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnZpZXcgVGhlIENhbGVuZGFyIHdpZGdldCBpbiB3aGljaCB0aGUgZHJhZyBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRHJhZ0NyZWF0ZUVuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIsIGRyYWc6IERyYWdDb250ZXh0LCBldmVudDogRXZlbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZD86IFJlc291cmNlTW9kZWwsIGZlYXR1cmU6IENhbGVuZGFyRHJhZywgdmFsaWRhdGlvbjogYm9vbGVhbnxWYWxpZGF0ZUNyZWF0ZVJlc3VsdCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgQ2FsZW5kYXIgd2hlbiBhIGRyYWcgbW92ZSBnZXN0dXJlIGlzIGNvbXBsZXRlZC4gVGhlIGBldmVudFJlY29yZGAgaGFzIGFscmVhZHkgYmVlbiBhZGRlZFxuICAgICAqIHRvIHRoZSBgZXZlbnRTdG9yZWAgb2YgdGhlIG93bmluZyBjYWxlbmRhci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhlIENhbGVuZGFyIGluc3RhbmNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7Q29yZS51dGlsLmRyYWcuRHJhZ0NvbnRleHR9IGV2ZW50LmRyYWcgVGhlIGRyYWcgY3JlYXRlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIHVwZGF0ZWQgYEV2ZW50TW9kZWxgIHJlY29yZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgYFJlc291cmNlTW9kZWxgIHJlY29yZCBpZiB0aGUgZ2VzdHVyZSB3YXMgcGVyZm9ybWVkIGluIGEgcmVzb3VyY2UtdHlwZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIuZmVhdHVyZS5DYWxlbmRhckRyYWd9IGV2ZW50LmZlYXR1cmUgVGhlIENhbGVuZGFyIGRyYWcgZmVhdHVyZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sVmFsaWRhdGVDcmVhdGVSZXN1bHR9IGV2ZW50LnZhbGlkYXRpb24gVGhlIHJlc3VsdCBvZiB0aGUgW3ZhbGlkYXRlTW92ZUZuXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvQ2FsZW5kYXJEcmFnI2NvbmZpZy12YWxpZGF0ZU1vdmVGbikgaWYgb25lIHdhcyBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGUgQ2FsZW5kYXIgd2lkZ2V0IGluIHdoaWNoIHRoZSBkcmFnIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EcmFnTW92ZUVuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIsIGRyYWc6IERyYWdDb250ZXh0LCBldmVudDogRXZlbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZD86IFJlc291cmNlTW9kZWwsIGZlYXR1cmU6IENhbGVuZGFyRHJhZywgdmFsaWRhdGlvbjogYm9vbGVhbnxWYWxpZGF0ZUNyZWF0ZVJlc3VsdCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIG9uIHRoZSBvd25pbmcgQ2FsZW5kYXIgd2hlbiBkcmFnZ2luZyBhbiBldmVudCBmcm9tIHRoZSBjYWxlbmRhciBvdmVyIHRoZVxuICAgICAqIGV4dGVybmFsIHNvdXJjZSA8c3Ryb25nPmlmIHRoZSBbZHJvcHBhYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZHJvcHBhYmxlKSB3YXMgY29uZmlndXJlZDwvc3Ryb25nPi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWRyYWdNb3ZlRXh0ZXJuYWwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmQgYmVpbmcgZHJhZ2dlZC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5pdGVtRWxlbWVudCBUaGUgZWxlbWVudCBpbiB3aGljaCB0aGUgZHJhZyBnZXN0dXJlIHN0YXJ0ZWQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudGFyZ2V0RWxlbWVudCBUaGUgY3VycmVudCBvdmVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHBvaW50ZXIgZXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkcmFnIHBvaW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vdmVySW5kZXggKklmIFtncmlkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZ3JpZCkgd2FzIHNwZWNpZmllZCosIHRoZSBpbmRleCBvZiB0aGUgcm93IGJlaW5nIG1vdmVkIG92ZXI7XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50Lm92ZXJSZWNvcmQgKklmIFtncmlkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZ3JpZCkgd2FzIHNwZWNpZmllZCosIHRoZSByZWNvcmQgYmVpbmcgbW92ZWQgb3ZlcjtcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzQWJvdmUgKklmIFtncmlkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZ3JpZCkgd2FzIHNwZWNpZmllZCosIGB0cnVlYCBpZiB0aGUgcG9pbnRlciBwb3NpdGlvbiBpcyBhYm92ZSB0aGUgaGFsZndheSBsaW5lIG9mIHRoZSBvdmVyIHJvdy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmFsdEtleSBgdHJ1ZWAgaWYgdGhlIEFsdCBrZXkgd2FzIGRvd24gd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcHJvY2Vzc2VkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY3RybEtleSBgdHJ1ZWAgaWYgdGhlIEN0cmwga2V5IHdhcyBkb3duIHdoZW4gdGhlIGxhc3QgZXZlbnQgd2FzIHByb2Nlc3NlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50Lm1ldGFLZXkgYHRydWVgIGlmIHRoZSBNZXRhIGtleSB3YXMgZG93biB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyBwcm9jZXNzZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5zaGlmdEtleSBgdHJ1ZWAgaWYgdGhlIFNoaWZ0IGtleSB3YXMgZG93biB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRHJhZ01vdmVFeHRlcm5hbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCBpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkb21FdmVudDogRXZlbnQsIG92ZXJJbmRleDogbnVtYmVyLCBvdmVyUmVjb3JkOiBNb2RlbCwgaXNBYm92ZTogYm9vbGVhbiwgYWx0S2V5OiBib29sZWFuLCBjdHJsS2V5OiBib29sZWFuLCBtZXRhS2V5OiBib29sZWFuLCBzaGlmdEtleTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIENhbGVuZGFyIHdoZW4gYSBkcmFnIHJlc2l6ZSBnZXN0dXJlIGlzIGNvbXBsZXRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhlIENhbGVuZGFyIGluc3RhbmNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7Q29yZS51dGlsLmRyYWcuRHJhZ0NvbnRleHR9IGV2ZW50LmRyYWcgVGhlIGRyYWcgY3JlYXRlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIHVwZGF0ZWQgYEV2ZW50TW9kZWxgIHJlY29yZC5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLmZlYXR1cmUuQ2FsZW5kYXJEcmFnfSBldmVudC5mZWF0dXJlIFRoZSBDYWxlbmRhciBkcmFnIGZlYXR1cmUgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFuLFZhbGlkYXRlQ3JlYXRlUmVzdWx0fSBldmVudC52YWxpZGF0aW9uIFRoZSByZXN1bHQgb2YgdGhlIFt2YWxpZGF0ZVJlc2l6ZUZuXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvQ2FsZW5kYXJEcmFnI2NvbmZpZy12YWxpZGF0ZVJlc2l6ZUZuKSBpZiBvbmUgd2FzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC52aWV3IFRoZSBDYWxlbmRhciB3aWRnZXQgaW4gd2hpY2ggdGhlIGRyYWcgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRyYWdSZXNpemVFbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyLCBkcmFnOiBEcmFnQ29udGV4dCwgZXZlbnQ6IEV2ZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZmVhdHVyZTogQ2FsZW5kYXJEcmFnLCB2YWxpZGF0aW9uOiBib29sZWFufFZhbGlkYXRlQ3JlYXRlUmVzdWx0LCB2aWV3OiBDYWxlbmRhclZpZXcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgb24gdGhlIG93bmluZyBDYWxlbmRhciBhZnRlciBkcm9wcGluZyBhbiBldmVudCBmcm9tIHRoZSBjYWxlbmRhciBvbiB0aGVcbiAgICAgKiBleHRlcm5hbCBzb3VyY2UgaGFzIGJlZW4gY29tcGxldGVkIDxzdHJvbmc+aWYgdGhlIFtkcm9wcGFibGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1kcm9wcGFibGUpIHdhcyBjb25maWd1cmVkPC9zdHJvbmc+LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtZHJvcEV4dGVybmFsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkIHRoYXQgd2FzIGRyb3BwZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5kcm9wT25DYWxlbmRhciBgdHJ1ZWAgaWYgdGhlIGRyb3AgZ2VzdHVyZSBpcyBvdmVyIHRoZSBjbGllbnQgQ2FsZW5kYXIuIFRoaXMgZmVhdHVyZSBhbHNvIGFsbG93cyBkcmFnICpvdXQqIG9mIHRoZSBDYWxlbmRhciBhbmQgb250byB0aGUgZXh0ZXJuYWwgZXZlbnQgc291cmNlIGlmIHRoZSBbZHJvcHBhYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZHJvcHBhYmxlKSBjb25maWcgaXMgc2V0LlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50Lml0ZW1FbGVtZW50IFRoZSBlbGVtZW50IGluIHdoaWNoIHRoZSBkcmFnIGdlc3R1cmUgc3RhcnRlZC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXRFbGVtZW50IFRoZSBjdXJyZW50IG92ZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcG9pbnRlciBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGRyYWcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm92ZXJJbmRleCAqSWYgW2dyaWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1ncmlkKSB3YXMgc3BlY2lmaWVkKiwgdGhlIGluZGV4IG9mIHRoZSByb3cgYmVpbmcgbW92ZWQgb3ZlcjtcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQub3ZlclJlY29yZCAqSWYgW2dyaWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1ncmlkKSB3YXMgc3BlY2lmaWVkKiwgdGhlIHJlY29yZCBiZWluZyBtb3ZlZCBvdmVyO1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNBYm92ZSAqSWYgW2dyaWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1ncmlkKSB3YXMgc3BlY2lmaWVkKiwgYHRydWVgIGlmIHRoZSBwb2ludGVyIHBvc2l0aW9uIGlzIGFib3ZlIHRoZSBoYWxmd2F5IGxpbmUgb2YgdGhlIG92ZXIgcm93LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYWx0S2V5IGB0cnVlYCBpZiB0aGUgQWx0IGtleSB3YXMgZG93biB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyBwcm9jZXNzZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jdHJsS2V5IGB0cnVlYCBpZiB0aGUgQ3RybCBrZXkgd2FzIGRvd24gd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcHJvY2Vzc2VkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQubWV0YUtleSBgdHJ1ZWAgaWYgdGhlIE1ldGEga2V5IHdhcyBkb3duIHdoZW4gdGhlIGxhc3QgZXZlbnQgd2FzIHByb2Nlc3NlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnNoaWZ0S2V5IGB0cnVlYCBpZiB0aGUgU2hpZnQga2V5IHdhcyBkb3duIHdoZW4gdGhlIGxhc3QgZXZlbnQgd2FzIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ecm9wRXh0ZXJuYWw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZHJvcE9uQ2FsZW5kYXI6IGJvb2xlYW4sIGl0ZW1FbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsIGRvbUV2ZW50OiBFdmVudCwgb3ZlckluZGV4OiBudW1iZXIsIG92ZXJSZWNvcmQ6IE1vZGVsLCBpc0Fib3ZlOiBib29sZWFuLCBhbHRLZXk6IGJvb2xlYW4sIGN0cmxLZXk6IGJvb2xlYW4sIG1ldGFLZXk6IGJvb2xlYW4sIHNoaWZ0S2V5OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHdpZGdldCdzIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmVsZW1lbnQgVGhlIFdpZGdldCdzIGVsZW1lbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRWxlbWVudENyZWF0ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhbiBlbXB0eSBjZWxsIGNvbnRlbnQgYXJlYSBpcyBjbGlja2VkIG9uIGluIGEgW01vbnRoVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3KSBvciBhXG4gICAgICogW0NhbGVuZGFyUm93XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9DYWxlbmRhclJvdykuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIGNoaWxkIHZpZXcgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBpbml0aWF0ZWQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHRyaWdnZXJpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSB3aGljaCBoYXMgbm8gdmlzaWJsZSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FbXB0eUNlbGxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpIGdlc3R1cmUgaGFzXG4gICAgICogY3JlYXRlZCBhIG5ldyBldmVudCBhbmQgYWRkZWQgaXQgdG8gdGhlIGV2ZW50IHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtZXZlbnRBdXRvQ3JlYXRlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgY2hpbGQgdmlldyBvbiB3aGljaCB0aGUgZXZlbnQgd2FzIGluaXRpYXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgbmV3IGV2ZW50IHJlY29yZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FdmVudEF1dG9DcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIGV2ZW50IGJhciBpcyBjbGlja2VkIGluIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBVSSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCBjbGlja2VkIG9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBjbGlja2VkIG9uIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50Q2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIGV2ZW50IGJhciBpcyByaWdodC1jbGlja2VkIGluIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBVSSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByaWdodC1jbGlja2VkIG9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSByaWdodC1jbGlja2VkIG9uIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50Q29udGV4dE1lbnU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIGV2ZW50IGJhciBpcyBkb3VibGUgY2xpY2tlZCBpbiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgb2YgdGhlIFVJIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgVUkgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgZG91YmxlIGNsaWNrZWQgb24uXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGRvdWJsZSBjbGlja2VkIG9uIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50RGJsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgdGhlIGVkaXRvciB3aWxsIGxvYWQgdGhlIGV2ZW50IHJlY29yZCBkYXRhIGludG8gaXRzIGlucHV0IGZpZWxkcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91XG4gICAgICogd2FudCB0byBtb2RpZnkgdGhlIGZpZWxkcyBiZWZvcmUgZGF0YSBpcyBsb2FkZWQgKGUuZy4gc2V0IHNvbWUgaW5wdXQgZmllbGQgdG8gYmUgcmVhZG9ubHkpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuQ29udGFpbmVyfSBldmVudC5zb3VyY2UgVGhlIGVkaXRvciB3aWRnZXRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50RWRpdEJlZm9yZVNldFJlY29yZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCByZWNvcmQ6IEV2ZW50TW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCB3aGlsZSBhbiBldmVudCBiYXIgaXMgZm9jdXNlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgb2YgdGhlIFVJIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgVUkgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgaW4gd2hpY2ggdGhlIGtleSBldmVudCB3YXMgZGV0ZWN0ZWQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGluIHdoaWNoIHRoZSBrZXkgZXZlbnQgd2FzIGRldGVjdGVkIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50S2V5RG93bjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZnJvbU92ZXJmbG93UG9wdXA6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYmVmb3JlIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIGFuIGV2ZW50LiBBbGxvd3MgbWFuaXB1bGF0aW9uIG9mIHRoZSBpdGVtc1xuICAgICAqIHRvIHNob3cgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGBwcm9jZXNzSXRlbXNgLiBSZXR1cm5pbmcgYGZhbHNlYCBmcm9tIGEgbGlzdGVuZXIgcHJldmVudHMgdGhlIG1lbnUgZnJvbVxuICAgICAqIGJlaW5nIHNob3duLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBFdmVudCByZWNvcmQgZm9yIHdoaWNoIHRoZSBtZW51IHdhcyB0cmlnZ2VyZWRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBSZXNvdXJjZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWx9IGV2ZW50LmFzc2lnbm1lbnRSZWNvcmQgQXNzaWdubWVudCByZWNvcmQsIGlmIGFzc2lnbm1lbnRzIGFyZSB1c2VkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBQb2ludGVyIGV2ZW50IHdoaWNoIHRyaWdnZXJlZCB0aGUgY29udGV4dCBtZW51IChpZiBhbnkpXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNZW51QmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgYXNzaWdubWVudFJlY29yZDogQXNzaWdubWVudE1vZGVsLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudD86IE1vdXNlRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWx9IGV2ZW50LmFzc2lnbm1lbnRSZWNvcmQgQXNzaWdubWVudCByZWNvcmQsIGlmIGFzc2lnbm1lbnRzIGFyZSB1c2VkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBpdGVtOiBNZW51SXRlbSwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBhc3NpZ25tZW50UmVjb3JkOiBBc3NpZ25tZW50TW9kZWwsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYWZ0ZXIgc2hvd2luZyB0aGUgY29udGV4dCBtZW51IGZvciBhbiBldmVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgRXZlbnQgcmVjb3JkIGZvciB3aGljaCB0aGUgbWVudSB3YXMgdHJpZ2dlcmVkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgUmVzb3VyY2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuQXNzaWdubWVudE1vZGVsfSBldmVudC5hc3NpZ25tZW50UmVjb3JkIEFzc2lnbm1lbnQgcmVjb3JkLCBpZiBhc3NpZ25tZW50cyBhcmUgdXNlZFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50TWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgbWVudTogTWVudSwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBhc3NpZ25tZW50UmVjb3JkOiBBc3NpZ25tZW50TW9kZWwsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gZXZlbnQgYmFyIGlzIG1vdXNlZG93bmVkIGluIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBVSSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCBtb3VzZWRvd25lZCBvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgbW91c2Vkb3duZWQgb24gaWYgdGhlIFVJIGluY2x1ZGVzIGEgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5mcm9tT3ZlcmZsb3dQb3B1cCBgdHJ1ZWAgaWYgdGhlIGludGVyYWN0aW9uIHdhcyB0aHJvdWdoIHRoZSBzb3VyY2UgdmlldydzIFtvdmVyZmxvd1BvcHVwXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsUmVuZGVyZXIjcHJvcGVydHktb3ZlcmZsb3dQb3B1cCkuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNb3VzZURvd246IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGN1cnNvciBlbnRlcnMgYW4gZXZlbnQgYmFyIGluIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBVSSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50TW91c2VFbnRlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZnJvbU92ZXJmbG93UG9wdXA6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gY3Vyc29yIGxlYXZlcyBhbiBldmVudCBiYXIgaW4gYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIG9mIHRoZSBVSSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5ldmVudEVsZW1lbnQgVGhlIFVJIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGV2ZW50IHJlY29yZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgaWYgdGhlIFVJIGluY2x1ZGVzIGEgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5mcm9tT3ZlcmZsb3dQb3B1cCBgdHJ1ZWAgaWYgdGhlIGludGVyYWN0aW9uIHdhcyB0aHJvdWdoIHRoZSBzb3VyY2UgdmlldydzIFtvdmVyZmxvd1BvcHVwXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsUmVuZGVyZXIjcHJvcGVydHktb3ZlcmZsb3dQb3B1cCkuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNb3VzZUxlYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBmcm9tT3ZlcmZsb3dQb3B1cDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbiBldmVudCBiYXIgaXMgbW91c2VvdXRlZCBpbiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgb2YgdGhlIFVJIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgVUkgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgbW91c2VvdXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgbW91c2VvdXRlZCBpZiB0aGUgVUkgaW5jbHVkZXMgYSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZyb21PdmVyZmxvd1BvcHVwIGB0cnVlYCBpZiB0aGUgaW50ZXJhY3Rpb24gd2FzIHRocm91Z2ggdGhlIHNvdXJjZSB2aWV3J3MgW292ZXJmbG93UG9wdXBdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0RheUNlbGxSZW5kZXJlciNwcm9wZXJ0eS1vdmVyZmxvd1BvcHVwKS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FdmVudE1vdXNlT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBmcm9tT3ZlcmZsb3dQb3B1cDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbiBldmVudCBiYXIgaXMgbW91c2VvdmVyZWQgaW4gYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIG9mIHRoZSBVSSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5ldmVudEVsZW1lbnQgVGhlIFVJIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGV2ZW50IG1vdXNlb3ZlcmVkLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBtb3VzZW92ZXJlZCBpZiB0aGUgVUkgaW5jbHVkZXMgYSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZyb21PdmVyZmxvd1BvcHVwIGB0cnVlYCBpZiB0aGUgaW50ZXJhY3Rpb24gd2FzIHRocm91Z2ggdGhlIHNvdXJjZSB2aWV3J3MgW292ZXJmbG93UG9wdXBdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0RheUNlbGxSZW5kZXJlciNwcm9wZXJ0eS1vdmVyZmxvd1BvcHVwKS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FdmVudE1vdXNlT3ZlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZnJvbU92ZXJmbG93UG9wdXA6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gZXZlbnQgYmFyIGlzIG1vdXNldXBwZWQgaW4gYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIG9mIHRoZSBVSSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5ldmVudEVsZW1lbnQgVGhlIFVJIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGV2ZW50IG1vdXNldXBwZWQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIG1vdXNldXBwZWQgaWYgdGhlIFVJIGluY2x1ZGVzIGEgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5mcm9tT3ZlcmZsb3dQb3B1cCBgdHJ1ZWAgaWYgdGhlIGludGVyYWN0aW9uIHdhcyB0aHJvdWdoIHRoZSBzb3VyY2UgdmlldydzIFtvdmVyZmxvd1BvcHVwXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsUmVuZGVyZXIjcHJvcGVydHktb3ZlcmZsb3dQb3B1cCkuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNb3VzZVVwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBmcm9tT3ZlcmZsb3dQb3B1cDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGRheSBzcGFubmluZyBldmVudCBpcyBmb3VuZCwgYW5kIHRoZSBkYXRlIHRvIHdoaWNoIGl0cyBlbmNhcHN1bGF0aW5nIGV2ZW50IGJhclxuICAgICAqIGV4dGVuZHMgaGFzIGJlZW4gY2FsY3VsYXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWV2ZW50UHJvcGFnYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5ldmVudEVuZERhdGUgVGhlIGVuZCBkYXRlIGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIHByb3BhZ2F0ZSBlbmQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnByb3BhZ2F0ZUVuZERhdGUgVGhlIHN5c3RlbS1jYWxjdWxhdGVkIGVuZCBwb2ludCBvZiB0aGUgZXZlbnQgYmFyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNBbGxEYXkgYHRydWVgIGlmIHRoZSBldmVudCBpcyBhbiBhbGwgZGF5IGV2ZW50LCBvciBzcGFucyBtdWx0aXBsZSBkYXlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNPdmVyZmxvdyBgdHJ1ZWAgaWYgdGhpcyBpcyBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiBmdXJ0aGVyIHByb3BhZ2F0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQub3ZlcmZsb3dzIGB0cnVlYCBpZiB0aGUgZXZlbnQgZXh0ZW5kcyBpbnRvIGZ1dHVyZSBjZWxscy5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkIGJlaW5nIHByb3BhZ2F0ZWQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGZyb20gd2hpY2ggdGhlIGV2ZW50IGlzIGJlaW5nIHByb3BhZ2F0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRQcm9wYWdhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZXZlbnRFbmREYXRlOiBEYXRlLCBwcm9wYWdhdGVFbmREYXRlOiBEYXRlLCBpc0FsbERheTogYm9vbGVhbiwgaXNPdmVyZmxvdzogYm9vbGVhbiwgb3ZlcmZsb3dzOiBib29sZWFuLCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZGF0ZTogRGF0ZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIFBhbmVsIGlzIGV4cGFuZGVkIHVzaW5nIHRoZSBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlBhbmVsfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFBhbmVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGVudGVycyB0aGlzIFdpZGdldC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmZyb21FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudG9FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuZnJvbVdpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnRvV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYmFja3dhcmRzIGB0cnVlYCBpZiB0aGUgYHRvRWxlbWVudGAgaXMgYmVmb3JlIHRoZSBgZnJvbUVsZW1lbnRgIGluIGRvY3VtZW50IG9yZGVyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZvY3VzSW46IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBmb2N1cyBleGl0cyB0aGlzIFdpZGdldCdzIG93bmVyc2hpcCB0cmVlLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgYGJsdXJgIGV2ZW50LlxuICAgICAqIGZvY3VzIG1vdmluZyBmcm9tIHdpdGhpbiB0aGlzIFdpZGdldCdzIG93bmVyc2hpcCB0cmVlLCBldmVuIGlmIHRoZXJlIGFyZSBmbG9hdGluZyB3aWRnZXRzXG4gICAgICogd2lsbCBub3QgdHJpZ2dlciB0aGlzIGV2ZW50LiBUaGlzIGlzIHdoZW4gZm9jdXMgZXhpdHMgdGhpcyB3aWRnZXQgY29tcGxldGVseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmZyb21FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudG9FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuZnJvbVdpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnRvV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYmFja3dhcmRzIGB0cnVlYCBpZiB0aGUgYHRvRWxlbWVudGAgaXMgYmVmb3JlIHRoZSBgZnJvbUVsZW1lbnRgIGluIGRvY3VtZW50IG9yZGVyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZvY3VzT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCwgZnJvbVdpZGdldDogV2lkZ2V0LCB0b1dpZGdldDogV2lkZ2V0LCBiYWNrd2FyZHM6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCB3YXMgaGlkZGVuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiB0aGUgW0xvYWRPbkRlbWFuZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0xvYWRPbkRlbWFuZCkgZmVhdHVyZSBkZXRlY3RzIHRoYXQgYSByZXF1ZXN0XG4gICAgICogZm9yIGRhdGEgZnJvbSB0aGUgc2VydmVyIGhhcyBmYWlsZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1sb2FkT25EZW1hbmRGYWlsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yYXdSZXNwb25zZSBUaGUgSFRUUCBgZmV0Y2hgIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdCBUaGUgQ3J1ZE1hbmFnZXIgbG9hZCBkYXRhIGJsb2NrLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBKU09OIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkxvYWRPbkRlbWFuZEZhaWw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByYXdSZXNwb25zZTogYW55LCByZXF1ZXN0OiBvYmplY3QsIHJlc3BvbnNlOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBtb250aCBuYW1lIGhlYWRlciBpbiBhIFtZZWFyVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvWWVhclZpZXcpIG9yIGEgW01vbnRoR3JpZF0oI0NhbGVuZGFyL3dpZGdldC9Nb250aEdyaWQpIGlzIGNsaWNrZWRcbiAgICAgKiBvciBhY3RpdmF0ZWQgYnkgdGhlIDxrYmQ+RU5URVI8L2tiZD4ga2V5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtbW9udGhOYW1lQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm1vbnRoIFRoZSBtb250aCBpbmRleCAqKHplcm8gYmFzZWQpKiBjbGlja2VkIG9uLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTW9udGhOYW1lQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBtb250aDogbnVtYmVyLCBkYXRlOiBEYXRlIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHVzZXIgZ2VzdHVyZSBjYXVzZXMgdGhlIGFjdGl2ZSBpdGVtIHRvIGNoYW5nZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQgd2hpY2ggaW5zdGlnYXRlZCBuYXZpZ2F0aW9uLiBNYXkgYmUgYSBjbGljayBvciBrZXkgb3IgZm9jdXMgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudCxudWxsfSBldmVudC5pdGVtIFRoZSBuZXdseSBhY3RpdmUgaXRlbSwgb3IgYG51bGxgIGlmIGZvY3VzIG1vdmVkIG91dC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50LG51bGx9IGV2ZW50Lm9sZEl0ZW0gVGhlIHByZXZpb3VzbHkgYWN0aXZlIGl0ZW0sIG9yIGBudWxsYCBpZiBmb2N1cyBpcyBtb3ZpbmcgaW4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTmF2aWdhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudDogRXZlbnQsIGl0ZW06IEhUTUxFbGVtZW50fG51bGwsIG9sZEl0ZW06IEhUTUxFbGVtZW50fG51bGwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0IHdoaWNoIGhhZCBiZWVuIGluIGEgbm9uLXZpc2libGUgc3RhdGUgZm9yIGFueSByZWFzb25cbiAgICAgKiBhY2hpZXZlcyB2aXNpYmlsaXR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtcGFpbnQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBwYWludGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZmlyc3RQYWludCBgdHJ1ZWAgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFpbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFpbnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZmlyc3RQYWludDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYWZ0ZXIgYSBwYXN0ZSBhY3Rpb24gaXMgcGVyZm9ybWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIE93bmVyIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRSZWNvcmRzIFRoZSBwYXN0ZWQgZXZlbnQgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5hc3NpZ25tZW50UmVjb3JkcyBUaGUgcGFzdGVkIGFzc2lnbm1lbnQgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQucGFzdGVkRXZlbnRSZWNvcmRzIChERVBSRUNBVEVEKSBVc2UgZXZlbnRSZWNvcmRzIGluc3RlYWRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50Lm9yaWdpbmFsRXZlbnRSZWNvcmRzIFRoZSBvcmlnaW5hbCBjb3BpZWQgZXZlbnQgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5vcmlnaW5hbEFzc2lnbm1lbnRSZWNvcmRzIFRoZSBvcmlnaW5hbCBjb3BpZWQgYXNzaWdubWVudCByZWNvcmRzXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIGRhdGUgUGFzdGVkIHRvIHRoaXMgZGF0ZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSB0YXJnZXQgcmVzb3VyY2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc0N1dCBgdHJ1ZWAgaWYgdGhpcyBpcyBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZW50aXR5TmFtZSAnZXZlbnQnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBwYXN0ZSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25QYXN0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBldmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgYXNzaWdubWVudFJlY29yZHM6IEFzc2lnbm1lbnRNb2RlbFtdLCBwYXN0ZWRFdmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgb3JpZ2luYWxFdmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgb3JpZ2luYWxBc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBpc0N1dDogYm9vbGVhbiwgZW50aXR5TmFtZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBpZiBhIHBhc3RlIGFjdGlvbiBpcyBub3QgYWxsb3dlZC4gRGVwZW5kaW5nIG9uIGlmIHRoZSBFdmVudFN0b3JlIGlzIHVzaW5nXG4gICAgICogW3NpbmdsZUFzc2lnbm1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvRXZlbnRTdG9yZSNjb25maWctc2luZ2xlQXNzaWdubWVudCkgb3IgdGhlIGNvbmZpZ3VyYXRpb24gb2ZcbiAgICAgKiBbY29weVBhc3RlQWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL0V2ZW50Q29weVBhc3RlI2NvbmZpZy1jb3B5UGFzdGVBY3Rpb24pLCBlaXRoZXIgdGhlIGBldmVudFJlY29yZHNgIG9yIHRoZSBgYXNzaWdubWVudFJlY29yZHNgIHBhcmFtIHdpbGwgYmUgcG9wdWxhdGVkXG4gICAgICogd2l0aCByZWNvcmQgY29waWVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIE93bmVyIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRSZWNvcmRzIFRoZSBldmVudCByZWNvcmRzIGFib3V0IHRvIGJlIHBhc3RlZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5hc3NpZ25tZW50UmVjb3JkcyBUaGUgYXNzaWdubWVudCByZWNvcmRzIGFib3V0IHRvIGJlIHBhc3RlZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQub3JpZ2luYWxFdmVudFJlY29yZHMgVGhlIGV2ZW50IHJlY29yZHMgdGhhdCB3ZXJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5vcmlnaW5hbEFzc2lnbm1lbnRSZWNvcmRzIFRoZSBhc3NpZ25tZW50IHJlY29yZHMgdGhhdCB3ZXJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgcGFzdGUgZGF0ZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSB0YXJnZXQgcmVzb3VyY2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc0N1dCBgdHJ1ZWAgaWYgdGhpcyBpcyBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZW50aXR5TmFtZSAnZXZlbnQnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBgcGFzdGVOb3RBbGxvd2VkYCBldmVudHNcbiAgICAgKiBAcGFyYW0geydvdmVybGFwcGluZ0V2ZW50cycsJ3Jlc291cmNlUmVhZE9ubHknfSBldmVudC5yZWFzb24gQSBzdHJpbmcgaWQgdG8gdXNlIGZvciBkaXNwbGF5aW5nIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFzdGVOb3RBbGxvd2VkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGV2ZW50UmVjb3JkczogRXZlbnRNb2RlbFtdLCBhc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIG9yaWdpbmFsRXZlbnRSZWNvcmRzOiBFdmVudE1vZGVsW10sIG9yaWdpbmFsQXNzaWdubWVudFJlY29yZHM6IEFzc2lnbm1lbnRNb2RlbFtdLCBkYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgaXNDdXQ6IGJvb2xlYW4sIGVudGl0eU5hbWU6IHN0cmluZywgcmVhc29uOiAnb3ZlcmxhcHBpbmdFdmVudHMnfCdyZXNvdXJjZVJlYWRPbmx5JyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFdpZGdldCdzIHJlYWQgb25seSBzdGF0ZSBpcyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQucmVhZE9ubHkgUmVhZCBvbmx5IG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlYWRPbmx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVhZE9ubHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB3aWRnZXQncyBlbGVtZW50cyBoYXZlIGJlZW4gc3luY2hyb25pemVkIGR1ZSB0byBhIGRpcmVjdCBvciBpbmRpcmVjdCBjYWxsXG4gICAgICogdG8gW3JlY29tcG9zZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tcmVjb21wb3NlKSwgaWYgdGhpcyByZXN1bHRzIGluIHNvbWUgY2hhbmdlIHRvIHRoZSB3aWRnZXQncyByZW5kZXJlZCBET00gZWxlbWVudHMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVjb21wb3NlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBvbmUgb2YgdGhlIHZpZXdzIGluIHRoaXMgQ2FsZW5kYXIgcmVmcmVzaGVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHJlZnJlc2hlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWZyZXNoOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIGVuY2Fwc3VsYXRpbmcgZWxlbWVudCBvZiBhIFdpZGdldCByZXNpemVzICpvbmx5IHdoZW4gW21vbml0b3JSZXNpemVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tb25pdG9yUmVzaXplKSBpcyBgdHJ1ZWAqLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LndpZHRoIFRoZSBuZXcgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZFdpZHRoIFRoZSBvbGQgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBvbGQgaGVpZ2h0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvbGRXaWR0aDogbnVtYmVyLCBvbGRIZWlnaHQ6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGNsaWNrIGV2ZW50IGlzIHJlY2VpdmVkIGJ5IGEgdmlldyB3aGljaCBzdXBwb3J0cyByZXNvdXJjZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1yZXNvdXJjZUNsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50ICpJZiogYW4gZXZlbnQgd2FzIGludGVyYWN0ZWQgd2l0aCwgdGhlIFVJIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgKklmKiBhbiBldmVudCB3YXMgaW50ZXJhY3RlZCB3aXRoLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnJlc291cmNlRWxlbWVudCBUaGUgVUkgZWxlbWVudCB3aGljaCBlbmNhcHN1bGF0ZXMgdGhlIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc291cmNlQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VFbGVtZW50OiBIVE1MRWxlbWVudCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIG5ldyBbcmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkgaXMgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IHdob3NlIGByZXNwb25zaXZlU3RhdGVgIGhhcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnN0YXRlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRTdGF0ZSBUaGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc3BvbnNpdmVTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBzdGF0ZTogc3RyaW5nLCBvbGRTdGF0ZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgY2xpY2sgbWFkZSBpdHMgd2F5IHRocm91Z2ggdG8gYW4gZW1wdHkgcGFydCBvZiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgY2xpY2tlZCBvbi4gX05vdGUgdGhhdCBpbiBhIFtEYXlWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9EYXlWaWV3KSwgdGhpcyB3aWxsIGluY2x1ZGUgZ3JhbnVsYXIgdGltZSBpbmZvcm1hdGlvbi4gRm9yIG90aGVyIHZpZXdzLCB0aGlzIGlzIHRoZSAqc3RhcnQqIG9mIHRoZSBkYXRlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcgaWYgYW55LiBPbmx5IFtSZXNvdXJjZVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L1Jlc291cmNlVmlldykgb3IgYSBbRGF5UmVzb3VyY2VWaWV3XSgjQ2FsZW5kYXIvd2lkZ2V0L0RheVJlc291cmNlVmlldykgd2lsbCBpbmNsdWRlIHRoaXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2NoZWR1bGVDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgY29udGV4dCBtZW51IG1hZGUgaXRzIHdheSB0aHJvdWdoIHRvIGFuIGVtcHR5IHBhcnQgb2YgYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGNsaWNrZWQgb24uIF9Ob3RlIHRoYXQgaW4gYSBbRGF5Vmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRGF5VmlldyksIHRoaXMgd2lsbCBpbmNsdWRlIGdyYW51bGFyIHRpbWUgaW5mb3JtYXRpb24uIEZvciBvdGhlciB2aWV3cywgdGhpcyBpcyB0aGUgKnN0YXJ0KiBvZiB0aGUgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB2aWV3IGlmIGFueS4gT25seSBbUmVzb3VyY2VWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9SZXNvdXJjZVZpZXcpIG9yIGEgW0RheVJlc291cmNlVmlld10oI0NhbGVuZGFyL3dpZGdldC9EYXlSZXNvdXJjZVZpZXcpIHdpbGwgaW5jbHVkZSB0aGlzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxlQ29udGV4dE1lbnU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGRibGNsaWNrIG1hZGUgaXRzIHdheSB0aHJvdWdoIHRvIGFuIGVtcHR5IHBhcnQgb2YgYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGRvdWJsZSBjbGlja2VkIG9uLiBfTm90ZSB0aGF0IGluIGEgW0RheVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcpLCB0aGlzIHdpbGwgaW5jbHVkZSBncmFudWxhciB0aW1lIGluZm9ybWF0aW9uLiBGb3Igb3RoZXIgdmlld3MsIHRoaXMgaXMgdGhlICpzdGFydCogb2YgdGhlIGRhdGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldyBpZiBhbnkuIE9ubHkgW1Jlc291cmNlVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvUmVzb3VyY2VWaWV3KSBvciBhIFtEYXlSZXNvdXJjZVZpZXddKCNDYWxlbmRhci93aWRnZXQvRGF5UmVzb3VyY2VWaWV3KSB3aWxsIGluY2x1ZGUgdGhpcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TY2hlZHVsZURibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgb3IgR2FudHQgd2lkZ2V0IGJlZm9yZSB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciB0aGUgc2NoZWR1bGUuXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gYHByb2Nlc3NJdGVtc2AuIFJldHVybmluZyBgZmFsc2VgIGZyb20gYSBsaXN0ZW5lclxuICAgICAqIHByZXZlbnRzIHRoZSBtZW51IGZyb20gYmVpbmcgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFJlc291cmNlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBDbGlja2VkIGRhdGUsIHJvdW5kZWQgYWNjb3JkaW5nIHRvIHZpZXdQcmVzZXQncyBzZXR0aW5nc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbH0gZXZlbnQuYXNzaWdubWVudFJlY29yZCBBc3NpZ25tZW50IHJlY29yZCwgaWYgYXNzaWdubWVudHMgYXJlIHVzZWRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5ldmVudEVsZW1lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TY2hlZHVsZU1lbnVCZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGRhdGU6IERhdGUsIGFzc2lnbm1lbnRSZWNvcmQ6IEFzc2lnbm1lbnRNb2RlbCwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgb3IgR2FudHQgd2lkZ2V0IHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIENsaWNrZWQgZGF0ZSwgcm91bmRlZCBhY2NvcmRpbmcgdG8gdmlld1ByZXNldCdzIHNldHRpbmdzXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZWxlbWVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxlTWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgaXRlbTogTWVudUl0ZW0sIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBkYXRlOiBEYXRlLCBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBvciBHYW50dCB3aWRnZXQgYWZ0ZXIgc2hvd2luZyB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgc2NoZWR1bGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIENsaWNrZWQgZGF0ZSwgcm91bmRlZCBhY2NvcmRpbmcgdG8gdmlld1ByZXNldCdzIHNldHRpbmdzXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudGFyZ2V0RWxlbWVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxlTWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBtZW51OiBNZW51LCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZGF0ZTogRGF0ZSwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBtb3VzZWRvd24gbWFkZSBpdHMgd2F5IHRocm91Z2ggdG8gYW4gZW1wdHkgcGFydCBvZiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgbW91c2Vkb3duZWQgb24uIF9Ob3RlIHRoYXQgaW4gYSBbRGF5Vmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRGF5VmlldyksIHRoaXMgd2lsbCBpbmNsdWRlIGdyYW51bGFyIHRpbWUgaW5mb3JtYXRpb24uIEZvciBvdGhlciB2aWV3cywgdGhpcyBpcyB0aGUgKnN0YXJ0KiBvZiB0aGUgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB2aWV3IGlmIGFueS4gT25seSBbUmVzb3VyY2VWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9SZXNvdXJjZVZpZXcpIG9yIGEgW0RheVJlc291cmNlVmlld10oI0NhbGVuZGFyL3dpZGdldC9EYXlSZXNvdXJjZVZpZXcpIHdpbGwgaW5jbHVkZSB0aGlzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxlTW91c2VEb3duOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBtb3VzZW91dCBtYWRlIGl0J3Mgd2F5IHRocm91Z2ggdG8gYW4gZW1wdHkgcGFydCBvZiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgbW91c2VvdXRlZC4gX05vdGUgdGhhdCBpbiBhIFtEYXlWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9EYXlWaWV3KSwgdGhpcyB3aWxsIGluY2x1ZGUgZ3JhbnVsYXIgdGltZSBpbmZvcm1hdGlvbi4gRm9yIG90aGVyIHZpZXdzLCB0aGlzIGlzIHRoZSAqc3RhcnQqIG9mIHRoZSBkYXRlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcgaWYgYW55LiBPbmx5IFtSZXNvdXJjZVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L1Jlc291cmNlVmlldykgb3IgYSBbRGF5UmVzb3VyY2VWaWV3XSgjQ2FsZW5kYXIvd2lkZ2V0L0RheVJlc291cmNlVmlldykgd2lsbCBpbmNsdWRlIHRoaXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2NoZWR1bGVNb3VzZU91dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgbW91c2VvdmVyIG1hZGUgaXRzIHdheSB0aHJvdWdoIHRvIGFuIGVtcHR5IHBhcnQgb2YgYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIG1vdXNlb3ZlcmVkLiBfTm90ZSB0aGF0IGluIGEgW0RheVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcpLCB0aGlzIHdpbGwgaW5jbHVkZSBncmFudWxhciB0aW1lIGluZm9ybWF0aW9uLiBGb3Igb3RoZXIgdmlld3MsIHRoaXMgaXMgdGhlICpzdGFydCogb2YgdGhlIGRhdGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldyBpZiBhbnkuIE9ubHkgW1Jlc291cmNlVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvUmVzb3VyY2VWaWV3KSBvciBhIFtEYXlSZXNvdXJjZVZpZXddKCNDYWxlbmRhci93aWRnZXQvRGF5UmVzb3VyY2VWaWV3KSB3aWxsIGluY2x1ZGUgdGhpcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TY2hlZHVsZU1vdXNlT3ZlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgbW91c2V1cCBtYWRlIGl0cyB3YXkgdGhyb3VnaCB0byBhbiBlbXB0eSBwYXJ0IG9mIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBtb3VzZXVwcGVkIG9uLiBfTm90ZSB0aGF0IGluIGEgW0RheVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcpLCB0aGlzIHdpbGwgaW5jbHVkZSBncmFudWxhciB0aW1lIGluZm9ybWF0aW9uLiBGb3Igb3RoZXIgdmlld3MsIHRoaXMgaXMgdGhlICpzdGFydCogb2YgdGhlIGRhdGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldyBpZiBhbnkuIE9ubHkgW1Jlc291cmNlVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvUmVzb3VyY2VWaWV3KSBvciBhIFtEYXlSZXNvdXJjZVZpZXddKCNDYWxlbmRhci93aWRnZXQvRGF5UmVzb3VyY2VWaWV3KSB3aWxsIGluY2x1ZGUgdGhpcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TY2hlZHVsZU1vdXNlVXA6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYW55IHRpbWUgdGhlcmUgaXMgYSBjaGFuZ2UgdG8gdGhlIGV2ZW50cyBzZWxlY3RlZCBpbiB0aGUgQ2FsZW5kYXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIudmlldy5DYWxlbmRhcn0gZXZlbnQuc291cmNlIFRoZSBDYWxlbmRhciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0geydzZWxlY3QnLCdkZXNlbGVjdCcsJ3VwZGF0ZScsJ2NsZWFyJ30gZXZlbnQuYWN0aW9uIE9uZSBvZiB0aGUgYWN0aW9ucyAnc2VsZWN0JywgJ2Rlc2VsZWN0JywgJ3VwZGF0ZScsICdjbGVhcidcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LnNlbGVjdGVkIEFuIGFycmF5IG9mIHRoZSBFdmVudHMgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LmRlc2VsZWN0ZWQgQW4gYXJyYXkgb2YgdGhlIEV2ZW50IHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuc2VsZWN0aW9uIFRoZSBuZXcgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIsIGFjdGlvbjogJ3NlbGVjdCd8J2Rlc2VsZWN0J3wndXBkYXRlJ3wnY2xlYXInLCBzZWxlY3RlZDogRXZlbnRNb2RlbFtdLCBkZXNlbGVjdGVkOiBFdmVudE1vZGVsW10sIHNlbGVjdGlvbjogRXZlbnRNb2RlbFtdIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgc2lkZWJhciBpcyBjb2xsYXBzZWQgZWl0aGVyIHRocm91Z2ggdGhlIFVJIG9yIHByb2dyYW1hdGljYWxseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhpcyBDYWxlbmRhciBpbnN0YW5jZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNpZGViYXJDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHNpZGViYXIgaXMgZXhwYW5kZWQgZWl0aGVyIHRocm91Z2ggdGhlIFVJIG9yIHByb2dyYW1hdGljYWxseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhpcyBDYWxlbmRhciBpbnN0YW5jZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNpZGViYXJFeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgdGltZSBheGlzIG9mIGEgRGF5VmlldyBvciBXZWVrVmlldyBpcyBjbGlja2VkIG9uLiBJZiB0aGUgaGFuZGxlciByZXR1cm5zXG4gICAgICogYGZhbHNlYCB0aGUgY3VycmVudCBwb2ludGVyIGV2ZW50IGlzIG5vdCBwcm9jZXNzZWQgZnVydGhlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSB0cmlnZ2VyaW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnByZWNpc2VUaW1lIFRoZSBleGFjdCBkYXRlIGFuZCB0aW1lIGF0IHRoZSBjbGlja2VkIHBvc2l0aW9uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC50aW1lIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHRoZSBjbGlja2VkIHBvc2l0aW9uIHNuYXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBbaW5jcmVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9EYXlWaWV3I2NvbmZpZy1pbmNyZW1lbnQpIGFuZCBbdGltZVNuYXBUeXBlXSgjQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcjY29uZmlnLXRpbWVTbmFwVHlwZSlcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UaW1lQXhpc0NsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgcHJlY2lzZVRpbWU6IERhdGUsIHRpbWU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIG9yIEdhbnR0IHdpZGdldCB3aGVuIGEgY2xpY2sgaGFwcGVucyBvbiBhIHRpbWUgcmFuZ2UgaGVhZGVyIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBTY2hlZHVsZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5UaW1lU3Bhbn0gZXZlbnQudGltZVJhbmdlUmVjb3JkIFRoZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UaW1lUmFuZ2VIZWFkZXJDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCB0aW1lUmFuZ2VSZWNvcmQ6IFRpbWVTcGFuLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgb3IgR2FudHQgd2lkZ2V0IHdoZW4gYSByaWdodCBjbGljayBoYXBwZW5zIG9uIGEgdGltZSByYW5nZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlRpbWVTcGFufSBldmVudC50aW1lUmFuZ2VSZWNvcmQgVGhlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRpbWVSYW5nZUhlYWRlckNvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIHRpbWVSYW5nZVJlY29yZDogVGltZVNwYW4sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBvciBHYW50dCB3aWRnZXQgd2hlbiBhIGRvdWJsZSBjbGljayBoYXBwZW5zIG9uIGEgdGltZSByYW5nZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlRpbWVTcGFufSBldmVudC50aW1lUmFuZ2VSZWNvcmQgVGhlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRpbWVSYW5nZUhlYWRlckRibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIHRpbWVSYW5nZVJlY29yZDogVGltZVNwYW4sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBBIGhlYWRlciBbdG9vbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctdG9vbHMpIGhhcyBiZWVuIGNsaWNrZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuVG9vbH0gZXZlbnQuc291cmNlIFRoaXMgUGFuZWwuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Ub29sfSBldmVudC50b29sIFRoZSB0b29sIHdoaWNoIGlzIGJlaW5nIGNsaWNrZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVG9vbENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUb29sLCB0b29sOiBUb29sIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIG9uZSBvZiB0aGUgY2hpbGQgdmlld3MgaXMgcGFpbnRlZC4gVGhhdCBpcyB3aGVuIGl0IGJlY29tZXMgdmlzaWJsZS5cbiAgICAgKiBOb3RlIHRoYXQgZHVlIHRvIHRoZSBzbGlkZS1pbiBhbmltYXRpb24sIHdoaWxlIHRoZSB2aWV3IGlzIHZpc2libGUsIGl0IHdpbGwgbm90XG4gICAgICogeWV0IGJlIGluIGl0cyBmaW5hbCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHBhaW50ZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZpcnN0UGFpbnQgYHRydWVgIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhaW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVmlld1BhaW50OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGZpcnN0UGFpbnQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSB3ZWVrIG51bWJlciBpcyBjbGlja2VkIG9yIGFjdGl2YXRlZCBieSB0aGUgPGtiZD5FTlRFUjwva2JkPiBrZXkuIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSB3ZWVrIG51bWJlciBjZWxscyBvZiBhXG4gICAgICogW1llYXJWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9ZZWFyVmlldyksIHRoZSB3ZWVrIG51bWJlciBpbiB0aGUgZmlyc3QgY2VsbFxuICAgICAqIGluIGVhY2ggcm93IG9mIGEgW01vbnRoVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3KVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtd2Vla051bWJlckNsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGV2ZW50LndlZWsgVGhlIGBbeWVhciwgd2Vla11gIGNsaWNrZWQgb24uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uV2Vla051bWJlckNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgd2VlazogbnVtYmVyW10sIGRhdGU6IERhdGUgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bmRlcmx5aW5nIHdpZGdldFxuICAgICAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgbWUgPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ1xuICAgICAgICAgICAgfSA9IG1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2xhc3MsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdzLFxuICAgICAgICAgICAgICAgIGJyeW50dW1FdmVudHNcbiAgICAgICAgICAgIH0gPSBCcnludHVtQ2FsZW5kYXJDb21wb25lbnQ7XG5cbiAgICAgICAgYnJ5bnR1bUNvbmZpZ3MuZmlsdGVyKHByb3AgPT4gcHJvcCBpbiB0aGlzKS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShicnludHVtQ29uZmlnLCBwcm9wLCB0aGlzW3Byb3BdKTtcbiAgICAgICAgICAgIGlmIChbJ2ZlYXR1cmVzJywgJ2NvbmZpZyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29uZmlnUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBicnludHVtRXZlbnRzLmZpbHRlcihldmVudCA9PiB0aGlzW2V2ZW50XSAmJiB0aGlzW2V2ZW50XS5vYnNlcnZlcnMubGVuZ3RoID4gMCkuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIHVuY2FwaXRhbGl6ZSA9IChzdHI6IHN0cmluZykgPT4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLFxuICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IChzdHI6IHN0cmluZykgPT4gdW5jYXBpdGFsaXplKHN0ci5zbGljZSgyKSk7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGJyeW50dW1Db25maWcubGlzdGVuZXJzW2V2ZW50TmFtZShldmVudCldID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG1lW2V2ZW50XS5lbWl0KGUpO1xuICAgICAgICAgICAgICAgIC8vIEV2ZW50RW1pdHRlciBkb2VzIG5vdCByZXR1cm4gdmFsdWVzIGluIHRoZSBub3JtYWwgd2F5LCB3b3JrIGFyb3VuZCBpdCBieSBzZXR0aW5nIGByZXR1cm5WYWx1ZWAgZmxhZ1xuICAgICAgICAgICAgICAgIC8vIGluIEFuZ3VsYXIgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUucmV0dXJuVmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiBjb21wb25lbnQgaGFzIG5vIGNvbnRhaW5lciBzcGVjaWZpZWQgaW4gY29uZmlnIHRoZW4gdXNlIGFkb3B0IHRvIFdyYXBwZXIncyBlbGVtZW50XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBjb250YWluZXJQYXJhbSA9IFtcbiAgICAgICAgICAgICAgICAnYWRvcHQnLFxuICAgICAgICAgICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICAgICAgICAgJ2luc2VydEFmdGVyJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QmVmb3JlJ1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIF0uZmluZChwcm9wID0+IGJyeW50dW1Db25maWdbcHJvcF0pO1xuICAgICAgICBpZiAoIWNvbnRhaW5lclBhcmFtKSB7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VOYW1lID09PSAnQnV0dG9uJyB8fCBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b24gc2hvdWxkIGFsd2F5cyBiZSA8YT4gb3IgPGJ1dHRvbj4gaW5zaWRlIG93bmVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFwcGVuZFRvID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5hZG9wdCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ0NvbnRhaW5lcihpbnN0YW5jZU5hbWUsIGNvbnRhaW5lclBhcmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWUuaW5zdGFuY2UgPSBpbnN0YW5jZU5hbWUgPT09ICdXaWRnZXQnID8gV2lkZ2V0LmNyZWF0ZShicnludHVtQ29uZmlnKSA6IG5ldyBpbnN0YW5jZUNsYXNzKGJyeW50dW1Db25maWcpO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBncmlkSW5zdGFuY2UsIHNjaGVkdWxlckluc3RhbmNlIGV0Yy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZVtTdHJpbmdIZWxwZXIudW5jYXBpdGFsaXplKGluc3RhbmNlTmFtZSkgKyAnSW5zdGFuY2UnXSA9IG1lLmluc3RhbmNlO1xuICAgICAgICAvLyBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtQ2FsZW5kYXJDb21wb25lbnQ7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGNoYW5nZXNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykuZm9yRWFjaCgoW3Byb3AsIGNoYW5nZV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSAoY2hhbmdlIGFzIFNpbXBsZUNoYW5nZSkuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICAgICAgeyBicnludHVtQ29uZmlnc09ubHksIGJyeW50dW1Qcm9wcyB9ID0gQnJ5bnR1bUNhbGVuZGFyQ29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKGJyeW50dW1Qcm9wcy5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuYXBwbHlQcm9wVmFsdWUoaW5zdGFuY2UsIHByb3AsIG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJyeW50dW1Db25maWdzT25seS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdVcGRhdGVQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLmluc3RhbmNlLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|