@decaf-ts/db-decorators 0.6.8 → 0.6.10

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.
@@ -2,6 +2,10 @@ import { DBOperations, OperationKeys } from "./constants.js";
2
2
  import { Operations } from "./Operations.js";
3
3
  import { apply } from "@decaf-ts/reflection";
4
4
  import { propMetadata } from "@decaf-ts/decorator-validation";
5
+ import { InternalError } from "./../repository/errors.js";
6
+ import { getHandlerArgs } from "./../repository/utils.js";
7
+ const defaultPriority = 50;
8
+ const DefaultGroupSort = { priority: defaultPriority };
5
9
  /**
6
10
  * @description Internal function to register operation handlers
7
11
  * @summary Registers an operation handler for a specific operation key on a target property
@@ -16,18 +20,120 @@ function handle(op, handler) {
16
20
  Operations.register(handler, op, target, propertyKey);
17
21
  };
18
22
  }
23
+ /**
24
+ * @description Retrieves decorator objects for handling database operations
25
+ * @summary Retrieves a list of decorator objects representing operation handlers for a given model and decorators
26
+ * @template M - Type for the model, defaults to Model<true | false>
27
+ * @template R - Type for the repository, defaults to IRepository<M, F, C>
28
+ * @template V - Type for metadata, defaults to object
29
+ * @template F - Type for repository flags, defaults to RepositoryFlags
30
+ * @template C - Type for context, defaults to Context<F>
31
+ * @param {Model} model - The model for which to retrieve decorator objects
32
+ * @param {Record<string, DecoratorMetadata[]>} decorators - The decorators associated with the model properties
33
+ * @param {string} prefix - The operation prefix (e.g., 'on', 'after')
34
+ * @return {DecoratorObject[]} An array of decorator objects representing operation handlers
35
+ * @function getHandlersDecorators
36
+ * @category Function
37
+ */
38
+ export function getHandlersDecorators(model, decorators, prefix) {
39
+ const accum = [];
40
+ for (const prop in decorators) {
41
+ const decs = decorators[prop];
42
+ for (const dec of decs) {
43
+ const { key } = dec;
44
+ const handlers = Operations.get(model, prop, prefix + key);
45
+ if (!handlers || !handlers.length)
46
+ throw new InternalError(`Could not find registered handler for the operation ${prefix + key} under property ${prop}`);
47
+ const handlerArgs = getHandlerArgs(dec, prop, model);
48
+ if (!handlerArgs || Object.values(handlerArgs).length !== handlers.length)
49
+ throw new InternalError("Args and handlers length do not match");
50
+ for (let i = 0; i < handlers.length; i++) {
51
+ const data = handlerArgs[handlers[i].name]
52
+ .data;
53
+ accum.push({
54
+ handler: handlers[i],
55
+ data: [data],
56
+ prop: [prop],
57
+ });
58
+ }
59
+ }
60
+ }
61
+ return accum;
62
+ }
63
+ /**
64
+ * @description Groups decorators based on their group property
65
+ * @summary Groups decorator objects by their group property, combining data and properties within each group
66
+ * @param {DecoratorObject[]} decorators - The array of decorator objects to group
67
+ * @return {DecoratorObject[]} An array of grouped decorator objects
68
+ * @function groupDecorators
69
+ * @category Function
70
+ */
71
+ export function groupDecorators(decorators) {
72
+ const grouped = decorators.reduce((acc, dec) => {
73
+ if (!dec || !dec.data || !dec.prop)
74
+ throw new InternalError("Missing decorator properties or data");
75
+ // If decorator have no group
76
+ if (!dec.data[0].group) {
77
+ acc.set(Symbol(), dec);
78
+ return acc;
79
+ }
80
+ const groupKey = dec.data[0].group;
81
+ if (!acc.has(groupKey)) {
82
+ // first handler is saved in the group
83
+ acc.set(groupKey, { ...dec });
84
+ }
85
+ else {
86
+ const existing = acc.get(groupKey);
87
+ acc.set(groupKey, {
88
+ handler: existing.handler,
89
+ data: [...existing.data, ...dec.data],
90
+ prop: [...existing.prop, ...dec.prop],
91
+ });
92
+ }
93
+ return acc;
94
+ }, new Map());
95
+ const groups = Array.from(grouped.values());
96
+ // Sort inside each group by priority
97
+ groups.forEach((group) => {
98
+ const combined = group.data.map((d, i) => ({
99
+ data: d,
100
+ prop: group.prop[i],
101
+ }));
102
+ combined.sort((a, b) => (a.data.groupPriority ?? 50) - (b.data.groupPriority ?? 50));
103
+ group.data = combined.map((c) => c.data);
104
+ group.prop = combined.map((c) => c.prop);
105
+ });
106
+ return groups;
107
+ }
108
+ /**
109
+ * @description Sorts decorator objects based on their priority
110
+ * @summary Sorts an array of decorator objects by the priority of their first data element
111
+ * @param {DecoratorObject[]} decorators - The array of decorator objects to sort
112
+ * @return {DecoratorObject[]} The sorted array of decorator objects
113
+ * @function sortDecorators
114
+ * @category Function
115
+ */
116
+ export function sortDecorators(decorators) {
117
+ // Sort by groupPriority
118
+ decorators.sort((a, b) => {
119
+ const priorityA = a.data[0].priority ?? defaultPriority;
120
+ const priorityB = b.data[0].priority ?? defaultPriority;
121
+ return priorityA - priorityB; // lower number = higher priority
122
+ });
123
+ return decorators;
124
+ }
19
125
  /**
20
126
  * @description Decorator for handling create and update operations
21
127
  * @summary Defines a behavior to execute during both create and update operations
22
128
  * @template V - Type for metadata, defaults to object
23
- * @param {StandardOperationHandler<any, any, V, any, any> | UpdateOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
129
+ * @param {GeneralOperationHandler<any, any, V, any, any> | GeneralUpdateOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
24
130
  * @param {V} [data] - Optional metadata to pass to the handler
25
131
  * @return {PropertyDecorator} A decorator that can be applied to class properties
26
132
  * @function onCreateUpdate
27
133
  * @category Property Decorators
28
134
  */
