@bryntum/gantt-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-gantt-angular-thin.d.ts +5 -0
- package/bundles/bryntum-gantt-angular-thin.umd.js +14832 -0
- package/bundles/bryntum-gantt-angular-thin.umd.js.map +1 -0
- package/esm2015/bryntum-gantt-angular-thin.js +5 -0
- package/esm2015/lib/bryntum-assignment-field.component.js +941 -0
- package/esm2015/lib/bryntum-assignment-grid.component.js +2111 -0
- package/esm2015/lib/bryntum-calendar-picker.component.js +933 -0
- package/esm2015/lib/bryntum-dependency-field.component.js +961 -0
- package/esm2015/lib/bryntum-gantt-base.component.js +4219 -0
- package/esm2015/lib/bryntum-gantt-project-model.component.js +923 -0
- package/esm2015/lib/bryntum-gantt.component.js +4223 -0
- package/esm2015/lib/gantt.module.js +54 -0
- package/esm2015/lib/wrapper.helper.js +74 -0
- package/esm2015/public-api.js +12 -0
- package/fesm2015/bryntum-gantt-angular-thin.js +14387 -0
- package/fesm2015/bryntum-gantt-angular-thin.js.map +1 -0
- package/lib/bryntum-assignment-field.component.d.ts +1225 -0
- package/lib/bryntum-assignment-grid.component.d.ts +2292 -0
- package/lib/bryntum-calendar-picker.component.d.ts +1200 -0
- package/lib/bryntum-dependency-field.component.d.ts +1241 -0
- package/lib/bryntum-gantt-base.component.d.ts +4468 -0
- package/lib/bryntum-gantt-project-model.component.d.ts +1106 -0
- package/lib/bryntum-gantt.component.d.ts +4470 -0
- package/lib/gantt.module.d.ts +13 -0
- package/lib/wrapper.helper.d.ts +26 -0
- package/package.json +33 -0
- package/public-api.d.ts +8 -0
|
@@ -0,0 +1,923 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/**
|
|
3
|
+
* Angular wrapper for Bryntum ProjectModel
|
|
4
|
+
*/
|
|
5
|
+
import { Component, EventEmitter, Output, Input } from '@angular/core';
|
|
6
|
+
import WrapperHelper from './wrapper.helper';
|
|
7
|
+
import { ProjectModel } from '@bryntum/gantt-thin';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class BryntumGanttProjectModelComponent {
|
|
10
|
+
constructor(element) {
|
|
11
|
+
this.bryntumConfig = {
|
|
12
|
+
adopt: undefined,
|
|
13
|
+
appendTo: undefined,
|
|
14
|
+
href: undefined,
|
|
15
|
+
angularComponent: this,
|
|
16
|
+
features: {},
|
|
17
|
+
listeners: {}
|
|
18
|
+
};
|
|
19
|
+
// Events emitters
|
|
20
|
+
/**
|
|
21
|
+
* Fires before an object is destroyed.
|
|
22
|
+
* @param {object} event Event object
|
|
23
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
24
|
+
*/
|
|
25
|
+
this.onBeforeDestroy = new EventEmitter();
|
|
26
|
+
/**
|
|
27
|
+
* Fires before [load request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-load) is sent. Return `false` to cancel load request.
|
|
28
|
+
* @param {object} event Event object
|
|
29
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
30
|
+
* @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
|
|
31
|
+
*/
|
|
32
|
+
this.onBeforeLoad = new EventEmitter();
|
|
33
|
+
/**
|
|
34
|
+
* Fires before loaded data get applied to the stores. Return `false` to prevent data applying.
|
|
35
|
+
* This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
|
|
36
|
+
* @param {object} event Event object
|
|
37
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
38
|
+
* @param {object} event.response The decoded server response object.
|
|
39
|
+
* @param {object} event.options Options provided to the [load](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-load) method.
|
|
40
|
+
*/
|
|
41
|
+
this.onBeforeLoadApply = new EventEmitter();
|
|
42
|
+
/**
|
|
43
|
+
* Fires before server response gets applied to the stores. Return `false` to prevent data applying.
|
|
44
|
+
* This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
|
|
45
|
+
* @param {object} event Event object
|
|
46
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
47
|
+
* @param {'sync','load'} event.requestType The request type (`sync` or `load`).
|
|
48
|
+
* @param {object} event.response The decoded server response object.
|
|
49
|
+
*/
|
|
50
|
+
this.onBeforeResponseApply = new EventEmitter();
|
|
51
|
+
/**
|
|
52
|
+
* Fires before a request is sent to the server.
|
|
53
|
+
* ...
|
|
54
|
+
* [View online docs...](https://bryntum.com/products/gantt/docs/api/Gantt/model/ProjectModel#event-beforeSend)
|
|
55
|
+
* @param {object} event Event object
|
|
56
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.crudManager The CRUD manager.
|
|
57
|
+
* @param {object} event.params HTTP request params to be passed in the request URL.
|
|
58
|
+
* @param {'sync','load'} event.requestType CrudManager request type (`load`/`sync`)
|
|
59
|
+
* @param {object} event.requestConfig Configuration object for Ajax request call
|
|
60
|
+
*/
|
|
61
|
+
this.onBeforeSend = new EventEmitter();
|
|
62
|
+
/**
|
|
63
|
+
* Fires before [sync request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-sync) is sent. Return `false` to cancel sync request.
|
|
64
|
+
* ...
|
|
65
|
+
* [View online docs...](https://bryntum.com/products/gantt/docs/api/Gantt/model/ProjectModel#event-beforeSync)
|
|
66
|
+
* @param {object} event Event object
|
|
67
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
68
|
+
* @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
|
|
69
|
+
*/
|
|
70
|
+
this.onBeforeSync = new EventEmitter();
|
|
71
|
+
/**
|
|
72
|
+
* Fires before sync response data get applied to the stores. Return `false` to prevent data applying.
|
|
73
|
+
* This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
|
|
74
|
+
* @param {object} event Event object
|
|
75
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
76
|
+
* @param {object} event.response The decoded server response object.
|
|
77
|
+
*/
|
|
78
|
+
this.onBeforeSyncApply = new EventEmitter();
|
|
79
|
+
/**
|
|
80
|
+
* Fires when any other event is fired from the object.
|
|
81
|
+
* ...
|
|
82
|
+
* [View online docs...](https://bryntum.com/products/gantt/docs/api/Gantt/model/ProjectModel#event-catchAll)
|
|
83
|
+
* @param {object} event Event object
|
|
84
|
+
* @param {{[key: string]: any, type: string}} event.event The Object that contains event details
|
|
85
|
+
* @param {string} event.event.type The type of the event which is caught by the listener
|
|
86
|
+
*/
|
|
87
|
+
this.onCatchAll = new EventEmitter();
|
|
88
|
+
/**
|
|
89
|
+
* Fired when data in any of the projects stores changes.
|
|
90
|
+
* ...
|
|
91
|
+
* [View online docs...](https://bryntum.com/products/gantt/docs/api/Gantt/model/ProjectModel#event-change)
|
|
92
|
+
* @param {object} event Event object
|
|
93
|
+
* @param {Gantt.model.ProjectModel} event.source This project
|
|
94
|
+
* @param {Core.data.Store} event.store Affected store
|
|
95
|
+
* @param {'remove','removeAll','add','clearchanges','filter','update','dataset','replace'} event.action Name of action which triggered the change. May be one of the options listed above.
|
|
96
|
+
* @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
|
|
97
|
+
* @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
|
|
98
|
+
* @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
|
|
99
|
+
*/
|
|
100
|
+
this.onChange = new EventEmitter();
|
|
101
|
+
/**
|
|
102
|
+
* Fired when the Engine detects a computation cycle.
|
|
103
|
+
* @param {object} event Event object
|
|
104
|
+
* @param {object} event.schedulingIssue Scheduling error describing the case:
|
|
105
|
+
* @param {Function} event.schedulingIssue.getDescription Returns the cycle description
|
|
106
|
+
* @param {object} event.schedulingIssue.cycle Object providing the cycle info
|
|
107
|
+
* @param {Function} event.schedulingIssue.getResolutions Returns possible resolutions
|
|
108
|
+
* @param {Function} event.continueWithResolutionResult Function to call after a resolution is chosen to proceed with the Engine calculations: ```javascript project.on('cycle', ({ continueWithResolutionResult }) => { // cancel changes in case of a cycle continueWithResolutionResult(EffectResolutionResult.Cancel); }) ``` Where `EffectResolutionResult.Cancel` results in cancelling the changes.
|
|
109
|
+
*/
|
|
110
|
+
this.onCycle = new EventEmitter();
|
|
111
|
+
/**
|
|
112
|
+
* Fired when the engine has finished its calculations and the results has been written back to the records.
|
|
113
|
+
* ...
|
|
114
|
+
* [View online docs...](https://bryntum.com/products/gantt/docs/api/Gantt/model/ProjectModel#event-dataReady)
|
|
115
|
+
* @param {object} event Event object
|
|
116
|
+
* @param {Gantt.model.ProjectModel} event.source The project
|
|
117
|
+
* @param {boolean} event.isInitialCommit Flag that shows if this commit is initial
|
|
118
|
+
* @param {Set<any>} event.records Set of all [Model](https://bryntum.com/products/gantt/docs/api/Core/data/Model)s that were modified in the completed transaction. Use the [modifications](https://bryntum.com/products/gantt/docs/api/Core/data/Model#property-modifications) property of each Model to identify modified fields.
|
|
119
|
+
*/
|
|
120
|
+
this.onDataReady = new EventEmitter();
|
|
121
|
+
/**
|
|
122
|
+
* Fires when an object is destroyed.
|
|
123
|
+
* @param {object} event Event object
|
|
124
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
125
|
+
*/
|
|
126
|
+
this.onDestroy = new EventEmitter();
|
|
127
|
+
/**
|
|
128
|
+
* Fired when the Engine detects a calendar misconfiguration when the calendar does
|
|
129
|
+
* not provide any working periods of time which makes usage impossible.
|
|
130
|
+
* @param {object} event Event object
|
|
131
|
+
* @param {object} event.schedulingIssue Scheduling error describing the case:
|
|
132
|
+
* @param {Function} event.schedulingIssue.getDescription Returns the error description
|
|
133
|
+
* @param {Function} event.schedulingIssue.getCalendar Returns the calendar that must be fixed
|
|
134
|
+
* @param {Function} event.schedulingIssue.getResolutions Returns possible resolutions
|
|
135
|
+
* @param {Function} event.continueWithResolutionResult Function to call after a resolution is chosen to proceed with the Engine calculations: ```javascript project.on('emptyCalendar', ({ schedulingIssue, continueWithResolutionResult }) => { // apply the first resolution and continue schedulingIssue.getResolutions()[0].resolve(); continueWithResolutionResult(EffectResolutionResult.Resume); }) ```
|
|
136
|
+
*/
|
|
137
|
+
this.onEmptyCalendar = new EventEmitter();
|
|
138
|
+
/**
|
|
139
|
+
* Fires when data in any of the registered data stores is changed.
|
|
140
|
+
* ...
|
|
141
|
+
* [View online docs...](https://bryntum.com/products/gantt/docs/api/Gantt/model/ProjectModel#event-hasChanges)
|
|
142
|
+
* @param {object} event Event object
|
|
143
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
144
|
+
*/
|
|
145
|
+
this.onHasChanges = new EventEmitter();
|
|
146
|
+
/**
|
|
147
|
+
* Fires on successful [load request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-load) completion after data gets loaded to the stores.
|
|
148
|
+
* @param {object} event Event object
|
|
149
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
150
|
+
* @param {object} event.response The decoded server response object.
|
|
151
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
152
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
153
|
+
* @param {Response} event.rawResponse The native Response object
|
|
154
|
+
*/
|
|
155
|
+
this.onLoad = new EventEmitter();
|
|
156
|
+
/**
|
|
157
|
+
* Fired after [load request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-load) was canceled by some [beforeLoad](#Scheduler/crud/AbstractCrudManagerMixin#event-beforeLoad)
|
|
158
|
+
* listener or due to incomplete prior load request.
|
|
159
|
+
* @param {object} event Event object
|
|
160
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
161
|
+
* @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
|
|
162
|
+
*/
|
|
163
|
+
this.onLoadCanceled = new EventEmitter();
|
|
164
|
+
/**
|
|
165
|
+
* Fires when a [load request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-load) fails.
|
|
166
|
+
* @param {object} event Event object
|
|
167
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
|
|
168
|
+
* @param {object} event.response The decoded server response object.
|
|
169
|
+
* @param {string} event.responseText The raw server response text
|
|
170
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
171
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
172
|
+
* @param {Response} event.rawResponse The native Response object
|
|
173
|
+
*/
|
|
174
|
+
this.onLoadFail = new EventEmitter();
|
|
175
|
+
/**
|
|
176
|
+
* Fires when registered stores get into state when they don't have any
|
|
177
|
+
* not persisted change. This happens after [load](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-load) or [sync](#Scheduler/crud/AbstractCrudManagerMixin#function-sync) request
|
|
178
|
+
* completion. Or this may happen after a record update which turns its fields back to their original state.
|
|
179
|
+
* ...
|
|
180
|
+
* [View online docs...](https://bryntum.com/products/gantt/docs/api/Gantt/model/ProjectModel#event-noChanges)
|
|
181
|
+
* @param {object} event Event object
|
|
182
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
183
|
+
*/
|
|
184
|
+
this.onNoChanges = new EventEmitter();
|
|
185
|
+
/**
|
|
186
|
+
* Fired during the Engine calculation if [enableProgressNotifications](https://bryntum.com/products/gantt/docs/api/Gantt/model/ProjectModel#config-enableProgressNotifications) config is `true`
|
|
187
|
+
* @param {object} event Event object
|
|
188
|
+
* @param {Gantt.model.ProjectModel} event.source The owning project
|
|
189
|
+
* @param {number} event.total The total number of operations
|
|
190
|
+
* @param {number} event.remaining The number of remaining operations
|
|
191
|
+
* @param {'storePopulation','propagating'} event.phase The phase of the calculation, either 'storePopulation' when data is getting loaded, or 'propagating' when data is getting calculated
|
|
192
|
+
*/
|
|
193
|
+
this.onProgress = new EventEmitter();
|
|
194
|
+
/**
|
|
195
|
+
* Fires on successful request completion after data gets applied to the stores.
|
|
196
|
+
* @param {object} event Event object
|
|
197
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
198
|
+
* @param {'sync','load'} event.requestType The request type (`sync` or `load`).
|
|
199
|
+
* @param {object} event.response The decoded server response object.
|
|
200
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
201
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
202
|
+
* @param {Response} event.rawResponse The native Response object
|
|
203
|
+
*/
|
|
204
|
+
this.onRequestDone = new EventEmitter();
|
|
205
|
+
/**
|
|
206
|
+
* Fires when a request fails.
|
|
207
|
+
* @param {object} event Event object
|
|
208
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
|
|
209
|
+
* @param {'sync','load'} event.requestType The request type (`sync` or `load`).
|
|
210
|
+
* @param {object} event.response The decoded server response object.
|
|
211
|
+
* @param {string} event.responseText The raw server response text
|
|
212
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
213
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
214
|
+
* @param {Response} event.rawResponse The native Response object
|
|
215
|
+
*/
|
|
216
|
+
this.onRequestFail = new EventEmitter();
|
|
217
|
+
/**
|
|
218
|
+
* This event triggers when a new revision is added to the project. It is used to notify the backend about the
|
|
219
|
+
* new revision.
|
|
220
|
+
* @param {object} event Event object
|
|
221
|
+
* @param {string} event.localRevisionId ID of the local revision. Backend should send it in the broadcast channel
|
|
222
|
+
* @param {string} event.conflictResolutionFor ID of the revision with a conflict which was resolved by this revision
|
|
223
|
+
* @param {string} event.clientId ID of the client instance. Used to distinguish own revisions from the broadcast channel
|
|
224
|
+
* @param {object} event.changes Object with changes constituting revision
|
|
225
|
+
*/
|
|
226
|
+
this.onRevisionNotification = new EventEmitter();
|
|
227
|
+
/**
|
|
228
|
+
* Fired when the Engine detects a scheduling conflict.
|
|
229
|
+
* @param {object} event Event object
|
|
230
|
+
* @param {object} event.schedulingIssue The conflict details:
|
|
231
|
+
* @param {Function} event.schedulingIssue.getDescription Returns the conflict description
|
|
232
|
+
* @param {object[]} event.schedulingIssue.intervals Array of conflicting intervals
|
|
233
|
+
* @param {Function} event.schedulingIssue.getResolutions Function to get possible resolutions
|
|
234
|
+
* @param {Function} event.continueWithResolutionResult Function to call after a resolution is chosen to proceed with the Engine calculations: ```javascript project.on('schedulingConflict', ({ schedulingIssue, continueWithResolutionResult }) => { // apply the first resolution and continue schedulingIssue.getResolutions()[0].resolve(); continueWithResolutionResult(EffectResolutionResult.Resume); }) ``` Where `EffectResolutionResult.Resume` results in a resolution being applied and current transaction should be continued.
|
|
235
|
+
*/
|
|
236
|
+
this.onSchedulingConflict = new EventEmitter();
|
|
237
|
+
/**
|
|
238
|
+
* Fires on successful [sync request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-sync) completion.
|
|
239
|
+
* @param {object} event Event object
|
|
240
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
241
|
+
* @param {object} event.response The decoded server response object.
|
|
242
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
243
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
244
|
+
* @param {Response} event.rawResponse The native Response object
|
|
245
|
+
*/
|
|
246
|
+
this.onSync = new EventEmitter();
|
|
247
|
+
/**
|
|
248
|
+
* Fires after [sync request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-sync) was canceled by some [beforeSync](#Scheduler/crud/AbstractCrudManagerMixin#event-beforeSync) listener.
|
|
249
|
+
* @param {object} event Event object
|
|
250
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
251
|
+
* @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
|
|
252
|
+
*/
|
|
253
|
+
this.onSyncCanceled = new EventEmitter();
|
|
254
|
+
/**
|
|
255
|
+
* Fires after [sync request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-sync) was delayed due to incomplete previous one.
|
|
256
|
+
* @param {object} event Event object
|
|
257
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
258
|
+
* @param {object} event.arguments The arguments of [sync](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-sync) call.
|
|
259
|
+
*/
|
|
260
|
+
this.onSyncDelayed = new EventEmitter();
|
|
261
|
+
/**
|
|
262
|
+
* Fires when a [sync request](https://bryntum.com/products/gantt/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-sync) fails.
|
|
263
|
+
* @param {object} event Event object
|
|
264
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
|
|
265
|
+
* @param {object} event.response The decoded server response object.
|
|
266
|
+
* @param {string} event.responseText The raw server response text
|
|
267
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
268
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
269
|
+
* @param {Response} event.rawResponse The native Response object
|
|
270
|
+
*/
|
|
271
|
+
this.onSyncFail = new EventEmitter();
|
|
272
|
+
this.elementRef = element;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Create and append the underlying widget
|
|
276
|
+
*/
|
|
277
|
+
ngOnInit() {
|
|
278
|
+
const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumGanttProjectModelComponent;
|
|
279
|
+
bryntumConfigs.filter(prop => prop in this).forEach(prop => {
|
|
280
|
+
// @ts-ignore
|
|
281
|
+
WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
|
|
282
|
+
if (['features', 'config'].includes(prop)) {
|
|
283
|
+
WrapperHelper.devWarningConfigProp(instanceName, prop);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
// @ts-ignore
|
|
287
|
+
bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
|
|
288
|
+
const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
|
|
289
|
+
// @ts-ignore
|
|
290
|
+
bryntumConfig.listeners[eventName(event)] = e => {
|
|
291
|
+
// @ts-ignore
|
|
292
|
+
me[event].emit(e);
|
|
293
|
+
// EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
|
|
294
|
+
// in Angular listeners
|
|
295
|
+
return e.returnValue;
|
|
296
|
+
};
|
|
297
|
+
});
|
|
298
|
+
// If component has no container specified in config then use adopt to Wrapper's element
|
|
299
|
+
const containerParam = [
|
|
300
|
+
'adopt',
|
|
301
|
+
'appendTo',
|
|
302
|
+
'insertAfter',
|
|
303
|
+
'insertBefore'
|
|
304
|
+
// @ts-ignore
|
|
305
|
+
].find(prop => bryntumConfig[prop]);
|
|
306
|
+
if (!containerParam) {
|
|
307
|
+
if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
|
|
308
|
+
// Button should always be <a> or <button> inside owner element
|
|
309
|
+
bryntumConfig.appendTo = elementRef.nativeElement;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
bryntumConfig.adopt = elementRef.nativeElement;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
WrapperHelper.devWarningContainer(instanceName, containerParam);
|
|
317
|
+
}
|
|
318
|
+
// @ts-ignore
|
|
319
|
+
me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Watch for changes
|
|
323
|
+
* @param changes
|
|
324
|
+
*/
|
|
325
|
+
ngOnChanges(changes) {
|
|
326
|
+
const { instance } = this, { instanceName } = BryntumGanttProjectModelComponent;
|
|
327
|
+
if (!instance) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
// Iterate over all changes
|
|
331
|
+
Object.entries(changes).forEach(([prop, change]) => {
|
|
332
|
+
const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumGanttProjectModelComponent;
|
|
333
|
+
if (bryntumProps.includes(prop)) {
|
|
334
|
+
WrapperHelper.applyPropValue(instance, prop, newValue, false);
|
|
335
|
+
if (bryntumConfigsOnly.includes(prop)) {
|
|
336
|
+
WrapperHelper.devWarningUpdateProp(instanceName, prop);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Destroy the component
|
|
343
|
+
*/
|
|
344
|
+
ngOnDestroy() {
|
|
345
|
+
// @ts-ignore
|
|
346
|
+
if (this.instance && this.instance.destroy) {
|
|
347
|
+
this.instance.destroy();
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
BryntumGanttProjectModelComponent.instanceClass = ProjectModel;
|
|
352
|
+
BryntumGanttProjectModelComponent.instanceName = 'ProjectModel';
|
|
353
|
+
BryntumGanttProjectModelComponent.bryntumEvents = [
|
|
354
|
+
'onBeforeDestroy',
|
|
355
|
+
'onBeforeLoad',
|
|
356
|
+
'onBeforeLoadApply',
|
|
357
|
+
'onBeforeResponseApply',
|
|
358
|
+
'onBeforeSend',
|
|
359
|
+
'onBeforeSync',
|
|
360
|
+
'onBeforeSyncApply',
|
|
361
|
+
'onCatchAll',
|
|
362
|
+
'onChange',
|
|
363
|
+
'onCycle',
|
|
364
|
+
'onDataReady',
|
|
365
|
+
'onDestroy',
|
|
366
|
+
'onEmptyCalendar',
|
|
367
|
+
'onHasChanges',
|
|
368
|
+
'onLoad',
|
|
369
|
+
'onLoadCanceled',
|
|
370
|
+
'onLoadFail',
|
|
371
|
+
'onNoChanges',
|
|
372
|
+
'onProgress',
|
|
373
|
+
'onRequestDone',
|
|
374
|
+
'onRequestFail',
|
|
375
|
+
'onRevisionNotification',
|
|
376
|
+
'onSchedulingConflict',
|
|
377
|
+
'onSync',
|
|
378
|
+
'onSyncCanceled',
|
|
379
|
+
'onSyncDelayed',
|
|
380
|
+
'onSyncFail'
|
|
381
|
+
];
|
|
382
|
+
BryntumGanttProjectModelComponent.bryntumFeatureNames = [];
|
|
383
|
+
BryntumGanttProjectModelComponent.bryntumConfigs = BryntumGanttProjectModelComponent.bryntumFeatureNames.concat([
|
|
384
|
+
'addConstraintOnDateSet',
|
|
385
|
+
'adjustDurationToDST',
|
|
386
|
+
'allowPostponedConflicts',
|
|
387
|
+
'assignmentModelClass',
|
|
388
|
+
'assignments',
|
|
389
|
+
'assignmentsData',
|
|
390
|
+
'assignmentStore',
|
|
391
|
+
'assignmentStoreClass',
|
|
392
|
+
'autoCalculatePercentDoneForParentTasks',
|
|
393
|
+
'autoLoad',
|
|
394
|
+
'autoMergeAdjacentSegments',
|
|
395
|
+
'autoPostponeConflicts',
|
|
396
|
+
'autoPostponedConflicts',
|
|
397
|
+
'autoScheduleManualTasksOnSecondPass',
|
|
398
|
+
'autoSetConstraints',
|
|
399
|
+
'autoSync',
|
|
400
|
+
'autoSyncTimeout',
|
|
401
|
+
'bubbleEvents',
|
|
402
|
+
'bwcConflictPostpone',
|
|
403
|
+
'calendar',
|
|
404
|
+
'calendarManagerStore',
|
|
405
|
+
'calendarManagerStoreClass',
|
|
406
|
+
'calendarModelClass',
|
|
407
|
+
'calendars',
|
|
408
|
+
'calendarsData',
|
|
409
|
+
'callOnFunctions',
|
|
410
|
+
'catchEventHandlerExceptions',
|
|
411
|
+
'children',
|
|
412
|
+
'crudStores',
|
|
413
|
+
'daysPerMonth',
|
|
414
|
+
'daysPerWeek',
|
|
415
|
+
'delayCalculation',
|
|
416
|
+
'dependencies',
|
|
417
|
+
'dependenciesCalendar',
|
|
418
|
+
'dependenciesData',
|
|
419
|
+
'dependencyModelClass',
|
|
420
|
+
'dependencyStore',
|
|
421
|
+
'dependencyStoreClass',
|
|
422
|
+
'description',
|
|
423
|
+
'direction',
|
|
424
|
+
'enableProgressNotifications',
|
|
425
|
+
'encoder',
|
|
426
|
+
'endDate',
|
|
427
|
+
'eventsData',
|
|
428
|
+
'eventStore',
|
|
429
|
+
'expanded',
|
|
430
|
+
'forceSync',
|
|
431
|
+
'hoursPerDay',
|
|
432
|
+
'id',
|
|
433
|
+
'ignoreConstraintsOnConflictDuringSecondPass',
|
|
434
|
+
'ignoreRemoteChangesInSTM',
|
|
435
|
+
'includeAsapAlapAsConstraints',
|
|
436
|
+
'includeChildrenInRemoveRequest',
|
|
437
|
+
'includeLegacyDataProperties',
|
|
438
|
+
'isFullyLoaded',
|
|
439
|
+
'json',
|
|
440
|
+
'lazyLoad',
|
|
441
|
+
'listeners',
|
|
442
|
+
'loadUrl',
|
|
443
|
+
'maxCalendarRange',
|
|
444
|
+
'maxCriticalPathsCount',
|
|
445
|
+
'name',
|
|
446
|
+
'orderedParentIndex',
|
|
447
|
+
'pageSize',
|
|
448
|
+
'parentId',
|
|
449
|
+
'parentIndex',
|
|
450
|
+
'phantomIdField',
|
|
451
|
+
'phantomParentIdField',
|
|
452
|
+
'readOnly',
|
|
453
|
+
'remoteChildCount',
|
|
454
|
+
'remotePaging',
|
|
455
|
+
'requestData',
|
|
456
|
+
'resetIdsBeforeSync',
|
|
457
|
+
'resetUndoRedoQueuesAfterLoad',
|
|
458
|
+
'resourceModelClass',
|
|
459
|
+
'resources',
|
|
460
|
+
'resourcesData',
|
|
461
|
+
'resourceStore',
|
|
462
|
+
'resourceStoreClass',
|
|
463
|
+
'shouldSyncDataOnLoad',
|
|
464
|
+
'silenceInitialCommit',
|
|
465
|
+
'skipNonWorkingTimeInDurationWhenSchedulingManually',
|
|
466
|
+
'skipNonWorkingTimeWhenSchedulingManually',
|
|
467
|
+
'skipSuccessProperty',
|
|
468
|
+
'startDate',
|
|
469
|
+
'startedTaskScheduling',
|
|
470
|
+
'statusDate',
|
|
471
|
+
'stm',
|
|
472
|
+
'storeIdProperty',
|
|
473
|
+
'supportShortSyncResponse',
|
|
474
|
+
'syncApplySequence',
|
|
475
|
+
'syncUrl',
|
|
476
|
+
'taskModelClass',
|
|
477
|
+
'tasks',
|
|
478
|
+
'tasksData',
|
|
479
|
+
'taskStore',
|
|
480
|
+
'taskStoreClass',
|
|
481
|
+
'timeRanges',
|
|
482
|
+
'timeRangesData',
|
|
483
|
+
'timeRangeStore',
|
|
484
|
+
'timeZone',
|
|
485
|
+
'toJSONResultFormat',
|
|
486
|
+
'trackProjectModelChanges',
|
|
487
|
+
'trackResponseType',
|
|
488
|
+
'transport',
|
|
489
|
+
'useRawData',
|
|
490
|
+
'validateResponse',
|
|
491
|
+
'writeAllFields'
|
|
492
|
+
]);
|
|
493
|
+
BryntumGanttProjectModelComponent.bryntumConfigsOnly = [
|
|
494
|
+
'adjustDurationToDST',
|
|
495
|
+
'assignmentModelClass',
|
|
496
|
+
'assignmentsData',
|
|
497
|
+
'assignmentStoreClass',
|
|
498
|
+
'autoLoad',
|
|
499
|
+
'autoSetConstraints',
|
|
500
|
+
'autoSync',
|
|
501
|
+
'autoSyncTimeout',
|
|
502
|
+
'bubbleEvents',
|
|
503
|
+
'bwcConflictPostpone',
|
|
504
|
+
'calendarManagerStoreClass',
|
|
505
|
+
'calendarModelClass',
|
|
506
|
+
'calendarsData',
|
|
507
|
+
'children',
|
|
508
|
+
'delayCalculation',
|
|
509
|
+
'dependenciesData',
|
|
510
|
+
'dependencyModelClass',
|
|
511
|
+
'dependencyStoreClass',
|
|
512
|
+
'encoder',
|
|
513
|
+
'eventsData',
|
|
514
|
+
'expanded',
|
|
515
|
+
'includeAsapAlapAsConstraints',
|
|
516
|
+
'includeChildrenInRemoveRequest',
|
|
517
|
+
'listeners',
|
|
518
|
+
'maxCalendarRange',
|
|
519
|
+
'orderedParentIndex',
|
|
520
|
+
'pageSize',
|
|
521
|
+
'parentIndex',
|
|
522
|
+
'phantomIdField',
|
|
523
|
+
'phantomParentIdField',
|
|
524
|
+
'remotePaging',
|
|
525
|
+
'requestData',
|
|
526
|
+
'resetIdsBeforeSync',
|
|
527
|
+
'resetUndoRedoQueuesAfterLoad',
|
|
528
|
+
'resourceModelClass',
|
|
529
|
+
'resourcesData',
|
|
530
|
+
'resourceStoreClass',
|
|
531
|
+
'silenceInitialCommit',
|
|
532
|
+
'skipSuccessProperty',
|
|
533
|
+
'storeIdProperty',
|
|
534
|
+
'supportShortSyncResponse',
|
|
535
|
+
'taskModelClass',
|
|
536
|
+
'tasksData',
|
|
537
|
+
'taskStoreClass',
|
|
538
|
+
'timeRangesData',
|
|
539
|
+
'toJSONResultFormat',
|
|
540
|
+
'trackResponseType',
|
|
541
|
+
'transport',
|
|
542
|
+
'useRawData',
|
|
543
|
+
'validateResponse',
|
|
544
|
+
'writeAllFields'
|
|
545
|
+
];
|
|
546
|
+
BryntumGanttProjectModelComponent.bryntumProps = BryntumGanttProjectModelComponent.bryntumFeatureNames.concat([
|
|
547
|
+
'addConstraintOnDateSet',
|
|
548
|
+
'allChildren',
|
|
549
|
+
'allowPostponedConflicts',
|
|
550
|
+
'allUnfilteredChildren',
|
|
551
|
+
'assignments',
|
|
552
|
+
'assignmentStore',
|
|
553
|
+
'autoCalculatePercentDoneForParentTasks',
|
|
554
|
+
'autoMergeAdjacentSegments',
|
|
555
|
+
'autoPostponeConflicts',
|
|
556
|
+
'autoPostponedConflicts',
|
|
557
|
+
'autoScheduleManualTasksOnSecondPass',
|
|
558
|
+
'calendar',
|
|
559
|
+
'calendarManagerStore',
|
|
560
|
+
'calendars',
|
|
561
|
+
'callOnFunctions',
|
|
562
|
+
'catchEventHandlerExceptions',
|
|
563
|
+
'criticalPaths',
|
|
564
|
+
'crudStores',
|
|
565
|
+
'daysPerMonth',
|
|
566
|
+
'daysPerWeek',
|
|
567
|
+
'dependencies',
|
|
568
|
+
'dependenciesCalendar',
|
|
569
|
+
'dependencyStore',
|
|
570
|
+
'descendantCount',
|
|
571
|
+
'description',
|
|
572
|
+
'direction',
|
|
573
|
+
'enableProgressNotifications',
|
|
574
|
+
'endDate',
|
|
575
|
+
'eventStore',
|
|
576
|
+
'forceSync',
|
|
577
|
+
'hasGeneratedId',
|
|
578
|
+
'hoursPerDay',
|
|
579
|
+
'id',
|
|
580
|
+
'ignoreConstraintsOnConflictDuringSecondPass',
|
|
581
|
+
'ignoreRemoteChangesInSTM',
|
|
582
|
+
'includeLegacyDataProperties',
|
|
583
|
+
'inlineData',
|
|
584
|
+
'internalId',
|
|
585
|
+
'isCommitting',
|
|
586
|
+
'isCreating',
|
|
587
|
+
'isFullyLoaded',
|
|
588
|
+
'isValid',
|
|
589
|
+
'json',
|
|
590
|
+
'lazyLoad',
|
|
591
|
+
'loadUrl',
|
|
592
|
+
'maxCriticalPathsCount',
|
|
593
|
+
'name',
|
|
594
|
+
'parentId',
|
|
595
|
+
'previousSiblingsTotalCount',
|
|
596
|
+
'readOnly',
|
|
597
|
+
'remoteChildCount',
|
|
598
|
+
'resources',
|
|
599
|
+
'resourceStore',
|
|
600
|
+
'segmentModelClass',
|
|
601
|
+
'shouldSyncDataOnLoad',
|
|
602
|
+
'skipNonWorkingTimeInDurationWhenSchedulingManually',
|
|
603
|
+
'skipNonWorkingTimeWhenSchedulingManually',
|
|
604
|
+
'startDate',
|
|
605
|
+
'startedTaskScheduling',
|
|
606
|
+
'statusDate',
|
|
607
|
+
'stm',
|
|
608
|
+
'syncApplySequence',
|
|
609
|
+
'syncUrl',
|
|
610
|
+
'tasks',
|
|
611
|
+
'taskStore',
|
|
612
|
+
'timeRanges',
|
|
613
|
+
'timeRangeStore',
|
|
614
|
+
'timeZone',
|
|
615
|
+
'trackProjectModelChanges',
|
|
616
|
+
'visibleDescendantCount'
|
|
617
|
+
]);
|
|
618
|
+
BryntumGanttProjectModelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumGanttProjectModelComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
619
|
+
BryntumGanttProjectModelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumGanttProjectModelComponent, selector: "bryntum-gantt-project-model", inputs: { adjustDurationToDST: "adjustDurationToDST", assignmentModelClass: "assignmentModelClass", assignmentsData: "assignmentsData", assignmentStoreClass: "assignmentStoreClass", autoLoad: "autoLoad", autoSetConstraints: "autoSetConstraints", autoSync: "autoSync", autoSyncTimeout: "autoSyncTimeout", bubbleEvents: "bubbleEvents", bwcConflictPostpone: "bwcConflictPostpone", calendarManagerStoreClass: "calendarManagerStoreClass", calendarModelClass: "calendarModelClass", calendarsData: "calendarsData", children: "children", delayCalculation: "delayCalculation", dependenciesData: "dependenciesData", dependencyModelClass: "dependencyModelClass", dependencyStoreClass: "dependencyStoreClass", encoder: "encoder", eventsData: "eventsData", expanded: "expanded", includeAsapAlapAsConstraints: "includeAsapAlapAsConstraints", includeChildrenInRemoveRequest: "includeChildrenInRemoveRequest", listeners: "listeners", maxCalendarRange: "maxCalendarRange", orderedParentIndex: "orderedParentIndex", pageSize: "pageSize", parentIndex: "parentIndex", phantomIdField: "phantomIdField", phantomParentIdField: "phantomParentIdField", remotePaging: "remotePaging", requestData: "requestData", resetIdsBeforeSync: "resetIdsBeforeSync", resetUndoRedoQueuesAfterLoad: "resetUndoRedoQueuesAfterLoad", resourceModelClass: "resourceModelClass", resourcesData: "resourcesData", resourceStoreClass: "resourceStoreClass", silenceInitialCommit: "silenceInitialCommit", skipSuccessProperty: "skipSuccessProperty", storeIdProperty: "storeIdProperty", supportShortSyncResponse: "supportShortSyncResponse", taskModelClass: "taskModelClass", tasksData: "tasksData", taskStoreClass: "taskStoreClass", timeRangesData: "timeRangesData", toJSONResultFormat: "toJSONResultFormat", trackResponseType: "trackResponseType", transport: "transport", useRawData: "useRawData", validateResponse: "validateResponse", writeAllFields: "writeAllFields", addConstraintOnDateSet: "addConstraintOnDateSet", allowPostponedConflicts: "allowPostponedConflicts", assignments: "assignments", assignmentStore: "assignmentStore", autoCalculatePercentDoneForParentTasks: "autoCalculatePercentDoneForParentTasks", autoMergeAdjacentSegments: "autoMergeAdjacentSegments", autoPostponeConflicts: "autoPostponeConflicts", autoPostponedConflicts: "autoPostponedConflicts", autoScheduleManualTasksOnSecondPass: "autoScheduleManualTasksOnSecondPass", calendar: "calendar", calendarManagerStore: "calendarManagerStore", calendars: "calendars", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", crudStores: "crudStores", daysPerMonth: "daysPerMonth", daysPerWeek: "daysPerWeek", dependencies: "dependencies", dependenciesCalendar: "dependenciesCalendar", dependencyStore: "dependencyStore", description: "description", direction: "direction", enableProgressNotifications: "enableProgressNotifications", endDate: "endDate", eventStore: "eventStore", forceSync: "forceSync", hoursPerDay: "hoursPerDay", id: "id", ignoreConstraintsOnConflictDuringSecondPass: "ignoreConstraintsOnConflictDuringSecondPass", ignoreRemoteChangesInSTM: "ignoreRemoteChangesInSTM", includeLegacyDataProperties: "includeLegacyDataProperties", isFullyLoaded: "isFullyLoaded", json: "json", lazyLoad: "lazyLoad", loadUrl: "loadUrl", maxCriticalPathsCount: "maxCriticalPathsCount", name: "name", parentId: "parentId", readOnly: "readOnly", remoteChildCount: "remoteChildCount", resources: "resources", resourceStore: "resourceStore", shouldSyncDataOnLoad: "shouldSyncDataOnLoad", skipNonWorkingTimeInDurationWhenSchedulingManually: "skipNonWorkingTimeInDurationWhenSchedulingManually", skipNonWorkingTimeWhenSchedulingManually: "skipNonWorkingTimeWhenSchedulingManually", startDate: "startDate", startedTaskScheduling: "startedTaskScheduling", statusDate: "statusDate", stm: "stm", syncApplySequence: "syncApplySequence", syncUrl: "syncUrl", tasks: "tasks", taskStore: "taskStore", timeRanges: "timeRanges", timeRangeStore: "timeRangeStore", timeZone: "timeZone", trackProjectModelChanges: "trackProjectModelChanges", allChildren: "allChildren", allUnfilteredChildren: "allUnfilteredChildren", criticalPaths: "criticalPaths", descendantCount: "descendantCount", hasGeneratedId: "hasGeneratedId", inlineData: "inlineData", internalId: "internalId", isCommitting: "isCommitting", isCreating: "isCreating", isValid: "isValid", previousSiblingsTotalCount: "previousSiblingsTotalCount", segmentModelClass: "segmentModelClass", visibleDescendantCount: "visibleDescendantCount" }, outputs: { onBeforeDestroy: "onBeforeDestroy", onBeforeLoad: "onBeforeLoad", onBeforeLoadApply: "onBeforeLoadApply", onBeforeResponseApply: "onBeforeResponseApply", onBeforeSend: "onBeforeSend", onBeforeSync: "onBeforeSync", onBeforeSyncApply: "onBeforeSyncApply", onCatchAll: "onCatchAll", onChange: "onChange", onCycle: "onCycle", onDataReady: "onDataReady", onDestroy: "onDestroy", onEmptyCalendar: "onEmptyCalendar", onHasChanges: "onHasChanges", onLoad: "onLoad", onLoadCanceled: "onLoadCanceled", onLoadFail: "onLoadFail", onNoChanges: "onNoChanges", onProgress: "onProgress", onRequestDone: "onRequestDone", onRequestFail: "onRequestFail", onRevisionNotification: "onRevisionNotification", onSchedulingConflict: "onSchedulingConflict", onSync: "onSync", onSyncCanceled: "onSyncCanceled", onSyncDelayed: "onSyncDelayed", onSyncFail: "onSyncFail" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
|
|
620
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumGanttProjectModelComponent, decorators: [{
|
|
621
|
+
type: Component,
|
|
622
|
+
args: [{
|
|
623
|
+
selector: 'bryntum-gantt-project-model',
|
|
624
|
+
template: ''
|
|
625
|
+
}]
|
|
626
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { adjustDurationToDST: [{
|
|
627
|
+
type: Input
|
|
628
|
+
}], assignmentModelClass: [{
|
|
629
|
+
type: Input
|
|
630
|
+
}], assignmentsData: [{
|
|
631
|
+
type: Input
|
|
632
|
+
}], assignmentStoreClass: [{
|
|
633
|
+
type: Input
|
|
634
|
+
}], autoLoad: [{
|
|
635
|
+
type: Input
|
|
636
|
+
}], autoSetConstraints: [{
|
|
637
|
+
type: Input
|
|
638
|
+
}], autoSync: [{
|
|
639
|
+
type: Input
|
|
640
|
+
}], autoSyncTimeout: [{
|
|
641
|
+
type: Input
|
|
642
|
+
}], bubbleEvents: [{
|
|
643
|
+
type: Input
|
|
644
|
+
}], bwcConflictPostpone: [{
|
|
645
|
+
type: Input
|
|
646
|
+
}], calendarManagerStoreClass: [{
|
|
647
|
+
type: Input
|
|
648
|
+
}], calendarModelClass: [{
|
|
649
|
+
type: Input
|
|
650
|
+
}], calendarsData: [{
|
|
651
|
+
type: Input
|
|
652
|
+
}], children: [{
|
|
653
|
+
type: Input
|
|
654
|
+
}], delayCalculation: [{
|
|
655
|
+
type: Input
|
|
656
|
+
}], dependenciesData: [{
|
|
657
|
+
type: Input
|
|
658
|
+
}], dependencyModelClass: [{
|
|
659
|
+
type: Input
|
|
660
|
+
}], dependencyStoreClass: [{
|
|
661
|
+
type: Input
|
|
662
|
+
}], encoder: [{
|
|
663
|
+
type: Input
|
|
664
|
+
}], eventsData: [{
|
|
665
|
+
type: Input
|
|
666
|
+
}], expanded: [{
|
|
667
|
+
type: Input
|
|
668
|
+
}], includeAsapAlapAsConstraints: [{
|
|
669
|
+
type: Input
|
|
670
|
+
}], includeChildrenInRemoveRequest: [{
|
|
671
|
+
type: Input
|
|
672
|
+
}], listeners: [{
|
|
673
|
+
type: Input
|
|
674
|
+
}], maxCalendarRange: [{
|
|
675
|
+
type: Input
|
|
676
|
+
}], orderedParentIndex: [{
|
|
677
|
+
type: Input
|
|
678
|
+
}], pageSize: [{
|
|
679
|
+
type: Input
|
|
680
|
+
}], parentIndex: [{
|
|
681
|
+
type: Input
|
|
682
|
+
}], phantomIdField: [{
|
|
683
|
+
type: Input
|
|
684
|
+
}], phantomParentIdField: [{
|
|
685
|
+
type: Input
|
|
686
|
+
}], remotePaging: [{
|
|
687
|
+
type: Input
|
|
688
|
+
}], requestData: [{
|
|
689
|
+
type: Input
|
|
690
|
+
}], resetIdsBeforeSync: [{
|
|
691
|
+
type: Input
|
|
692
|
+
}], resetUndoRedoQueuesAfterLoad: [{
|
|
693
|
+
type: Input
|
|
694
|
+
}], resourceModelClass: [{
|
|
695
|
+
type: Input
|
|
696
|
+
}], resourcesData: [{
|
|
697
|
+
type: Input
|
|
698
|
+
}], resourceStoreClass: [{
|
|
699
|
+
type: Input
|
|
700
|
+
}], silenceInitialCommit: [{
|
|
701
|
+
type: Input
|
|
702
|
+
}], skipSuccessProperty: [{
|
|
703
|
+
type: Input
|
|
704
|
+
}], storeIdProperty: [{
|
|
705
|
+
type: Input
|
|
706
|
+
}], supportShortSyncResponse: [{
|
|
707
|
+
type: Input
|
|
708
|
+
}], taskModelClass: [{
|
|
709
|
+
type: Input
|
|
710
|
+
}], tasksData: [{
|
|
711
|
+
type: Input
|
|
712
|
+
}], taskStoreClass: [{
|
|
713
|
+
type: Input
|
|
714
|
+
}], timeRangesData: [{
|
|
715
|
+
type: Input
|
|
716
|
+
}], toJSONResultFormat: [{
|
|
717
|
+
type: Input
|
|
718
|
+
}], trackResponseType: [{
|
|
719
|
+
type: Input
|
|
720
|
+
}], transport: [{
|
|
721
|
+
type: Input
|
|
722
|
+
}], useRawData: [{
|
|
723
|
+
type: Input
|
|
724
|
+
}], validateResponse: [{
|
|
725
|
+
type: Input
|
|
726
|
+
}], writeAllFields: [{
|
|
727
|
+
type: Input
|
|
728
|
+
}], addConstraintOnDateSet: [{
|
|
729
|
+
type: Input
|
|
730
|
+
}], allowPostponedConflicts: [{
|
|
731
|
+
type: Input
|
|
732
|
+
}], assignments: [{
|
|
733
|
+
type: Input
|
|
734
|
+
}], assignmentStore: [{
|
|
735
|
+
type: Input
|
|
736
|
+
}], autoCalculatePercentDoneForParentTasks: [{
|
|
737
|
+
type: Input
|
|
738
|
+
}], autoMergeAdjacentSegments: [{
|
|
739
|
+
type: Input
|
|
740
|
+
}], autoPostponeConflicts: [{
|
|
741
|
+
type: Input
|
|
742
|
+
}], autoPostponedConflicts: [{
|
|
743
|
+
type: Input
|
|
744
|
+
}], autoScheduleManualTasksOnSecondPass: [{
|
|
745
|
+
type: Input
|
|
746
|
+
}], calendar: [{
|
|
747
|
+
type: Input
|
|
748
|
+
}], calendarManagerStore: [{
|
|
749
|
+
type: Input
|
|
750
|
+
}], calendars: [{
|
|
751
|
+
type: Input
|
|
752
|
+
}], callOnFunctions: [{
|
|
753
|
+
type: Input
|
|
754
|
+
}], catchEventHandlerExceptions: [{
|
|
755
|
+
type: Input
|
|
756
|
+
}], crudStores: [{
|
|
757
|
+
type: Input
|
|
758
|
+
}], daysPerMonth: [{
|
|
759
|
+
type: Input
|
|
760
|
+
}], daysPerWeek: [{
|
|
761
|
+
type: Input
|
|
762
|
+
}], dependencies: [{
|
|
763
|
+
type: Input
|
|
764
|
+
}], dependenciesCalendar: [{
|
|
765
|
+
type: Input
|
|
766
|
+
}], dependencyStore: [{
|
|
767
|
+
type: Input
|
|
768
|
+
}], description: [{
|
|
769
|
+
type: Input
|
|
770
|
+
}], direction: [{
|
|
771
|
+
type: Input
|
|
772
|
+
}], enableProgressNotifications: [{
|
|
773
|
+
type: Input
|
|
774
|
+
}], endDate: [{
|
|
775
|
+
type: Input
|
|
776
|
+
}], eventStore: [{
|
|
777
|
+
type: Input
|
|
778
|
+
}], forceSync: [{
|
|
779
|
+
type: Input
|
|
780
|
+
}], hoursPerDay: [{
|
|
781
|
+
type: Input
|
|
782
|
+
}], id: [{
|
|
783
|
+
type: Input
|
|
784
|
+
}], ignoreConstraintsOnConflictDuringSecondPass: [{
|
|
785
|
+
type: Input
|
|
786
|
+
}], ignoreRemoteChangesInSTM: [{
|
|
787
|
+
type: Input
|
|
788
|
+
}], includeLegacyDataProperties: [{
|
|
789
|
+
type: Input
|
|
790
|
+
}], isFullyLoaded: [{
|
|
791
|
+
type: Input
|
|
792
|
+
}], json: [{
|
|
793
|
+
type: Input
|
|
794
|
+
}], lazyLoad: [{
|
|
795
|
+
type: Input
|
|
796
|
+
}], loadUrl: [{
|
|
797
|
+
type: Input
|
|
798
|
+
}], maxCriticalPathsCount: [{
|
|
799
|
+
type: Input
|
|
800
|
+
}], name: [{
|
|
801
|
+
type: Input
|
|
802
|
+
}], parentId: [{
|
|
803
|
+
type: Input
|
|
804
|
+
}], readOnly: [{
|
|
805
|
+
type: Input
|
|
806
|
+
}], remoteChildCount: [{
|
|
807
|
+
type: Input
|
|
808
|
+
}], resources: [{
|
|
809
|
+
type: Input
|
|
810
|
+
}], resourceStore: [{
|
|
811
|
+
type: Input
|
|
812
|
+
}], shouldSyncDataOnLoad: [{
|
|
813
|
+
type: Input
|
|
814
|
+
}], skipNonWorkingTimeInDurationWhenSchedulingManually: [{
|
|
815
|
+
type: Input
|
|
816
|
+
}], skipNonWorkingTimeWhenSchedulingManually: [{
|
|
817
|
+
type: Input
|
|
818
|
+
}], startDate: [{
|
|
819
|
+
type: Input
|
|
820
|
+
}], startedTaskScheduling: [{
|
|
821
|
+
type: Input
|
|
822
|
+
}], statusDate: [{
|
|
823
|
+
type: Input
|
|
824
|
+
}], stm: [{
|
|
825
|
+
type: Input
|
|
826
|
+
}], syncApplySequence: [{
|
|
827
|
+
type: Input
|
|
828
|
+
}], syncUrl: [{
|
|
829
|
+
type: Input
|
|
830
|
+
}], tasks: [{
|
|
831
|
+
type: Input
|
|
832
|
+
}], taskStore: [{
|
|
833
|
+
type: Input
|
|
834
|
+
}], timeRanges: [{
|
|
835
|
+
type: Input
|
|
836
|
+
}], timeRangeStore: [{
|
|
837
|
+
type: Input
|
|
838
|
+
}], timeZone: [{
|
|
839
|
+
type: Input
|
|
840
|
+
}], trackProjectModelChanges: [{
|
|
841
|
+
type: Input
|
|
842
|
+
}], allChildren: [{
|
|
843
|
+
type: Input
|
|
844
|
+
}], allUnfilteredChildren: [{
|
|
845
|
+
type: Input
|
|
846
|
+
}], criticalPaths: [{
|
|
847
|
+
type: Input
|
|
848
|
+
}], descendantCount: [{
|
|
849
|
+
type: Input
|
|
850
|
+
}], hasGeneratedId: [{
|
|
851
|
+
type: Input
|
|
852
|
+
}], inlineData: [{
|
|
853
|
+
type: Input
|
|
854
|
+
}], internalId: [{
|
|
855
|
+
type: Input
|
|
856
|
+
}], isCommitting: [{
|
|
857
|
+
type: Input
|
|
858
|
+
}], isCreating: [{
|
|
859
|
+
type: Input
|
|
860
|
+
}], isValid: [{
|
|
861
|
+
type: Input
|
|
862
|
+
}], previousSiblingsTotalCount: [{
|
|
863
|
+
type: Input
|
|
864
|
+
}], segmentModelClass: [{
|
|
865
|
+
type: Input
|
|
866
|
+
}], visibleDescendantCount: [{
|
|
867
|
+
type: Input
|
|
868
|
+
}], onBeforeDestroy: [{
|
|
869
|
+
type: Output
|
|
870
|
+
}], onBeforeLoad: [{
|
|
871
|
+
type: Output
|
|
872
|
+
}], onBeforeLoadApply: [{
|
|
873
|
+
type: Output
|
|
874
|
+
}], onBeforeResponseApply: [{
|
|
875
|
+
type: Output
|
|
876
|
+
}], onBeforeSend: [{
|
|
877
|
+
type: Output
|
|
878
|
+
}], onBeforeSync: [{
|
|
879
|
+
type: Output
|
|
880
|
+
}], onBeforeSyncApply: [{
|
|
881
|
+
type: Output
|
|
882
|
+
}], onCatchAll: [{
|
|
883
|
+
type: Output
|
|
884
|
+
}], onChange: [{
|
|
885
|
+
type: Output
|
|
886
|
+
}], onCycle: [{
|
|
887
|
+
type: Output
|
|
888
|
+
}], onDataReady: [{
|
|
889
|
+
type: Output
|
|
890
|
+
}], onDestroy: [{
|
|
891
|
+
type: Output
|
|
892
|
+
}], onEmptyCalendar: [{
|
|
893
|
+
type: Output
|
|
894
|
+
}], onHasChanges: [{
|
|
895
|
+
type: Output
|
|
896
|
+
}], onLoad: [{
|
|
897
|
+
type: Output
|
|
898
|
+
}], onLoadCanceled: [{
|
|
899
|
+
type: Output
|
|
900
|
+
}], onLoadFail: [{
|
|
901
|
+
type: Output
|
|
902
|
+
}], onNoChanges: [{
|
|
903
|
+
type: Output
|
|
904
|
+
}], onProgress: [{
|
|
905
|
+
type: Output
|
|
906
|
+
}], onRequestDone: [{
|
|
907
|
+
type: Output
|
|
908
|
+
}], onRequestFail: [{
|
|
909
|
+
type: Output
|
|
910
|
+
}], onRevisionNotification: [{
|
|
911
|
+
type: Output
|
|
912
|
+
}], onSchedulingConflict: [{
|
|
913
|
+
type: Output
|
|
914
|
+
}], onSync: [{
|
|
915
|
+
type: Output
|
|
916
|
+
}], onSyncCanceled: [{
|
|
917
|
+
type: Output
|
|
918
|
+
}], onSyncDelayed: [{
|
|
919
|
+
type: Output
|
|
920
|
+
}], onSyncFail: [{
|
|
921
|
+
type: Output
|
|
922
|
+
}] } });
|
|
923
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1nYW50dC1wcm9qZWN0LW1vZGVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudC9zcmMvbGliL2JyeW50dW0tZ2FudHQtcHJvamVjdC1tb2RlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBQ3REOztHQUVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0QsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFLN0MsT0FBTyxFQUF3UCxZQUFZLEVBQXlKLE1BQU0scUJBQXFCLENBQUM7O0FBMHFCaGMsTUFBTSxPQUFPLGlDQUFpQztJQWtTMUMsWUFBWSxPQUFtQjtRQVR2QixrQkFBYSxHQUFHO1lBQ3BCLEtBQUssRUFBYyxTQUFTO1lBQzVCLFFBQVEsRUFBVyxTQUFTO1lBQzVCLElBQUksRUFBZSxTQUFTO1lBQzVCLGdCQUFnQixFQUFHLElBQUk7WUFDdkIsUUFBUSxFQUFXLEVBQUU7WUFDckIsU0FBUyxFQUFVLEVBQUU7U0FDeEIsQ0FBQztRQTBJRixrQkFBa0I7UUFDbEI7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQThDLENBQUM7UUFDaEc7Ozs7O1dBS0c7UUFDTyxpQkFBWSxHQUFRLElBQUksWUFBWSxFQUFvRyxDQUFDO1FBQ25KOzs7Ozs7O1dBT0c7UUFDTyxzQkFBaUIsR0FBUSxJQUFJLFlBQVksRUFBeUgsQ0FBQztRQUM3Szs7Ozs7OztXQU9HO1FBQ08sMEJBQXFCLEdBQVEsSUFBSSxZQUFZLEVBQW9JLENBQUM7UUFDNUw7Ozs7Ozs7OztXQVNHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBOEksQ0FBQztRQUM3TDs7Ozs7OztXQU9HO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBb0csQ0FBQztRQUNuSjs7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QkFBOUIsS0FBSztnQkFRSSxlQUFlO3NCQUF4QixNQUFNO2dCQU9HLFlBQVk7c0JBQXJCLE1BQU07Z0JBU0csaUJBQWlCO3NCQUExQixNQUFNO2dCQVNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFXRyxZQUFZO3NCQUFyQixNQUFNO2dCQVNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBUUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQVNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBYUcsUUFBUTtzQkFBakIsTUFBTTtnQkFVRyxPQUFPO3NCQUFoQixNQUFNO2dCQVVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBTUcsU0FBUztzQkFBbEIsTUFBTTtnQkFXRyxlQUFlO3NCQUF4QixNQUFNO2dCQVFHLFlBQVk7c0JBQXJCLE1BQU07Z0JBVUcsTUFBTTtzQkFBZixNQUFNO2dCQVFHLGNBQWM7c0JBQXZCLE1BQU07Z0JBV0csVUFBVTtzQkFBbkIsTUFBTTtnQkFVRyxXQUFXO3NCQUFwQixNQUFNO2dCQVNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBV0csYUFBYTtzQkFBdEIsTUFBTTtnQkFZRyxhQUFhO3NCQUF0QixNQUFNO2dCQVVHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFVRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBVUcsTUFBTTtzQkFBZixNQUFNO2dCQU9HLGNBQWM7c0JBQXZCLE1BQU07Z0JBT0csYUFBYTtzQkFBdEIsTUFBTTtnQkFXRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBmb3IgQnJ5bnR1bSBQcm9qZWN0TW9kZWxcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgU2ltcGxlQ2hhbmdlLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgV3JhcHBlckhlbHBlciBmcm9tICcuL3dyYXBwZXIuaGVscGVyJztcblxuaW1wb3J0IHsgQmFzZSwgRHVyYXRpb25Vbml0LCBNb2RlbCwgTW9kZWxDb25maWcsIFN0YXRlVHJhY2tpbmdNYW5hZ2VyIGFzIENvcmVTdGF0ZVRyYWNraW5nTWFuYWdlciwgU3RvcmUsIFN0b3JlQ29uZmlnIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIENydWRNYW5hZ2VyUmVxdWVzdFJlc3BvbnNlLCBDcnVkTWFuYWdlclN0b3JlRGVzY3JpcHRvciwgTGF6eUxvYWRDcnVkTWFuYWdlclJlcXVlc3RQYXJhbXMsIFRpbWVSYW5nZU1vZGVsLCBUaW1lUmFuZ2VNb2RlbENvbmZpZywgVGltZVJhbmdlU3RvcmUsIFRpbWVSYW5nZVN0b3JlQ29uZmlnLCBUaW1lU3BhbiwgVGltZVNwYW5Db25maWcgfSBmcm9tICdAYnJ5bnR1bS9zY2hlZHVsZXItdGhpbic7XG5pbXBvcnQgeyBFdmVudFNlZ21lbnRNb2RlbCwgU3RhdGVUcmFja2luZ01hbmFnZXJDb25maWcgfSBmcm9tICdAYnJ5bnR1bS9zY2hlZHVsZXJwcm8tdGhpbic7XG5pbXBvcnQgeyBBc3NpZ25tZW50TW9kZWwsIEFzc2lnbm1lbnRNb2RlbENvbmZpZywgQXNzaWdubWVudFN0b3JlLCBBc3NpZ25tZW50U3RvcmVDb25maWcsIENhbGVuZGFyTWFuYWdlclN0b3JlLCBDYWxlbmRhck1hbmFnZXJTdG9yZUNvbmZpZywgQ2FsZW5kYXJNb2RlbCwgQ2FsZW5kYXJNb2RlbENvbmZpZywgRGVwZW5kZW5jeU1vZGVsLCBEZXBlbmRlbmN5TW9kZWxDb25maWcsIERlcGVuZGVuY3lTdG9yZSwgRGVwZW5kZW5jeVN0b3JlQ29uZmlnLCBQcm9qZWN0TW9kZWwsIFByb2plY3RNb2RlbExpc3RlbmVycywgUmVzb3VyY2VNb2RlbCwgUmVzb3VyY2VNb2RlbENvbmZpZywgUmVzb3VyY2VTdG9yZSwgUmVzb3VyY2VTdG9yZUNvbmZpZywgVGFza01vZGVsLCBUYXNrTW9kZWxDb25maWcsIFRhc2tTdG9yZSwgVGFza1N0b3JlQ29uZmlnIH0gZnJvbSAnQGJyeW50dW0vZ2FudHQtdGhpbic7XG5cbmltcG9ydCB7IFN0cmluZ0hlbHBlciB9IGZyb20gJ0BicnludHVtL2NvcmUtdGhpbic7XG5cbmV4cG9ydCB0eXBlIEJyeW50dW1HYW50dFByb2plY3RNb2RlbFByb3BzID0ge1xuICAgIC8vIENvbmZpZ3NcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIGB0cnVlYCAoZGVmYXVsdCkgd2hlbiBhIHN0YXJ0L2VuZCBkYXRlIGlzIHNldCBvbiB0aGUgZXZlbnQsIGEgY29ycmVzcG9uZGluZ1xuICAgICAqIGBzdGFydC1uby1lYXJsaWVyL2xhdGVyLXRoYW5gIGNvbnN0cmFpbnQgaXMgYWRkZWQsIGF1dG9tYXRpY2FsbHkuIFRoaXMgaXMgZG9uZSBpbiBvcmRlciB0b1xuICAgICAqIGtlZXAgdGhlIGV2ZW50IFwiYXR0YWNoZWRcIiB0byB0aGlzIGRhdGUsIGFjY29yZGluZyB0byB0aGUgdXNlciBpbnRlbnRpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1hZGRDb25zdHJhaW50T25EYXRlU2V0KVxuICAgICAqL1xuICAgIGFkZENvbnN0cmFpbnRPbkRhdGVTZXQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBtYW5hZ2VzIERTVCBjb3JyZWN0aW9uIGluIHRoZSBzY2hlZHVsaW5nIGVuZ2luZS4gSXQgb25seSBoYXMgZWZmZWN0IHdoZW4gRFNUIHRyYW5zaXRpb24gaG91ciBpc1xuICAgICAqIHdvcmtpbmcgdGltZS4gVXN1YWxseSBEU1QgdHJhbnNpdGlvbiBvY2N1cnMgb24gU3VuZGF5LCBzbyB3aXRoIG5vbiB3b3JraW5nIHdlZWtlbmRzIHRoZSBEU1QgY29ycmVjdGlvbiBsb2dpY1xuICAgICAqIGlzIG5vdCBpbnZvbHZlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWFkanVzdER1cmF0aW9uVG9EU1QpXG4gICAgICovXG4gICAgYWRqdXN0RHVyYXRpb25Ub0RTVCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgZmllbGQgaXMgc2V0IHRvIGB0cnVlYCBzY2hlZHVsaW5nIGNvbmZsaWN0c1xuICAgICAqIHdpbGwgaW5jbHVkZSBhbiBhZGRpdGlvbmFsIHJlc29sdXRpb24gb3B0aW9uIHRvIFwicG9zdHBvbmVcIiB0aGUgY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAgICAgKiBUaGUgY29uZmxpY3QgdGhlbiBpcyBzdG9yZWQgaW4gdGhlIHRhc2tcbiAgICAgKiBbcG9zdHBvbmVkQ29uZmxpY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvVGFza01vZGVsI2ZpZWxkLXBvc3Rwb25lZENvbmZsaWN0KSBmaWVsZFxuICAgICAqIGFuZCBjYW4gYmUgdmlzdWFsaXplZCB3aXRoIHRoZSBbVGFza0luZm9Db2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvY29sdW1uL1Rhc2tJbmZvQ29sdW1uKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWFsbG93UG9zdHBvbmVkQ29uZmxpY3RzKVxuICAgICAqL1xuICAgIGFsbG93UG9zdHBvbmVkQ29uZmxpY3RzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBhc3NpZ25tZW50IG1vZGVsIGNsYXNzLCB0byBiZSB1c2VkIGluIHRoZSBwcm9qZWN0LiBXaWxsIGJlIHNldCBhcyB0aGUgW21vZGVsQ2xhc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1tb2RlbENsYXNzKVxuICAgICAqIHByb3BlcnR5IG9mIHRoZSBbYXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpXG4gICAgICovXG4gICAgYXNzaWdubWVudE1vZGVsQ2xhc3MgPyA6IHR5cGVvZiBBc3NpZ25tZW50TW9kZWxcbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbYXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbQXNzaWdubWVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Bc3NpZ25tZW50TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgYXNzaWdubWVudHMgPyA6IEFzc2lnbm1lbnRNb2RlbFtdfEFzc2lnbm1lbnRNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGF0YSwgdG8gZmlsbCB0aGUgW2Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktYXNzaWdubWVudFN0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbQXNzaWdubWVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Bc3NpZ25tZW50TW9kZWwpIG9yIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW2Fzc2lnbm1lbnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctYXNzaWdubWVudHMpIGluc3RlYWRcbiAgICAgKi9cbiAgICBhc3NpZ25tZW50c0RhdGEgPyA6IEFzc2lnbm1lbnRNb2RlbENvbmZpZ1tdfEFzc2lnbm1lbnRNb2RlbFtdXG4gICAgLyoqXG4gICAgICogQW4gW0Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9kYXRhL0Fzc2lnbm1lbnRTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRTdG9yZSA/IDogQXNzaWdubWVudFN0b3JlfEFzc2lnbm1lbnRTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBkZXBlbmRlbmN5IHN0b3JlIGluc3RhbmNlIHdpdGguIFNob3VsZCBiZSBhIGNsYXNzLCBzdWJjbGFzc2luZyB0aGUgW0Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9kYXRhL0Fzc2lnbm1lbnRTdG9yZSlcbiAgICAgKi9cbiAgICBhc3NpZ25tZW50U3RvcmVDbGFzcyA/IDogdHlwZW9mIEFzc2lnbm1lbnRTdG9yZVxuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBlbmFibGUgYXV0b21hdGljIFslIGRvbmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvVGFza01vZGVsI2ZpZWxkLXBlcmNlbnREb25lKSBjYWxjdWxhdGlvbiBmb3Igc3VtbWFyeVxuICAgICAqIHRhc2tzLCBgZmFsc2VgIHRvIGRpc2FibGUgaXQuXG4gICAgICovXG4gICAgYXV0b0NhbGN1bGF0ZVBlcmNlbnREb25lRm9yUGFyZW50VGFza3MgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNhbGwgW2xvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIG1ldGhvZCBvbiB0aGUgbmV4dCBmcmFtZSBhZnRlciBjcmVhdGlvbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWF1dG9Mb2FkKVxuICAgICAqL1xuICAgIGF1dG9Mb2FkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAgKGRlZmF1bHQpIGFkamFjZW50IG9yIG92ZXJsYXBwaW5nIHRhc2sgc2VnbWVudHMgZ2V0IG1lcmdlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqL1xuICAgIGF1dG9NZXJnZUFkamFjZW50U2VnbWVudHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIHNldCB0byBgdHJ1ZWAgc2NoZWR1bGluZyBjb25mbGljdHNcbiAgICAgKiB3aWxsIG5vdCBzaG93IHRoZSBjb25mbGljdCByZXNvbHV0aW9uIHBvcHVwIGJ1dCBpbnN0ZWFkIHdpbGwgYmUgc2F2ZWQgaW50b1xuICAgICAqIHRhc2tzIFtwb3N0cG9uZWRDb25mbGljdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9UYXNrTW9kZWwjZmllbGQtcG9zdHBvbmVkQ29uZmxpY3QpIGZpZWxkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctYXV0b1Bvc3Rwb25lQ29uZmxpY3RzKVxuICAgICAqL1xuICAgIGF1dG9Qb3N0cG9uZUNvbmZsaWN0cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgZmllbGQgaXMgc2V0IHRvIGB0cnVlYCBzY2hlZHVsaW5nIGNvbmZsaWN0c1xuICAgICAqIHdpbGwgbm90IHNob3cgdGhlIGNvbmZsaWN0IHJlc29sdXRpb24gcG9wdXAgYnV0IGluc3RlYWQgd2lsbCBiZSBzYXZlZCBpbnRvXG4gICAgICogdGFza3MgW3Bvc3Rwb25lZENvbmZsaWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Rhc2tNb2RlbCNmaWVsZC1wb3N0cG9uZWRDb25mbGljdCkgZmllbGQuXG4gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBbYXV0b1Bvc3Rwb25lQ29uZmxpY3RzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNmaWVsZC1hdXRvUG9zdHBvbmVDb25mbGljdHMpIGZpZWxkIG5hbWUuXG4gICAgICovXG4gICAgYXV0b1Bvc3Rwb25lZENvbmZsaWN0cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIGVuYWJsZWQgKGRlZmF1bHQpLCBtYW51YWxseSBzY2hlZHVsZWQgdGFza3MgYXJlIHNjaGVkdWxlZCBhdXRvbWF0aWNhbGx5IG9uIHRoZSAybmQgc2NoZWR1bGluZyBwYXNzLlxuICAgICAqIFRoaXMgaXMgYSBiYWNrd2FyZCBwYXNzIChcImxhdGVcIiBzdGFydC9lbmQgZGF0ZXMpIGZvciBmb3J3YXJkLXNjaGVkdWxlZCBwcm9qZWN0IGFuZCBmb3J3YXJkIHBhc3NcbiAgICAgKiAoXCJlYXJseVwiIHN0YXJ0L2VuZCBkYXRlcykgZm9yIGJhY2t3YXJkLXNjaGVkdWxlZCBwcm9qZWN0LiBCZWNhdXNlIG9mIGl0LCBtYW51YWxseSBzY2hlZHVsZWQgdGFza3NcbiAgICAgKiBtYXkgaGF2ZSBub24temVybyBzbGFjay5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWF1dG9TY2hlZHVsZU1hbnVhbFRhc2tzT25TZWNvbmRQYXNzKVxuICAgICAqL1xuICAgIGF1dG9TY2hlZHVsZU1hbnVhbFRhc2tzT25TZWNvbmRQYXNzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiBzZXQgdG8gYHRydWVgLCBwaW5zIGEgdGFzayBhdCBpdHMgc3RhcnRpbmcgZGF0ZS4gT3RoZXJ3aXNlLCBpdCBpcyByZXNjaGVkdWxlZCB0byB0aGVcbiAgICAgKiBwcm9qZWN0J3Mgc3RhcnRpbmcgZGF0ZSBpZiB0aGVyZSBpcyBubyBwcmVkZWNlc3NvciBvciBjb25zdHJhaW50IHN1cHBsaWVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctYXV0b1NldENvbnN0cmFpbnRzKVxuICAgICAqL1xuICAgIGF1dG9TZXRDb25zdHJhaW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IHBlcnNpc3Qgc3RvcmUgY2hhbmdlcyBhZnRlciBlZGl0cyBhcmUgbWFkZSBpbiBhbnkgb2YgdGhlIHN0b3JlcyBtb25pdG9yZWQuXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCBzeW5jIHJlcXVlc3Qgd2lsbCBub3QgYmUgaW52b2tlZCBpbW1lZGlhdGVseSBidXQgb25seSBhZnRlclxuICAgICAqIFthdXRvU3luY1RpbWVvdXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2NvbmZpZy1hdXRvU3luY1RpbWVvdXQpIGludGVydmFsLlxuICAgICAqL1xuICAgIGF1dG9TeW5jID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHBlcnNpc3RpbmcgY2hhbmdlcyB0byB0aGUgc2VydmVyLlxuICAgICAqIFVzZWQgd2hlbiBbYXV0b1N5bmNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2NvbmZpZy1hdXRvU3luYykgaXMgc2V0IHRvIGB0cnVlYC5cbiAgICAgKi9cbiAgICBhdXRvU3luY1RpbWVvdXQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aGVyZSBwcm9wZXJ0eSBuYW1lcyB3aXRoIGEgdHJ1dGh5IHZhbHVlIGluZGljYXRlIHdoaWNoIGV2ZW50cyBzaG91bGQgYnViYmxlIHVwIHRoZSBvd25lcnNoaXBcbiAgICAgKiBoaWVyYXJjaHkgd2hlbiB0cmlnZ2VyZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1idWJibGVFdmVudHMpXG4gICAgICovXG4gICAgYnViYmxlRXZlbnRzID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGJhY2t3YXJkIGNvbXBhdGlibGUgY29uZmxpY3RzIHBvc3Rwb25pbmcgbG9naWNcbiAgICAgKiBjb3ZlcmluZyBvbmx5IGNvbmZsaWN0cyBiZXR3ZWVuIGEgdGFzayBjb25zdHJhaW50IGFuZCBpdHMgaW5jb21pbmcgZGVwZW5kZW5jaWVzLlxuICAgICAqIEBkZXByZWNhdGVkIFRoZSBmbGFnIGlzIGFkZGVkIGFzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIGFuZCBpcyBnb2luZyB0byBiZSByZW1vdmVkIGluIGEgbmV4dCByZWxlYXNlLiBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgbmVlZCB0aGF0IG9sZCBiZWhhdmlvci5cbiAgICAgKi9cbiAgICBid2NDb25mbGljdFBvc3Rwb25lID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIHByb2plY3QgY2FsZW5kYXIuXG4gICAgICovXG4gICAgY2FsZW5kYXIgPyA6IHN0cmluZ3xDYWxlbmRhck1vZGVsQ29uZmlnfENhbGVuZGFyTW9kZWxcbiAgICAvKipcbiAgICAgKiBBIFtDYWxlbmRhck1hbmFnZXJTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9kYXRhL0NhbGVuZGFyTWFuYWdlclN0b3JlKSBpbnN0YW5jZSBvciBhIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgY2FsZW5kYXJNYW5hZ2VyU3RvcmUgPyA6IENhbGVuZGFyTWFuYWdlclN0b3JlfENhbGVuZGFyTWFuYWdlclN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIGNhbGVuZGFyIHN0b3JlIGluc3RhbmNlIHdpdGguIFNob3VsZCBiZSBhIGNsYXNzLCBzdWJjbGFzc2luZyB0aGUgW0NhbGVuZGFyTWFuYWdlclN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L2RhdGEvQ2FsZW5kYXJNYW5hZ2VyU3RvcmUpXG4gICAgICovXG4gICAgY2FsZW5kYXJNYW5hZ2VyU3RvcmVDbGFzcyA/IDogdHlwZW9mIENhbGVuZGFyTWFuYWdlclN0b3JlXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjYWxlbmRhciBtb2RlbCBjbGFzcywgdG8gYmUgdXNlZCBpbiB0aGUgcHJvamVjdC4gV2lsbCBiZSBzZXQgYXMgdGhlIFttb2RlbENsYXNzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctbW9kZWxDbGFzcylcbiAgICAgKiBwcm9wZXJ0eSBvZiB0aGUgW2NhbGVuZGFyTWFuYWdlclN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1jYWxlbmRhck1hbmFnZXJTdG9yZSlcbiAgICAgKi9cbiAgICBjYWxlbmRhck1vZGVsQ2xhc3MgPyA6IHR5cGVvZiBDYWxlbmRhck1vZGVsXG4gICAgLyoqXG4gICAgICogRGF0YSB1c2UgdG8gZmlsbCB0aGUgW2NhbGVuZGFyTWFuYWdlclN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1jYWxlbmRhck1hbmFnZXJTdG9yZSkuIFNob3VsZCBiZSBhXG4gICAgICogW0NhbGVuZGFyTW9kZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvQ2FsZW5kYXJNb2RlbCkgYXJyYXkgb3IgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKi9cbiAgICBjYWxlbmRhcnMgPyA6IENhbGVuZGFyTW9kZWxbXXxDYWxlbmRhck1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbY2FsZW5kYXJNYW5hZ2VyU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWNhbGVuZGFyTWFuYWdlclN0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbQ2FsZW5kYXJNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvQ2FsZW5kYXJNb2RlbCkgb3IgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqIEBkZXByZWNhdGVkIDYuMy4wIFVzZSBbY2FsZW5kYXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY2FsZW5kYXJzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgY2FsZW5kYXJzRGF0YSA/IDogQ2FsZW5kYXJNb2RlbENvbmZpZ1tdfENhbGVuZGFyTW9kZWxbXVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gY2FsbCBvblhYWCBtZXRob2QgbmFtZXMgKGUuZy4gYG9uU2hvd2AsIGBvbkNsaWNrYCksIGFzIGFuIGVhc3kgd2F5IHRvIGxpc3RlbiBmb3IgZXZlbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY2FsbE9uRnVuY3Rpb25zKVxuICAgICAqL1xuICAgIGNhbGxPbkZ1bmN0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGlmIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIGVycm9yIHByb3BhZ2F0ZXMgdXAgdGhlIHN0YWNrIGFuZCB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0ZSBpcyB1bmRlZmluZWQuIENvZGUgd2hpY2ggZm9sbG93cyB0aGUgZXZlbnQgaGFuZGxlciB3aWxsICpub3QqIGJlIGV4ZWN1dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zKVxuICAgICAqL1xuICAgIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENoaWxkIG5vZGVzLiBUbyBhbGxvdyBsb2FkaW5nIGNoaWxkcmVuIG9uIGRlbWFuZCwgc3BlY2lmeSBgY2hpbGRyZW4gOiB0cnVlYCBpbiB5b3VyIGRhdGEuIE9taXQgdGhlIGZpZWxkIGZvciBsZWFmXG4gICAgICogdGFza3MuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1jaGlsZHJlbilcbiAgICAgKi9cbiAgICBjaGlsZHJlbiA/IDogYm9vbGVhbnxvYmplY3RbXXxNb2RlbFtdfE1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHN0b3JlcyBjb250cm9sbGVkIGJ5IHRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1jcnVkU3RvcmVzKVxuICAgICAqL1xuICAgIGNydWRTdG9yZXMgPyA6IFN0b3JlW118c3RyaW5nW118Q3J1ZE1hbmFnZXJTdG9yZURlc2NyaXB0b3JbXXxTdG9yZUNvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWRheXNQZXJNb250aClcbiAgICAgKi9cbiAgICBkYXlzUGVyTW9udGggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBwZXIgd2Vlay5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWRheXNQZXJXZWVrKVxuICAgICAqL1xuICAgIGRheXNQZXJXZWVrID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGVhcmx5IHJlbmRlcmluZyBpbiBHYW50dCwgYnkgcG9zdHBvbmluZyBjYWxjdWxhdGlvbnMgdG8gYWZ0ZXIgdGhlIGZpcnN0IHJlZnJlc2guXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1kZWxheUNhbGN1bGF0aW9uKVxuICAgICAqL1xuICAgIGRlbGF5Q2FsY3VsYXRpb24gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbZGVwZW5kZW5jeVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1kZXBlbmRlbmN5U3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbRGVwZW5kZW5jeU1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9EZXBlbmRlbmN5TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzID8gOiBEZXBlbmRlbmN5TW9kZWxbXXxEZXBlbmRlbmN5TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBzb3VyY2Ugb2YgdGhlIGNhbGVuZGFyIGZvciBkZXBlbmRlbmNpZXMgKHRoZSBjYWxlbmRhciB1c2VkIGZvciB0YWtpbmcgZGVwZW5kZW5jaWVzIGxhZyBpbnRvIGFjY291bnQpLlxuICAgICAqIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1kZXBlbmRlbmNpZXNDYWxlbmRhcilcbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXNDYWxlbmRhciA/IDogJ1RvRXZlbnQnfCdGcm9tRXZlbnQnfCdQcm9qZWN0J3wnQWxsV29ya2luZydcbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbZGVwZW5kZW5jeVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1kZXBlbmRlbmN5U3RvcmUpIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGFuIGFycmF5IG9mIFtEZXBlbmRlbmN5TW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL0RlcGVuZGVuY3lNb2RlbCkgb3IgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqIEBkZXByZWNhdGVkIDYuMy4wIFVzZSBbZGVwZW5kZW5jaWVzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctZGVwZW5kZW5jaWVzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzRGF0YSA/IDogRGVwZW5kZW5jeU1vZGVsQ29uZmlnW118RGVwZW5kZW5jeU1vZGVsW11cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGRlcGVuZGVuY3kgbW9kZWwgY2xhc3MsIHRvIGJlIHVzZWQgaW4gdGhlIHByb2plY3QuIFdpbGwgYmUgc2V0IGFzIHRoZSBbbW9kZWxDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUjY29uZmlnLW1vZGVsQ2xhc3MpXG4gICAgICogcHJvcGVydHkgb2YgdGhlIFtkZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWRlcGVuZGVuY3lTdG9yZSlcbiAgICAgKi9cbiAgICBkZXBlbmRlbmN5TW9kZWxDbGFzcyA/IDogdHlwZW9mIERlcGVuZGVuY3lNb2RlbFxuICAgIC8qKlxuICAgICAqIEEgW0RlcGVuZGVuY3lTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9kYXRhL0RlcGVuZGVuY3lTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGRlcGVuZGVuY3lTdG9yZSA/IDogRGVwZW5kZW5jeVN0b3JlfERlcGVuZGVuY3lTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBkZXBlbmRlbmN5IHN0b3JlIGluc3RhbmNlIHdpdGguIFNob3VsZCBiZSBhIGNsYXNzLCBzdWJjbGFzc2luZyB0aGUgW0RlcGVuZGVuY3lTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9kYXRhL0RlcGVuZGVuY3lTdG9yZSlcbiAgICAgKi9cbiAgICBkZXBlbmRlbmN5U3RvcmVDbGFzcyA/IDogdHlwZW9mIERlcGVuZGVuY3lTdG9yZVxuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24gPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBzY2hlZHVsaW5nIGRpcmVjdGlvbiBvZiB0aGUgcHJvamVjdCB0YXNrcy5cbiAgICAgKiBUaGUgYEZvcndhcmRgIGRpcmVjdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgQXMtU29vbi1Bcy1Qb3NzaWJsZSAoQVNBUCkgc2NoZWR1bGluZyxcbiAgICAgKiBgQmFja3dhcmRgIC0gdG8gQXMtTGF0ZS1Bcy1Qb3NzaWJsZSAoQUxBUCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1kaXJlY3Rpb24pXG4gICAgICovXG4gICAgZGlyZWN0aW9uID8gOiAnRm9yd2FyZCd8J0JhY2t3YXJkJ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gZW5hYmxlIGNhbGN1bGF0aW9uIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMuXG4gICAgICogV2hlbiBlbmFibGVkLCB0aGUgcHJvamVjdCBmaXJlcyBbcHJvZ3Jlc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2V2ZW50LXByb2dyZXNzKSBldmVudHMgYW5kIHRoZSBHYW50dCBjaGFydCBsb2FkIG1hc2sgcmVhY3RzIGJ5IHNob3dpbmcgYSBwcm9ncmVzcyBiYXIgZm9yIHRoZSBFbmdpbmUgY2FsY3VsYXRpb25zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctZW5hYmxlUHJvZ3Jlc3NOb3RpZmljYXRpb25zKVxuICAgICAqL1xuICAgIGVuYWJsZVByb2dyZXNzTm90aWZpY2F0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gb2YgdGhlIEpTT04gZW5jb2RlciB1c2VkIGJ5IHRoZSAqQ3J1ZCBNYW5hZ2VyKi5cbiAgICAgKi9cbiAgICBlbmNvZGVyID8gOiB7XG4gICAgICAgIHJlcXVlc3REYXRhPzogb2JqZWN0XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuZCBkYXRlIG9mIHRoZSBwcm9qZWN0IGluIHRoZSBJU08gODYwMSBmb3JtYXQuXG4gICAgICogVGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQgYXMgdGhlIGxhdGVzdCBkYXRlIGFtb25nIGFsbCB0YXNrcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWVuZERhdGUpXG4gICAgICovXG4gICAgZW5kRGF0ZSA/IDogc3RyaW5nfERhdGVcbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byBbdGFza3NEYXRhXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdGFza3NEYXRhKS5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW3Rhc2tzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdGFza3MpIGluc3RlYWRcbiAgICAgKi9cbiAgICBldmVudHNEYXRhID8gOiBUYXNrTW9kZWxDb25maWdbXXxUYXNrTW9kZWxbXVxuICAgIC8qKlxuICAgICAqIEEgW1Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9kYXRhL1Rhc2tTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGV2ZW50U3RvcmUgPyA6IFRhc2tTdG9yZXxUYXNrU3RvcmVDb25maWdcbiAgICAvKipcbiAgICAgKiBTdGFydCBleHBhbmRlZCBvciBub3QgKG9ubHkgdmFsaWQgZm9yIHRyZWUgZGF0YSlcbiAgICAgKi9cbiAgICBleHBhbmRlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYXMgYHRydWVgIHRvIGZvcmNlIHN5bmMgcmVxdWVzdHMgdG8gYmUgc2VudCB3aGVuIGNhbGxpbmcgYHN5bmMoKWAsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGxvY2FsXG4gICAgICogY2hhbmdlcy4gVXNlZnVsIGluIGEgcG9sbGluZyBzY2VuYXJpbywgdG8ga2VlcCBjbGllbnQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBiYWNrZW5kLlxuICAgICAqL1xuICAgIGZvcmNlU3luYyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaG91cnMgcGVyIGRheS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWhvdXJzUGVyRGF5KVxuICAgICAqL1xuICAgIGhvdXJzUGVyRGF5ID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlY29yZC4gTWlnaHQgYmUgbWFwcGVkIHRvIGFub3RoZXIgZGF0YVNvdXJjZSB1c2luZyBpZEZpZWxkLCBidXQgYWx3YXlzIGV4cG9zZWQgYXNcbiAgICAgKiByZWNvcmQuaWQuIFdpbGwgZ2V0IGEgZ2VuZXJhdGVkIHZhbHVlIGlmIG5vbmUgaXMgc3BlY2lmaWVkIGluIHJlY29yZHMgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWlkKVxuICAgICAqL1xuICAgIGlkID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogPHN0cm9uZz5UaGlzIG9wdGlvbiBpcyBleHBlcmltZW50YWwgYW5kIHN1YmplY3QgZm9yIHBvc3NpYmxlIGNoYW5nZTwvc3Ryb25nPi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWlnbm9yZUNvbnN0cmFpbnRzT25Db25mbGljdER1cmluZ1NlY29uZFBhc3MpXG4gICAgICogQGRlcHJlY2F0ZWQgVGhlIG9wdGlvbiBpcyBubyBsb25nZXIgbmVlZGVkIHNpbmNlIHRoZSBjb2RlIG5vdyBieSBkZWZhdWx0IGlnbm9yZXMgY29uZmxpY3RzIGZhY2VkIG9uIHRoZSBzZWNvbmQgcGFzcy5cbiAgICAgKi9cbiAgICBpZ25vcmVDb25zdHJhaW50c09uQ29uZmxpY3REdXJpbmdTZWNvbmRQYXNzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtYWtlIFNUTSBpZ25vcmUgY2hhbmdlcyBjb21pbmcgZnJvbSB0aGUgYmFja2VuZC4gVGhpcyB3aWxsIGFsbG93IHVzZXIgdG8gb25seSB1bmRvIHJlZG9cbiAgICAgKiBsb2NhbCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGlnbm9yZVJlbW90ZUNoYW5nZXNJblNUTSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBcIkFzIHNvb24gYXMgcG9zc2libGVcIiBhbmQgXCJBcyBsYXRlIGFzIHBvc3NpYmxlXCIgaW4gdGhlIGxpc3Qgb2YgdGhlIGNvbnN0cmFpbnRzLFxuICAgICAqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1TIFByb2plY3QuIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWluY2x1ZGVBc2FwQWxhcEFzQ29uc3RyYWludHMpXG4gICAgICovXG4gICAgaW5jbHVkZUFzYXBBbGFwQXNDb25zdHJhaW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG9ubHkgaW5jbHVkZSB0aGUgaWQgb2YgYSByZW1vdmVkIHBhcmVudCBub2RlIGluIHRoZSByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kIChhbHNvXG4gICAgICogYWZmZWN0cyBwcm9ncmFtbWF0aWMgY2FsbHMgdG8gZ2V0IFtjaGFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNwcm9wZXJ0eS1jaGFuZ2VzKSBldGMuKSwgYW5kIG5vdCB0aGUgaWRzIG9mIGl0cyBjaGlsZHJlbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWluY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdClcbiAgICAgKi9cbiAgICBpbmNsdWRlQ2hpbGRyZW5JblJlbW92ZVJlcXVlc3QgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgbGVnYWN5IGRhdGEgcHJvcGVydGllcyBpbiB0aGUgSlNPTiAvIGlubGluZURhdGEgb3V0cHV0LiBUaGUgbGVnYWN5IGRhdGEgcHJvcGVydGllcyBhcmVcbiAgICAgKiB0aGUgYHh4RGF0YWAgKGBldmVudHNEYXRhYCwgYHJlc291cmNlc0RhdGFgIGV0Yy4pIHByb3BlcnRpZXMgdGhhdCBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluXG4gICAgICogdGhlIGZ1dHVyZS5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBUaGlzIGNvbmZpZyB3aWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUgZXZlbnRzRGF0YSwgcmVzb3VyY2VzRGF0YSBldGMuIHByb3BlcnRpZXMgYXJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKi9cbiAgICBpbmNsdWRlTGVnYWN5RGF0YVByb3BlcnRpZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIGFkZGVkIHRvIHRoZSBjbGFzcyBhdCBydW50aW1lIHdoZW4gdGhlIFN0b3JlIGlzIGNvbmZpZ3VyZWQgd2l0aFxuICAgICAqIFtsYXp5TG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUjY29uZmlnLWxhenlMb2FkKS4gSWYgc2V0IG9uIGEgcGFyZW50IHJlY29yZCBhdCBsb2FkIHRpbWUsIHRoYXQgcGFyZW50IHdpbGwgbm90IGNhdXNlIGFueVxuICAgICAqIG1vcmUgY2hpbGQgbG9hZCByZXF1ZXN0cy4gSWYgb21pdHRlZCwgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNldCB0byBgdHJ1ZWAgd2hlbiBhIGxvYWQgcmVxdWVzdCByZWNlaXZlcyBmZXdlclxuICAgICAqIGNoaWxkIHJlY29yZHMgdGhhbiByZXF1ZXN0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1pc0Z1bGx5TG9hZGVkKVxuICAgICAqL1xuICAgIGlzRnVsbHlMb2FkZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IGRhdGEgYXMgYSBKU09OIHN0cmluZywgdXNlZCB0byBwb3B1bGF0ZSBpdHMgc3RvcmVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctanNvbilcbiAgICAgKi9cbiAgICBqc29uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gYHRydWVgLCBvciBhIGNvbmZpZyBvYmplY3QsIHRoaXMgbWFrZXMgdGhlIENydWRNYW5hZ2VyIGxvYWQgcmVjb3JkcyBvbmx5IHdoZW4gbmVlZGVkLiBXaGVuIGEgcmVjb3JkXG4gICAgICogb3IgYSBkYXRlIHJhbmdlIHRoYXQgaXMgbm90IGFscmVhZHkgbG9hZGVkIGlzIHJlcXVlc3RlZCwgYSBsb2FkIHJlcXVlc3Qgd2lsbCBiZSBtYWRlIHRvIHRoZSBzcGVjaWZpZWQgVVJMLlxuICAgICAqIE1vcmUgbW9yZSBkZXRhaWxzIGFib3V0IGxhenkgbG9hZGluZywgc2VlIHRoZSBbZ3VpZGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR3JpZC9ndWlkZXMvZGF0YS9sYXp5bG9hZGluZy5tZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbGF6eUxvYWQgTGF6eSBsb2FkIGNvbmZpZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsYXp5TG9hZC5jaHVua1NpemUgVGhlIG51bWJlciBvZiByZWNvcmRzIHRvIGJlIGxvYWRlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSByZXF1ZXN0ZWQgaW5kZXggKG9ubHkgYWZmZWN0cyB0aGUgUmVzb3VyY2VTdG9yZSkuXG4gICAgICogQHBhcmFtIHtEdXJhdGlvblVuaXR9IGJ1ZmZlclVuaXQgVXNlZCB0b2dldGhlciB3aXRoIGJ1ZmZlckFtb3VudCB0byBjYWxjdWxhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZXMgb2YgZWFjaCBsb2FkIHJlcXVlc3QuIFRoZSB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgY3VycmVudCB2aXNpYmxlIHN0YXJ0IG9yIGVuZCBkYXRlLiBEZWZhdWx0cyB0byB0aGUgdmlzaWJsZSB0aW1lIHNwYW4gbGVuZ3RoIChkb2VzIG5vdCBhZmZlY3QgUmVzb3VyY2VTdG9yZSkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJ1ZmZlckFtb3VudCBTZWUgYGJ1ZmZlclVuaXRgXG4gICAgICovXG4gICAgbGF6eUxvYWQgPyA6IGJvb2xlYW58e2xhenlMb2FkOiB7IGNodW5rU2l6ZTogbnVtYmVyIH0sIGJ1ZmZlclVuaXQ6IER1cmF0aW9uVW5pdCwgYnVmZmVyQW1vdW50OiBudW1iZXJ9XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3RlbmVyIHNldCBmb3IgdGhpcyBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1saXN0ZW5lcnMpXG4gICAgICovXG4gICAgbGlzdGVuZXJzID8gOiBQcm9qZWN0TW9kZWxMaXN0ZW5lcnNcbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzaG9ydGN1dCB0byBzZXQgb25seSB0aGUgdXJsIHRvIGxvYWQgZnJvbSwgd2hlbiB5b3UgZG8gbm90IG5lZWQgdG8gc3VwcGx5IGFueSBvdGhlciBjb25maWdcbiAgICAgKiBvcHRpb25zIGluIHRoZSBgbG9hZGAgc2VjdGlvbiBvZiB0aGUgYHRyYW5zcG9ydGAgY29uZmlnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctbG9hZFVybClcbiAgICAgKi9cbiAgICBsb2FkVXJsID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIHJhbmdlIHRoZSBwcm9qZWN0IGNhbGVuZGFycyBjYW4gaXRlcmF0ZS5cbiAgICAgKiBUaGUgdmFsdWUgaXMgZGVmaW5lZCBpbiBtaWxsaXNlY29uZHMgYW5kIGJ5IGRlZmF1bHQgZXF1YWxzIGA1IHllYXJzYCByb3VnaGx5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctbWF4Q2FsZW5kYXJSYW5nZSlcbiAgICAgKi9cbiAgICBtYXhDYWxlbmRhclJhbmdlID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgKmNyaXRpY2FsIHBhdGhzKiB0byBjb2xsZWN0IGluIFtjcml0aWNhbFBhdGhzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1jcml0aWNhbFBhdGhzKS5cbiAgICAgKiBXaGVuIGNyaXRpY2FsIHRhc2tzIGNvbm5lY3Rpdml0eSBpcyBoaWdoICh0aGVyZSBhcmUgbWFueSBvZiBzdWNoIHRhc2tzIGhhdmluZyBtYW55XG4gICAgICogY3JpdGljYWwgcHJlZGVjZXNzb3JzKSB0aGUgdGFza3MgbWlnaHQgcHJvZHVjZSBhIGh1Z2UgbnVtYmVyIG9mIGNyaXRpY2FsIHBhdGhzIHdoaWNoXG4gICAgICogY2FuJ3QgcmVhbGx5IGJlIGhhbmRsZWQgYnkgYSBicm93c2VyLlxuICAgICAqIFNvIHRoaXMgdmFsdWUgbGltaXRzIHRoZSBudW1iZXIgb2YgcGF0aHMgdG8gY29sbGVjdCB0byBwcm90ZWN0IGZyb20gc3VjaCBjYXNlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLW1heENyaXRpY2FsUGF0aHNDb3VudClcbiAgICAgKi9cbiAgICBtYXhDcml0aWNhbFBhdGhzQ291bnQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIHByb2plY3RcbiAgICAgKi9cbiAgICBuYW1lID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgcmVhZC1vbmx5IGZpZWxkIHByb3ZpZGVkIGluIHNlcnZlciBzeW5jaHJvbml6YXRpb24gcGFja2V0cyB0byBzcGVjaWZ5XG4gICAgICogd2hpY2ggcG9zaXRpb24gdGhlIG5vZGUgdGFrZXMgaW4gdGhlIHBhcmVudCdzIG9yZGVyZWQgY2hpbGRyZW4gYXJyYXkuXG4gICAgICogVGhpcyBpbmRleCBpcyBzZXQgb24gbG9hZCBhbmQgZ2V0cyB1cGRhdGVkIG9uIHJlb3JkZXJpbmcgbm9kZXMgaW4gdHJlZS4gU29ydGluZyBhbmQgZmlsdGVyaW5nXG4gICAgICogaGF2ZSBubyBlZmZlY3Qgb24gaXQuXG4gICAgICovXG4gICAgb3JkZXJlZFBhcmVudEluZGV4ID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIFJlc291cmNlIHJlY29yZHMgZWFjaCBwYWdlIHNob3VsZCBjb250YWluLCB3aGVuIHVzaW5nIFtyZW1vdGVQYWdpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvbWl4aW4vTGF6eUxvYWRDcnVkTWFuYWdlciNjb25maWctcmVtb3RlUGFnaW5nKVxuICAgICAqL1xuICAgIHBhZ2VTaXplID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgcmVhZC1vbmx5IGZpZWxkIHByb3ZpZGVkIGluIHNlcnZlciBzeW5jaHJvbml6YXRpb24gcGFja2V0cyB0byBzcGVjaWZ5XG4gICAgICogd2hpY2ggcmVjb3JkIGlkIGlzIHRoZSBwYXJlbnQgb2YgdGhlIHJlY29yZC5cbiAgICAgKi9cbiAgICBwYXJlbnRJZCA/IDogc3RyaW5nfG51bWJlcnxudWxsXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIHJlYWQtb25seSBmaWVsZCBwcm92aWRlZCBpbiBzZXJ2ZXIgc3luY2hyb25pemF0aW9uIHBhY2tldHMgdG8gc3BlY2lmeVxuICAgICAqIHdoaWNoIHBvc2l0aW9uIHRoZSBub2RlIHRha2VzIGluIHRoZSBwYXJlbnQncyBjaGlsZHJlbiBhcnJheS5cbiAgICAgKiBUaGlzIGluZGV4IGlzIHNldCBvbiBsb2FkIGFuZCBnZXRzIHVwZGF0ZWQgYXV0b21hdGljYWxseSBhZnRlciByb3cgcmVvcmRlcmluZywgc29ydGluZywgZXRjLlxuICAgICAqIFRvIHNhdmUgdGhlIG9yZGVyLCBuZWVkIHRvIHBlcnNpc3QgdGhlIGZpZWxkIG9uIHRoZSBzZXJ2ZXIgYW5kIHdoZW4gZGF0YSBpcyBmZXRjaGVkIHRvIGJlIGxvYWRlZCxcbiAgICAgKiBuZWVkIHRvIHNvcnQgYnkgdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBwYXJlbnRJbmRleCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogRmllbGQgbmFtZSB0byBiZSB1c2VkIHRvIHRyYW5zZmVyIGEgcGhhbnRvbSByZWNvcmQgaWRlbnRpZmllci5cbiAgICAgKi9cbiAgICBwaGFudG9tSWRGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogRmllbGQgbmFtZSB0byBiZSB1c2VkIHRvIHRyYW5zZmVyIGEgcGhhbnRvbSBwYXJlbnQgcmVjb3JkIGlkZW50aWZpZXIuXG4gICAgICovXG4gICAgcGhhbnRvbVBhcmVudElkRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEZsYWcgdGhlIHJlY29yZCBhcyByZWFkLW9ubHkgb24gdGhlIFVJIGxldmVsLCBwcmV2ZW50aW5nIHRoZSBlbmQgdXNlciBmcm9tIG1hbmlwdWxhdGluZyBpdCB1c2luZyBlZGl0aW5nXG4gICAgICogZmVhdHVyZXMgc3VjaCBhcyBjZWxsIGVkaXRpbmcgYW5kIGV2ZW50IGRyYWdnaW5nLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctcmVhZE9ubHkpXG4gICAgICovXG4gICAgcmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIGFkZGVkIHRvIHRoZSBjbGFzcyBhdCBydW50aW1lIHdoZW4gdGhlIFN0b3JlIGlzIGNvbmZpZ3VyZWQgd2l0aFxuICAgICAqIFtsYXp5TG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUjY29uZmlnLWxhenlMb2FkKS4gVGhlXG4gICAgICogbnVtYmVyIHNwZWNpZmllZCBzaG91bGQgcmVmbGVjdCB0aGUgPHN0cm9uZz50b3RhbDwvc3Ryb25nPiBhbW91bnQgb2YgY2hpbGRyZW4gb2YgYSBwYXJlbnQgbm9kZSwgaW5jbHVkaW5nIG5lc3RlZCBkZXNjZW5kYW50cy5cbiAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZpZWxkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSByZWFkIHRoZSBbZ3VpZGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR3JpZC9ndWlkZXMvZGF0YS9sYXp5bG9hZGluZy5tZCkgdG8gZmluZCBvdXQgaWYgeW91ciBhcHAgbmVlZHMgdG8gdXNlIHRoZSBuZXcgW2lzRnVsbHlMb2FkZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvQ29yZS9kYXRhL21peGluL1RyZWVOb2RlI2ZpZWxkLWlzRnVsbHlMb2FkZWQpIGZpZWxkLlxuICAgICAqL1xuICAgIHJlbW90ZUNoaWxkQ291bnQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoaXMgbWFrZXMgdGhlIENydWRNYW5hZ2VyIGxvYWQgcGFnZXMgb2YgZGF0YSwgaW5zdGVhZCBvZiBsb2FkaW5nIHRoZSBjb21wbGV0ZSBkYXRhc2V0IGF0XG4gICAgICogb25jZS4gVGhlIHJlcXVlc3RzIG1hZGUgdG8gdGhlIFtsb2FkVXJsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNjb25maWctbG9hZFVybCkgd2lsbCBjb250YWluXG4gICAgICogcGFyYW1zIHdpdGggaW5mbyBhYm91dCB0aGUgY3VycmVudCBkYXRhc2V0IGJlaW5nIHJlcXVlc3RlZDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXJlbW90ZVBhZ2luZylcbiAgICAgKi9cbiAgICByZW1vdGVQYWdpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBDcnVkTWFuYWdlci9Qcm9qZWN0IGlzIGNvbmZpZ3VyZWQgd2l0aCBbbGF6eUxvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvbWl4aW4vTGF6eUxvYWRDcnVkTWFuYWdlciNjb25maWctbGF6eUxvYWQpIHNldCB0byBgdHJ1ZWAsIHlvdSBjYW4gY29uZmlndXJlXG4gICAgICogeW91ciBvd24gZGF0YSBmZXRjaGluZyBsb2dpYyBieSBpbXBsZW1lbnRpbmcgdGhpcyBmdW5jdGlvbi4gRG9pbmcgdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBidWlsdC1pbiBmZXRjaGluZ1xuICAgICAqIG1lY2hhbmlzbSB1c2luZyB0aGUgW2xvYWRVcmxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvQ3J1ZE1hbmFnZXIjY29uZmlnLWxvYWRVcmwpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctcmVxdWVzdERhdGEpXG4gICAgICogQHBhcmFtIHtMYXp5TG9hZENydWRNYW5hZ2VyUmVxdWVzdFBhcmFtc30gcGFyYW1zIE9iamVjdCBjb250YWluaW5nIGluZm8gb2Ygd2hhdCBkYXRhIGlzIHJlcXVlc3RlZFxuICAgICAqIEByZXR1cm5zIHtDcnVkTWFuYWdlclJlcXVlc3RSZXNwb25zZX1cbiAgICAgKi9cbiAgICByZXF1ZXN0RGF0YSA/IDogKHBhcmFtczogTGF6eUxvYWRDcnVkTWFuYWdlclJlcXVlc3RQYXJhbXMpID0+IFByb21pc2U8Q3J1ZE1hbmFnZXJSZXF1ZXN0UmVzcG9uc2U+XG4gICAgLyoqXG4gICAgICogYFRydWVgIHRvIHJlc2V0IGlkZW50aWZpZXJzIChkZWZpbmVkIGJ5IGBpZEZpZWxkYCBjb25maWcpIG9mIHBoYW50b20gcmVjb3JkcyBiZWZvcmUgc3VibWl0dGluZyB0aGVtXG4gICAgICogdG8gdGhlIHNlcnZlci5cbiAgICAgKi9cbiAgICByZXNldElkc0JlZm9yZVN5bmMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIHJlc2V0IHRoZSB1bmRvL3JlZG8gcXVldWVzIG9mIHRoZSBpbnRlcm5hbCBbU3RhdGVUcmFja2luZ01hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvQ29yZS9kYXRhL3N0bS9TdGF0ZVRyYWNraW5nTWFuYWdlcilcbiAgICAgKiBhZnRlciB0aGUgUHJvamVjdCBoYXMgbG9hZGVkLiBEZWZhdWx0cyB0byBgZmFsc2VgXG4gICAgICovXG4gICAgcmVzZXRVbmRvUmVkb1F1ZXVlc0FmdGVyTG9hZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVzb3VyY2UgbW9kZWwgY2xhc3MsIHRvIGJlIHVzZWQgaW4gdGhlIHByb2plY3QuIFdpbGwgYmUgc2V0IGFzIHRoZSBbbW9kZWxDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUjY29uZmlnLW1vZGVsQ2xhc3MpXG4gICAgICogcHJvcGVydHkgb2YgdGhlIFtyZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1yZXNvdXJjZVN0b3JlKVxuICAgICAqL1xuICAgIHJlc291cmNlTW9kZWxDbGFzcyA/IDogdHlwZW9mIFJlc291cmNlTW9kZWxcbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbcmVzb3VyY2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktcmVzb3VyY2VTdG9yZSkuIFNob3VsZCBiZSBhbiBhcnJheSBvZlxuICAgICAqIFtSZXNvdXJjZU1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9SZXNvdXJjZU1vZGVsKSBvciBpdHMgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqL1xuICAgIHJlc291cmNlcyA/IDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBpbml0aWFsIGRhdGEsIHRvIGZpbGwgdGhlIFtyZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1yZXNvdXJjZVN0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbUmVzb3VyY2VNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUmVzb3VyY2VNb2RlbCkgb3IgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqIEBkZXByZWNhdGVkIDYuMy4wIFVzZSBbcmVzb3VyY2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctcmVzb3VyY2VzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgcmVzb3VyY2VzRGF0YSA/IDogUmVzb3VyY2VNb2RlbENvbmZpZ1tdfFJlc291cmNlTW9kZWxbXVxuICAgIC8qKlxuICAgICAqIEEgW1Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvZGF0YS9SZXNvdXJjZVN0b3JlKSBpbnN0YW5jZSBvciBhIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgcmVzb3VyY2VTdG9yZSA/IDogUmVzb3VyY2VTdG9yZXxSZXNvdXJjZVN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIGRlcGVuZGVuY3kgc3RvcmUgaW5zdGFuY2Ugd2l0aC4gU2hvdWxkIGJlIGEgY2xhc3MsIHN1YmNsYXNzaW5nIHRoZSBbUmVzb3VyY2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9kYXRhL1Jlc291cmNlU3RvcmUpXG4gICAgICovXG4gICAgcmVzb3VyY2VTdG9yZUNsYXNzID8gOiB0eXBlb2YgUmVzb3VyY2VTdG9yZVxuICAgIC8qKlxuICAgICAqIEV4cGVyaW1lbnRhbCBob29rIHRoYXQgbGV0cyB0aGUgYXBwIGRldGVybWluZSBpZiBhIGJvdW5kIGRhdGFzZXQgbmVlZHMgc3luY2luZyB3aXRoIHRoZSBzdG9yZSBvciBub3QsIGFuZFxuICAgICAqIGlmIGl0IGRvZXMgLSB3aGljaCByZWNvcmRzIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4gT25seSBjYWxsZWQgZm9yIHN0b3JlcyB0aGF0IGFyZSBjb25maWd1cmVkIHdpdGhcbiAgICAgKiBgc3luY0RhdGFPbkxvYWQ6IHRydWVgICh3aGljaCBpcyB0aGUgZGVmYXVsdCBpbiB0aGUgUmVhY3QsIEFuZ3VsYXIgYW5kIFZ1ZSB3cmFwcGVycykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zaG91bGRTeW5jRGF0YU9uTG9hZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBPcHRpb25zIHBhc3NlZCBieSB0aGUgc3RvcmUgdG8gdGhpcyBob29rXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuU3RvcmV9IG9wdGlvbnMuc3RvcmUgU3RvcmUgYWJvdXQgdG8gYmUgc3luY2VkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IG9wdGlvbnMucmVjb3JkcyBSZWNvcmRzIGN1cnJlbnRseSBpbiB0aGUgc3RvcmVcbiAgICAgKiBAcGFyYW0ge29iamVjdFtdfSBvcHRpb25zLmRhdGEgSW5jb21pbmcgZGF0YVxuICAgICAqIEByZXR1cm5zIHtTZXQ8YW55Pixib29sZWFufSBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBzdG9yZSBmcm9tIHN5bmNpbmcsIG9yIGEgc2V0IG9mIHJlY29yZCBpZHMgdGhhdCBuZWVkIGZ1cnRoZXIgcHJvY2Vzc2luZyAoZm9yIHJlY29yZHMgdGhhdCBoYXMgc29tZSBraW5kIG9mIGNoYW5nZSwgZWcuIGFuIHVwZGF0ZSwgcmVtb3ZhbCBvciBhZGRpdGlvbilcbiAgICAgKi9cbiAgICBzaG91bGRTeW5jRGF0YU9uTG9hZCA/IDogKG9wdGlvbnM6IHsgc3RvcmU6IFN0b3JlLCByZWNvcmRzOiBNb2RlbCwgZGF0YTogb2JqZWN0W10gfSkgPT4gU2V0PGFueT58Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIFNpbGVuY2VzIHByb3BhZ2F0aW9ucyBjYXVzZWQgYnkgdGhlIHByb2plY3QgbG9hZGluZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXNpbGVuY2VJbml0aWFsQ29tbWl0KVxuICAgICAqL1xuICAgIHNpbGVuY2VJbml0aWFsQ29tbWl0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAgdGhlIHByb2plY3QncyBtYW51YWxseSBzY2hlZHVsZWQgdGFza3MgZHVyYXRpb24gd2lsbCBpbmNsdWRlIG9ubHkgd29ya2luZyBwZXJpb2RzIG9mIHRpbWUuXG4gICAgICogV2hlbiBgZmFsc2VgIHN1Y2ggdGFza3Mgd2lsbCBpZ25vcmUgd29ya2luZyB0aW1lIGNhbGVuZGFycyBhbmQgdHJlYXQgYWxsIGludGVydmFscyBhcyB3b3JraW5nLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctc2tpcE5vbldvcmtpbmdUaW1lSW5EdXJhdGlvbldoZW5TY2hlZHVsaW5nTWFudWFsbHkpXG4gICAgICovXG4gICAgc2tpcE5vbldvcmtpbmdUaW1lSW5EdXJhdGlvbldoZW5TY2hlZHVsaW5nTWFudWFsbHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCB0aGUgcHJvamVjdCBtYW51YWxseSBzY2hlZHVsZWQgdGFza3Mgd2lsbCBhZGp1c3QgdGhlaXIgcHJvcG9zZWQgc3RhcnQvZW5kIGRhdGVzXG4gICAgICogdG8gc2tpcCBub24gd29ya2luZyB0aW1lLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctc2tpcE5vbldvcmtpbmdUaW1lV2hlblNjaGVkdWxpbmdNYW51YWxseSlcbiAgICAgKi9cbiAgICBza2lwTm9uV29ya2luZ1RpbWVXaGVuU2NoZWR1bGluZ01hbnVhbGx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAgdHJlYXRzIHBhcnNlZCByZXNwb25zZXMgd2l0aG91dCBgc3VjY2Vzc2AgcHJvcGVydHkgYXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiBJbiB0aGlzIG1vZGUgYSBwYXJzZWQgcmVzcG9uc2UgaXMgdHJlYXRlZCBhcyBpbnZhbGlkIGlmIGl0IGhhcyBleHBsaWNpdGx5IHNldCBgc3VjY2VzcyA6IGZhbHNlYC5cbiAgICAgKi9cbiAgICBza2lwU3VjY2Vzc1Byb3BlcnR5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3RhcnQgZGF0ZSBvZiB0aGUgcHJvamVjdCBpbiB0aGUgSVNPIDg2MDEgZm9ybWF0LiBTZXR0aW5nIHRoaXMgZGF0ZSB3aWxsIGNvbnN0cmFpbiBhbGwgb3RoZXIgdGFza3MgaW4gdGhlXG4gICAgICogcHJvamVjdCB0byBzdGFydCBubyBlYXJsaWVyIHRoYW4gaXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zdGFydERhdGUpXG4gICAgICovXG4gICAgc3RhcnREYXRlID8gOiBzdHJpbmd8RGF0ZVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgc3RhcnRlZCB0YXNrcyBhcmUgc2NoZWR1bGVkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctc3RhcnRlZFRhc2tTY2hlZHVsaW5nKVxuICAgICAqL1xuICAgIHN0YXJ0ZWRUYXNrU2NoZWR1bGluZyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBkYXRlIG9mIHRoZSBwcm9qZWN0LiBJdCBpcyBqdXN0IGEgZGF0ZSwgdGhhdCBzZXRzIGEgcmVmZXJlbmNlIHBvaW50IHRvIHZhcmlvdXMgcmVwb3J0aW5nIGZhY2lsaXRpZXMsXG4gICAgICogbGlrZSBbUHJvZ3Jlc3NMaW5lXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L2ZlYXR1cmUvUHJvZ3Jlc3NMaW5lKSBvciBbUGxhbm5lZFBlcmNlbnREb25lQ29sdW1uXSgjR2FudHQvY29sdW1uL1BsYW5uZWRQZXJjZW50RG9uZUNvbHVtbikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zdGF0dXNEYXRlKVxuICAgICAqL1xuICAgIHN0YXR1c0RhdGUgPyA6IERhdGVcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gcHJvdmlkZSB0byB0aGUgU1RNIG1hbmFnZXJcbiAgICAgKi9cbiAgICBzdG0gPyA6IFN0YXRlVHJhY2tpbmdNYW5hZ2VyQ29uZmlnfENvcmVTdGF0ZVRyYWNraW5nTWFuYWdlclxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgYSBzdG9yZSBwcm9wZXJ0eSB0byByZXRyaWV2ZSBzdG9yZSBpZGVudGlmaWVycyBmcm9tLiBNYWtlIHN1cmUgeW91IGhhdmUgYW4gaW5zdGFuY2Ugb2YgYVxuICAgICAqIHN0b3JlIHRvIHVzZSBpdCBieSBpZC4gU3RvcmUgaWRlbnRpZmllciBpcyB1c2VkIGFzIGEgY29udGFpbmVyIG5hbWUgaG9sZGluZyBjb3JyZXNwb25kaW5nIHN0b3JlIGRhdGFcbiAgICAgKiB3aGlsZSB0cmFuc2ZlcnJpbmcgdGhlbSB0by9mcm9tIHRoZSBzZXJ2ZXIuIEJ5IGRlZmF1bHQsIGBpZGAgcHJvcGVydHkgaXMgdXNlZC4gQW5kIGluIGNhc2UgYVxuICAgICAqIGNvbnRhaW5lciBpZGVudGlmaWVyIGhhcyB0byBkaWZmZXIgdGhpcyBjb25maWcgY2FuIGJlIHVzZWQ6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zdG9yZUlkUHJvcGVydHkpXG4gICAgICovXG4gICAgc3RvcmVJZFByb3BlcnR5ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCB0aGUgQ3J1ZCBNYW5hZ2VyIGRvZXMgbm90IHJlcXVpcmUgYWxsIHVwZGF0ZWQgYW5kIHJlbW92ZWQgcmVjb3JkcyB0byBiZSBtZW50aW9uZWQgaW4gdGhlXG4gICAgICogKnN5bmMqIHJlc3BvbnNlLiBJbiB0aGlzIGNhc2UgcmVzcG9uc2Ugc2hvdWxkIGluY2x1ZGUgb25seSBzZXJ2ZXIgc2lkZSBjaGFuZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctc3VwcG9ydFNob3J0U3luY1Jlc3BvbnNlKVxuICAgICAqL1xuICAgIHN1cHBvcnRTaG9ydFN5bmNSZXNwb25zZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHN0b3JlIGlkZW50aWZpZXJzIHNldHMgYW4gYWx0ZXJuYXRpdmUgc3luYyByZXNwb25zZXMgYXBwbHkgb3JkZXIuXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIG9yZGVyIGluIHdoaWNoIHN5bmMgcmVzcG9uc2VzIGFyZSBhcHBsaWVkIHRvIHRoZSBzdG9yZXMgaXMgdGhlIHNhbWUgYXMgdGhleVxuICAgICAqIHJlZ2lzdGVyZWQgaW4uIEJ1dCBpbiBjYXNlIG9mIHNvbWUgdHJpY2t5IGRlcGVuZGVuY2llcyBiZXR3ZWVuIHN0b3JlcyB0aGlzIG9yZGVyIGNhbiBiZSBjaGFuZ2VkOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctc3luY0FwcGx5U2VxdWVuY2UpXG4gICAgICovXG4gICAgc3luY0FwcGx5U2VxdWVuY2UgPyA6IHN0cmluZ1tdfENydWRNYW5hZ2VyU3RvcmVEZXNjcmlwdG9yW11cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzaG9ydGN1dCB0byBzZXQgb25seSB0aGUgdXJsIHRvIHN5bmMgdG8sIHdoZW4geW91IGRvIG5vdCBuZWVkIHRvIHN1cHBseSBhbnkgb3RoZXIgY29uZmlnXG4gICAgICogb3B0aW9ucyBpbiB0aGUgYHN5bmNgIHNlY3Rpb24gb2YgdGhlIGB0cmFuc3BvcnRgIGNvbmZpZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXN5bmNVcmwpXG4gICAgICovXG4gICAgc3luY1VybCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBldmVudCBtb2RlbCBjbGFzcywgdG8gYmUgdXNlZCBpbiB0aGUgcHJvamVjdC4gV2lsbCBiZSBzZXQgYXMgdGhlIFttb2RlbENsYXNzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctbW9kZWxDbGFzcylcbiAgICAgKiBwcm9wZXJ0eSBvZiB0aGUgW2V2ZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWV2ZW50U3RvcmUpXG4gICAgICovXG4gICAgdGFza01vZGVsQ2xhc3MgPyA6IHR5cGVvZiBUYXNrTW9kZWxcbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbdGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS10YXNrU3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbVGFza01vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9UYXNrTW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgdGFza3MgPyA6IFRhc2tNb2RlbFtdfFRhc2tNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGF0YSwgdG8gZmlsbCB0aGUgW3Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktdGFza1N0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbVGFza01vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9UYXNrTW9kZWwpIG9yIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW3Rhc2tzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdGFza3MpIGluc3RlYWRcbiAgICAgKi9cbiAgICB0YXNrc0RhdGEgPyA6IFRhc2tNb2RlbENvbmZpZ1tdfFRhc2tNb2RlbFtdXG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIHRoZSBbZXZlbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWV2ZW50U3RvcmUpLlxuICAgICAqL1xuICAgIHRhc2tTdG9yZSA/IDogVGFza1N0b3JlfFRhc2tTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYW4gdGFzayBzdG9yZSBpbnN0YW5jZSB3aXRoLiBTaG91bGQgYmUgYSBjbGFzcywgc3ViY2xhc3NpbmcgdGhlIFtUYXNrU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvZGF0YS9UYXNrU3RvcmUpXG4gICAgICovXG4gICAgdGFza1N0b3JlQ2xhc3MgPyA6IHR5cGVvZiBUYXNrU3RvcmVcbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbdGltZVJhbmdlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXRpbWVSYW5nZVN0b3JlKS4gU2hvdWxkIGJlIGFuIGFycmF5IG9mXG4gICAgICogW1RpbWVSYW5nZU1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9TY2hlZHVsZXIvbW9kZWwvVGltZVJhbmdlTW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgdGltZVJhbmdlcyA/IDogVGltZVJhbmdlTW9kZWxbXXxUaW1lUmFuZ2VNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGF0YSwgdG8gZmlsbCB0aGUgW3RpbWVSYW5nZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS10aW1lUmFuZ2VTdG9yZSkgd2l0aC5cbiAgICAgKiBTaG91bGQgYmUgYW4gYXJyYXkgb2YgW1RpbWVSYW5nZU1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9TY2hlZHVsZXIvbW9kZWwvVGltZVJhbmdlTW9kZWwpIG9yIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW3RpbWVSYW5nZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy10aW1lUmFuZ2VzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgdGltZVJhbmdlc0RhdGEgPyA6IFRpbWVTcGFuQ29uZmlnW118VGltZVNwYW5bXVxuICAgIC8qKlxuICAgICAqIFN0b3JlIHRoYXQgaG9sZHMgdGltZSByYW5nZXMgLSBpbnN0YW5jZXMgb2YgW1RpbWVSYW5nZU1vZGVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9UaW1lUmFuZ2VNb2RlbCkgZm9yIHRoZVxuICAgICAqIFtUaW1lUmFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL1RpbWVSYW5nZXMpIGZlYXR1cmUuIEEgc3RvcmUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaWYgbm9uZSBpcyBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgdGltZVJhbmdlU3RvcmUgPyA6IFRpbWVSYW5nZVN0b3JlQ29uZmlnfFRpbWVSYW5nZVN0b3JlXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgSUFOQSB0aW1lIHpvbmUgKGkuZS4gYEV1cm9wZS9TdG9ja2hvbG1gKSBvciBhIFVUQyBvZmZzZXQgaW4gbWludXRlcyAoaS5lLiBgLTEyMGApLiBUaGlzIHdpbGxcbiAgICAgKiBjb252ZXJ0IGFsbCBldmVudHMsIHRhc2tzIGFuZCB0aW1lIHJhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHRpbWUgem9uZSBvciBvZmZzZXQuIEl0IHdpbGwgYWxzbyBhZmZlY3QgdGhlXG4gICAgICogZGlzcGxheWVkIHRpbWVsaW5lJ3MgaGVhZGVycyBhcyB3ZWxsIGF0IHRoZSBzdGFydCBhbmQgZW5kIGRhdGUgb2YgaXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvR2FudHQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy10aW1lWm9uZSlcbiAgICAgKi9cbiAgICB0aW1lWm9uZSA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiBbdG9KU09OXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9taXhpbi9Qcm9qZWN0TW9kZWxDb21tb24jZnVuY3Rpb24tdG9KU09OKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXRvSlNPTlJlc3VsdEZvcm1hdClcbiAgICAgKi9cbiAgICB0b0pTT05SZXN1bHRGb3JtYXQgPyA6ICdpbmxpbmVEYXRhJ3wnbW9kZWwnXG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBwcm9qZWN0IFtjaGFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlclByby9kYXRhL21peGluL1Byb2plY3RDcnVkTWFuYWdlciNwcm9wZXJ0eS1jaGFuZ2VzKSBBUEkgd2lsbCBhbHNvIHJlcG9ydCBwcm9qZWN0IG1vZGVsIGNoYW5nZXM6IHN0YXJ0L2VuZCBkYXRlLFxuICAgICAqIGNhbGVuZGFyLCBlZmZvcnQsIGR1cmF0aW9uLCBldGMuXG4gICAgICovXG4gICAgdHJhY2tQcm9qZWN0TW9kZWxDaGFuZ2VzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAgZm9yY2VzIHRoZSBDUlVEIG1hbmFnZXIgdG8gcHJvY2VzcyByZXNwb25zZXMgZGVwZW5kaW5nIG9uIHRoZWlyIGB0eXBlYCBhdHRyaWJ1dGUuXG4gICAgICogU28gYGxvYWRgIHJlcXVlc3QgbWF5IGJlIHJlc3BvbmRlZCB3aXRoIGBzeW5jYCByZXNwb25zZSBmb3IgZXhhbXBsZS5cbiAgICAgKiBDYW4gYmUgdXNlZCBmb3Igc21hcnQgc2VydmVyIGxvZ2ljIGFsbG93aW5nIHRoZSBzZXJ2ZXIgdG8gZGVjaWRlIHdoZW4gaXQncyBiZXR0ZXIgdG8gcmVzcG9uZCB3aXRoIGFcbiAgICAgKiBjb21wbGV0ZSBkYXRhIHNldCAoYGxvYWRgIHJlc3BvbnNlKSBvciBpdCdzIGVub3VnaCB0byByZXR1cm4ganVzdCBhIGRlbHRhIChgc3luY2AgcmVzcG9uc2UpLlxuICAgICAqL1xuICAgIHRyYWNrUmVzcG9uc2VUeXBlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJhdGlvbiBvZiB0aGUgQUpBWCByZXF1ZXN0cyB1c2VkIGJ5ICpDcnVkIE1hbmFnZXIqIHRvIGNvbW11bmljYXRlIHdpdGggYSBzZXJ2ZXItc2lkZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXRyYW5zcG9ydClcbiAgICAgKi9cbiAgICB0cmFuc3BvcnQgPyA6IHtcbiAgICAgICAgbG9hZD86IG9iamVjdFxuICAgICAgICBzeW5jPzogb2JqZWN0XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBzdG9yZXMgb2YgYSBwcm9qZWN0IHVzZSB0aGUgcmF3IGRhdGEgb2JqZWN0cyBwYXNzZWQgdG8gdGhlbSBhcyB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZWlyXG4gICAgICogcmVjb3JkcyBpZiBkYXRhIGlzIGxvYWRlZCByZW1vdGVseSAodXNpbmcgYW4gYEFqYXhTdG9yZWAgb3IgYSBgQ3J1ZE1hbmFnZXJgKS4gRm9yIGRhdGEgc3VwcGxpZWQgaW5saW5lLFxuICAgICAqIHRoZSBkYXRhIG9iamVjdHMgYXJlIGluc3RlYWQgYnkgZGVmYXVsdCBjbG9uZWQgdG8gYXZvaWQgdGhlIG9yaWdpbmFsIGRhdGEgb2JqZWN0IGJlaW5nIG1vZGlmaWVkIGJ5IHRoZVxuICAgICAqIHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdXNlUmF3RGF0YSlcbiAgICAgKi9cbiAgICB1c2VSYXdEYXRhID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgdmFsaWRhdGVzIHRoZSByZXNwb25zZSBzdHJ1Y3R1cmUgZm9yIHJlcXVlc3RzIG1hZGUgYnkgdGhlIENydWQgTWFuYWdlci5cbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIENydWQgTWFuYWdlciBjaGVja3MgZXZlcnkgcGFyc2VkIHJlc3BvbnNlIHN0cnVjdHVyZSBmb3IgZXJyb3JzXG4gICAgICogYW5kIGlmIHRoZSByZXNwb25zZSBmb3JtYXQgaXMgaW52YWxpZCwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgYnJvd3NlciBjb25zb2xlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdmFsaWRhdGVSZXNwb25zZSlcbiAgICAgKi9cbiAgICB2YWxpZGF0ZVJlc3BvbnNlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIHdyaXRlIGFsbCBmaWVsZHMgZnJvbSB0aGUgcmVjb3JkIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICogSWYgc2V0IHRvIGBmYWxzZWAgaXQgd2lsbCBvbmx5IHNlbmQgdGhlIGZpZWxkcyB0aGF0IHdlcmUgbW9kaWZpZWQuXG4gICAgICogTm90ZSB0aGF0IGFueSBmaWVsZHMgdGhhdCBoYXZlIFtwZXJzaXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0NvcmUvZGF0YS9maWVsZC9EYXRhRmllbGQjY29uZmlnLXBlcnNpc3QpIHNldCB0byBgZmFsc2VgIHdpbGxcbiAgICAgKiBzdGlsbCBiZSBpZ25vcmVkIGFuZCBmaWVsZHMgaGF2aW5nIFthbHdheXNXcml0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9Db3JlL2RhdGEvZmllbGQvRGF0YUZpZWxkI2NvbmZpZy1hbHdheXNXcml0ZSkgc2V0IHRvIGB0cnVlYFxuICAgICAqIHdpbGwgYWx3YXlzIGJlIGluY2x1ZGVkLlxuICAgICAqL1xuICAgIHdyaXRlQWxsRmllbGRzID8gOiBib29sZWFuXG5cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3IgOiAnYnJ5bnR1bS1nYW50dC1wcm9qZWN0LW1vZGVsJyxcbiAgICB0ZW1wbGF0ZSA6ICcnXG59KVxuZXhwb3J0IGNsYXNzIEJyeW50dW1HYW50dFByb2plY3RNb2RlbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VDbGFzcyA9IFByb2plY3RNb2RlbDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VOYW1lID0gJ1Byb2plY3RNb2RlbCc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZUxvYWQnLFxuICAgICAgICAnb25CZWZvcmVMb2FkQXBwbHknLFxuICAgICAgICAnb25CZWZvcmVSZXNwb25zZUFwcGx5JyxcbiAgICAgICAgJ29uQmVmb3JlU2VuZCcsXG4gICAgICAgICdvbkJlZm9yZVN5bmMnLFxuICAgICAgICAnb25CZWZvcmVTeW5jQXBwbHknLFxuICAgICAgICAnb25DYXRjaEFsbCcsXG4gICAgICAgICdvbkNoYW5nZScsXG4gICAgICAgICdvbkN5Y2xlJyxcbiAgICAgICAgJ29uRGF0YVJlYWR5JyxcbiAgICAgICAgJ29uRGVzdHJveScsXG4gICAgICAgICdvbkVtcHR5Q2FsZW5kYXInLFxuICAgICAgICAnb25IYXNDaGFuZ2VzJyxcbiAgICAgICAgJ29uTG9hZCcsXG4gICAgICAgICdvbkxvYWRDYW5jZWxlZCcsXG4gICAgICAgICdvbkxvYWRGYWlsJyxcbiAgICAgICAgJ29uTm9DaGFuZ2VzJyxcbiAgICAgICAgJ29uUHJvZ3Jlc3MnLFxuICAgICAgICAnb25SZXF1ZXN0RG9uZScsXG4gICAgICAgICdvblJlcXVlc3RGYWlsJyxcbiAgICAgICAgJ29uUmV2aXNpb25Ob3RpZmljYXRpb24nLFxuICAgICAgICAnb25TY2hlZHVsaW5nQ29uZmxpY3QnLFxuICAgICAgICAnb25TeW5jJyxcbiAgICAgICAgJ29uU3luY0NhbmNlbGVkJyxcbiAgICAgICAgJ29uU3luY0RlbGF5ZWQnLFxuICAgICAgICAnb25TeW5jRmFpbCdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUZlYXR1cmVOYW1lczogc3RyaW5nW10gPSBbXG5cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bUdhbnR0UHJvamVjdE1vZGVsQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2FkZENvbnN0cmFpbnRPbkRhdGVTZXQnLFxuICAgICAgICAnYWRqdXN0RHVyYXRpb25Ub0RTVCcsXG4gICAgICAgICdhbGxvd1Bvc3Rwb25lZENvbmZsaWN0cycsXG4gICAgICAgICdhc3NpZ25tZW50TW9kZWxDbGFzcycsXG4gICAgICAgICdhc3NpZ25tZW50cycsXG4gICAgICAgICdhc3NpZ25tZW50c0RhdGEnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2F1dG9DYWxjdWxhdGVQZXJjZW50RG9uZUZvclBhcmVudFRhc2tzJyxcbiAgICAgICAgJ2F1dG9Mb2FkJyxcbiAgICAgICAgJ2F1dG9NZXJnZUFkamFjZW50U2VnbWVudHMnLFxuICAgICAgICAnYXV0b1Bvc3Rwb25lQ29uZmxpY3RzJyxcbiAgICAgICAgJ2F1dG9Qb3N0cG9uZWRDb25mbGljdHMnLFxuICAgICAgICAnYXV0b1NjaGVkdWxlTWFudWFsVGFza3NPblNlY29uZFBhc3MnLFxuICAgICAgICAnYXV0b1NldENvbnN0cmFpbnRzJyxcbiAgICAgICAgJ2F1dG9TeW5jJyxcbiAgICAgICAgJ2F1dG9TeW5jVGltZW91dCcsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnYndjQ29uZmxpY3RQb3N0cG9uZScsXG4gICAgICAgICdjYWxlbmRhcicsXG4gICAgICAgICdjYWxlbmRhck1hbmFnZXJTdG9yZScsXG4gICAgICAgICdjYWxlbmRhck1hbmFnZXJTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2NhbGVuZGFyTW9kZWxDbGFzcycsXG4gICAgICAgICdjYWxlbmRhcnMnLFxuICAgICAgICAnY2FsZW5kYXJzRGF0YScsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NoaWxkcmVuJyxcbiAgICAgICAgJ2NydWRTdG9yZXMnLFxuICAgICAgICAnZGF5c1Blck1vbnRoJyxcbiAgICAgICAgJ2RheXNQZXJXZWVrJyxcbiAgICAgICAgJ2RlbGF5Q2FsY3VsYXRpb24nLFxuICAgICAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ2RlcGVuZGVuY2llc0NhbGVuZGFyJyxcbiAgICAgICAgJ2RlcGVuZGVuY2llc0RhdGEnLFxuICAgICAgICAnZGVwZW5kZW5jeU1vZGVsQ2xhc3MnLFxuICAgICAgICAnZGVwZW5kZW5jeVN0b3JlJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2RpcmVjdGlvbicsXG4gICAgICAgICdlbmFibGVQcm9ncmVzc05vdGlmaWNhdGlvbnMnLFxuICAgICAgICAnZW5jb2RlcicsXG4gICAgICAgICdlbmREYXRlJyxcbiAgICAgICAgJ2V2ZW50c0RhdGEnLFxuICAgICAgICAnZXZlbnRTdG9yZScsXG4gICAgICAgICdleHBhbmRlZCcsXG4gICAgICAgICdmb3JjZVN5bmMnLFxuICAgICAgICAnaG91cnNQZXJEYXknLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaWdub3JlQ29uc3RyYWludHNPbkNvbmZsaWN0RHVyaW5nU2Vjb25kUGFzcycsXG4gICAgICAgICdpZ25vcmVSZW1vdGVDaGFuZ2VzSW5TVE0nLFxuICAgICAgICAnaW5jbHVkZUFzYXBBbGFwQXNDb25zdHJhaW50cycsXG4gICAgICAgICdpbmNsdWRlQ2hpbGRyZW5JblJlbW92ZVJlcXVlc3QnLFxuICAgICAgICAnaW5jbHVkZUxlZ2FjeURhdGFQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ2lzRnVsbHlMb2FkZWQnLFxuICAgICAgICAnanNvbicsXG4gICAgICAgICdsYXp5TG9hZCcsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9hZFVybCcsXG4gICAgICAgICdtYXhDYWxlbmRhclJhbmdlJyxcbiAgICAgICAgJ21heENyaXRpY2FsUGF0aHNDb3VudCcsXG4gICAgICAgICduYW1lJyxcbiAgICAgICAgJ29yZGVyZWRQYXJlbnRJbmRleCcsXG4gICAgICAgICdwYWdlU2l6ZScsXG4gICAgICAgICdwYXJlbnRJZCcsXG4gICAgICAgICdwYXJlbnRJbmRleCcsXG4gICAgICAgICdwaGFudG9tSWRGaWVsZCcsXG4gICAgICAgICdwaGFudG9tUGFyZW50SWRGaWVsZCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZW1vdGVDaGlsZENvdW50JyxcbiAgICAgICAgJ3JlbW90ZVBhZ2luZycsXG4gICAgICAgICdyZXF1ZXN0RGF0YScsXG4gICAgICAgICdyZXNldElkc0JlZm9yZVN5bmMnLFxuICAgICAgICAncmVzZXRVbmRvUmVkb1F1ZXVlc0FmdGVyTG9hZCcsXG4gICAgICAgICdyZXNvdXJjZU1vZGVsQ2xhc3MnLFxuICAgICAgICAncmVzb3VyY2VzJyxcbiAgICAgICAgJ3Jlc291cmNlc0RhdGEnLFxuICAgICAgICAncmVzb3VyY2VTdG9yZScsXG4gICAgICAgICdyZXNvdXJjZVN0b3JlQ2xhc3MnLFxuICAgICAgICAnc2hvdWxkU3luY0RhdGFPbkxvYWQnLFxuICAgICAgICAnc2lsZW5jZUluaXRpYWxDb21taXQnLFxuICAgICAgICAnc2tpcE5vbldvcmtpbmdUaW1lSW5EdXJhdGlvbldoZW5TY2hlZHVsaW5nTWFudWFsbHknLFxuICAgICAgICAnc2tpcE5vbldvcmtpbmdUaW1lV2hlblNjaGVkdWxpbmdNYW51YWxseScsXG4gICAgICAgICdza2lwU3VjY2Vzc1Byb3BlcnR5JyxcbiAgICAgICAgJ3N0YXJ0RGF0ZScsXG4gICAgICAgICdzdGFydGVkVGFza1NjaGVkdWxpbmcnLFxuICAgICAgICAnc3RhdHVzRGF0ZScsXG4gICAgICAgICdzdG0nLFxuICAgICAgICAnc3RvcmVJZFByb3BlcnR5JyxcbiAgICAgICAgJ3N1cHBvcnRTaG9ydFN5bmNSZXNwb25zZScsXG4gICAgICAgICdzeW5jQXBwbHlTZXF1ZW5jZScsXG4gICAgICAgICdzeW5jVXJsJyxcbiAgICAgICAgJ3Rhc2tNb2RlbENsYXNzJyxcbiAgICAgICAgJ3Rhc2tzJyxcbiAgICAgICAgJ3Rhc2tzRGF0YScsXG4gICAgICAgICd0YXNrU3RvcmUnLFxuICAgICAgICAndGFza1N0b3JlQ2xhc3MnLFxuICAgICAgICAndGltZVJhbmdlcycsXG4gICAgICAgICd0aW1lUmFuZ2VzRGF0YScsXG4gICAgICAgICd0aW1lUmFuZ2VTdG9yZScsXG4gICAgICAgICd0aW1lWm9uZScsXG4gICAgICAgICd0b0pTT05SZXN1bHRGb3JtYXQnLFxuICAgICAgICAndHJhY2tQcm9qZWN0TW9kZWxDaGFuZ2VzJyxcbiAgICAgICAgJ3RyYWNrUmVzcG9uc2VUeXBlJyxcbiAgICAgICAgJ3RyYW5zcG9ydCcsXG4gICAgICAgICd1c2VSYXdEYXRhJyxcbiAgICAgICAgJ3ZhbGlkYXRlUmVzcG9uc2UnLFxuICAgICAgICAnd3JpdGVBbGxGaWVsZHMnXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtQ29uZmlnc09ubHk6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWRqdXN0RHVyYXRpb25Ub0RTVCcsXG4gICAgICAgICdhc3NpZ25tZW50TW9kZWxDbGFzcycsXG4gICAgICAgICdhc3NpZ25tZW50c0RhdGEnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlQ2xhc3MnLFxuICAgICAgICAnYXV0b0xvYWQnLFxuICAgICAgICAnYXV0b1NldENvbnN0cmFpbnRzJyxcbiAgICAgICAgJ2F1dG9TeW5jJyxcbiAgICAgICAgJ2F1dG9TeW5jVGltZW91dCcsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnYndjQ29uZmxpY3RQb3N0cG9uZScsXG4gICAgICAgICdjYWxlbmRhck1hbmFnZXJTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2NhbGVuZGFyTW9kZWxDbGFzcycsXG4gICAgICAgICdjYWxlbmRhcnNEYXRhJyxcbiAgICAgICAgJ2NoaWxkcmVuJyxcbiAgICAgICAgJ2RlbGF5Q2FsY3VsYXRpb24nLFxuICAgICAgICAnZGVwZW5kZW5jaWVzRGF0YScsXG4gICAgICAgICdkZXBlbmRlbmN5TW9kZWxDbGFzcycsXG4gICAgICAgICdkZXBlbmRlbmN5U3RvcmVDbGFzcycsXG4gICAgICAgICdlbmNvZGVyJyxcbiAgICAgICAgJ2V2ZW50c0RhdGEnLFxuICAgICAgICAnZXhwYW5kZWQnLFxuICAgICAgICAnaW5jbHVkZUFzYXBBbGFwQXNDb25zdHJhaW50cycsXG4gICAgICAgICdpbmNsdWRlQ2hpbGRyZW5JblJlbW92ZVJlcXVlc3QnLFxuICAgICAgICAnbGlzdGVuZXJzJyxcbiAgICAgICAgJ21heENhbGVuZGFyUmFuZ2UnLFxuICAgICAgICAnb3JkZXJlZFBhcmVudEluZGV4JyxcbiAgICAgICAgJ3BhZ2VTaXplJyxcbiAgICAgICAgJ3BhcmVudEluZGV4JyxcbiAgICAgICAgJ3BoYW50b21JZEZpZWxkJyxcbiAgICAgICAgJ3BoYW50b21QYXJlbnRJZEZpZWxkJyxcbiAgICAgICAgJ3JlbW90ZVBhZ2luZycsXG4gICAgICAgICdyZXF1ZXN0RGF0YScsXG4gICAgICAgICdyZXNldElkc0JlZm9yZVN5bmMnLFxuICAgICAgICAncmVzZXRVbmRvUmVkb1F1ZXVlc0FmdGVyTG9hZCcsXG4gICAgICAgICdyZXNvdXJjZU1vZGVsQ2xhc3MnLFxuICAgICAgICAncmVzb3VyY2VzRGF0YScsXG4gICAgICAgICdyZXNvdXJjZVN0b3JlQ2xhc3MnLFxuICAgICAgICAnc2lsZW5jZUluaXRpYWxDb21taXQnLFxuICAgICAgICAnc2tpcFN1Y2Nlc3NQcm9wZXJ0eScsXG4gICAgICAgICdzdG9yZUlkUHJvcGVydHknLFxuICAgICAgICAnc3VwcG9ydFNob3J0U3luY1Jlc3BvbnNlJyxcbiAgICAgICAgJ3Rhc2tNb2RlbENsYXNzJyxcbiAgICAgICAgJ3Rhc2tzRGF0YScsXG4gICAgICAgICd0YXNrU3RvcmVDbGFzcycsXG4gICAgICAgICd0aW1lUmFuZ2VzRGF0YScsXG4gICAgICAgICd0b0pTT05SZXN1bHRGb3JtYXQnLFxuICAgICAgICAndHJhY2tSZXNwb25zZVR5cGUnLFxuICAgICAgICAndHJhbnNwb3J0JyxcbiAgICAgICAgJ3VzZVJhd0RhdGEnLFxuICAgICAgICAndmFsaWRhdGVSZXNwb25zZScsXG4gICAgICAgICd3cml0ZUFsbEZpZWxkcydcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bVByb3BzOiBzdHJpbmdbXSA9IEJyeW50dW1HYW50dFByb2plY3RNb2RlbENvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhZGRDb25zdHJhaW50T25EYXRlU2V0JyxcbiAgICAgICAgJ2FsbENoaWxkcmVuJyxcbiAgICAgICAgJ2FsbG93UG9zdHBvbmVkQ29uZmxpY3RzJyxcbiAgICAgICAgJ2FsbFVuZmlsdGVyZWRDaGlsZHJlbicsXG4gICAgICAgICdhc3NpZ25tZW50cycsXG4gICAgICAgICdhc3NpZ25tZW50U3RvcmUnLFxuICAgICAgICAnYXV0b0NhbGN1bGF0ZVBlcmNlbnREb25lRm9yUGFyZW50VGFza3MnLFxuICAgICAgICAnYXV0b01lcmdlQWRqYWNlbnRTZWdtZW50cycsXG4gICAgICAgICdhdXRvUG9zdHBvbmVDb25mbGljdHMnLFxuICAgICAgICAnYXV0b1Bvc3Rwb25lZENvbmZsaWN0cycsXG4gICAgICAgICdhdXRvU2NoZWR1bGVNYW51YWxUYXNrc09uU2Vjb25kUGFzcycsXG4gICAgICAgICdjYWxlbmRhcicsXG4gICAgICAgICdjYWxlbmRhck1hbmFnZXJTdG9yZScsXG4gICAgICAgICdjYWxlbmRhcnMnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjcml0aWNhbFBhdGhzJyxcbiAgICAgICAgJ2NydWRTdG9yZXMnLFxuICAgICAgICAnZGF5c1Blck1vbnRoJyxcbiAgICAgICAgJ2RheXNQZXJXZWVrJyxcbiAgICAgICAgJ2RlcGVuZGVuY2llcycsXG4gICAgICAgICdkZXBlbmRlbmNpZXNDYWxlbmRhcicsXG4gICAgICAgICdkZXBlbmRlbmN5U3RvcmUnLFxuICAgICAgICAnZGVzY2VuZGFudENvdW50JyxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2RpcmVjdGlvbicsXG4gICAgICAgICdlbmFibGVQcm9ncmVzc05vdGlmaWNhdGlvbnMnLFxuICAgICAgICAnZW5kRGF0ZScsXG4gICAgICAgICdldmVudFN0b3JlJyxcbiAgICAgICAgJ2ZvcmNlU3luYycsXG4gICAgICAgICdoYXNHZW5lcmF0ZWRJZCcsXG4gICAgICAgICdob3Vyc1BlckRheScsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdpZ25vcmVDb25zdHJhaW50c09uQ29uZmxpY3REdXJpbmdTZWNvbmRQYXNzJyxcbiAgICAgICAgJ2lnbm9yZVJlbW90ZUNoYW5nZXNJblNUTScsXG4gICAgICAgICdpbmNsdWRlTGVnYWN5RGF0YVByb3BlcnRpZXMnLFxuICAgICAgICAnaW5saW5lRGF0YScsXG4gICAgICAgICdpbnRlcm5hbElkJyxcbiAgICAgICAgJ2lzQ29tbWl0dGluZycsXG4gICAgICAgICdpc0NyZWF0aW5nJyxcbiAgICAgICAgJ2lzRnVsbHlMb2FkZWQnLFxuICAgICAgICAnaXNWYWxpZCcsXG4gICAgICAgICdqc29uJyxcbiAgICAgICAgJ2xhenlMb2FkJyxcbiAgICAgICAgJ2xvYWRVcmwnLFxuICAgICAgICAnbWF4Q3JpdGljYWxQYXRoc0NvdW50JyxcbiAgICAgICAgJ25hbWUnLFxuICAgICAgICAncGFyZW50SWQnLFxuICAgICAgICAncHJldmlvdXNTaWJsaW5nc1RvdGFsQ291bnQnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVtb3RlQ2hpbGRDb3VudCcsXG4gICAgICAgICdyZXNvdXJjZXMnLFxuICAgICAgICAncmVzb3VyY2VTdG9yZScsXG4gICAgICAgICdzZWdtZW50TW9kZWxDbGFzcycsXG4gICAgICAgICdzaG91bGRTeW5jRGF0YU9uTG9hZCcsXG4gICAgICAgICdza2lwTm9uV29ya2luZ1RpbWVJbkR1cmF0aW9uV2hlblNjaGVkdWxpbmdNYW51YWxseScsXG4gICAgICAgICdza2lwTm9uV29ya2luZ1RpbWVXaGVuU2NoZWR1bGluZ01hbnVhbGx5JyxcbiAgICAgICAgJ3N0YXJ0RGF0ZScsXG4gICAgICAgICdzdGFydGVkVGFza1NjaGVkdWxpbmcnLFxuICAgICAgICAnc3RhdHVzRGF0ZScsXG4gICAgICAgICdzdG0nLFxuICAgICAgICAnc3luY0FwcGx5U2VxdWVuY2UnLFxuICAgICAgICAnc3luY1VybCcsXG4gICAgICAgICd0YXNrcycsXG4gICAgICAgICd0YXNrU3RvcmUnLFxuICAgICAgICAndGltZVJhbmdlcycsXG4gICAgICAgICd0aW1lUmFuZ2VTdG9yZScsXG4gICAgICAgICd0aW1lWm9uZScsXG4gICAgICAgICd0cmFja1Byb2plY3RNb2RlbENoYW5nZXMnLFxuICAgICAgICAndmlzaWJsZURlc2NlbmRhbnRDb3VudCdcbiAgICBdKTtcblxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgICBwdWJsaWMgaW5zdGFuY2UhOiBQcm9qZWN0TW9kZWw7XG5cbiAgICBwcml2YXRlIGJyeW50dW1Db25maWcgPSB7XG4gICAgICAgIGFkb3B0ICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGFwcGVuZFRvICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGhyZWYgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGFuZ3VsYXJDb21wb25lbnQgOiB0aGlzLFxuICAgICAgICBmZWF0dXJlcyAgICAgICAgIDoge30sXG4gICAgICAgIGxpc3RlbmVycyAgICAgICAgOiB7fVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlncyBvbmx5XG4gICAgQElucHV0KCkgYWRqdXN0RHVyYXRpb25Ub0RTVCAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFzc2lnbm1lbnRNb2RlbENsYXNzICAgICAgICAgICAhIDogdHlwZW9mIEFzc2lnbm1lbnRNb2RlbDtcbiAgICBASW5wdXQoKSBhc3NpZ25tZW50c0RhdGEgICAgICAgICAgICAgICAgISA6IEFzc2lnbm1lbnRNb2RlbENvbmZpZ1tdfEFzc2lnbm1lbnRNb2RlbFtdO1xuICAgIEBJbnB1dCgpIGFzc2lnbm1lbnRTdG9yZUNsYXNzICAgICAgICAgICAhIDogdHlwZW9mIEFzc2lnbm1lbnRTdG9yZTtcbiAgICBASW5wdXQoKSBhdXRvTG9hZCAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b1NldENvbnN0cmFpbnRzICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGF1dG9TeW5jICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhdXRvU3luY1RpbWVvdXQgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBidWJibGVFdmVudHMgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBid2NDb25mbGljdFBvc3Rwb25lICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2FsZW5kYXJNYW5hZ2VyU3RvcmVDbGFzcyAgICAgICEgOiB0eXBlb2YgQ2FsZW5kYXJNYW5hZ2VyU3RvcmU7XG4gICAgQElucHV0KCkgY2FsZW5kYXJNb2RlbENsYXNzICAgICAgICAgICAgICEgOiB0eXBlb2YgQ2FsZW5kYXJNb2RlbDtcbiAgICBASW5wdXQoKSBjYWxlbmRhcnNEYXRhICAgICAgICAgICAgICAgICAgISA6IENhbGVuZGFyTW9kZWxDb25maWdbXXxDYWxlbmRhck1vZGVsW107XG4gICAgQElucHV0KCkgY2hpbGRyZW4gICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdFtdfE1vZGVsW118TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBkZWxheUNhbGN1bGF0aW9uICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGVwZW5kZW5jaWVzRGF0YSAgICAgICAgICAgICAgICEgOiBEZXBlbmRlbmN5TW9kZWxDb25maWdbXXxEZXBlbmRlbmN5TW9kZWxbXTtcbiAgICBASW5wdXQoKSBkZXBlbmRlbmN5TW9kZWxDbGFzcyAgICAgICAgICAgISA6IHR5cGVvZiBEZXBlbmRlbmN5TW9kZWw7XG4gICAgQElucHV0KCkgZGVwZW5kZW5jeVN0b3JlQ2xhc3MgICAgICAgICAgICEgOiB0eXBlb2YgRGVwZW5kZW5jeVN0b3JlO1xuICAgIEBJbnB1dCgpIGVuY29kZXIgICAgICAgICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICByZXF1ZXN0RGF0YT86IG9iamVjdFxuICAgIH07XG4gICAgQElucHV0KCkgZXZlbnRzRGF0YSAgICAgICAgICAgICAgICAgICAgICEgOiBUYXNrTW9kZWxDb25maWdbXXxUYXNrTW9kZWxbXTtcbiAgICBASW5wdXQoKSBleHBhbmRlZCAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5jbHVkZUFzYXBBbGFwQXNDb25zdHJhaW50cyAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGluY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdCAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICAgISA6IFByb2plY3RNb2RlbExpc3RlbmVycztcbiAgICBASW5wdXQoKSBtYXhDYWxlbmRhclJhbmdlICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBvcmRlcmVkUGFyZW50SW5kZXggICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwYWdlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwYXJlbnRJbmRleCAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwaGFudG9tSWRGaWVsZCAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBwaGFudG9tUGFyZW50SWRGaWVsZCAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSByZW1vdGVQYWdpbmcgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVxdWVzdERhdGEgICAgICAgICAgICAgICAgICAgICEgOiAocGFyYW1zOiBMYXp5TG9hZENydWRNYW5hZ2VyUmVxdWVzdFBhcmFtcykgPT4gUHJvbWlzZTxDcnVkTWFuYWdlclJlcXVlc3RSZXNwb25zZT47XG4gICAgQElucHV0KCkgcmVzZXRJZHNCZWZvcmVTeW5jICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlc2V0VW5kb1JlZG9RdWV1ZXNBZnRlckxvYWQgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNvdXJjZU1vZGVsQ2xhc3MgICAgICAgICAgICAgISA6IHR5cGVvZiBSZXNvdXJjZU1vZGVsO1xuICAgIEBJbnB1dCgpIHJlc291cmNlc0RhdGEgICAgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VNb2RlbENvbmZpZ1tdfFJlc291cmNlTW9kZWxbXTtcbiAgICBASW5wdXQoKSByZXNvdXJjZVN0b3JlQ2xhc3MgICAgICAgICAgICAgISA6IHR5cGVvZiBSZXNvdXJjZVN0b3JlO1xuICAgIEBJbnB1dCgpIHNpbGVuY2VJbml0aWFsQ29tbWl0ICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBza2lwU3VjY2Vzc1Byb3BlcnR5ICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RvcmVJZFByb3BlcnR5ICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc3VwcG9ydFNob3J0U3luY1Jlc3BvbnNlICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHRhc2tNb2RlbENsYXNzICAgICAgICAgICAgICAgICAhIDogdHlwZW9mIFRhc2tNb2RlbDtcbiAgICBASW5wdXQoKSB0YXNrc0RhdGEgICAgICAgICAgICAgICAgICAgICAgISA6IFRhc2tNb2RlbENvbmZpZ1tdfFRhc2tNb2RlbFtdO1xuICAgIEBJbnB1dCgpIHRhc2tTdG9yZUNsYXNzICAgICAgICAgICAgICAgICAhIDogdHlwZW9mIFRhc2tTdG9yZTtcbiAgICBASW5wdXQoKSB0aW1lUmFuZ2VzRGF0YSAgICAgICAgICAgICAgICAgISA6IFRpbWVTcGFuQ29uZmlnW118VGltZVNwYW5bXTtcbiAgICBASW5wdXQoKSB0b0pTT05SZXN1bHRGb3JtYXQgICAgICAgICAgICAgISA6ICdpbmxpbmVEYXRhJ3wnbW9kZWwnO1xuICAgIEBJbnB1dCgpIHRyYWNrUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0cmFuc3BvcnQgICAgICAgICAgICAgICAgICAgICAgISA6IHtcbiAgICAgICAgbG9hZD86IG9iamVjdFxuICAgICAgICBzeW5jPzogb2JqZWN0XG4gICAgfTtcbiAgICBASW5wdXQoKSB1c2VSYXdEYXRhICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdmFsaWRhdGVSZXNwb25zZSAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHdyaXRlQWxsRmllbGRzICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcblxuICAgIC8vIENvbmZpZ3MgYW5kIHByb3BlcnRpZXNcbiAgICBASW5wdXQoKSBhZGRDb25zdHJhaW50T25EYXRlU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhbGxvd1Bvc3Rwb25lZENvbmZsaWN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhc3NpZ25tZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogQXNzaWdubWVudE1vZGVsW118QXNzaWdubWVudE1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgYXNzaWdubWVudFN0b3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IEFzc2lnbm1lbnRTdG9yZXxBc3NpZ25tZW50U3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgYXV0b0NhbGN1bGF0ZVBlcmNlbnREb25lRm9yUGFyZW50VGFza3MgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b01lcmdlQWRqYWNlbnRTZWdtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b1Bvc3Rwb25lQ29uZmxpY3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b1Bvc3Rwb25lZENvbmZsaWN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b1NjaGVkdWxlTWFudWFsVGFza3NPblNlY29uZFBhc3MgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2FsZW5kYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IENhbGVuZGFyTW9kZWx8c3RyaW5nfENhbGVuZGFyTW9kZWxDb25maWc7XG4gICAgQElucHV0KCkgY2FsZW5kYXJNYW5hZ2VyU3RvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IENhbGVuZGFyTWFuYWdlclN0b3JlfENhbGVuZGFyTWFuYWdlclN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNhbGVuZGFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBDYWxlbmRhck1vZGVsW118Q2FsZW5kYXJNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGNhbGxPbkZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNydWRTdG9yZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBDcnVkTWFuYWdlclN0b3JlRGVzY3JpcHRvcltdfFN0b3JlW118c3RyaW5nW118U3RvcmVDb25maWdbXTtcbiAgICBASW5wdXQoKSBkYXlzUGVyTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGRheXNQZXJXZWVrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgZGVwZW5kZW5jaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IERlcGVuZGVuY3lNb2RlbFtdfERlcGVuZGVuY3lNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGRlcGVuZGVuY2llc0NhbGVuZGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAnVG9FdmVudCd8J0Zyb21FdmVudCd8J1Byb2plY3QnfCdBbGxXb3JraW5nJztcbiAgICBASW5wdXQoKSBkZXBlbmRlbmN5U3RvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogRGVwZW5kZW5jeVN0b3JlfERlcGVuZGVuY3lTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAnRm9yd2FyZCd8J0JhY2t3YXJkJztcbiAgICBASW5wdXQoKSBlbmFibGVQcm9ncmVzc05vdGlmaWNhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBlbmREYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfERhdGU7XG4gICAgQElucHV0KCkgZXZlbnRTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFRhc2tTdG9yZXxUYXNrU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgZm9yY2VTeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaG91cnNQZXJEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBpZ25vcmVDb25zdHJhaW50c09uQ29uZmxpY3REdXJpbmdTZWNvbmRQYXNzICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpZ25vcmVSZW1vdGVDaGFuZ2VzSW5TVE0gICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbmNsdWRlTGVnYWN5RGF0YVByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc0Z1bGx5TG9hZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBqc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGxhenlMb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtsYXp5TG9hZDogeyBjaHVua1NpemU6IG51bWJlciB9LCBidWZmZXJVbml0OiBEdXJhdGlvblVuaXQsIGJ1ZmZlckFtb3VudDogbnVtYmVyfTtcbiAgICBASW5wdXQoKSBsb2FkVXJsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heENyaXRpY2FsUGF0aHNDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBwYXJlbnRJZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZ3xudWxsO1xuICAgIEBJbnB1dCgpIHJlYWRPbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbW90ZUNoaWxkQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlc291cmNlTW9kZWxbXXxSZXNvdXJjZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgcmVzb3VyY2VTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlc291cmNlU3RvcmV8UmVzb3VyY2VTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBzaG91bGRTeW5jRGF0YU9uTG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogKG9wdGlvbnM6IHsgc3RvcmU6IFN0b3JlLCByZWNvcmRzOiBNb2RlbCwgZGF0YTogb2JqZWN0W10gfSkgPT4gU2V0PGFueT58Ym9vbGVhbjtcbiAgICBASW5wdXQoKSBza2lwTm9uV29ya2luZ1RpbWVJbkR1cmF0aW9uV2hlblNjaGVkdWxpbmdNYW51YWxseSAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBza2lwTm9uV29ya2luZ1RpbWVXaGVuU2NoZWR1bGluZ01hbnVhbGx5ICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzdGFydERhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfERhdGU7XG4gICAgQElucHV0KCkgc3RhcnRlZFRhc2tTY2hlZHVsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBzdGF0dXNEYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogRGF0ZTtcbiAgICBASW5wdXQoKSBzdG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogQ29yZVN0YXRlVHJhY2tpbmdNYW5hZ2VyfFN0YXRlVHJhY2tpbmdNYW5hZ2VyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHN5bmNBcHBseVNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmdbXXxDcnVkTWFuYWdlclN0b3JlRGVzY3JpcHRvcltdO1xuICAgIEBJbnB1dCgpIHN5bmNVcmwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFRhc2tNb2RlbFtdfFRhc2tNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHRhc2tTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBUYXNrU3RvcmV8VGFza1N0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRpbWVSYW5nZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBUaW1lUmFuZ2VNb2RlbFtdfFRpbWVSYW5nZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgdGltZVJhbmdlU3RvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFN0b3JlfFRpbWVSYW5nZVN0b3JlQ29uZmlnfFRpbWVSYW5nZVN0b3JlO1xuICAgIEBJbnB1dCgpIHRpbWVab25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIHRyYWNrUHJvamVjdE1vZGVsQ2hhbmdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuXG4gICAgLy8gUHJvcGVydGllcyBvbmx5XG4gICAgQElucHV0KCkgYWxsQ2hpbGRyZW4gICAgICAgICAgICAgICAgISA6IE1vZGVsW107XG4gICAgQElucHV0KCkgYWxsVW5maWx0ZXJlZENoaWxkcmVuICAgICAgISA6IE1vZGVsW107XG4gICAgQElucHV0KCkgY3JpdGljYWxQYXRocyAgICAgICAgICAgICAgISA6IGFueVtdO1xuICAgIEBJbnB1dCgpIGRlc2NlbmRhbnRDb3VudCAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgaGFzR2VuZXJhdGVkSWQgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5saW5lRGF0YSAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBpbnRlcm5hbElkICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGlzQ29tbWl0dGluZyAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzQ3JlYXRpbmcgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzVmFsaWQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXZpb3VzU2libGluZ3NUb3RhbENvdW50ICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgc2VnbWVudE1vZGVsQ2xhc3MgICAgICAgICAgISA6IHR5cGVvZiBFdmVudFNlZ21lbnRNb2RlbDtcbiAgICBASW5wdXQoKSB2aXNpYmxlRGVzY2VuZGFudENvdW50ICAgICAhIDogbnVtYmVyO1xuXG4gICAgLy8gRXZlbnRzIGVtaXR0ZXJzXG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgW2xvYWQgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9TY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tbG9hZCkgaXMgc2VudC4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIGxvYWQgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucGFjayBUaGUgZGF0YSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIGRhdGEgZm9yIGFsbCBzdG9yZXMgbWFuYWdlZCBieSB0aGUgY3J1ZCBtYW5hZ2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUxvYWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHBhY2s6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBsb2FkZWQgZGF0YSBnZXQgYXBwbGllZCB0byB0aGUgc3RvcmVzLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGRhdGEgYXBwbHlpbmcuXG4gICAgICogVGhpcyBldmVudCBjYW4gYmUgdXNlZCBmb3Igc2VydmVyIGRhdGEgcHJlcHJvY2Vzc2luZy4gVG8gYWNoaWV2ZSBpdCB1c2VyIGNhbiBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5vcHRpb25zIE9wdGlvbnMgcHJvdmlkZWQgdG8gdGhlIFtsb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBtZXRob2QuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlTG9hZEFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXNwb25zZTogb2JqZWN0LCBvcHRpb25zOiBvYmplY3QgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgc2VydmVyIHJlc3BvbnNlIGdldHMgYXBwbGllZCB0byB0aGUgc3RvcmVzLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGRhdGEgYXBwbHlpbmcuXG4gICAgICogVGhpcyBldmVudCBjYW4gYmUgdXNlZCBmb3Igc2VydmVyIGRhdGEgcHJlcHJvY2Vzc2luZy4gVG8gYWNoaWV2ZSBpdCB1c2VyIGNhbiBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7J3N5bmMnLCdsb2FkJ30gZXZlbnQucmVxdWVzdFR5cGUgVGhlIHJlcXVlc3QgdHlwZSAoYHN5bmNgIG9yIGBsb2FkYCkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUmVzcG9uc2VBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVxdWVzdFR5cGU6ICdzeW5jJ3wnbG9hZCcsIHJlc3BvbnNlOiBvYmplY3QgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYSByZXF1ZXN0IGlzIHNlbnQgdG8gdGhlIHNlcnZlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtYmVmb3JlU2VuZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5jcnVkTWFuYWdlciBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYXJhbXMgSFRUUCByZXF1ZXN0IHBhcmFtcyB0byBiZSBwYXNzZWQgaW4gdGhlIHJlcXVlc3QgVVJMLlxuICAgICAqIEBwYXJhbSB7J3N5bmMnLCdsb2FkJ30gZXZlbnQucmVxdWVzdFR5cGUgQ3J1ZE1hbmFnZXIgcmVxdWVzdCB0eXBlIChgbG9hZGAvYHN5bmNgKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXF1ZXN0Q29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBBamF4IHJlcXVlc3QgY2FsbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNlbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjcnVkTWFuYWdlcjogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFyYW1zOiBvYmplY3QsIHJlcXVlc3RUeXBlOiAnc3luYyd8J2xvYWQnLCByZXF1ZXN0Q29uZmlnOiBvYmplY3QgfSkgPT4gUHJvbWlzZTx2b2lkPil8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBbc3luYyByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1zeW5jKSBpcyBzZW50LiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgc3luYyByZXF1ZXN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1iZWZvcmVTeW5jKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3luYzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFjazogb2JqZWN0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIHN5bmMgcmVzcG9uc2UgZGF0YSBnZXQgYXBwbGllZCB0byB0aGUgc3RvcmVzLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGRhdGEgYXBwbHlpbmcuXG4gICAgICogVGhpcyBldmVudCBjYW4gYmUgdXNlZCBmb3Igc2VydmVyIGRhdGEgcHJlcHJvY2Vzc2luZy4gVG8gYWNoaWV2ZSBpdCB1c2VyIGNhbiBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN5bmNBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW55IG90aGVyIGV2ZW50IGlzIGZpcmVkIGZyb20gdGhlIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtY2F0Y2hBbGwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7e1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfX0gZXZlbnQuZXZlbnQgVGhlIE9iamVjdCB0aGF0IGNvbnRhaW5zIGV2ZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZXZlbnQudHlwZSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQgd2hpY2ggaXMgY2F1Z2h0IGJ5IHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNhdGNoQWxsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHtba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ30pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGRhdGEgaW4gYW55IG9mIHRoZSBwcm9qZWN0cyBzdG9yZXMgY2hhbmdlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtY2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dhbnR0Lm1vZGVsLlByb2plY3RNb2RlbH0gZXZlbnQuc291cmNlIFRoaXMgcHJvamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLlN0b3JlfSBldmVudC5zdG9yZSBBZmZlY3RlZCBzdG9yZVxuICAgICAqIEBwYXJhbSB7J3JlbW92ZScsJ3JlbW92ZUFsbCcsJ2FkZCcsJ2NsZWFyY2hhbmdlcycsJ2ZpbHRlcicsJ3VwZGF0ZScsJ2RhdGFzZXQnLCdyZXBsYWNlJ30gZXZlbnQuYWN0aW9uIE5hbWUgb2YgYWN0aW9uIHdoaWNoIHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBNYXkgYmUgb25lIG9mIHRoZSBvcHRpb25zIGxpc3RlZCBhYm92ZS5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIENoYW5nZWQgcmVjb3JkLCBmb3IgYWN0aW9ucyB0aGF0IGFmZmVjdHMgZXhhY3RseSBvbmUgcmVjb3JkIChgJ3VwZGF0ZSdgKVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnJlY29yZHMgQ2hhbmdlZCByZWNvcmRzLCBwYXNzZWQgZm9yIGFsbCBhY3Rpb25zIGV4Y2VwdCBgJ3JlbW92ZUFsbCdgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNoYW5nZXMgUGFzc2VkIGZvciB0aGUgYCd1cGRhdGUnYCBhY3Rpb24sIGluZm8gb24gd2hpY2ggcmVjb3JkIGZpZWxkcyBjaGFuZ2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQcm9qZWN0TW9kZWwsIHN0b3JlOiBTdG9yZSwgYWN0aW9uOiAncmVtb3ZlJ3wncmVtb3ZlQWxsJ3wnYWRkJ3wnY2xlYXJjaGFuZ2VzJ3wnZmlsdGVyJ3wndXBkYXRlJ3wnZGF0YXNldCd8J3JlcGxhY2UnLCByZWNvcmQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCBjaGFuZ2VzOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIEVuZ2luZSBkZXRlY3RzIGEgY29tcHV0YXRpb24gY3ljbGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5zY2hlZHVsaW5nSXNzdWUgU2NoZWR1bGluZyBlcnJvciBkZXNjcmliaW5nIHRoZSBjYXNlOlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LnNjaGVkdWxpbmdJc3N1ZS5nZXREZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBjeWNsZSBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5zY2hlZHVsaW5nSXNzdWUuY3ljbGUgT2JqZWN0IHByb3ZpZGluZyB0aGUgY3ljbGUgaW5mb1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LnNjaGVkdWxpbmdJc3N1ZS5nZXRSZXNvbHV0aW9ucyBSZXR1cm5zIHBvc3NpYmxlIHJlc29sdXRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY29udGludWVXaXRoUmVzb2x1dGlvblJlc3VsdCBGdW5jdGlvbiB0byBjYWxsIGFmdGVyIGEgcmVzb2x1dGlvbiBpcyBjaG9zZW4gdG8gcHJvY2VlZCB3aXRoIHRoZSBFbmdpbmUgY2FsY3VsYXRpb25zOiBgYGBqYXZhc2NyaXB0IHByb2plY3Qub24oJ2N5Y2xlJywgKHsgY29udGludWVXaXRoUmVzb2x1dGlvblJlc3VsdCB9KSA9PiB7ICAgICAvLyBjYW5jZWwgY2hhbmdlcyBpbiBjYXNlIG9mIGEgY3ljbGUgICAgIGNvbnRpbnVlV2l0aFJlc29sdXRpb25SZXN1bHQoRWZmZWN0UmVzb2x1dGlvblJlc3VsdC5DYW5jZWwpOyB9KSBgYGAgV2hlcmUgYEVmZmVjdFJlc29sdXRpb25SZXN1bHQuQ2FuY2VsYCByZXN1bHRzIGluIGNhbmNlbGxpbmcgdGhlIGNoYW5nZXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ3ljbGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzY2hlZHVsaW5nSXNzdWU6IHsgZ2V0RGVzY3JpcHRpb246IEZ1bmN0aW9uLCBjeWNsZTogb2JqZWN0LCBnZXRSZXNvbHV0aW9uczogRnVuY3Rpb24gfSwgY29udGludWVXaXRoUmVzb2x1dGlvblJlc3VsdDogRnVuY3Rpb24gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIGVuZ2luZSBoYXMgZmluaXNoZWQgaXRzIGNhbGN1bGF0aW9ucyBhbmQgdGhlIHJlc3VsdHMgaGFzIGJlZW4gd3JpdHRlbiBiYWNrIHRvIHRoZSByZWNvcmRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1kYXRhUmVhZHkpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R2FudHQubW9kZWwuUHJvamVjdE1vZGVsfSBldmVudC5zb3VyY2UgVGhlIHByb2plY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzSW5pdGlhbENvbW1pdCBGbGFnIHRoYXQgc2hvd3MgaWYgdGhpcyBjb21taXQgaXMgaW5pdGlhbFxuICAgICAqIEBwYXJhbSB7U2V0PGFueT59IGV2ZW50LnJlY29yZHMgU2V0IG9mIGFsbCBbTW9kZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvQ29yZS9kYXRhL01vZGVsKXMgdGhhdCB3ZXJlIG1vZGlmaWVkIGluIHRoZSBjb21wbGV0ZWQgdHJhbnNhY3Rpb24uIFVzZSB0aGUgW21vZGlmaWNhdGlvbnNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvQ29yZS9kYXRhL01vZGVsI3Byb3BlcnR5LW1vZGlmaWNhdGlvbnMpIHByb3BlcnR5IG9mIGVhY2ggTW9kZWwgdG8gaWRlbnRpZnkgbW9kaWZpZWQgZmllbGRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRhdGFSZWFkeTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogUHJvamVjdE1vZGVsLCBpc0luaXRpYWxDb21taXQ6IGJvb2xlYW4sIHJlY29yZHM6IFNldDxhbnk+IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBFbmdpbmUgZGV0ZWN0cyBhIGNhbGVuZGFyIG1pc2NvbmZpZ3VyYXRpb24gd2hlbiB0aGUgY2FsZW5kYXIgZG9lc1xuICAgICAqIG5vdCBwcm92aWRlIGFueSB3b3JraW5nIHBlcmlvZHMgb2YgdGltZSB3aGljaCBtYWtlcyB1c2FnZSBpbXBvc3NpYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuc2NoZWR1bGluZ0lzc3VlIFNjaGVkdWxpbmcgZXJyb3IgZGVzY3JpYmluZyB0aGUgY2FzZTpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5zY2hlZHVsaW5nSXNzdWUuZ2V0RGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZXJyb3IgZGVzY3JpcHRpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5zY2hlZHVsaW5nSXNzdWUuZ2V0Q2FsZW5kYXIgUmV0dXJucyB0aGUgY2FsZW5kYXIgdGhhdCBtdXN0IGJlIGZpeGVkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuc2NoZWR1bGluZ0lzc3VlLmdldFJlc29sdXRpb25zIFJldHVybnMgcG9zc2libGUgcmVzb2x1dGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jb250aW51ZVdpdGhSZXNvbHV0aW9uUmVzdWx0IEZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgYSByZXNvbHV0aW9uIGlzIGNob3NlbiB0byBwcm9jZWVkIHdpdGggdGhlIEVuZ2luZSBjYWxjdWxhdGlvbnM6IGBgYGphdmFzY3JpcHQgcHJvamVjdC5vbignZW1wdHlDYWxlbmRhcicsICh7IHNjaGVkdWxpbmdJc3N1ZSwgY29udGludWVXaXRoUmVzb2x1dGlvblJlc3VsdCB9KSA9PiB7ICAgICAvLyBhcHBseSB0aGUgZmlyc3QgcmVzb2x1dGlvbiBhbmQgY29udGludWUgICAgIHNjaGVkdWxpbmdJc3N1ZS5nZXRSZXNvbHV0aW9ucygpWzBdLnJlc29sdmUoKTsgICAgIGNvbnRpbnVlV2l0aFJlc29sdXRpb25SZXN1bHQoRWZmZWN0UmVzb2x1dGlvblJlc3VsdC5SZXN1bWUpOyB9KSBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FbXB0eUNhbGVuZGFyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc2NoZWR1bGluZ0lzc3VlOiB7IGdldERlc2NyaXB0aW9uOiBGdW5jdGlvbiwgZ2V0Q2FsZW5kYXI6IEZ1bmN0aW9uLCBnZXRSZXNvbHV0aW9uczogRnVuY3Rpb24gfSwgY29udGludWVXaXRoUmVzb2x1dGlvblJlc3VsdDogRnVuY3Rpb24gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gZGF0YSBpbiBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgZGF0YSBzdG9yZXMgaXMgY2hhbmdlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9HYW50dC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtaGFzQ2hhbmdlcylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IYXNDaGFuZ2VzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiBzdWNjZXNzZnVsIFtsb2FkIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIGNvbXBsZXRpb24gYWZ0ZXIgZGF0YSBnZXRzIGxvYWRlZCB0byB0aGUgc3RvcmVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTG9hZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VPcHRpb25zOiBvYmplY3QsIHJlcXVlc3RPcHRpb25zOiBvYmplY3QsIHJhd1Jlc3BvbnNlOiBhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIFtsb2FkIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIHdhcyBjYW5jZWxlZCBieSBzb21lIFtiZWZvcmVMb2FkXSgjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2V2ZW50LWJlZm9yZUxvYWQpXG4gICAgICogbGlzdGVuZXIgb3IgZHVlIHRvIGluY29tcGxldGUgcHJpb3IgbG9hZCByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTG9hZENhbmNlbGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCBwYWNrOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBbbG9hZCByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBmYWlscy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2UgVGhlIGRlY29kZWQgc2VydmVyIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQucmVzcG9uc2VUZXh0IFRoZSByYXcgc2VydmVyIHJlc3BvbnNlIHRleHRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2VPcHRpb25zIFtERVBSRUNBVEVEXSBzZWUgYHJlcXVlc3RPcHRpb25zYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXF1ZXN0T3B0aW9ucyBUaGUgcmVxdWVzdCBvcHRpb25zIHBhc3NlZCB0byB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yYXdSZXNwb25zZSBUaGUgbmF0aXZlIFJlc3BvbnNlIG9iamVjdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkxvYWRGYWlsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXNwb25zZTogb2JqZWN0LCByZXNwb25zZVRleHQ6IHN0cmluZywgcmVzcG9uc2VPcHRpb25zOiBvYmplY3QsIHJlcXVlc3RPcHRpb25zOiBvYmplY3QsIHJhd1Jlc3BvbnNlOiBhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gcmVnaXN0ZXJlZCBzdG9yZXMgZ2V0IGludG8gc3RhdGUgd2hlbiB0aGV5IGRvbid0IGhhdmUgYW55XG4gICAgICogbm90IHBlcnNpc3RlZCBjaGFuZ2UuIFRoaXMgaGFwcGVucyBhZnRlciBbbG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9TY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tbG9hZCkgb3IgW3N5bmNdKCNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgcmVxdWVzdFxuICAgICAqIGNvbXBsZXRpb24uIE9yIHRoaXMgbWF5IGhhcHBlbiBhZnRlciBhIHJlY29yZCB1cGRhdGUgd2hpY2ggdHVybnMgaXRzIGZpZWxkcyBiYWNrIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1ub0NoYW5nZXMpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTm9DaGFuZ2VzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBkdXJpbmcgdGhlIEVuZ2luZSBjYWxjdWxhdGlvbiBpZiBbZW5hYmxlUHJvZ3Jlc3NOb3RpZmljYXRpb25zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL0dhbnR0L21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctZW5hYmxlUHJvZ3Jlc3NOb3RpZmljYXRpb25zKSBjb25maWcgaXMgYHRydWVgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R2FudHQubW9kZWwuUHJvamVjdE1vZGVsfSBldmVudC5zb3VyY2UgVGhlIG93bmluZyBwcm9qZWN0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnRvdGFsIFRoZSB0b3RhbCBudW1iZXIgb2Ygb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5yZW1haW5pbmcgVGhlIG51bWJlciBvZiByZW1haW5pbmcgb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSB7J3N0b3JlUG9wdWxhdGlvbicsJ3Byb3BhZ2F0aW5nJ30gZXZlbnQucGhhc2UgVGhlIHBoYXNlIG9mIHRoZSBjYWxjdWxhdGlvbiwgZWl0aGVyICdzdG9yZVBvcHVsYXRpb24nIHdoZW4gZGF0YSBpcyBnZXR0aW5nIGxvYWRlZCwgb3IgJ3Byb3BhZ2F0aW5nJyB3aGVuIGRhdGEgaXMgZ2V0dGluZyBjYWxjdWxhdGVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUHJvZ3Jlc3M6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFByb2plY3RNb2RlbCwgdG90YWw6IG51bWJlciwgcmVtYWluaW5nOiBudW1iZXIsIHBoYXNlOiAnc3RvcmVQb3B1bGF0aW9uJ3wncHJvcGFnYXRpbmcnIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiBzdWNjZXNzZnVsIHJlcXVlc3QgY29tcGxldGlvbiBhZnRlciBkYXRhIGdldHMgYXBwbGllZCB0byB0aGUgc3RvcmVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7J3N5bmMnLCdsb2FkJ30gZXZlbnQucmVxdWVzdFR5cGUgVGhlIHJlcXVlc3QgdHlwZSAoYHN5bmNgIG9yIGBsb2FkYCkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXF1ZXN0RG9uZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVxdWVzdFR5cGU6ICdzeW5jJ3wnbG9hZCcsIHJlc3BvbnNlOiBvYmplY3QsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgcmVxdWVzdCBmYWlscy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0geydzeW5jJywnbG9hZCd9IGV2ZW50LnJlcXVlc3RUeXBlIFRoZSByZXF1ZXN0IHR5cGUgKGBzeW5jYCBvciBgbG9hZGApLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5yZXNwb25zZVRleHQgVGhlIHJhdyBzZXJ2ZXIgcmVzcG9uc2UgdGV4dFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVxdWVzdEZhaWw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlcXVlc3RUeXBlOiAnc3luYyd8J2xvYWQnLCByZXNwb25zZTogb2JqZWN0LCByZXNwb25zZVRleHQ6IHN0cmluZywgcmVzcG9uc2VPcHRpb25zOiBvYmplY3QsIHJlcXVlc3RPcHRpb25zOiBvYmplY3QsIHJhd1Jlc3BvbnNlOiBhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgdHJpZ2dlcnMgd2hlbiBhIG5ldyByZXZpc2lvbiBpcyBhZGRlZCB0byB0aGUgcHJvamVjdC4gSXQgaXMgdXNlZCB0byBub3RpZnkgdGhlIGJhY2tlbmQgYWJvdXQgdGhlXG4gICAgICogbmV3IHJldmlzaW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQubG9jYWxSZXZpc2lvbklkIElEIG9mIHRoZSBsb2NhbCByZXZpc2lvbi4gQmFja2VuZCBzaG91bGQgc2VuZCBpdCBpbiB0aGUgYnJvYWRjYXN0IGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY29uZmxpY3RSZXNvbHV0aW9uRm9yIElEIG9mIHRoZSByZXZpc2lvbiB3aXRoIGEgY29uZmxpY3Qgd2hpY2ggd2FzIHJlc29sdmVkIGJ5IHRoaXMgcmV2aXNpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY2xpZW50SWQgSUQgb2YgdGhlIGNsaWVudCBpbnN0YW5jZS4gVXNlZCB0byBkaXN0aW5ndWlzaCBvd24gcmV2aXNpb25zIGZyb20gdGhlIGJyb2FkY2FzdCBjaGFubmVsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNoYW5nZXMgT2JqZWN0IHdpdGggY2hhbmdlcyBjb25zdGl0dXRpbmcgcmV2aXNpb25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXZpc2lvbk5vdGlmaWNhdGlvbjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGxvY2FsUmV2aXNpb25JZDogc3RyaW5nLCBjb25mbGljdFJlc29sdXRpb25Gb3I/OiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcsIGNoYW5nZXM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgRW5naW5lIGRldGVjdHMgYSBzY2hlZHVsaW5nIGNvbmZsaWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuc2NoZWR1bGluZ0lzc3VlIFRoZSBjb25mbGljdCBkZXRhaWxzOlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LnNjaGVkdWxpbmdJc3N1ZS5nZXREZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBjb25mbGljdCBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IGV2ZW50LnNjaGVkdWxpbmdJc3N1ZS5pbnRlcnZhbHMgQXJyYXkgb2YgY29uZmxpY3RpbmcgaW50ZXJ2YWxzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuc2NoZWR1bGluZ0lzc3VlLmdldFJlc29sdXRpb25zIEZ1bmN0aW9uIHRvIGdldCBwb3NzaWJsZSByZXNvbHV0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNvbnRpbnVlV2l0aFJlc29sdXRpb25SZXN1bHQgRnVuY3Rpb24gdG8gY2FsbCBhZnRlciBhIHJlc29sdXRpb24gaXMgY2hvc2VuIHRvIHByb2NlZWQgd2l0aCB0aGUgRW5naW5lIGNhbGN1bGF0aW9uczogYGBgamF2YXNjcmlwdCBwcm9qZWN0Lm9uKCdzY2hlZHVsaW5nQ29uZmxpY3QnLCAoeyBzY2hlZHVsaW5nSXNzdWUsIGNvbnRpbnVlV2l0aFJlc29sdXRpb25SZXN1bHQgfSkgPT4geyAgICAgLy8gYXBwbHkgdGhlIGZpcnN0IHJlc29sdXRpb24gYW5kIGNvbnRpbnVlICAgICBzY2hlZHVsaW5nSXNzdWUuZ2V0UmVzb2x1dGlvbnMoKVswXS5yZXNvbHZlKCk7ICAgICBjb250aW51ZVdpdGhSZXNvbHV0aW9uUmVzdWx0KEVmZmVjdFJlc29sdXRpb25SZXN1bHQuUmVzdW1lKTsgfSkgYGBgIFdoZXJlIGBFZmZlY3RSZXNvbHV0aW9uUmVzdWx0LlJlc3VtZWAgcmVzdWx0cyBpbiBhIHJlc29sdXRpb24gYmVpbmcgYXBwbGllZCBhbmQgY3VycmVudCB0cmFuc2FjdGlvbiBzaG91bGQgYmUgY29udGludWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxpbmdDb25mbGljdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNjaGVkdWxpbmdJc3N1ZTogeyBnZXREZXNjcmlwdGlvbjogRnVuY3Rpb24sIGludGVydmFsczogb2JqZWN0W10sIGdldFJlc29sdXRpb25zOiBGdW5jdGlvbiB9LCBjb250aW51ZVdpdGhSZXNvbHV0aW9uUmVzdWx0OiBGdW5jdGlvbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gc3VjY2Vzc2Z1bCBbc3luYyByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dhbnR0L2RvY3MvYXBpL1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1zeW5jKSBjb21wbGV0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luYzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VPcHRpb25zOiBvYmplY3QsIHJlcXVlc3RPcHRpb25zOiBvYmplY3QsIHJhd1Jlc3BvbnNlOiBhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIHdhcyBjYW5jZWxlZCBieSBzb21lIFtiZWZvcmVTeW5jXSgjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2V2ZW50LWJlZm9yZVN5bmMpIGxpc3RlbmVyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luY0NhbmNlbGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCBwYWNrOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIHdhcyBkZWxheWVkIGR1ZSB0byBpbmNvbXBsZXRlIHByZXZpb3VzIG9uZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuYXJndW1lbnRzIFRoZSBhcmd1bWVudHMgb2YgW3N5bmNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ2FudHQvZG9jcy9hcGkvU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIGNhbGwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luY0RlbGF5ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIGFyZ3VtZW50czogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgW3N5bmMgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9nYW50dC9kb2NzL2FwaS9TY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgZmFpbHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnJlc3BvbnNlVGV4dCBUaGUgcmF3IHNlcnZlciByZXNwb25zZSB0ZXh0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TeW5jRmFpbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VUZXh0OiBzdHJpbmcsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bmRlcmx5aW5nIHdpZGdldFxuICAgICAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgbWUgPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ1xuICAgICAgICAgICAgfSA9IG1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2xhc3MsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdzLFxuICAgICAgICAgICAgICAgIGJyeW50dW1FdmVudHNcbiAgICAgICAgICAgIH0gPSBCcnludHVtR2FudHRQcm9qZWN0TW9kZWxDb21wb25lbnQ7XG5cbiAgICAgICAgYnJ5bnR1bUNvbmZpZ3MuZmlsdGVyKHByb3AgPT4gcHJvcCBpbiB0aGlzKS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShicnludHVtQ29uZmlnLCBwcm9wLCB0aGlzW3Byb3BdKTtcbiAgICAgICAgICAgIGlmIChbJ2ZlYXR1cmVzJywgJ2NvbmZpZyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29uZmlnUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBicnludHVtRXZlbnRzLmZpbHRlcihldmVudCA9PiB0aGlzW2V2ZW50XSAmJiB0aGlzW2V2ZW50XS5vYnNlcnZlcnMubGVuZ3RoID4gMCkuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIHVuY2FwaXRhbGl6ZSA9IChzdHI6IHN0cmluZykgPT4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLFxuICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IChzdHI6IHN0cmluZykgPT4gdW5jYXBpdGFsaXplKHN0ci5zbGljZSgyKSk7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGJyeW50dW1Db25maWcubGlzdGVuZXJzW2V2ZW50TmFtZShldmVudCldID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG1lW2V2ZW50XS5lbWl0KGUpO1xuICAgICAgICAgICAgICAgIC8vIEV2ZW50RW1pdHRlciBkb2VzIG5vdCByZXR1cm4gdmFsdWVzIGluIHRoZSBub3JtYWwgd2F5LCB3b3JrIGFyb3VuZCBpdCBieSBzZXR0aW5nIGByZXR1cm5WYWx1ZWAgZmxhZ1xuICAgICAgICAgICAgICAgIC8vIGluIEFuZ3VsYXIgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUucmV0dXJuVmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiBjb21wb25lbnQgaGFzIG5vIGNvbnRhaW5lciBzcGVjaWZpZWQgaW4gY29uZmlnIHRoZW4gdXNlIGFkb3B0IHRvIFdyYXBwZXIncyBlbGVtZW50XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBjb250YWluZXJQYXJhbSA9IFtcbiAgICAgICAgICAgICAgICAnYWRvcHQnLFxuICAgICAgICAgICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICAgICAgICAgJ2luc2VydEFmdGVyJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QmVmb3JlJ1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIF0uZmluZChwcm9wID0+IGJyeW50dW1Db25maWdbcHJvcF0pO1xuICAgICAgICBpZiAoIWNvbnRhaW5lclBhcmFtKSB7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VOYW1lID09PSAnQnV0dG9uJyB8fCBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b24gc2hvdWxkIGFsd2F5cyBiZSA8YT4gb3IgPGJ1dHRvbj4gaW5zaWRlIG93bmVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFwcGVuZFRvID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5hZG9wdCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ0NvbnRhaW5lcihpbnN0YW5jZU5hbWUsIGNvbnRhaW5lclBhcmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWUuaW5zdGFuY2UgPSBpbnN0YW5jZU5hbWUgPT09ICdXaWRnZXQnID8gV2lkZ2V0LmNyZWF0ZShicnludHVtQ29uZmlnKSA6IG5ldyBpbnN0YW5jZUNsYXNzKGJyeW50dW1Db25maWcpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2F0Y2ggZm9yIGNoYW5nZXNcbiAgICAgKiBAcGFyYW0gY2hhbmdlc1xuICAgICAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICB7IGluc3RhbmNlTmFtZSB9ID0gQnJ5bnR1bUdhbnR0UHJvamVjdE1vZGVsQ29tcG9uZW50O1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBjaGFuZ2VzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpLmZvckVhY2goKFtwcm9wLCBjaGFuZ2VdKSA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gKGNoYW5nZSBhcyBTaW1wbGVDaGFuZ2UpLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIHsgYnJ5bnR1bUNvbmZpZ3NPbmx5LCBicnludHVtUHJvcHMgfSA9IEJyeW50dW1HYW50dFByb2plY3RNb2RlbENvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChicnludHVtUHJvcHMuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGluc3RhbmNlLCBwcm9wLCBuZXdWYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChicnludHVtQ29uZmlnc09ubHkuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nVXBkYXRlUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5pbnN0YW5jZS5kZXN0cm95KSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|