29
- export function onCreateUpdate(handler, data) {
30
- return on(DBOperations.CREATE_UPDATE, handler, data);
135
+ export function onCreateUpdate(handler, data, groupsort) {
136
+ return on(DBOperations.CREATE_UPDATE, handler, data, groupsort);
31
137
  }
32
138
  /**
33
139
  * @description Decorator for handling update operations
@@ -39,21 +145,21 @@ export function onCreateUpdate(handler, data) {
39
145
  * @function onUpdate
40
146
  * @category Property Decorators
41
147
  */
42
- export function onUpdate(handler, data) {
43
- return on(DBOperations.UPDATE, handler, data);
148
+ export function onUpdate(handler, data, groupsort) {
149
+ return on(DBOperations.UPDATE, handler, data, groupsort);
44
150
  }
45
151
  /**
46
152
  * @description Decorator for handling create operations
47
153
  * @summary Defines a behavior to execute during create operations
48
154
  * @template V - Type for metadata, defaults to object
49
- * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
155
+ * @param {GeneralOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
50
156
  * @param {V} [data] - Optional metadata to pass to the handler
51
157
  * @return {PropertyDecorator} A decorator that can be applied to class properties
52
158
  * @function onCreate
53
159
  * @category Property Decorators
54
160
  */
55
- export function onCreate(handler, data) {
56
- return on(DBOperations.CREATE, handler, data);
161
+ export function onCreate(handler, data, groupsort) {
162
+ return on(DBOperations.CREATE, handler, data, groupsort);
57
163
  }
58
164
  /**
59
165
  * @description Decorator for handling read operations
@@ -65,8 +171,8 @@ export function onCreate(handler, data) {
65
171
  * @function onRead
66
172
  * @category Property Decorators
67
173
  */
68
- export function onRead(handler, data) {
69
- return on(DBOperations.READ, handler, data);
174
+ export function onRead(handler, data, groupsort) {
175
+ return on(DBOperations.READ, handler, data, groupsort);
70
176
  }
71
177
  /**
72
178
  * @description Decorator for handling delete operations
@@ -78,8 +184,8 @@ export function onRead(handler, data) {
78
184
  * @function onDelete
79
185
  * @category Property Decorators
80
186
  */
81
- export function onDelete(handler, data) {
82
- return on(DBOperations.DELETE, handler, data);
187
+ export function onDelete(handler, data, groupsort) {
188
+ return on(DBOperations.DELETE, handler, data, groupsort);
83
189
  }
84
190
  /**
85
191
  * @description Decorator for handling all operation types
@@ -91,8 +197,8 @@ export function onDelete(handler, data) {
91
197
  * @function onAny
92
198
  * @category Property Decorators
93
199
  */
94
- export function onAny(handler, data) {
95
- return on(DBOperations.ALL, handler, data);
200
+ export function onAny(handler, data, groupsort) {
201
+ return on(DBOperations.ALL, handler, data, groupsort);
96
202
  }
97
203
  /**
98
204
  * @description Base decorator for handling database operations
@@ -111,8 +217,8 @@ export function onAny(handler, data) {
111
217
  * myProperty: string;
112
218
  * }
113
219
  */
114
- export function on(op = DBOperations.ALL, handler, data) {
115
- return operation(OperationKeys.ON, op, handler, data);
220
+ export function on(op = DBOperations.ALL, handler, data, groupsort) {
221
+ return operation(OperationKeys.ON, op, handler, data, groupsort);
116
222
  }
117
223
  /**
118
224
  * @description Decorator for handling post-create and post-update operations
@@ -124,8 +230,8 @@ export function on(op = DBOperations.ALL, handler, data) {
124
230
  * @function afterCreateUpdate
125
231
  * @category Property Decorators
126
232
  */
127
- export function afterCreateUpdate(handler, data) {
128
- return after(DBOperations.CREATE_UPDATE, handler, data);
233
+ export function afterCreateUpdate(handler, data, groupsort) {
234
+ return after(DBOperations.CREATE_UPDATE, handler, data, groupsort);
129
235
  }
130
236
  /**
131
237
  * @description Decorator for handling post-update operations
@@ -137,8 +243,8 @@ export function afterCreateUpdate(handler, data) {
137
243
  * @function afterUpdate
138
244
  * @category Property Decorators
139
245
  */
140
- export function afterUpdate(handler, data) {
141
- return after(DBOperations.UPDATE, handler, data);
246
+ export function afterUpdate(handler, data, groupsort) {
247
+ return after(DBOperations.UPDATE, handler, data, groupsort);
142
248
  }
143
249
  /**
144
250
  * @description Decorator for handling post-create operations
@@ -150,8 +256,8 @@ export function afterUpdate(handler, data) {
150
256
  * @function afterCreate
151
257
  * @category Property Decorators
152
258
  */
153
- export function afterCreate(handler, data) {
154
- return after(DBOperations.CREATE, handler, data);
259
+ export function afterCreate(handler, data, groupsort) {
260
+ return after(DBOperations.CREATE, handler, data, groupsort);
155
261
  }
156
262
  /**
157
263
  * @description Decorator for handling post-read operations
@@ -163,8 +269,8 @@ export function afterCreate(handler, data) {
163
269
  * @function afterRead
164
270
  * @category Property Decorators
165
271
  */
166
- export function afterRead(handler, data) {
167
- return after(DBOperations.READ, handler, data);
272
+ export function afterRead(handler, data, groupsort) {
273
+ return after(DBOperations.READ, handler, data, groupsort);
168
274
  }
169
275
  /**
170
276
  * @description Decorator for handling post-delete operations
@@ -176,8 +282,8 @@ export function afterRead(handler, data) {
176
282
  * @function afterDelete
177
283
  * @category Property Decorators
178
284
  */
179
- export function afterDelete(handler, data) {
180
- return after(DBOperations.DELETE, handler, data);
285
+ export function afterDelete(handler, data, groupsort) {
286
+ return after(DBOperations.DELETE, handler, data, groupsort);
181
287
  }
182
288
  /**
183
289
  * @description Decorator for handling post-operation for all operation types
@@ -189,8 +295,8 @@ export function afterDelete(handler, data) {
189
295
  * @function afterAny
190
296
  * @category Property Decorators
191
297
  */
192
- export function afterAny(handler, data) {
193
- return after(DBOperations.ALL, handler, data);
298
+ export function afterAny(handler, data, groupsort) {
299
+ return after(DBOperations.ALL, handler, data, groupsort);
194
300
  }
195
301
  /**
196
302
  * @description Base decorator for handling post-operation behaviors
@@ -209,8 +315,8 @@ export function afterAny(handler, data) {
209
315
  * myProperty: string;
210
316
  * }
211
317
  */
212
- export function after(op = DBOperations.ALL, handler, data) {
213
- return operation(OperationKeys.AFTER, op, handler, data);
318
+ export function after(op = DBOperations.ALL, handler, data, groupsort) {
319
+ return operation(OperationKeys.AFTER, op, handler, data, groupsort);
214
320
  }
215
321
  /**
216
322
  * @description Core decorator factory for operation handlers
@@ -240,7 +346,7 @@ export function after(op = DBOperations.ALL, handler, data) {
240
346
  * Handler-->>Operations: Return result
241
347
  * Operations-->>Client: Return final result
242
348
  */
243
- export function operation(baseOp, operation = DBOperations.ALL, handler, dataToAdd) {
349
+ export function operation(baseOp, operation = DBOperations.ALL, handler, dataToAdd, groupsort = DefaultGroupSort) {
244
350
  return (target, propertyKey) => {
245
351
  const name = target.constructor.name;
246
352
  const decorators = operation.reduce((accum, op) => {
@@ -252,6 +358,12 @@ export function operation(baseOp, operation = DBOperations.ALL, handler, dataToA
252
358
  handlers: {},
253
359
  };
254
360
  const handlerKey = Operations.getHandlerName(handler);
361
+ let mergeData = groupsort;
362
+ if (dataToAdd) {
363
+ if (Object.keys(dataToAdd).filter((key) => key in groupsort).length > 0)
364
+ throw new InternalError(`Unable to merge groupSort into dataToAdd due to overlaping keys`);
365
+ mergeData = { ...groupsort, ...dataToAdd };
366
+ }
255
367
  if (!data.handlers[name] ||
256
368
  !data.handlers[name][propertyKey] ||
257
369
  !(handlerKey in data.handlers[name][propertyKey])) {
@@ -259,7 +371,7 @@ export function operation(baseOp, operation = DBOperations.ALL, handler, dataToA
259
371
  data.handlers[name][propertyKey] =
260
372
  data.handlers[name][propertyKey] || {};
261
373
  data.handlers[name][propertyKey][handlerKey] = {
262
- data: dataToAdd,
374
+ data: mergeData,
263
375
  };
264
376
  accum.push(handle(compoundKey, handler), propMetadata(Operations.key(compoundKey), data));
265
377
  }
@@ -268,4 +380,4 @@ export function operation(baseOp, operation = DBOperations.ALL, handler, dataToA
268
380
  return apply(...decorators)(target, propertyKey);
269
381
  };
270
382
  }
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVyYXRpb25zL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsdUJBQW9CO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsd0JBQXFCO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFOUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLE1BQU0sQ0FDYixFQUFpQixFQUNqQixPQUFrRDtJQUVsRCxPQUFPLENBQUMsTUFBVyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtRQUMxQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixPQUVpRCxFQUNqRCxJQUFRO0lBRVIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUNEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLE9BQWlELEVBQ2pELElBQVE7SUFFUixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBQ0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsT0FBd0QsRUFDeEQsSUFBUTtJQUVSLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRDs7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LFdBQTRCLEVBQUUsT0FBTyxDQUFDLEVBQzdDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUNoRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElkT3BlcmF0aW9uSGFuZGxlcixcbiAgT3BlcmF0aW9uSGFuZGxlcixcbiAgU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyLFxuICBVcGRhdGVPcGVyYXRpb25IYW5kbGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgREJPcGVyYXRpb25zLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25zIH0gZnJvbSBcIi4vT3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHByb3BNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW50ZXJuYWwgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uIGtleSBvbiBhIHRhcmdldCBwcm9wZXJ0eVxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcCAtIFRoZSBvcGVyYXRpb24ga2V5IHRvIGhhbmRsZVxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIGhhbmRsZXJcbiAqIEBmdW5jdGlvbiBoYW5kbGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZShcbiAgb3A6IE9wZXJhdGlvbktleXMsXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+XG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIE9wZXJhdGlvbnMucmVnaXN0ZXIoaGFuZGxlciwgb3AsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBib3RoIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PiB8IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25DcmVhdGVVcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkNyZWF0ZVVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjpcbiAgICB8IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+XG4gICAgfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWXG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1VwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uVXBkYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25VcGRhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueT4sXG4gIGRhdGE/OiBWXG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5VUERBVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBjcmVhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIGNyZWF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uQ3JlYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25DcmVhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyByZWFkIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyByZWFkIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtJZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25SZWFkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25SZWFkPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBJZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuUkVBRCwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBkZWxldGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25EZWxldGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRlbGV0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWXG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5ERUxFVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIGFsbCBvcGVyYXRpb24gdHlwZXNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBhbnkgZGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvbkFueVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQW55PFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFZcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLkFMTCwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgZGVjb3JhdG9yIGZvciBoYW5kbGluZyBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgc3BlY2lmaWVkIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW10gfCBEQk9wZXJhdGlvbnN9IFtvcD1EQk9wZXJhdGlvbnMuQUxMXSAtIE9uZSBvciBtb3JlIG9wZXJhdGlvbiB0eXBlcyB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzYWdlOlxuICogY2xhc3MgTXlNb2RlbCB7XG4gKiAgIEBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBteUhhbmRsZXIpXG4gKiAgIG15UHJvcGVydHk6IHN0cmluZztcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uPFYgPSBvYmplY3Q+KFxuICBvcDogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvcGVyYXRpb24oT3BlcmF0aW9uS2V5cy5PTiwgb3AsIGhhbmRsZXIsIGRhdGEpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LWNyZWF0ZSBhbmQgcG9zdC11cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4gfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckNyZWF0ZVVwZGF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyQ3JlYXRlVXBkYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOlxuICAgIHwgU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT5cbiAgICB8IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURSwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC11cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlclVwZGF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyVXBkYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFZcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLlVQREFURSwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1jcmVhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgY3JlYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyQ3JlYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJDcmVhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWXG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5DUkVBVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtcmVhZCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciByZWFkIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyUmVhZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVhZDxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWXG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5SRUFELCBoYW5kbGVyLCBkYXRhKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1kZWxldGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyRGVsZXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJEZWxldGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuREVMRVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LW9wZXJhdGlvbiBmb3IgYWxsIG9wZXJhdGlvbiB0eXBlc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgYW55IGRhdGFiYXNlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJBbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlckFueTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWXG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5BTEwsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGRlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1vcGVyYXRpb24gYmVoYXZpb3JzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciBzcGVjaWZpZWQgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXNbXSB8IERCT3BlcmF0aW9uc30gW29wPURCT3BlcmF0aW9ucy5BTExdIC0gT25lIG9yIG1vcmUgb3BlcmF0aW9uIHR5cGVzIHRvIGhhbmRsZVxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlclxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzYWdlOlxuICogY2xhc3MgTXlNb2RlbCB7XG4gKiAgIEBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBteUhhbmRsZXIpXG4gKiAgIG15UHJvcGVydHk6IHN0cmluZztcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyPFYgPSBvYmplY3Q+KFxuICBvcDogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvcGVyYXRpb24oT3BlcmF0aW9uS2V5cy5BRlRFUiwgb3AsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIGRlY29yYXRvciBmYWN0b3J5IGZvciBvcGVyYXRpb24gaGFuZGxlcnNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgZGVjb3JhdG9ycyB0aGF0IHJlZ2lzdGVyIGhhbmRsZXJzIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5PTiB8IE9wZXJhdGlvbktleXMuQUZURVJ9IGJhc2VPcCAtIFdoZXRoZXIgdGhlIGhhbmRsZXIgcnVucyBkdXJpbmcgb3IgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW119IFtvcGVyYXRpb249REJPcGVyYXRpb25zLkFMTF0gLSBUaGUgc3BlY2lmaWMgb3BlcmF0aW9ucyB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHBhcmFtIHtWfSBbZGF0YVRvQWRkXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvcGVyYXRpb25cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3IgYXMgQG9wZXJhdGlvblxuICogICBwYXJ0aWNpcGFudCBPcGVyYXRpb25zIGFzIE9wZXJhdGlvbnMgUmVnaXN0cnlcbiAqICAgcGFydGljaXBhbnQgSGFuZGxlclxuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5PcGVyYXRpb25zOiBSZWdpc3RlciBoYW5kbGVyXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogU3RvcmUgbWV0YWRhdGFcbiAqXG4gKiAgIE5vdGUgb3ZlciBDbGllbnQsSGFuZGxlcjogTGF0ZXIsIGR1cmluZyBvcGVyYXRpb24gZXhlY3V0aW9uXG4gKiAgIENsaWVudC0+Pk9wZXJhdGlvbnM6IEV4ZWN1dGUgb3BlcmF0aW9uXG4gKiAgIE9wZXJhdGlvbnMtPj5IYW5kbGVyOiBDYWxsIHJlZ2lzdGVyZWQgaGFuZGxlclxuICogICBIYW5kbGVyLS0+Pk9wZXJhdGlvbnM6IFJldHVybiByZXN1bHRcbiAqICAgT3BlcmF0aW9ucy0tPj5DbGllbnQ6IFJldHVybiBmaW5hbCByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZXJhdGlvbjxWID0gb2JqZWN0PihcbiAgYmFzZU9wOiBPcGVyYXRpb25LZXlzLk9OIHwgT3BlcmF0aW9uS2V5cy5BRlRFUixcbiAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzW10gPSBEQk9wZXJhdGlvbnMuQUxMLFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGFUb0FkZD86IFZcbikge1xuICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3IubmFtZTtcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gb3BlcmF0aW9uLnJlZHVjZSgoYWNjdW06IGFueVtdLCBvcCkgPT4ge1xuICAgICAgY29uc3QgY29tcG91bmRLZXkgPSBiYXNlT3AgKyBvcDtcbiAgICAgIGxldCBkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgT3BlcmF0aW9ucy5rZXkoY29tcG91bmRLZXkpLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIG9wZXJhdGlvbjogb3AsXG4gICAgICAgICAgaGFuZGxlcnM6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0gT3BlcmF0aW9ucy5nZXRIYW5kbGVyTmFtZShoYW5kbGVyKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhZGF0YS5oYW5kbGVyc1tuYW1lXSB8fFxuICAgICAgICAhZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV0gfHxcbiAgICAgICAgIShoYW5kbGVyS2V5IGluIGRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldKVxuICAgICAgKSB7XG4gICAgICAgIGRhdGEuaGFuZGxlcnNbbmFtZV0gPSBkYXRhLmhhbmRsZXJzW25hbWVdIHx8IHt9O1xuICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XSA9XG4gICAgICAgICAgZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV0gfHwge307XG4gICAgICAgIGRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldW2hhbmRsZXJLZXldID0ge1xuICAgICAgICAgIGRhdGE6IGRhdGFUb0FkZCxcbiAgICAgICAgfTtcblxuICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgIGhhbmRsZShjb21wb3VuZEtleSBhcyBPcGVyYXRpb25LZXlzLCBoYW5kbGVyKSxcbiAgICAgICAgICBwcm9wTWV0YWRhdGEoT3BlcmF0aW9ucy5rZXkoY29tcG91bmRLZXkpLCBkYXRhKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG4iXX0=
383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVyYXRpb25zL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsdUJBQW9CO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsd0JBQXFCO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQVMsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFJckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQ0FBNkI7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQ0FBNEI7QUFpQnJELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUUzQixNQUFNLGdCQUFnQixHQUFjLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxDQUFDO0FBaUJsRTs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsTUFBTSxDQUNiLEVBQWlCLEVBQ2pCLE9BQWtEO0lBRWxELE9BQU8sQ0FBQyxNQUFXLEVBQUUsV0FBbUIsRUFBRSxFQUFFO1FBQzFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQU9uQyxLQUFZLEVBQ1osVUFBK0MsRUFDL0MsTUFBYztJQUVkLE1BQU0sS0FBSyxHQUFzQixFQUFFLENBQUM7SUFDcEMsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksR0FBd0IsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxFQUFFLEdBQUcsRUFBRSxH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QUFDLElBQUksRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUc7b0JBQzdDLElBQUksRUFBRSxTQUFTO2lCQUNoQixDQUFDO2dCQUVGLEtBQUssQ0FBQyxJQUFJLENBQ1IsTUFBTSxDQUFDLFdBQTRCLEVBQUUsT0FBTyxDQUFDLEVBQzdDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUNoRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEdlbmVyYWxPcGVyYXRpb25IYW5kbGVyLFxuICBHZW5lcmFsVXBkYXRlT3BlcmF0aW9uSGFuZGxlcixcbiAgSWRPcGVyYXRpb25IYW5kbGVyLFxuICBPcGVyYXRpb25IYW5kbGVyLFxuICBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXIsXG4gIFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEQk9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbnMgfSBmcm9tIFwiLi9PcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBhcHBseSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgTW9kZWwsIHByb3BNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQ29udGV4dFwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2Vycm9yc1wiO1xuaW1wb3J0IHsgZ2V0SGFuZGxlckFyZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHNvcnRpbmcgcGFyYW1ldGVycyBmb3IgZ3JvdXBpbmcgZGVjb3JhdG9yc1xuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc3RydWN0dXJlIGZvciBzcGVjaWZ5aW5nIGdyb3VwIHNvcnRpbmcgb3B0aW9uc1xuICogQHR5cGVkZWYge09iamVjdH0gR3JvdXBTb3J0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJpb3JpdHkgLSBUaGUgcHJpb3JpdHkgb2YgdGhlIHNvcnRpbmcgb3BlcmF0aW9uLCBsb3dlciBudW1iZXJzIHJlcHJlc2VudCBoaWdoZXIgcHJpb3JpdHlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZ3JvdXBdIC0gT3B0aW9uYWwgcHJvcGVydHkgdG8gZ3JvdXAgZGVjb3JhdG9ycywgdXNlZCBmb3IgZ3JvdXBpbmcgcmVsYXRlZCBvcGVyYXRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2dyb3VwUHJpb3JpdHldIC0gT3B0aW9uYWwgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgcHJpb3JpdHkgd2l0aGluIGEgZ3JvdXAsIGxvd2VyIG51bWJlcnMgcmVwcmVzZW50IGhpZ2hlciBwcmlvcml0eSB3aXRoaW4gdGhlIGdyb3VwXG4gKiBAY2F0ZWdvcnkgVHlwZSBEZWZpbml0aW9uc1xuICovXG5leHBvcnQgdHlwZSBHcm91cFNvcnQgPSB7XG4gIHByaW9yaXR5OiBudW1iZXI7XG4gIGdyb3VwPzogc3RyaW5nO1xuICBncm91cFByaW9yaXR5PzogbnVtYmVyO1xufTtcblxuY29uc3QgZGVmYXVsdFByaW9yaXR5ID0gNTA7XG5cbmNvbnN0IERlZmF1bHRHcm91cFNvcnQ6IEdyb3VwU29ydCA9IHsgcHJpb3JpdHk6IGRlZmF1bHRQcmlvcml0eSB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3JPYmplY3QgdHlwZSBkZWZpbml0aW9uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgYW4gb2JqZWN0IHVzZWQgdG8gcmVwcmVzZW50IGEgZGVjb3JhdG9yIGluIHRoZSBjb250ZXh0IG9mIGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWNvcmF0b3JPYmplY3RcbiAqIEBwcm9wZXJ0eSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBkdXJpbmcgdGhlIG9wZXJhdGlvblxuICogQHByb3BlcnR5IHtvYmplY3R9IGRhdGEgLSBPcHRpb25hbCBtZXRhZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9wIC0gVGhlIHByb3BlcnR5IGtleSB0byB3aGljaCB0aGUgZGVjb3JhdG9yIGlzIGFwcGxpZWRcbiAqIEBjYXRlZ29yeSBUeXBlIERlZmluaXRpb25zXG4gKi9cbmV4cG9ydCB0eXBlIERlY29yYXRvck9iamVjdCA9IHtcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT47XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgcHJvcDogc3RyaW5nW107XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbnRlcm5hbCBmdW5jdGlvbiB0byByZWdpc3RlciBvcGVyYXRpb24gaGFuZGxlcnNcbiAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiBvcGVyYXRpb24gaGFuZGxlciBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb24ga2V5IG9uIGEgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wIC0gVGhlIG9wZXJhdGlvbiBrZXkgdG8gaGFuZGxlXG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcmVnaXN0ZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IHJlZ2lzdGVycyB0aGUgaGFuZGxlclxuICogQGZ1bmN0aW9uIGhhbmRsZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZnVuY3Rpb24gaGFuZGxlKFxuICBvcDogT3BlcmF0aW9uS2V5cyxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT5cbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgT3BlcmF0aW9ucy5yZWdpc3RlcihoYW5kbGVyLCBvcCwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBkZWNvcmF0b3Igb2JqZWN0cyBmb3IgaGFuZGxpbmcgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUmV0cmlldmVzIGEgbGlzdCBvZiBkZWNvcmF0b3Igb2JqZWN0cyByZXByZXNlbnRpbmcgb3BlcmF0aW9uIGhhbmRsZXJzIGZvciBhIGdpdmVuIG1vZGVsIGFuZCBkZWNvcmF0b3JzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZm9yIHRoZSBtb2RlbCwgZGVmYXVsdHMgdG8gTW9kZWw8dHJ1ZSB8IGZhbHNlPlxuICogQHRlbXBsYXRlIFIgLSBUeXBlIGZvciB0aGUgcmVwb3NpdG9yeSwgZGVmYXVsdHMgdG8gSVJlcG9zaXRvcnk8TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGZvciByZXBvc2l0b3J5IGZsYWdzLCBkZWZhdWx0cyB0byBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVHlwZSBmb3IgY29udGV4dCwgZGVmYXVsdHMgdG8gQ29udGV4dDxGPlxuICogQHBhcmFtIHtNb2RlbH0gbW9kZWwgLSBUaGUgbW9kZWwgZm9yIHdoaWNoIHRvIHJldHJpZXZlIGRlY29yYXRvciBvYmplY3RzXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+fSBkZWNvcmF0b3JzIC0gVGhlIGRlY29yYXRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbCBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IC0gVGhlIG9wZXJhdGlvbiBwcmVmaXggKGUuZy4sICdvbicsICdhZnRlcicpXG4gKiBAcmV0dXJuIHtEZWNvcmF0b3JPYmplY3RbXX0gQW4gYXJyYXkgb2YgZGVjb3JhdG9yIG9iamVjdHMgcmVwcmVzZW50aW5nIG9wZXJhdGlvbiBoYW5kbGVyc1xuICogQGZ1bmN0aW9uIGdldEhhbmRsZXJzRGVjb3JhdG9yc1xuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIYW5kbGVyc0RlY29yYXRvcnM8XG4gIE0gZXh0ZW5kcyBNb2RlbDx0cnVlIHwgZmFsc2U+LFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4oXG4gIG1vZGVsOiBNb2RlbCxcbiAgZGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4sXG4gIHByZWZpeDogc3RyaW5nXG4pOiBEZWNvcmF0b3JPYmplY3RbXSB7XG4gIGNvbnN0IGFjY3VtOiBEZWNvcmF0b3JPYmplY3RbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3AgaW4gZGVjb3JhdG9ycykge1xuICAgIGNvbnN0IGRlY3M6IERlY29yYXRvck1ldGFkYXRhW10gPSBkZWNvcmF0b3JzW3Byb3BdO1xuICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBkZWMhO1xuICAgICAgY29uc3QgaGFuZGxlcnM6IE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz5bXSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIE9wZXJhdGlvbnMuZ2V0PE0sIFIsIFYsIEYsIEM+KG1vZGVsLCBwcm9wLCBwcmVmaXggKyBrZXkpO1xuICAgICAgaWYgKCFoYW5kbGVycyB8fCAhaGFuZGxlcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcmVnaXN0ZXJlZCBoYW5kbGVyIGZvciB0aGUgb3BlcmF0aW9uICR7cHJlZml4ICsga2V5fSB1bmRlciBwcm9wZXJ0eSAke3Byb3B9YFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBoYW5kbGVyQXJncyA9IGdldEhhbmRsZXJBcmdzKGRlYywgcHJvcCwgbW9kZWwgYXMgYW55KTtcblxuICAgICAgaWYgKCFoYW5kbGVyQXJncyB8fCBPYmplY3QudmFsdWVzKGhhbmRsZXJBcmdzKS5sZW5ndGggIT09IGhhbmRsZXJzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJBcmdzIGFuZCBoYW5kbGVycyBsZW5ndGggZG8gbm90IG1hdGNoXCIpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAoaGFuZGxlckFyZ3NbaGFuZGxlcnNbaV0ubmFtZV0gYXMgUmVjb3JkPHN0cmluZywgYW55PilcbiAgICAgICAgICAuZGF0YTtcbiAgICAgICAgYWNjdW0ucHVzaCh7XG4gICAgICAgICAgaGFuZGxlcjogaGFuZGxlcnNbaV0sXG4gICAgICAgICAgZGF0YTogW2RhdGFdLFxuICAgICAgICAgIHByb3A6IFtwcm9wXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBhY2N1bTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR3JvdXBzIGRlY29yYXRvcnMgYmFzZWQgb24gdGhlaXIgZ3JvdXAgcHJvcGVydHlcbiAqIEBzdW1tYXJ5IEdyb3VwcyBkZWNvcmF0b3Igb2JqZWN0cyBieSB0aGVpciBncm91cCBwcm9wZXJ0eSwgY29tYmluaW5nIGRhdGEgYW5kIHByb3BlcnRpZXMgd2l0aGluIGVhY2ggZ3JvdXBcbiAqIEBwYXJhbSB7RGVjb3JhdG9yT2JqZWN0W119IGRlY29yYXRvcnMgLSBUaGUgYXJyYXkgb2YgZGVjb3JhdG9yIG9iamVjdHMgdG8gZ3JvdXBcbiAqIEByZXR1cm4ge0RlY29yYXRvck9iamVjdFtdfSBBbiBhcnJheSBvZiBncm91cGVkIGRlY29yYXRvciBvYmplY3RzXG4gKiBAZnVuY3Rpb24gZ3JvdXBEZWNvcmF0b3JzXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRGVjb3JhdG9ycyhcbiAgZGVjb3JhdG9yczogRGVjb3JhdG9yT2JqZWN0W11cbik6IERlY29yYXRvck9iamVjdFtdIHtcbiAgY29uc3QgZ3JvdXBlZCA9IGRlY29yYXRvcnMucmVkdWNlPE1hcDxzdHJpbmcgfCBzeW1ib2wsIERlY29yYXRvck9iamVjdD4+KFxuICAgIChhY2MsIGRlYykgPT4ge1xuICAgICAgaWYgKCFkZWMgfHwgIWRlYy5kYXRhIHx8ICFkZWMucHJvcClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIGRlY29yYXRvciBwcm9wZXJ0aWVzIG9yIGRhdGFcIik7XG5cbiAgICAgIC8vIElmIGRlY29yYXRvciBoYXZlIG5vIGdyb3VwXG4gICAgICBpZiAoIWRlYy5kYXRhWzBdLmdyb3VwKSB7XG4gICAgICAgIGFjYy5zZXQoU3ltYm9sKCksIGRlYyk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyb3VwS2V5ID0gZGVjLmRhdGFbMF0uZ3JvdXA7XG5cbiAgICAgIGlmICghYWNjLmhhcyhncm91cEtleSkpIHtcbiAgICAgICAgLy8gZmlyc3QgaGFuZGxlciBpcyBzYXZlZCBpbiB0aGUgZ3JvdXBcbiAgICAgICAgYWNjLnNldChncm91cEtleSwgeyAuLi5kZWMgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGFjYy5nZXQoZ3JvdXBLZXkpITtcblxuICAgICAgICBhY2Muc2V0KGdyb3VwS2V5LCB7XG4gICAgICAgICAgaGFuZGxlcjogZXhpc3RpbmcuaGFuZGxlcixcbiAgICAgICAgICBkYXRhOiBbLi4uZXhpc3RpbmcuZGF0YSwgLi4uZGVjLmRhdGFdLFxuICAgICAgICAgIHByb3A6IFsuLi5leGlzdGluZy5wcm9wLCAuLi5kZWMucHJvcF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAgbmV3IE1hcCgpXG4gICk7XG5cbiAgY29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbShncm91cGVkLnZhbHVlcygpKTtcblxuICAvLyBTb3J0IGluc2lkZSBlYWNoIGdyb3VwIGJ5IHByaW9yaXR5XG4gIGdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgIGNvbnN0IGNvbWJpbmVkID0gZ3JvdXAuZGF0YS5tYXAoKGQsIGkpID0+ICh7XG4gICAgICBkYXRhOiBkLFxuICAgICAgcHJvcDogZ3JvdXAucHJvcFtpXSxcbiAgICB9KSk7XG5cbiAgICBjb21iaW5lZC5zb3J0KFxuICAgICAgKGEsIGIpID0+IChhLmRhdGEuZ3JvdXBQcmlvcml0eSA/PyA1MCkgLSAoYi5kYXRhLmdyb3VwUHJpb3JpdHkgPz8gNTApXG4gICAgKTtcblxuICAgIGdyb3VwLmRhdGEgPSBjb21iaW5lZC5tYXAoKGMpID0+IGMuZGF0YSk7XG4gICAgZ3JvdXAucHJvcCA9IGNvbWJpbmVkLm1hcCgoYykgPT4gYy5wcm9wKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU29ydHMgZGVjb3JhdG9yIG9iamVjdHMgYmFzZWQgb24gdGhlaXIgcHJpb3JpdHlcbiAqIEBzdW1tYXJ5IFNvcnRzIGFuIGFycmF5IG9mIGRlY29yYXRvciBvYmplY3RzIGJ5IHRoZSBwcmlvcml0eSBvZiB0aGVpciBmaXJzdCBkYXRhIGVsZW1lbnRcbiAqIEBwYXJhbSB7RGVjb3JhdG9yT2JqZWN0W119IGRlY29yYXRvcnMgLSBUaGUgYXJyYXkgb2YgZGVjb3JhdG9yIG9iamVjdHMgdG8gc29ydFxuICogQHJldHVybiB7RGVjb3JhdG9yT2JqZWN0W119IFRoZSBzb3J0ZWQgYXJyYXkgb2YgZGVjb3JhdG9yIG9iamVjdHNcbiAqIEBmdW5jdGlvbiBzb3J0RGVjb3JhdG9yc1xuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0RGVjb3JhdG9ycyhcbiAgZGVjb3JhdG9yczogRGVjb3JhdG9yT2JqZWN0W11cbik6IERlY29yYXRvck9iamVjdFtdIHtcbiAgLy8gU29ydCBieSBncm91cFByaW9yaXR5XG4gIGRlY29yYXRvcnMuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHByaW9yaXR5QSA9IGEuZGF0YVswXS5wcmlvcml0eSA/PyBkZWZhdWx0UHJpb3JpdHk7XG4gICAgY29uc3QgcHJpb3JpdHlCID0gYi5kYXRhWzBdLnByaW9yaXR5ID8/IGRlZmF1bHRQcmlvcml0eTtcbiAgICByZXR1cm4gcHJpb3JpdHlBIC0gcHJpb3JpdHlCOyAvLyBsb3dlciBudW1iZXIgPSBoaWdoZXIgcHJpb3JpdHlcbiAgfSk7XG5cbiAgcmV0dXJuIGRlY29yYXRvcnM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIGJvdGggY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge0dlbmVyYWxPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4gfCBHZW5lcmFsVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvbkNyZWF0ZVVwZGF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQ3JlYXRlVXBkYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOlxuICAgIHwgR2VuZXJhbE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PlxuICAgIHwgR2VuZXJhbFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFYsXG4gIGdyb3Vwc29ydD86IEdyb3VwU29ydFxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURSwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1VwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uVXBkYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25VcGRhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueT4sXG4gIGRhdGE/OiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLlVQREFURSwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgY3JlYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBjcmVhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge0dlbmVyYWxPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uQ3JlYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25DcmVhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IEdlbmVyYWxPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLkNSRUFURSwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyByZWFkIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyByZWFkIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtJZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25SZWFkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25SZWFkPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBJZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5SRUFELCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIGRlbGV0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uRGVsZXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25EZWxldGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5ERUxFVEUsIGhhbmRsZXIsIGRhdGEsIGdyb3Vwc29ydCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgYWxsIG9wZXJhdGlvbiB0eXBlc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIGFueSBkYXRhYmFzZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uQW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25Bbnk8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5BTEwsIGhhbmRsZXIsIGRhdGEsIGdyb3Vwc29ydCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgZGVjb3JhdG9yIGZvciBoYW5kbGluZyBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgc3BlY2lmaWVkIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW10gfCBEQk9wZXJhdGlvbnN9IFtvcD1EQk9wZXJhdGlvbnMuQUxMXSAtIE9uZSBvciBtb3JlIG9wZXJhdGlvbiB0eXBlcyB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzYWdlOlxuICogY2xhc3MgTXlNb2RlbCB7XG4gKiAgIEBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBteUhhbmRsZXIpXG4gKiAgIG15UHJvcGVydHk6IHN0cmluZztcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uPFYgPSBvYmplY3Q+KFxuICBvcDogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIG9wZXJhdGlvbihPcGVyYXRpb25LZXlzLk9OLCBvcCwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1jcmVhdGUgYW5kIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGJvdGggY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+IHwgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJDcmVhdGVVcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlckNyZWF0ZVVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjpcbiAgICB8IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+XG4gICAgfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFYsXG4gIGdyb3Vwc29ydD86IEdyb3VwU29ydFxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURSwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LXVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1VwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyVXBkYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJVcGRhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5VUERBVEUsIGhhbmRsZXIsIGRhdGEsIGdyb3Vwc29ydCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1jcmVhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgY3JlYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyQ3JlYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJDcmVhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLkNSRUFURSwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LXJlYWQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgcmVhZCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlclJlYWRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlclJlYWQ8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5SRUFELCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LWRlbGV0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciBkZWxldGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJEZWxldGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlckRlbGV0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLkRFTEVURSwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LW9wZXJhdGlvbiBmb3IgYWxsIG9wZXJhdGlvbiB0eXBlc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgYW55IGRhdGFiYXNlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJBbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlckFueTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLkFMTCwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBkZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3Qtb3BlcmF0aW9uIGJlaGF2aW9yc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgc3BlY2lmaWVkIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW10gfCBEQk9wZXJhdGlvbnN9IFtvcD1EQk9wZXJhdGlvbnMuQUxMXSAtIE9uZSBvciBtb3JlIG9wZXJhdGlvbiB0eXBlcyB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB1c2FnZTpcbiAqIGNsYXNzIE15TW9kZWwge1xuICogICBAYWZ0ZXIoREJPcGVyYXRpb25zLkNSRUFURSwgbXlIYW5kbGVyKVxuICogICBteVByb3BlcnR5OiBzdHJpbmc7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcjxWID0gb2JqZWN0PihcbiAgb3A6IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5BTEwsXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFYsXG4gIGdyb3Vwc29ydD86IEdyb3VwU29ydFxuKSB7XG4gIHJldHVybiBvcGVyYXRpb24oT3BlcmF0aW9uS2V5cy5BRlRFUiwgb3AsIGhhbmRsZXIsIGRhdGEsIGdyb3Vwc29ydCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvcmUgZGVjb3JhdG9yIGZhY3RvcnkgZm9yIG9wZXJhdGlvbiBoYW5kbGVyc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBkZWNvcmF0b3JzIHRoYXQgcmVnaXN0ZXIgaGFuZGxlcnMgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzLk9OIHwgT3BlcmF0aW9uS2V5cy5BRlRFUn0gYmFzZU9wIC0gV2hldGhlciB0aGUgaGFuZGxlciBydW5zIGR1cmluZyBvciBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXNbXX0gW29wZXJhdGlvbj1EQk9wZXJhdGlvbnMuQUxMXSAtIFRoZSBzcGVjaWZpYyBvcGVyYXRpb25zIHRvIGhhbmRsZVxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byBleGVjdXRlXG4gKiBAcGFyYW0ge1Z9IFtkYXRhVG9BZGRdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9wZXJhdGlvblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvciBhcyBAb3BlcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE9wZXJhdGlvbnMgYXMgT3BlcmF0aW9ucyBSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBIYW5kbGVyXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+Pk9wZXJhdGlvbnM6IFJlZ2lzdGVyIGhhbmRsZXJcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBTdG9yZSBtZXRhZGF0YVxuICpcbiAqICAgTm90ZSBvdmVyIENsaWVudCxIYW5kbGVyOiBMYXRlciwgZHVyaW5nIG9wZXJhdGlvbiBleGVjdXRpb25cbiAqICAgQ2xpZW50LT4+T3BlcmF0aW9uczogRXhlY3V0ZSBvcGVyYXRpb25cbiAqICAgT3BlcmF0aW9ucy0+PkhhbmRsZXI6IENhbGwgcmVnaXN0ZXJlZCBoYW5kbGVyXG4gKiAgIEhhbmRsZXItLT4+T3BlcmF0aW9uczogUmV0dXJuIHJlc3VsdFxuICogICBPcGVyYXRpb25zLS0+PkNsaWVudDogUmV0dXJuIGZpbmFsIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlcmF0aW9uPFYgPSBvYmplY3Q+KFxuICBiYXNlT3A6IE9wZXJhdGlvbktleXMuT04gfCBPcGVyYXRpb25LZXlzLkFGVEVSLFxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5BTEwsXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YVRvQWRkPzogVixcbiAgZ3JvdXBzb3J0OiBHcm91cFNvcnQgPSBEZWZhdWx0R3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IG9wZXJhdGlvbi5yZWR1Y2UoKGFjY3VtOiBhbnlbXSwgb3ApID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvdW5kS2V5ID0gYmFzZU9wICsgb3A7XG4gICAgICBsZXQgZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIE9wZXJhdGlvbnMua2V5KGNvbXBvdW5kS2V5KSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wLFxuICAgICAgICAgIGhhbmRsZXJzOiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgY29uc3QgaGFuZGxlcktleSA9IE9wZXJhdGlvbnMuZ2V0SGFuZGxlck5hbWUoaGFuZGxlcik7XG5cbiAgICAgIGxldCBtZXJnZURhdGEgPSBncm91cHNvcnQ7XG5cbiAgICAgIGlmIChkYXRhVG9BZGQpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGFUb0FkZCkuZmlsdGVyKChrZXkpID0+IGtleSBpbiBncm91cHNvcnQpLmxlbmd0aCA+IDApXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVW5hYmxlIHRvIG1lcmdlIGdyb3VwU29ydCBpbnRvIGRhdGFUb0FkZCBkdWUgdG8gb3ZlcmxhcGluZyBrZXlzYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgbWVyZ2VEYXRhID0geyAuLi5ncm91cHNvcnQsIC4uLmRhdGFUb0FkZCB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICFkYXRhLmhhbmRsZXJzW25hbWVdIHx8XG4gICAgICAgICFkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XSB8fFxuICAgICAgICAhKGhhbmRsZXJLZXkgaW4gZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV0pXG4gICAgICApIHtcbiAgICAgICAgZGF0YS5oYW5kbGVyc1tuYW1lXSA9IGRhdGEuaGFuZGxlcnNbbmFtZV0gfHwge307XG4gICAgICAgIGRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldID1cbiAgICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XSB8fCB7fTtcbiAgICAgICAgZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV1baGFuZGxlcktleV0gPSB7XG4gICAgICAgICAgZGF0YTogbWVyZ2VEYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgaGFuZGxlKGNvbXBvdW5kS2V5IGFzIE9wZXJhdGlvbktleXMsIGhhbmRsZXIpLFxuICAgICAgICAgIHByb3BNZXRhZGF0YShPcGVyYXRpb25zLmtleShjb21wb3VuZEtleSksIGRhdGEpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cbiJdfQ==
@@ -18,7 +18,44 @@ export type OperationMetadata<V> = {
18
18
  handler: string;
19
19
  metadata?: V;
20
20
  };
21
- export type OperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = StandardOperationHandler<M, R, V, F, C> | UpdateOperationHandler<M, R, V, F, C> | IdOperationHandler<M, R, V, F, C>;
21
+ /**
22
+ * @description Union type for all operation handler types
23
+ * @summary Represents any type of operation handler function that can be used with database operations
24
+ * @template M - Model type extending Model
25
+ * @template R - Repository type extending IRepository
26
+ * @template V - Metadata type, defaults to object
27
+ * @template F - Repository flags extending RepositoryFlags
28
+ * @template C - Context type extending Context<F>
29
+ * @memberOf module:db-decorators
30
+ */
31
+ export type OperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = StandardOperationHandler<M, R, V, F, C> | UpdateOperationHandler<M, R, V, F, C> | IdOperationHandler<M, R, V, F, C> | GroupOperationHandler<M, R, V, F, C> | GroupUpdateOperationHandler<M, R, V, F, C>;
22
32
  export type StandardOperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = (this: R, context: C, metadata: V, key: keyof M, model: M) => Promise<void> | void;
23
33
  export type IdOperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = (this: R, context: C, decorator: V, key: keyof M, id: string) => Promise<void> | void;
24
34
  export type UpdateOperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = (this: R, context: C, decorator: V, key: keyof M, model: M, oldModel: M) => Promise<void> | void;
35
+ export type GroupOperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = (this: R, context: C, metadata: V[], keys: (keyof M)[], model: M) => Promise<void> | void;
36
+ export type GroupUpdateOperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = (this: R, context: C, decorator: V[], keys: (keyof M)[], model: M, oldModel: M) => Promise<void> | void;
37
+ /**
38
+ * @description General handler type for database operations
39
+ * @summary Function signature for handlers that process operations like create and read
40
+ * @template M - Model type extending Model
41
+ * @template R - Repository type extending IRepository
42
+ * @template V - Metadata type, defaults to object
43
+ * @template F - Repository flags extending RepositoryFlags
44
+ * @template C - Context type extending Context<F>
45
+ * @typedef {Function} GeneralOperationHandler
46
+ * @return {Promise<void> | void} Nothing or a Promise resolving to nothing
47
+ * @memberOf module:db-decorators
48
+ */
49
+ export type GeneralOperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = StandardOperationHandler<M, R, V, F, C> | GroupOperationHandler<M, R, V, F, C>;
50
+ /**
51
+ * @description General handler type for group update database operations
52
+ * @summary Function signature for handlers that process update operations with both new and old model states
53
+ * @template M - Model type extending Model
54
+ * @template R - Repository type extending IRepository
55
+ * @template V - Metadata type, defaults to object
56
+ * @template F - Repository flags extending RepositoryFlags
57
+ * @template C - Context type extending Context<F>
58
+ * @typedef {Function} GeneralUpdateOperationHandler
59
+ * @memberOf module:db-decorators
60
+ */
61
+ export type GeneralUpdateOperationHandler<M extends Model, R extends IRepository<M, F, C>, V = object, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> = UpdateOperationHandler<M, R, V, F, C> | GroupUpdateOperationHandler<M, R, V, F, C>;
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3BlcmF0aW9ucy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0YWRhdGEgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIG9wZXJhdGlvbiwgaXRzIGhhbmRsZXIsIGFuZCBhc3NvY2lhdGVkIG1ldGFkYXRhXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIG1ldGFkYXRhXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBPcGVyYXRpb25NZXRhZGF0YVxuICogQHByb3BlcnR5IHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBoYW5kbGVyIC0gVGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7Vn0gW21ldGFkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlcmF0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uTWV0YWRhdGE8Vj4gPSB7XG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cztcbiAgaGFuZGxlcjogc3RyaW5nO1xuICBtZXRhZGF0YT86IFY7XG59O1xuXG5leHBvcnQgdHlwZSBPcGVyYXRpb25IYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViA9IG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiA9XG4gIHwgU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+XG4gIHwgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPlxuICB8IElkT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPjtcblxuZXhwb3J0IHR5cGUgU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViA9IG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiA9IChcbiAgdGhpczogUixcbiAgY29udGV4dDogQyxcbiAgbWV0YWRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIElkT3BlcmF0aW9uSGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgPSBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gPSAoXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEMsXG4gIGRlY29yYXRvcjogVixcbiAga2V5OiBrZXlvZiBNLFxuICBpZDogc3RyaW5nXG4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViA9IG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiA9IChcbiAgdGhpczogUixcbiAgY29udGV4dDogQyxcbiAgZGVjb3JhdG9yOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNLFxuICBvbGRNb2RlbDogTVxuKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3BlcmF0aW9ucy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0YWRhdGEgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIG9wZXJhdGlvbiwgaXRzIGhhbmRsZXIsIGFuZCBhc3NvY2lhdGVkIG1ldGFkYXRhXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIG1ldGFkYXRhXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBPcGVyYXRpb25NZXRhZGF0YVxuICogQHByb3BlcnR5IHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBoYW5kbGVyIC0gVGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7Vn0gW21ldGFkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlcmF0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uTWV0YWRhdGE8Vj4gPSB7XG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cztcbiAgaGFuZGxlcjogc3RyaW5nO1xuICBtZXRhZGF0YT86IFY7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVbmlvbiB0eXBlIGZvciBhbGwgb3BlcmF0aW9uIGhhbmRsZXIgdHlwZXNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IHR5cGUgb2Ygb3BlcmF0aW9uIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEB0ZW1wbGF0ZSBGIC0gUmVwb3NpdG9yeSBmbGFncyBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIENvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbkhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWID0gb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+ID1cbiAgfCBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz5cbiAgfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+XG4gIHwgSWRPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+XG4gIHwgR3JvdXBPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+XG4gIHwgR3JvdXBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWID0gb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+ID0gKFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDLFxuICBtZXRhZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IHR5cGUgSWRPcGVyYXRpb25IYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViA9IG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiA9IChcbiAgdGhpczogUixcbiAgY29udGV4dDogQyxcbiAgZGVjb3JhdG9yOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIGlkOiBzdHJpbmdcbikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWID0gb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+ID0gKFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDLFxuICBkZWNvcmF0b3I6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNXG4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgdHlwZSBHcm91cE9wZXJhdGlvbkhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWID0gb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+ID0gKFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDLFxuICBtZXRhZGF0YTogVltdLFxuICBrZXlzOiAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIEdyb3VwVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgPSBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gPSAoXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEMsXG4gIGRlY29yYXRvcjogVltdLFxuICBrZXlzOiAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNXG4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmFsIGhhbmRsZXIgdHlwZSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRnVuY3Rpb24gc2lnbmF0dXJlIGZvciBoYW5kbGVycyB0aGF0IHByb2Nlc3Mgb3BlcmF0aW9ucyBsaWtlIGNyZWF0ZSBhbmQgcmVhZFxuICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBSZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGUsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gQ29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAdHlwZWRlZiB7RnVuY3Rpb259IEdlbmVyYWxPcGVyYXRpb25IYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+IHwgdm9pZH0gTm90aGluZyBvciBhIFByb21pc2UgcmVzb2x2aW5nIHRvIG5vdGhpbmdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBHZW5lcmFsT3BlcmF0aW9uSGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgPSBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gPVxuICB8IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPlxuICB8IEdyb3VwT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhbCBoYW5kbGVyIHR5cGUgZm9yIGdyb3VwIHVwZGF0ZSBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiBzaWduYXR1cmUgZm9yIGhhbmRsZXJzIHRoYXQgcHJvY2VzcyB1cGRhdGUgb3BlcmF0aW9ucyB3aXRoIGJvdGggbmV3IGFuZCBvbGQgbW9kZWwgc3RhdGVzXG4gKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gTWV0YWRhdGEgdHlwZSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3MgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gR2VuZXJhbFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBHZW5lcmFsVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgPSBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gPVxuICB8IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz5cbiAgfCBHcm91cFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz47XG4iXX0=
@@ -91,6 +91,8 @@ export declare class Context<F extends RepositoryFlags> {
91
91
  get timestamp(): F["timestamp"];
92
92
  /**
93
93
  * @description Retrieves a value from the context by key.
94
+ * @param {string} key
95
+ * @return {any}
94
96
  */
95
97
  get<K extends keyof F>(key: K): F[K];
96
98
  /**
@@ -98,6 +98,8 @@ export class Context {
98
98
  }
99
99
  /**
100
100
  * @description Retrieves a value from the context by key.
101
+ * @param {string} key
102
+ * @return {any}
101
103
  */
102
104
  get(key) {
103
105
  try {
@@ -156,4 +158,4 @@ export class Context {
156
158
  return { context: c, args: args };
157
159
  }
158
160
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXBvc2l0b3J5L0NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHVCQUFvQjtBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWM3RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBd0IsQ0FJeEQsR0FBeUIsRUFDekIsRUFBRTtJQUNGLE9BQU8sSUFBSSxPQUFPLEVBQUssQ0FBQyxVQUFVLENBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQU0sQ0FDbEQsQ0FBQztBQUNULENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFDSCxNQUFNLE9BQU8sT0FBTztJQUNsQjtRQVdTLFVBQUssR0FDWixJQUFJLGlCQUFpQixFQUNHLENBQUM7UUFaekIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ25DLEtBQUssRUFBRSxJQUFJLGlCQUFpQixFQUFLO1lBQ2pDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzthQUVNLFlBQU8sR0FBd0IscUJBQXFCLEFBQTdDLENBQThDO0lBTTVEOzs7O09BSUc7SUFDSCxVQUFVLENBQW1CLEtBQVE7UUFDbkMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ25DLEtBQUssRUFBRyxJQUFJLENBQUMsS0FBZ0MsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQy9ELFFBQVEs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bnRleHRBcmdzIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IENvbnRleHR1YWwgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9Db250ZXh0dWFsXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCJ0eXBlZC1vYmplY3QtYWNjdW11bGF0b3JcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdHlwZSBmb3IgY3JlYXRpbmcgY29udGV4dCBpbnN0YW5jZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgZnVuY3Rpb24gdHlwZSB0aGF0IGNyZWF0ZXMgY29udGV4dCBpbnN0YW5jZXMgd2l0aCBzcGVjaWZpYyByZXBvc2l0b3J5IGZsYWdzLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gQ29udGV4dEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb250ZXh0RmFjdG9yeTxGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzPiA9IDxDIGV4dGVuZHMgQ29udGV4dDxGPj4oXG4gIGFyZzogT21pdDxGLCBcInRpbWVzdGFtcFwiPlxuKSA9PiBDO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGNvbnRleHQgaW5zdGFuY2VzLlxuICogQHN1bW1hcnkgQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBuZXcgQ29udGV4dCBpbnN0YW5jZXMgd2l0aCB0aGUgcHJvdmlkZWQgcmVwb3NpdG9yeSBmbGFncy5cbiAqIEl0IGF1dG9tYXRpY2FsbHkgYWRkcyBhIHRpbWVzdGFtcCB0byB0aGUgY29udGV4dCBhbmQgcmV0dXJucyBhIHByb3Blcmx5IHR5cGVkIGNvbnRleHQgaW5zdGFuY2UuXG4gKiBAY29uc3QgRGVmYXVsdENvbnRleHRGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250ZXh0RmFjdG9yeTogQ29udGV4dEZhY3Rvcnk8YW55PiA9IDxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICBhcmc6IE9taXQ8RiwgXCJ0aW1lc3RhbXBcIj5cbikgPT4ge1xuICByZXR1cm4gbmV3IENvbnRleHQ8Rj4oKS5hY2N1bXVsYXRlKFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGFyZywgeyB0aW1lc3RhbXA6IG5ldyBEYXRlKCkgfSkgYXMgRlxuICApIGFzIEM7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbnRleHQgbWFuYWdlbWVudCBjbGFzcyBmb3IgaGFuZGxpbmcgcmVwb3NpdG9yeSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIENvbnRleHQgY2xhc3MgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHJlcG9zaXRvcnkgb3BlcmF0aW9ucyB3aXRoIGZsYWdzLFxuICogcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMsIGFuZCBzdGF0ZSBhY2N1bXVsYXRpb24uIEl0IGFsbG93cyBmb3IgaGllcmFyY2hpY2FsIGNvbnRleHQgY2hhaW5zXG4gKiBhbmQgbWFpbnRhaW5zIG9wZXJhdGlvbi1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyB3aGlsZSBzdXBwb3J0aW5nIHR5cGUgc2FmZXR5IHRocm91Z2ggZ2VuZXJpY3MuXG4gKlxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3MgdGhhdCBkZWZpbmVzIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdEFjY3VtdWxhdG9yPEY+fSBjYWNoZSAtIFRoZSBpbnRlcm5hbCBjYWNoZSBzdG9yaW5nIGFjY3VtdWxhdGVkIHZhbHVlc1xuICpcbiAqIEBjbGFzc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHdpdGggcmVwb3NpdG9yeSBmbGFnc1xuICogY29uc3QgY29udGV4dCA9IG5ldyBDb250ZXh0PFJlcG9zaXRvcnlGbGFncz4oKTtcbiAqXG4gKiAvLyBBY2N1bXVsYXRpbmcgdmFsdWVzXG4gKiBjb25zdCBlbnJpY2hlZENvbnRleHQgPSBjb250ZXh0LmFjY3VtdWxhdGUoe1xuICogICB3cml0ZU9wZXJhdGlvbjogdHJ1ZSxcbiAqICAgYWZmZWN0ZWRUYWJsZXM6IFsndXNlcnMnXSxcbiAqICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLkNSRUFURVxuICogfSk7XG4gKlxuICogLy8gQWNjZXNzaW5nIHZhbHVlc1xuICogY29uc3QgaXNXcml0ZSA9IGVucmljaGVkQ29udGV4dC5nZXQoJ3dyaXRlT3BlcmF0aW9uJyk7IC8vIHRydWVcbiAqIGNvbnN0IHRhYmxlcyA9IGVucmljaGVkQ29udGV4dC5nZXQoJ2FmZmVjdGVkVGFibGVzJyk7IC8vIFsndXNlcnMnXVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBDdHggYXMgQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBDYWNoZSBhcyBPYmplY3RBY2N1bXVsYXRvclxuICpcbiAqICAgQy0+PkN0eDogbmV3IENvbnRleHQoKVxuICogICBDdHgtPj5DYWNoZTogY3JlYXRlIGNhY2hlXG4gKlxuICogICBDLT4+Q3R4OiBhY2N1bXVsYXRlKHZhbHVlKVxuICogICBDdHgtPj5DYWNoZTogYWNjdW11bGF0ZSh2YWx1ZSlcbiAqICAgQ2FjaGUtLT4+Q3R4OiB1cGRhdGVkIGNhY2hlXG4gKiAgIEN0eC0tPj5DOiB1cGRhdGVkIGNvbnRleHRcbiAqXG4gKiAgIEMtPj5DdHg6IGdldChrZXkpXG4gKiAgIEN0eC0+PkNhY2hlOiBnZXQoa2V5KVxuICogICBhbHQgS2V5IGV4aXN0cyBpbiBjYWNoZVxuICogICAgIENhY2hlLS0+PkN0eDogdmFsdWVcbiAqICAgZWxzZSBLZXkgbm90IGZvdW5kXG4gKiAgICAgQ3R4LT4+Q3R4OiBjaGVjayBwYXJlbnQgY29udGV4dFxuICogICAgIGFsdCBQYXJlbnQgZXhpc3RzXG4gKiAgICAgICBDdHgtPj5QYXJlbnQ6IGdldChrZXkpXG4gKiAgICAgICBQYXJlbnQtLT4+Q3R4OiB2YWx1ZVxuICogICAgIGVsc2UgTm8gcGFyZW50XG4gKiAgICAgICBDdHgtLT4+QzogdGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEN0eC0tPj5DOiByZXF1ZXN0ZWQgdmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHQ8RiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjYWNoZVwiLCB7XG4gICAgICB2YWx1ZTogbmV3IE9iamVjdEFjY3VtdWxhdG9yPEY+KCksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmYWN0b3J5OiBDb250ZXh0RmFjdG9yeTxhbnk+ID0gRGVmYXVsdENvbnRleHRGYWN0b3J5O1xuXG4gIHJlYWRvbmx5IGNhY2hlOiBSZXBvc2l0b3J5RmxhZ3MgJiBPYmplY3RBY2N1bXVsYXRvcjxhbnk+ID1cbiAgICBuZXcgT2JqZWN0QWNjdW11bGF0b3IoKSBhcyB1bmtub3duIGFzIFJlcG9zaXRvcnlGbGFncyAmXG4gICAgICBPYmplY3RBY2N1bXVsYXRvcjxhbnk+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgbmV3IHZhbHVlcyBpbnRvIHRoZSBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBNZXJnZXMgdGhlIHByb3ZpZGVkIHZhbHVlIG9iamVjdCB3aXRoIHRoZSBleGlzdGluZyBjb250ZXh0IHN0YXRlLFxuICAgKiBjcmVhdGluZyBhIG5ldyBpbW11dGFibGUgY2FjaGUgc3RhdGUuXG4gICAqL1xuICBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVcIiwge1xuICAgICAgdmFsdWU6ICh0aGlzLmNhY2hlIGFzIE9iamVjdEFjY3VtdWxhdG9yPGFueT4pLmFjY3VtdWxhdGUodmFsdWUpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBDb250ZXh0PEYgJiBWPjtcbiAgfVxuXG4gIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNhY2hlIGFzIGFueSkudGltZXN0YW1wIGFzIEZbXCJ0aW1lc3RhbXBcIl07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gdGhlIGNvbnRleHQgYnkga2V5LlxuICAgKi9cbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBGPihrZXk6IEspOiBGW0tdIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICh0aGlzLmNhY2hlIGFzIE9iamVjdEFjY3VtdWxhdG9yPGFueT4pLmdldChcbiAgICAgICAga2V5IGFzIHVua25vd24gYXMgc3RyaW5nXG4gICAgICApIGFzIEZbS107XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgY29uc3QgcGFyZW50ID0gKHRoaXMuY2FjaGUgYXMgYW55KS5wYXJlbnRDb250ZXh0IGFzXG4gICAgICAgIHwgQ29udGV4dDxGPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwYXJlbnQpIHJldHVybiBwYXJlbnQuZ2V0KGtleSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNoaWxkIGNvbnRleHQgZnJvbSBhbm90aGVyIGNvbnRleHRcbiAgICovXG4gIHN0YXRpYyBjaGlsZEZyb208RiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncywgQyBleHRlbmRzIENvbnRleHQ8Rj4+KFxuICAgIGNvbnRleHQ6IEMsXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxGPlxuICApOiBDIHtcbiAgICByZXR1cm4gQ29udGV4dC5mYWN0b3J5KFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKGNvbnRleHQgYXMgYW55KS5jYWNoZSwgb3ZlcnJpZGVzIHx8IHt9KVxuICAgICkgYXMgdW5rbm93biBhcyBDO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgZnJvbSBvcGVyYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGZyb208XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gID4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEY+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxDPiB7XG4gICAgcmV0dXJuIENvbnRleHQuZmFjdG9yeShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MgYXMgUmVwb3NpdG9yeUZsYWdzLCBvdmVycmlkZXMsIHtcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgICAgIG1vZGVsOiBtb2RlbCxcbiAgICAgIH0pXG4gICAgKSBhcyBDO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhcmd1bWVudHMgZm9yIGNvbnRleHQgb3BlcmF0aW9uc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFyZ3M8XG4gICAgTSBleHRlbmRzIE1vZGVsPGFueT4sXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgPihcbiAgICBvcGVyYXRpb246XG4gICAgICB8IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICAgICAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYXJnczogYW55W10sXG4gICAgY29udGV4dHVhbD86IENvbnRleHR1YWw8Rj4sXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxGPlxuICApOiBQcm9taXNlPENvbnRleHRBcmdzPEYsIEM+PiB7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3MucG9wKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0KCkge1xuICAgICAgaWYgKGNvbnRleHR1YWwpXG4gICAgICAgIHJldHVybiBjb250ZXh0dWFsLmNvbnRleHQob3BlcmF0aW9uLCBvdmVycmlkZXMgfHwge30sIG1vZGVsLCAuLi5hcmdzKTtcbiAgICAgIHJldHVybiBDb250ZXh0LmZyb20ob3BlcmF0aW9uLCBvdmVycmlkZXMgfHwge30sIG1vZGVsLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICBsZXQgYzogQztcbiAgICBpZiAobGFzdCkge1xuICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBDb250ZXh0KSB7XG4gICAgICAgIGMgPSBsYXN0IGFzIEM7XG4gICAgICAgIGFyZ3MucHVzaChsYXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyZ3MucHVzaChsYXN0KTtcbiAgICAgICAgYyA9IChhd2FpdCBnZXRDb250ZXh0KCkpIGFzIEM7XG4gICAgICAgIGFyZ3MucHVzaChjKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYyA9IChhd2FpdCBnZXRDb250ZXh0KCkpIGFzIEM7XG4gICAgICBhcmdzLnB1c2goYyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGV4dDogYywgYXJnczogYXJncyB9O1xuICB9XG59XG4iXX0=
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXBvc2l0b3J5L0NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHVCQUFvQjtBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWM3RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBd0IsQ0FJeEQsR0FBeUIsRUFDekIsRUFBRTtJQUNGLE9BQU8sSUFBSSxPQUFPLEVBQUssQ0FBQyxVQUFVLENBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQU0sQ0FDbEQsQ0FBQztBQUNULENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFDSCxNQUFNLE9BQU8sT0FBTztJQUNsQjtRQVdTLFVBQUssR0FDWixJQUFJLGlCQUFpQixFQUNHLENBQUM7UUFaekIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ25DLEtBQUssRUFBRSxJQUFJLGlCQUFpQixFQUFLO1lBQ2pDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzthQUVNLFlBQU8sR0FBd0IscUJBQXFCLEFBQTdDLENBQThDO0lBTTVEOzs7O09BSUc7SUFDSCxVQUFVLENBQW1CLEtBQVE7UUFDbkMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ25DLEtBQUssRUFBRyxJQUFJLENBQUMsS0FBZ0MsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQy9ELFFBQVEs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Q29udGV4dEFyZ3MgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgQ29udGV4dHVhbCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0NvbnRleHR1YWxcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE9iamVjdEFjY3VtdWxhdG9yIH0gZnJvbSBcInR5cGVkLW9iamVjdC1hY2N1bXVsYXRvclwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmFjdG9yeSB0eXBlIGZvciBjcmVhdGluZyBjb250ZXh0IGluc3RhbmNlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBmdW5jdGlvbiB0eXBlIHRoYXQgY3JlYXRlcyBjb250ZXh0IGluc3RhbmNlcyB3aXRoIHNwZWNpZmljIHJlcG9zaXRvcnkgZmxhZ3MuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBDb250ZXh0RmFjdG9yeVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRGYWN0b3J5PEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3M+ID0gPEMgZXh0ZW5kcyBDb250ZXh0PEY+PihcbiAgYXJnOiBPbWl0PEYsIFwidGltZXN0YW1wXCI+XG4pID0+IEM7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZmFjdG9yeSBmb3IgY3JlYXRpbmcgY29udGV4dCBpbnN0YW5jZXMuXG4gKiBAc3VtbWFyeSBBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIG5ldyBDb250ZXh0IGluc3RhbmNlcyB3aXRoIHRoZSBwcm92aWRlZCByZXBvc2l0b3J5IGZsYWdzLlxuICogSXQgYXV0b21hdGljYWxseSBhZGRzIGEgdGltZXN0YW1wIHRvIHRoZSBjb250ZXh0IGFuZCByZXR1cm5zIGEgcHJvcGVybHkgdHlwZWQgY29udGV4dCBpbnN0YW5jZS5cbiAqIEBjb25zdCBEZWZhdWx0Q29udGV4dEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdENvbnRleHRGYWN0b3J5OiBDb250ZXh0RmFjdG9yeTxhbnk+ID0gPFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIGFyZzogT21pdDxGLCBcInRpbWVzdGFtcFwiPlxuKSA9PiB7XG4gIHJldHVybiBuZXcgQ29udGV4dDxGPigpLmFjY3VtdWxhdGUoXG4gICAgT2JqZWN0LmFzc2lnbih7fSwgYXJnLCB7IHRpbWVzdGFtcDogbmV3IERhdGUoKSB9KSBhcyBGXG4gICkgYXMgQztcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgY29udGV4dCBtYW5hZ2VtZW50IGNsYXNzIGZvciBoYW5kbGluZyByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGUgQ29udGV4dCBjbGFzcyBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgcmVwb3NpdG9yeSBvcGVyYXRpb25zIHdpdGggZmxhZ3MsXG4gKiBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcywgYW5kIHN0YXRlIGFjY3VtdWxhdGlvbi4gSXQgYWxsb3dzIGZvciBoaWVyYXJjaGljYWwgY29udGV4dCBjaGFpbnNcbiAqIGFuZCBtYWludGFpbnMgb3BlcmF0aW9uLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIHdoaWxlIHN1cHBvcnRpbmcgdHlwZSBzYWZldHkgdGhyb3VnaCBnZW5lcmljcy5cbiAqXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFncyB0aGF0IGRlZmluZXMgdGhlIGNvbnRleHQgY29uZmlndXJhdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0QWNjdW11bGF0b3I8Rj59IGNhY2hlIC0gVGhlIGludGVybmFsIGNhY2hlIHN0b3JpbmcgYWNjdW11bGF0ZWQgdmFsdWVzXG4gKlxuICogQGNsYXNzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgd2l0aCByZXBvc2l0b3J5IGZsYWdzXG4gKiBjb25zdCBjb250ZXh0ID0gbmV3IENvbnRleHQ8UmVwb3NpdG9yeUZsYWdzPigpO1xuICpcbiAqIC8vIEFjY3VtdWxhdGluZyB2YWx1ZXNcbiAqIGNvbnN0IGVucmljaGVkQ29udGV4dCA9IGNvbnRleHQuYWNjdW11bGF0ZSh7XG4gKiAgIHdyaXRlT3BlcmF0aW9uOiB0cnVlLFxuICogICBhZmZlY3RlZFRhYmxlczogWyd1c2VycyddLFxuICogICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gKiB9KTtcbiAqXG4gKiAvLyBBY2Nlc3NpbmcgdmFsdWVzXG4gKiBjb25zdCBpc1dyaXRlID0gZW5yaWNoZWRDb250ZXh0LmdldCgnd3JpdGVPcGVyYXRpb24nKTsgLy8gdHJ1ZVxuICogY29uc3QgdGFibGVzID0gZW5yaWNoZWRDb250ZXh0LmdldCgnYWZmZWN0ZWRUYWJsZXMnKTsgLy8gWyd1c2VycyddXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEN0eCBhcyBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IENhY2hlIGFzIE9iamVjdEFjY3VtdWxhdG9yXG4gKlxuICogICBDLT4+Q3R4OiBuZXcgQ29udGV4dCgpXG4gKiAgIEN0eC0+PkNhY2hlOiBjcmVhdGUgY2FjaGVcbiAqXG4gKiAgIEMtPj5DdHg6IGFjY3VtdWxhdGUodmFsdWUpXG4gKiAgIEN0eC0+PkNhY2hlOiBhY2N1bXVsYXRlKHZhbHVlKVxuICogICBDYWNoZS0tPj5DdHg6IHVwZGF0ZWQgY2FjaGVcbiAqICAgQ3R4LS0+PkM6IHVwZGF0ZWQgY29udGV4dFxuICpcbiAqICAgQy0+PkN0eDogZ2V0KGtleSlcbiAqICAgQ3R4LT4+Q2FjaGU6IGdldChrZXkpXG4gKiAgIGFsdCBLZXkgZXhpc3RzIGluIGNhY2hlXG4gKiAgICAgQ2FjaGUtLT4+Q3R4OiB2YWx1ZVxuICogICBlbHNlIEtleSBub3QgZm91bmRcbiAqICAgICBDdHgtPj5DdHg6IGNoZWNrIHBhcmVudCBjb250ZXh0XG4gKiAgICAgYWx0IFBhcmVudCBleGlzdHNcbiAqICAgICAgIEN0eC0+PlBhcmVudDogZ2V0KGtleSlcbiAqICAgICAgIFBhcmVudC0tPj5DdHg6IHZhbHVlXG4gKiAgICAgZWxzZSBObyBwYXJlbnRcbiAqICAgICAgIEN0eC0tPj5DOiB0aHJvdyBlcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgQ3R4LS0+PkM6IHJlcXVlc3RlZCB2YWx1ZVxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dDxGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNhY2hlXCIsIHtcbiAgICAgIHZhbHVlOiBuZXcgT2JqZWN0QWNjdW11bGF0b3I8Rj4oKSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGZhY3Rvcnk6IENvbnRleHRGYWN0b3J5PGFueT4gPSBEZWZhdWx0Q29udGV4dEZhY3Rvcnk7XG5cbiAgcmVhZG9ubHkgY2FjaGU6IFJlcG9zaXRvcnlGbGFncyAmIE9iamVjdEFjY3VtdWxhdG9yPGFueT4gPVxuICAgIG5ldyBPYmplY3RBY2N1bXVsYXRvcigpIGFzIHVua25vd24gYXMgUmVwb3NpdG9yeUZsYWdzICZcbiAgICAgIE9iamVjdEFjY3VtdWxhdG9yPGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBY2N1bXVsYXRlcyBuZXcgdmFsdWVzIGludG8gdGhlIGNvbnRleHQuXG4gICAqIEBzdW1tYXJ5IE1lcmdlcyB0aGUgcHJvdmlkZWQgdmFsdWUgb2JqZWN0IHdpdGggdGhlIGV4aXN0aW5nIGNvbnRleHQgc3RhdGUsXG4gICAqIGNyZWF0aW5nIGEgbmV3IGltbXV0YWJsZSBjYWNoZSBzdGF0ZS5cbiAgICovXG4gIGFjY3VtdWxhdGU8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjYWNoZVwiLCB7XG4gICAgICB2YWx1ZTogKHRoaXMuY2FjaGUgYXMgT2JqZWN0QWNjdW11bGF0b3I8YW55PikuYWNjdW11bGF0ZSh2YWx1ZSksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIENvbnRleHQ8RiAmIFY+O1xuICB9XG5cbiAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gKHRoaXMuY2FjaGUgYXMgYW55KS50aW1lc3RhbXAgYXMgRltcInRpbWVzdGFtcFwiXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgY29udGV4dCBieSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7YW55fVxuICAgKi9cbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBGPihrZXk6IEspOiBGW0tdIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICh0aGlzLmNhY2hlIGFzIE9iamVjdEFjY3VtdWxhdG9yPGFueT4pLmdldChcbiAgICAgICAga2V5IGFzIHVua25vd24gYXMgc3RyaW5nXG4gICAgICApIGFzIEZbS107XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgY29uc3QgcGFyZW50ID0gKHRoaXMuY2FjaGUgYXMgYW55KS5wYXJlbnRDb250ZXh0IGFzXG4gICAgICAgIHwgQ29udGV4dDxGPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwYXJlbnQpIHJldHVybiBwYXJlbnQuZ2V0KGtleSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNoaWxkIGNvbnRleHQgZnJvbSBhbm90aGVyIGNvbnRleHRcbiAgICovXG4gIHN0YXRpYyBjaGlsZEZyb208RiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncywgQyBleHRlbmRzIENvbnRleHQ8Rj4+KFxuICAgIGNvbnRleHQ6IEMsXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxGPlxuICApOiBDIHtcbiAgICByZXR1cm4gQ29udGV4dC5mYWN0b3J5KFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKGNvbnRleHQgYXMgYW55KS5jYWNoZSwgb3ZlcnJpZGVzIHx8IHt9KVxuICAgICkgYXMgdW5rbm93biBhcyBDO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgZnJvbSBvcGVyYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGZyb208XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gID4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEY+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxDPiB7XG4gICAgcmV0dXJuIENvbnRleHQuZmFjdG9yeShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MgYXMgUmVwb3NpdG9yeUZsYWdzLCBvdmVycmlkZXMsIHtcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgICAgIG1vZGVsOiBtb2RlbCxcbiAgICAgIH0pXG4gICAgKSBhcyBDO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhcmd1bWVudHMgZm9yIGNvbnRleHQgb3BlcmF0aW9uc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFyZ3M8XG4gICAgTSBleHRlbmRzIE1vZGVsPGFueT4sXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgPihcbiAgICBvcGVyYXRpb246XG4gICAgICB8IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICAgICAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYXJnczogYW55W10sXG4gICAgY29udGV4dHVhbD86IENvbnRleHR1YWw8Rj4sXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxGPlxuICApOiBQcm9taXNlPENvbnRleHRBcmdzPEYsIEM+PiB7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3MucG9wKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0KCkge1xuICAgICAgaWYgKGNvbnRleHR1YWwpXG4gICAgICAgIHJldHVybiBjb250ZXh0dWFsLmNvbnRleHQob3BlcmF0aW9uLCBvdmVycmlkZXMgfHwge30sIG1vZGVsLCAuLi5hcmdzKTtcbiAgICAgIHJldHVybiBDb250ZXh0LmZyb20ob3BlcmF0aW9uLCBvdmVycmlkZXMgfHwge30sIG1vZGVsLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICBsZXQgYzogQztcbiAgICBpZiAobGFzdCkge1xuICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBDb250ZXh0KSB7XG4gICAgICAgIGMgPSBsYXN0IGFzIEM7XG4gICAgICAgIGFyZ3MucHVzaChsYXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyZ3MucHVzaChsYXN0KTtcbiAgICAgICAgYyA9IChhd2FpdCBnZXRDb250ZXh0KCkpIGFzIEM7XG4gICAgICAgIGFyZ3MucHVzaChjKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYyA9IChhd2FpdCBnZXRDb250ZXh0KCkpIGFzIEM7XG4gICAgICBhcmdzLnB1c2goYyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGV4dDogYywgYXJnczogYXJncyB9O1xuICB9XG59XG4iXX0=