@decaf-ts/decorator-validation 1.7.12 → 1.7.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/decorator-validation.cjs +272 -107
- package/dist/decorator-validation.esm.cjs +272 -108
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/Model.js +31 -7
- package/lib/esm/model/decorators.d.ts +2 -12
- package/lib/esm/model/decorators.js +57 -37
- package/lib/esm/model/validation.d.ts +2 -2
- package/lib/esm/model/validation.js +51 -19
- package/lib/esm/utils/Decoration.d.ts +15 -3
- package/lib/esm/utils/Decoration.js +49 -12
- package/lib/esm/utils/decorators.d.ts +1 -1
- package/lib/esm/utils/decorators.js +13 -4
- package/lib/esm/utils/types.d.ts +3 -2
- package/lib/esm/utils/types.js +1 -1
- package/lib/esm/validation/Validators/ListValidator.js +8 -4
- package/lib/esm/validation/Validators/TypeValidator.js +12 -8
- package/lib/esm/validation/decorators.d.ts +4 -4
- package/lib/esm/validation/decorators.js +58 -22
- package/lib/esm/validation/types.d.ts +2 -1
- package/lib/esm/validation/types.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/Model.cjs +31 -7
- package/lib/model/decorators.cjs +58 -37
- package/lib/model/decorators.d.ts +2 -12
- package/lib/model/validation.cjs +51 -19
- package/lib/model/validation.d.ts +2 -2
- package/lib/utils/Decoration.cjs +49 -12
- package/lib/utils/Decoration.d.ts +15 -3
- package/lib/utils/decorators.cjs +13 -4
- package/lib/utils/decorators.d.ts +1 -1
- package/lib/utils/types.cjs +1 -1
- package/lib/utils/types.d.ts +3 -2
- package/lib/validation/Validators/ListValidator.cjs +8 -4
- package/lib/validation/Validators/TypeValidator.cjs +12 -8
- package/lib/validation/decorators.cjs +58 -22
- package/lib/validation/decorators.d.ts +4 -4
- package/lib/validation/types.cjs +1 -1
- package/lib/validation/types.d.ts +2 -1
- package/package.json +1 -1
|
@@ -74,18 +74,18 @@ function cleanupTemporaryContext(target, key) {
|
|
|
74
74
|
* @param isAsync - Whether to perform async validation
|
|
75
75
|
* @returns Validation result from hasErrors()
|
|
76
76
|
*/
|
|
77
|
-
function getNestedValidationErrors(nestedModel, parentModel, isAsync) {
|
|
77
|
+
function getNestedValidationErrors(nestedModel, parentModel, isAsync, ...propsToIgnore) {
|
|
78
78
|
// Set temporary context for nested models
|
|
79
79
|
if (parentModel) {
|
|
80
80
|
setTemporaryContext(nestedModel, VALIDATION_PARENT_KEY, parentModel);
|
|
81
81
|
}
|
|
82
82
|
setTemporaryContext(nestedModel, ASYNC_META_KEY, !!isAsync);
|
|
83
|
-
const errs = nestedModel.hasErrors();
|
|
83
|
+
const errs = nestedModel.hasErrors(...propsToIgnore);
|
|
84
84
|
cleanupTemporaryContext(nestedModel, VALIDATION_PARENT_KEY);
|
|
85
85
|
cleanupTemporaryContext(nestedModel, ASYNC_META_KEY);
|
|
86
86
|
return errs;
|
|
87
87
|
}
|
|
88
|
-
export function validateChildValue(prop, childValue, parentModel, allowedTypes, async) {
|
|
88
|
+
export function validateChildValue(prop, childValue, parentModel, allowedTypes, async, ...propsToIgnore) {
|
|
89
89
|
let err = undefined;
|
|
90
90
|
let atLeastOneMatched = false;
|
|
91
91
|
for (const allowedType of allowedTypes) {
|
|
@@ -99,7 +99,7 @@ export function validateChildValue(prop, childValue, parentModel, allowedTypes,
|
|
|
99
99
|
}
|
|
100
100
|
if (childValue instanceof Constr) {
|
|
101
101
|
atLeastOneMatched = true;
|
|
102
|
-
err = getNestedValidationErrors(childValue, parentModel, async);
|
|
102
|
+
err = getNestedValidationErrors(childValue, parentModel, async, ...propsToIgnore);
|
|
103
103
|
break;
|
|
104
104
|
}
|
|
105
105
|
}
|
|
@@ -127,7 +127,9 @@ export function validateDecorator(model, value, decorator, async) {
|
|
|
127
127
|
ignoreUndefined: true,
|
|
128
128
|
ignoreNull: true,
|
|
129
129
|
});
|
|
130
|
-
const maybeAsyncErrors = validator.hasErrors(value,
|
|
130
|
+
const maybeAsyncErrors = validator.hasErrors(value, decorator.key === ModelKeys.TYPE
|
|
131
|
+
? { types: decoratorProps[0].name }
|
|
132
|
+
: decoratorProps, context);
|
|
131
133
|
return toConditionalPromise(maybeAsyncErrors, async);
|
|
132
134
|
}
|
|
133
135
|
/**
|
|
@@ -157,7 +159,7 @@ export function validateDecorator(model, value, decorator, async) {
|
|
|
157
159
|
*
|
|
158
160
|
* @function validateDecorators
|
|
159
161
|
*/
|
|
160
|
-
export function validateDecorators(model, prop, value, decorators, async) {
|
|
162
|
+
export function validateDecorators(model, prop, value, decorators, async, ...propsToIgnore) {
|
|
161
163
|
const result = {};
|
|
162
164
|
for (const decorator of decorators) {
|
|
163
165
|
// skip async decorators if validateDecorators is called synchronously (async = false)
|
|
@@ -172,15 +174,19 @@ export function validateDecorators(model, prop, value, decorators, async) {
|
|
|
172
174
|
if (decorator.key === ValidationKeys.LIST && (!validationErrors || async)) {
|
|
173
175
|
const values = value instanceof Set ? [...value] : value;
|
|
174
176
|
if (values && values.length > 0) {
|
|
175
|
-
|
|
177
|
+
let types = (decorator.props.class ||
|
|
176
178
|
decorator.props.clazz ||
|
|
177
179
|
decorator.props.customTypes);
|
|
180
|
+
types = (Array.isArray(types) ? types : [types]).map((e) => {
|
|
181
|
+
e = typeof e === "function" && !e.name ? e() : e;
|
|
182
|
+
return e.name ? e.name : e;
|
|
183
|
+
});
|
|
178
184
|
const allowedTypes = [types].flat().map((t) => String(t).toLowerCase());
|
|
179
185
|
// const reserved = Object.values(ReservedModels).map((v) => v.toLowerCase()) as string[];
|
|
180
186
|
const errs = values.map((childValue) => {
|
|
181
187
|
// if (Model.isModel(v) && !reserved.includes(v) {
|
|
182
188
|
if (Model.isModel(childValue)) {
|
|
183
|
-
return validateChildValue(prop, childValue, model,
|
|
189
|
+
return validateChildValue(prop, childValue, model, types.flat(), !!async, ...propsToIgnore);
|
|
184
190
|
// return getNestedValidationErrors(childValue, model, async);
|
|
185
191
|
}
|
|
186
192
|
return allowedTypes.includes(typeof childValue)
|
|
@@ -199,8 +205,9 @@ export function validateDecorators(model, prop, value, decorators, async) {
|
|
|
199
205
|
}
|
|
200
206
|
}
|
|
201
207
|
}
|
|
208
|
+
const name = decorator.key === ModelKeys.TYPE ? ValidationKeys.TYPE : decorator.key;
|
|
202
209
|
if (validationErrors)
|
|
203
|
-
result[
|
|
210
|
+
result[name] = validationErrors;
|
|
204
211
|
}
|
|
205
212
|
if (!async)
|
|
206
213
|
return Object.keys(result).length > 0
|
|
@@ -280,14 +287,32 @@ export function validate(model, async, ...propsToIgnore) {
|
|
|
280
287
|
if (!decorators?.length)
|
|
281
288
|
continue;
|
|
282
289
|
// Get the default type validator
|
|
283
|
-
const
|
|
284
|
-
|
|
285
|
-
|
|
290
|
+
const priority = [ValidationKeys.TYPE, ModelKeys.TYPE];
|
|
291
|
+
const designTypeDec = priority
|
|
292
|
+
.map((key) => decorators.find((d) => d.key === key))
|
|
293
|
+
.find(Boolean);
|
|
294
|
+
// Ensures that only one type decorator remains.
|
|
295
|
+
if (designTypeDec?.key === ValidationKeys.TYPE) {
|
|
296
|
+
decorators.splice(0, decorators.length, ...decorators.filter((d) => d.key !== ModelKeys.TYPE));
|
|
297
|
+
}
|
|
286
298
|
if (!designTypeDec)
|
|
287
299
|
continue;
|
|
288
|
-
const designType = designTypeDec.props.
|
|
300
|
+
const designType = designTypeDec.props.class ||
|
|
301
|
+
designTypeDec.props.clazz ||
|
|
302
|
+
designTypeDec.props.customTypes ||
|
|
303
|
+
designTypeDec.props.name;
|
|
304
|
+
// TS emits "Object" as design:type for unions (string | number) and intersections (A & B).
|
|
305
|
+
// Since this metadata is ambiguous for validation, skip design:type checks in these cases.
|
|
306
|
+
// To enforce design:type validation explicitly, the @type validator can be used.
|
|
307
|
+
if (designTypeDec.key === ModelKeys.TYPE && designType === "Object")
|
|
308
|
+
decorators.shift();
|
|
309
|
+
const designTypes = (Array.isArray(designType) ? designType : [designType]).map((e) => {
|
|
310
|
+
e = typeof e === "function" && !e.name ? e() : e;
|
|
311
|
+
return e.name ? e.name : e;
|
|
312
|
+
});
|
|
289
313
|
// Handle array or Set types and enforce the presence of @list decorator
|
|
290
|
-
if ([Array.name, Set.name].includes(designType)) {
|
|
314
|
+
// if ([Array.name, Set.name].includes(designType)) {}
|
|
315
|
+
if (designTypes.some((t) => [Array.name, Set.name].includes(t))) {
|
|
291
316
|
if (!decorators.some((d) => d.key === ValidationKeys.LIST)) {
|
|
292
317
|
result[propKey] = {
|
|
293
318
|
[ValidationKeys.TYPE]: `Array or Set property '${propKey}' requires a @list decorator`,
|
|
@@ -309,7 +334,7 @@ export function validate(model, async, ...propsToIgnore) {
|
|
|
309
334
|
}
|
|
310
335
|
propValue = propValue instanceof Set ? [...propValue] : propValue;
|
|
311
336
|
}
|
|
312
|
-
const propErrors = validateDecorators(model, propKey, propValue, decorators, async) || {};
|
|
337
|
+
const propErrors = validateDecorators(model, propKey, propValue, decorators, async, ...propsToIgnore) || {};
|
|
313
338
|
// Check for nested properties.
|
|
314
339
|
// To prevent unnecessary processing, "propValue" must be defined and validatable
|
|
315
340
|
// let nestedErrors: Record<string, any> = {};
|
|
@@ -324,15 +349,22 @@ export function validate(model, async, ...propsToIgnore) {
|
|
|
324
349
|
console.warn("Model should be validatable but it's not.");
|
|
325
350
|
}
|
|
326
351
|
else {
|
|
327
|
-
const Constr =
|
|
352
|
+
const Constr = (Array.isArray(designType) ? designType : [designType])
|
|
353
|
+
.map((d) => {
|
|
354
|
+
if (typeof d === "function" && !d.name)
|
|
355
|
+
d = d();
|
|
356
|
+
return Model.get(d.name || d);
|
|
357
|
+
})
|
|
358
|
+
.find((d) => !!d);
|
|
328
359
|
// Ensure instance is of the expected model class.
|
|
329
360
|
if (!Constr || !(instance instanceof Constr)) {
|
|
330
361
|
propErrors[ValidationKeys.TYPE] = !Constr
|
|
331
|
-
? `Unable to verify type consistency, missing model registry for ${
|
|
362
|
+
? `Unable to verify type consistency, missing model registry for ${designTypes.toString()} on prop ${propKey}`
|
|
332
363
|
: `Value must be an instance of ${Constr.name}`;
|
|
364
|
+
delete propErrors[ModelKeys.TYPE]; // remove duplicate type error
|
|
333
365
|
}
|
|
334
366
|
else {
|
|
335
|
-
nestedErrors[propKey] = getNestedValidationErrors(instance, model, async);
|
|
367
|
+
nestedErrors[propKey] = getNestedValidationErrors(instance, model, async, ...propsToIgnore);
|
|
336
368
|
}
|
|
337
369
|
}
|
|
338
370
|
}
|
|
@@ -388,4 +420,4 @@ export function validate(model, async, ...propsToIgnore) {
|
|
|
388
420
|
: undefined;
|
|
389
421
|
});
|
|
390
422
|
}
|
|
391
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQ0FBK0I7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQ0FBMkI7QUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxtQkFBZ0I7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQ0FBaUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnREFBMkM7QUFNcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQ0FBMkI7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxnQ0FBcUI7QUFFckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBZ0I7QUFFL0M7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsS0FBMEIsRUFDMUIsSUFBWSxFQUNaLGFBQXFCLGNBQWMsQ0FBQyxPQUFPO0lBRTNDLE9BQU8sVUFBVSxDQUFDLHFCQUFxQixDQUNyQyxVQUFVLEVBQ1YsS0FBSyxFQUNMLElBQUksQ0FDK0MsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLE1BQU0sbUJBQW1CLEdBQTRDLEVBQUUsQ0FBQztJQUV4RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQ0UsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDakQsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUM3QixDQUFDO1lBQ0QsTUFBTSxHQUFH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QUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXZCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekQsTUFBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDbkMsQ0FBQztpQkFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLE1BQWMsQ0FBQyxHQUFHLENBQUM7b0JBQ2xCLEdBQUcsQ0FBQyxNQUFNLFlBQVksS0FBSzt3QkFDekIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTzt3QkFDcEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbkMsQ0FBQyxDQUFDLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQyxDQUFRLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE1vZGVsRXJyb3JzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGF0aFByb3h5RW5naW5lIH0gZnJvbSBcIi4uL3V0aWxzL1BhdGhQcm94eVwiO1xuaW1wb3J0IHsgQVNZTkNfTUVUQV9LRVksIFZBTElEQVRJT05fUEFSRU5UX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbmFsQXN5bmMsIERlY29yYXRvck1ldGFkYXRhQXN5bmMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHRvQ29uZGl0aW9uYWxQcm9taXNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRpb24gbWV0YWRhdGEgZGVjb3JhdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwcm9wZXJ0eSBvZiBhIG1vZGVsLFxuICogdXNpbmcgdGhlIHJlZmxlY3RpdmUgbWV0YWRhdGEga2V5LlxuICpcbiAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcyBjb250YWluaW5nIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBkZWNvcmF0b3JzIHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmbGVjdEtleSAtIFRoZSBtZXRhZGF0YSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVjb3JhdG9ycy5cbiAqICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RgLlxuICpcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIGRlY29yYXRvcnMgYXBwbGllZCB0byB0aGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25EZWNvcmF0b3JzKFxuICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJvcDogc3RyaW5nLFxuICByZWZsZWN0S2V5OiBzdHJpbmcgPSBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uIHtcbiAgcmV0dXJuIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgIHJlZmxlY3RLZXksXG4gICAgbW9kZWwsXG4gICAgcHJvcFxuICApIGFzIHVua25vd24gYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHJpZXZlcyBhbGwgdmFsaWRhdGFibGUgcHJvcGVydHkgZGVjb3JhdG9ycyBmcm9tIGEgZ2l2ZW4gbW9kZWwsIGV4Y2x1ZGluZyBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhIG1vZGVsIGluc3RhbmNlLCBmaWx0ZXJpbmcgb3V0IGFueSBwcm9wZXJ0aWVzXG4gKiBsaXN0ZWQgaW4gdGhlIGBwcm9wc1RvSWdub3JlYCBhcnJheS4gRm9yIGVhY2ggcmVtYWluaW5nIHByb3BlcnR5LCBpdCBjaGVja3Mgd2hldGhlciB2YWxpZGF0aW9uXG4gKiBkZWNvcmF0b3JzIGFyZSBwcmVzZW50IHVzaW5nIGBnZXRWYWxpZGF0aW9uRGVjb3JhdG9yc2AsIGFuZCBpZiBzbywgY29sbGVjdHMgdGhlbSBpbiB0aGUgcmVzdWx0IGFycmF5LlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gQSBnZW5lcmljIHBhcmFtZXRlciBleHRlbmRpbmcgdGhlIGBNb2RlbGAgY2xhc3MsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyBpbnNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIEFuIGluc3RhbmNlIG9mIGEgY2xhc3MgZXh0ZW5kaW5nIGBNb2RlbGAgZnJvbSB3aGljaCB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzIHdpbGwgYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNUb0lnbm9yZSAtIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdmFsaWRhdGlvbiBpbnNwZWN0aW9uLlxuICpcbiAqIEByZXR1cm4ge1ZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXX0gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBkZWNvcmF0b3IgZGVmaW5pdGlvbnNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwncyBwcm9wZXJ0aWVzLCBleGNsdWRpbmcgdGhvc2UgbGlzdGVkIGluIGBwcm9wc1RvSWdub3JlYC5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbW9kZWwpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHByb3ApICYmXG4gICAgICAhcHJvcHNUb0lnbm9yZS5pbmNsdWRlcyhwcm9wKVxuICAgICkge1xuICAgICAgY29uc3QgZGVjID0gZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMobW9kZWwsIHByb3ApO1xuICAgICAgaWYgKGRlYykgZGVjb3JhdGVkUHJvcGVydGllcy5wdXNoKGRlYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogU2FmZWx5IHNldHMgdGVtcG9yYXJ5IG1ldGFkYXRhIG9uIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBzZXRUZW1wb3JhcnlDb250ZXh0KFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBzeW1ib2wgfCBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHRhcmdldFtrZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogU2FmZWx5IHJlbW92ZXMgdGVtcG9yYXJ5IG1ldGFkYXRhIGZyb20gYW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KHRhcmdldDogYW55LCBrZXk6IHN5bWJvbCB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSBkZWxldGUgdGFyZ2V0W2tleV07XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdmFsaWRhdGlvbiB3aXRoIHRlbXBvcmFyeSBjb250ZXh0IGFuZCByZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICpcbiAqIEBwYXJhbSBuZXN0ZWRNb2RlbCAtIFRoZSBpbnN0YW5jZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHBhcmVudE1vZGVsIC0gUmVmZXJlbmNlIHRvIGEgcGFyZW50IG9iamVjdCBmb3IgbmVzdGVkIHZhbGlkYXRpb25cbiAqIEBwYXJhbSBpc0FzeW5jIC0gV2hldGhlciB0byBwZXJmb3JtIGFzeW5jIHZhbGlkYXRpb25cbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IGZyb20gaGFzRXJyb3JzKClcbiAqL1xuZnVuY3Rpb24gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG5lc3RlZE1vZGVsOiBNLFxuICBwYXJlbnRNb2RlbD86IE0sXG4gIGlzQXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgLy8gU2V0IHRlbXBvcmFyeSBjb250ZXh0IGZvciBuZXN0ZWQgbW9kZWxzXG4gIGlmIChwYXJlbnRNb2RlbCkge1xuICAgIHNldFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSwgcGFyZW50TW9kZWwpO1xuICB9XG4gIHNldFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIEFTWU5DX01FVEFfS0VZLCAhIWlzQXN5bmMpO1xuXG4gIGNvbnN0IGVycnMgPSBuZXN0ZWRNb2RlbC5oYXNFcnJvcnMoKTtcbiAgY2xlYW51cFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSk7XG4gIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBBU1lOQ19NRVRBX0tFWSk7XG4gIHJldHVybiBlcnJzIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRWYWx1ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBwcm9wOiBzdHJpbmcsXG4gIGNoaWxkVmFsdWU6IGFueSxcbiAgcGFyZW50TW9kZWw6IE0sXG4gIGFsbG93ZWRUeXBlczogc3RyaW5nW10sXG4gIGFzeW5jOiBib29sZWFuXG4pOlxuICB8IHN0cmluZ1xuICB8IHVuZGVmaW5lZFxuICB8IE1vZGVsRXJyb3JEZWZpbml0aW9uXG4gIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCBNb2RlbEVycm9yRGVmaW5pdGlvbj4ge1xuICBsZXQgZXJyOlxuICAgIHwgTW9kZWxFcnJvckRlZmluaXRpb25cbiAgICB8IHN0cmluZ1xuICAgIHwgdW5kZWZpbmVkXG4gICAgfCBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZCB8IE1vZGVsRXJyb3JEZWZpbml0aW9uPiA9IHVuZGVmaW5lZDtcbiAgbGV0IGF0TGVhc3RPbmVNYXRjaGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYWxsb3dlZFR5cGUgb2YgYWxsb3dlZFR5cGVzKSB7XG4gICAgY29uc3QgQ29uc3RyID0gTW9kZWwuZ2V0KGFsbG93ZWRUeXBlKSBhcyBhbnk7XG4gICAgaWYgKCFDb25zdHIpIHtcbiAgICAgIGVyciA9IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbih7XG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYFVuYWJsZSB0byB2ZXJpZnkgdHlwZSBjb25zaXN0ZW5jeSwgbWlzc2luZyBtb2RlbCByZWdpc3RyeSBmb3IgJHthbGxvd2VkVHlwZX1gLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkVmFsdWUgaW5zdGFuY2VvZiBDb25zdHIpIHtcbiAgICAgIGF0TGVhc3RPbmVNYXRjaGVkID0gdHJ1ZTtcbiAgICAgIGVyciA9IGdldE5lc3RlZFZhbGlkYXRpb25FcnJvcnMoY2hpbGRWYWx1ZSwgcGFyZW50TW9kZWwsIGFzeW5jKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhdExlYXN0T25lTWF0Y2hlZCkgcmV0dXJuIGVycjtcblxuICByZXR1cm4gKFxuICAgIGVyciB8fFxuICAgIG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbih7XG4gICAgICBbcHJvcF06IHtcbiAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgVmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGV4cGVjdGVkIHR5cGVzOiAke2FsbG93ZWRUeXBlcy5qb2luKFwiLCBcIil9YCxcbiAgICAgIH0sXG4gICAgfSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbW9kZWw6IE0sXG4gIHZhbHVlOiBhbnksXG4gIGRlY29yYXRvcjogRGVjb3JhdG9yTWV0YWRhdGFBc3luYyxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IFZhbGlkYXRpb24uZ2V0KGRlY29yYXRvci5rZXkpO1xuICBpZiAoIXZhbGlkYXRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB2YWxpZGF0b3IgZm9yICR7ZGVjb3JhdG9yLmtleX1gKTtcbiAgfVxuXG4gIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gIGlmICghYXN5bmMgJiYgZGVjb3JhdG9yLnByb3BzLmFzeW5jKSByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcblxuICBjb25zdCBkZWNvcmF0b3JQcm9wcyA9XG4gICAgZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgID8gW2RlY29yYXRvci5wcm9wc11cbiAgICAgIDogZGVjb3JhdG9yLnByb3BzIHx8IHt9O1xuXG4gIGNvbnN0IGNvbnRleHQgPSBQYXRoUHJveHlFbmdpbmUuY3JlYXRlKG1vZGVsLCB7XG4gICAgaWdub3JlVW5kZWZpbmVkOiB0cnVlLFxuICAgIGlnbm9yZU51bGw6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IG1heWJlQXN5bmNFcnJvcnMgPSB2YWxpZGF0b3IuaGFzRXJyb3JzKFxuICAgIHZhbHVlLFxuICAgIGRlY29yYXRvclByb3BzIGFzIFZhbGlkYXRvck9wdGlvbnMsXG4gICAgY29udGV4dFxuICApO1xuXG4gIHJldHVybiB0b0NvbmRpdGlvbmFsUHJvbWlzZShtYXliZUFzeW5jRXJyb3JzLCBhc3luYyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyB2YWxpZGF0aW9uIGxvZ2ljIGZvciBhIHNldCBvZiBkZWNvcmF0b3JzIGFwcGxpZWQgdG8gYSBtb2RlbCdzIHByb3BlcnR5LCBoYW5kbGluZyBib3RoXG4gKiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRpb25zLCBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgbmVzdGVkIHZhbGlkYXRpb25zIGFuZCBsaXN0cy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgb3ZlciBhbiBhcnJheSBvZiBkZWNvcmF0b3IgbWV0YWRhdGEgb2JqZWN0cyBhbmQgYXBwbGllcyBlYWNoIHZhbGlkYXRpb24gcnVsZSB0byB0aGVcbiAqIHByb3ZpZGVkIHZhbHVlLiBGb3IgbGlzdCBkZWNvcmF0b3JzIChgVmFsaWRhdGlvbktleXMuTElTVGApLCBpdCBwZXJmb3JtcyBlbGVtZW50LXdpc2UgdmFsaWRhdGlvbixcbiAqIHN1cHBvcnRpbmcgbmVzdGVkIG1vZGVsIHZhbGlkYXRpb24gYW5kIHR5cGUgY2hlY2tzLiBJZiB0aGUgYGFzeW5jYCBmbGFnIGlzIHNldCwgYXN5bmNocm9ub3VzXG4gKiB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZCB1c2luZyBgUHJvbWlzZS5hbGxgLiBUaGUgcmVzdWx0IGlzIGEgcmVjb3JkIG1hcHBpbmcgdmFsaWRhdGlvbiBrZXlzIHRvXG4gKiBlcnJvciBtZXNzYWdlcywgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIEEgdHlwZSBwYXJhbWV0ZXIgZXh0ZW5kaW5nIGBNb2RlbGAsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyB2YWxpZGF0ZWQuXG4gKiBAdGVtcGxhdGUgQXN5bmMgLSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgdGhlIHZhbGlkYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgLSBUaGUgbW9kZWwgZmllbGQgbmFtZVxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBkZWNvcmF0b3JzLlxuICogQHBhcmFtIHtEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW119IGRlY29yYXRvcnMgLSBBbiBhcnJheSBvZiBtZXRhZGF0YSBvYmplY3RzIHJlcHJlc2VudGluZyB2YWxpZGF0aW9uIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0FzeW5jfSBbYXN5bmNdIC0gT3B0aW9uYWwgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkfVxuICogUmV0dXJucyBlaXRoZXIgYSByZWNvcmQgb2YgdmFsaWRhdGlvbiBlcnJvcnMgKGtleWVkIGJ5IHRoZSBkZWNvcmF0b3Iga2V5KSBvciBgdW5kZWZpbmVkYCBpZiBubyBlcnJvcnMgYXJlIGZvdW5kLlxuICogSWYgYGFzeW5jYCBpcyB0cnVlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNhbWUgc3RydWN0dXJlLlxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICBwcm9wOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIGRlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhQXN5bmNbXSxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFByb21pc2U8c3RyaW5nPj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgLy8gc2tpcCBhc3luYyBkZWNvcmF0b3JzIGlmIHZhbGlkYXRlRGVjb3JhdG9ycyBpcyBjYWxsZWQgc3luY2hyb25vdXNseSAoYXN5bmMgPSBmYWxzZSlcbiAgICBpZiAoIWFzeW5jICYmIGRlY29yYXRvci5wcm9wcy5hc3luYykgY29udGludWU7XG5cbiAgICBsZXQgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRlRGVjb3JhdG9yKG1vZGVsLCB2YWx1ZSwgZGVjb3JhdG9yLCBhc3luYyk7XG5cbiAgICAvKlxuICAgIElmIHRoZSBkZWNvcmF0b3IgaXMgYSBsaXN0LCBlYWNoIGVsZW1lbnQgbXVzdCBiZSBjaGVja2VkLlxuICAgIFdoZW4gJ2FzeW5jJyBpcyB0cnVlLCB0aGUgJ2Vycicgd2lsbCBhbHdheXMgYmUgYSBwZW5kaW5nIHByb21pc2UgaW5pdGlhbGx5LFxuICAgIHNvIHRoZSAnIWVycicgY2hlY2sgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSAoZXZlbiBpZiB0aGUgcHJvbWlzZSBsYXRlciByZXNvbHZlcyB3aXRoIG5vIGVycm9ycylcbiAgICAqL1xuICAgIGlmIChkZWNvcmF0b3Iua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUICYmICghdmFsaWRhdGlvbkVycm9ycyB8fCBhc3luYykpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLnZhbHVlXSA6IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0eXBlcyA9IChkZWNvcmF0b3IucHJvcHMuY2xhc3MgfHxcbiAgICAgICAgICBkZWNvcmF0b3IucHJvcHMuY2xhenogfHxcbiAgICAgICAgICBkZWNvcmF0b3IucHJvcHMuY3VzdG9tVHlwZXMpIGFzIHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gICAgICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IFt0eXBlc10uZmxhdCgpLm1hcCgodCkgPT4gU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyBjb25zdCByZXNlcnZlZCA9IE9iamVjdC52YWx1ZXMoUmVzZXJ2ZWRNb2RlbHMpLm1hcCgodikgPT4gdi50b0xvd2VyQ2FzZSgpKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICBjb25zdCBlcnJzID0gdmFsdWVzLm1hcCgoY2hpbGRWYWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gaWYgKE1vZGVsLmlzTW9kZWwodikgJiYgIXJlc2VydmVkLmluY2x1ZGVzKHYpIHtcbiAgICAgICAgICBpZiAoTW9kZWwuaXNNb2RlbChjaGlsZFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlQ2hpbGRWYWx1ZShcbiAgICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgICAgY2hpbGRWYWx1ZSxcbiAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgIFt0eXBlc10uZmxhdCgpLFxuICAgICAgICAgICAgICAhIWFzeW5jXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gcmV0dXJuIGdldE5lc3RlZFZhbGlkYXRpb25FcnJvcnMoY2hpbGRWYWx1ZSwgbW9kZWwsIGFzeW5jKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKHR5cGVvZiBjaGlsZFZhbHVlKVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogXCJWYWx1ZSBoYXMgbm8gdmFsaWRhdGFibGUgdHlwZVwiO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzID0gUHJvbWlzZS5hbGwoZXJycykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbGxFbXB0eSA9IHJlc3VsdC5ldmVyeSgocikgPT4gIXIpO1xuICAgICAgICAgICAgcmV0dXJuIGFsbEVtcHR5ID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhbGxFbXB0eSA9IGVycnMuZXZlcnkoKHI6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gIXIpO1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMgPSBlcnJzLmxlbmd0aCA+IDAgJiYgIWFsbEVtcHR5ID8gZXJycyA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzKSAocmVzdWx0IGFzIGFueSlbZGVjb3JhdG9yLmtleV0gPSB2YWxpZGF0aW9uRXJyb3JzO1xuICB9XG5cbiAgaWYgKCFhc3luYylcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICA/IChyZXN1bHQgYXMgYW55KVxuICAgICAgOiAodW5kZWZpbmVkIGFzIGFueSk7XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQpIGFzIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPltdO1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlc29sdmVkVmFsdWVzKSA9PiB7XG4gICAgY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsID0gcmVzb2x2ZWRWYWx1ZXNbaV07XG4gICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzW2tleXNbaV1dID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzKS5sZW5ndGggPiAwID8gcmVzIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uIHZhbGlkYXRlXG4gKiBAdGVtcGxhdGUgTVxuICogQHRlbXBsYXRlIEFzeW5jXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFZhbGlkYXRlcyB0aGUgcHJvcGVydGllcyBvZiBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgdXNpbmcgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzLlxuICogU3VwcG9ydHMgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gZmxvd3MsIGRlcGVuZGluZyBvbiB0aGUgYGFzeW5jYCBmbGFnLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGZ1bmN0aW9uIGluc3BlY3RzIGEgZ2l2ZW4gbW9kZWwgb2JqZWN0LCBpZGVudGlmaWVzIGRlY29yYXRlZCBwcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSB2YWxpZGF0aW9uLFxuICogYW5kIGFwcGxpZXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsaWRhdGlvbiBydWxlcy4gSXQgYWxzbyBzdXBwb3J0cyBuZXN0ZWQgbW9kZWwgdmFsaWRhdGlvbiBhbmQgZ3JhY2VmdWxseVxuICogbWVyZ2VzIGFueSB2YWxpZGF0aW9uIGVycm9ycy4gRm9yIGNvbGxlY3Rpb25zIChBcnJheS9TZXQpLCBpdCBlbmZvcmNlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlIGBAbGlzdGAgZGVjb3JhdG9yXG4gKiBhbmQgY2hlY2tzIHRoZSB0eXBlIG9mIGVsZW1lbnRzLiBJZiBhIHByb3BlcnR5IGlzIGEgbmVzdGVkIG1vZGVsLCBpdCB3aWxsIGNhbGwgYGhhc0Vycm9yc2Agb24gaXQgYW5kIGZsYXR0ZW5cbiAqIHRoZSBuZXN0ZWQgZXJyb3Iga2V5cyB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBiZSB2YWxpZGF0ZWQuIE11c3QgZXh0ZW5kIGZyb20ge0BsaW5rIE1vZGVsfS5cbiAqIEBwYXJhbSB7QXN5bmN9IFthc3luY10gLSBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIGFzeW5jaHJvbm91cy5cbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwcm9wc1RvSWdub3JlIC0gQSB2YXJpYWRpYyBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgZHVyaW5nIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMge0NvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPn1cbiAqIFJldHVybnMgZWl0aGVyIGEge0BsaW5rIE1vZGVsRXJyb3JEZWZpbml0aW9ufSBjb250YWluaW5nIHZhbGlkYXRpb24gZXJyb3JzLFxuICogb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC4gV2hlbiBgYXN5bmNgIGlzIGB0cnVlYCwgcmV0dXJucyBhIFByb21pc2UuXG4gKlxuICogQHNlZSB7QGxpbmsgTW9kZWx9XG4gKiBAc2VlIHtAbGluayBNb2RlbEVycm9yRGVmaW5pdGlvbn1cbiAqIEBzZWUge0BsaW5rIHZhbGlkYXRlRGVjb3JhdG9yc31cbiAqIEBzZWUge0BsaW5rIGdldFZhbGlkYXRhYmxlUHJvcGVydGllc31cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgICAgcGFydGljaXBhbnQgdmFsaWRhdGVcbiAqICAgICBwYXJ0aWNpcGFudCBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXNcbiAqICAgICBwYXJ0aWNpcGFudCB2YWxpZGF0ZURlY29yYXRvcnNcbiAqICAgICBwYXJ0aWNpcGFudCBNb2RlbEluc3RhbmNlXG4gKiAgICAgQ2FsbGVyLT4+dmFsaWRhdGU6IGNhbGwgd2l0aCBvYmosIGFzeW5jLCBwcm9wc1RvSWdub3JlXG4gKiAgICAgdmFsaWRhdGUtPj5nZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM6IHJldHJpZXZlIGRlY29yYXRlZCBwcm9wc1xuICogICAgIGxvb3AgZm9yIGVhY2ggcHJvcGVydHlcbiAqICAgICAgICAgdmFsaWRhdGUtPj52YWxpZGF0ZURlY29yYXRvcnM6IHZhbGlkYXRlIHVzaW5nIGRlY29yYXRvcnNcbiAqICAgICAgICAgYWx0IGlzIG5lc3RlZCBtb2RlbFxuICogICAgICAgICAgICAgdmFsaWRhdGUtPj5Nb2RlbEluc3RhbmNlOiBjYWxsIGhhc0Vycm9ycygpXG4gKiAgICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICAgIGFsdCBhc3luY1xuICogICAgICAgICB2YWxpZGF0ZS0+PnZhbGlkYXRlOiBQcm9taXNlLmFsbFNldHRsZWQgZm9yIGVycm9yc1xuICogICAgIGVuZFxuICogICAgIHZhbGlkYXRlLS0+PkNhbGxlcjogcmV0dXJuIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICBhc3luYzogQXN5bmMsXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPVxuICAgIGdldFZhbGlkYXRhYmxlUHJvcGVydGllcyhtb2RlbCwgcHJvcHNUb0lnbm9yZSk7XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IG5lc3RlZEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGZvciAoY29uc3QgeyBwcm9wLCBkZWNvcmF0b3JzIH0gb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHByb3BLZXkgPSBTdHJpbmcocHJvcCk7XG4gICAgbGV0IHByb3BWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3Byb3BdO1xuXG4gICAgaWYgKCFkZWNvcmF0b3JzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2V0IHRoZSBkZWZhdWx0IHR5cGUgdmFsaWRhdG9yXG4gICAgY29uc3QgZGVzaWduVHlwZURlYyA9IGRlY29yYXRvcnMuZmluZCgoZCkgPT4ge1xuICAgICAgcmV0dXJuIFtNb2RlbEtleXMuVFlQRSwgVmFsaWRhdGlvbktleXMuVFlQRV0uaW5jbHVkZXMoZC5rZXkgYXMgYW55KTtcbiAgICB9KTtcblxuICAgIGlmICghZGVzaWduVHlwZURlYykgY29udGludWU7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID0gZGVzaWduVHlwZURlYy5wcm9wcy5uYW1lO1xuXG4gICAgLy8gSGFuZGxlIGFycmF5IG9yIFNldCB0eXBlcyBhbmQgZW5mb3JjZSB0aGUgcHJlc2VuY2Ugb2YgQGxpc3QgZGVjb3JhdG9yXG4gICAgaWYgKFtBcnJheS5uYW1lLCBTZXQubmFtZV0uaW5jbHVkZXMoZGVzaWduVHlwZSkpIHtcbiAgICAgIGlmICghZGVjb3JhdG9ycy5zb21lKChkKSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCkpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BLZXldID0ge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYEFycmF5IG9yIFNldCBwcm9wZXJ0eSAnJHtwcm9wS2V5fScgcmVxdWlyZXMgYSBAbGlzdCBkZWNvcmF0b3JgLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwcm9wVmFsdWUgJiZcbiAgICAgICAgIShBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkgfHwgcHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0KVxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBQcm9wZXJ0eSAnJHtTdHJpbmcocHJvcCl9JyBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhIFNldGAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgZGVzaWduOnR5cGUgZGVjb3JhdG9yLCBzaW5jZSBAbGlzdCBkZWNvcmF0b3IgYWxyZWFkeSBlbnN1cmVzIHR5cGVcbiAgICAgIGZvciAobGV0IGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChkZWNvcmF0b3JzW2ldLmtleSA9PT0gTW9kZWxLZXlzLlRZUEUpIHtcbiAgICAgICAgICBkZWNvcmF0b3JzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvcFZhbHVlID0gcHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLnByb3BWYWx1ZV0gOiBwcm9wVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICB2YWxpZGF0ZURlY29yYXRvcnMobW9kZWwsIHByb3BLZXksIHByb3BWYWx1ZSwgZGVjb3JhdG9ycywgYXN5bmMpIHx8IHt9O1xuXG4gICAgLy8gQ2hlY2sgZm9yIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgIC8vIFRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZywgXCJwcm9wVmFsdWVcIiBtdXN0IGJlIGRlZmluZWQgYW5kIHZhbGlkYXRhYmxlXG4gICAgLy8gbGV0IG5lc3RlZEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGlzQ29uc3RyID0gTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG1vZGVsLCBwcm9wS2V5KTtcbiAgICBjb25zdCBoYXNQcm9wVmFsdWUgPSBwcm9wVmFsdWUgIT09IG51bGwgJiYgcHJvcFZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzQ29uc3RyICYmIGhhc1Byb3BWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBwcm9wVmFsdWUgYXMgTW9kZWw7XG4gICAgICBjb25zdCBpc0ludmFsaWRNb2RlbCA9XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICB0eXBlb2YgaW5zdGFuY2UuaGFzRXJyb3JzICE9PSBcImZ1bmN0aW9uXCI7XG5cbiAgICAgIGlmIChpc0ludmFsaWRNb2RlbCkge1xuICAgICAgICAvLyBwcm9wRXJyb3JzW1ZhbGlkYXRpb25LZXlzLlRZUEVdID0gXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0J3Mgbm90LlwiO1xuICAgICAgICBjb25zb2xlLndhcm4oXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0J3Mgbm90LlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IENvbnN0ciA9IE1vZGVsLmdldChkZXNpZ25UeXBlKSBhcyBhbnk7XG5cbiAgICAgICAgLy8gRW5zdXJlIGluc3RhbmNlIGlzIG9mIHRoZSBleHBlY3RlZCBtb2RlbCBjbGFzcy5cbiAgICAgICAgaWYgKCFDb25zdHIgfHwgIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cikpIHtcbiAgICAgICAgICBwcm9wRXJyb3JzW1ZhbGlkYXRpb25LZXlzLlRZUEVdID0gIUNvbnN0clxuICAgICAgICAgICAgPyBgVW5hYmxlIHRvIHZlcmlmeSB0eXBlIGNvbnNpc3RlbmN5LCBtaXNzaW5nIG1vZGVsIHJlZ2lzdHJ5IGZvciAke2Rlc2lnblR5cGV9IG9uIHByb3AgJHtwcm9wS2V5fWBcbiAgICAgICAgICAgIDogYFZhbHVlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgJHtDb25zdHIubmFtZX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5lc3RlZEVycm9yc1twcm9wS2V5XSA9IGdldE5lc3RlZFZhbGlkYXRpb25FcnJvcnMoXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgYXN5bmNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHRvIHRoZSByZXN1bHQgaWYgd2UgaGF2ZSBhbnkgZXJyb3JzXG4gICAgLy8gQXN5bmMgbW9kZSByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHVuZGVmaW5lZCB3aGVuIG5vIGVycm9ycyBleGlzdFxuICAgIGlmIChPYmplY3Qua2V5cyhwcm9wRXJyb3JzKS5sZW5ndGggPiAwIHx8IGFzeW5jKVxuICAgICAgcmVzdWx0W3Byb3BLZXldID0gcHJvcEVycm9ycztcblxuICAgIC8vIFRoZW4gbWVyZ2UgYW55IG5lc3RlZCBlcnJvcnNcbiAgICBpZiAoIWFzeW5jKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhuZXN0ZWRFcnJvcnNbcHJvcEtleV0gfHwge30pLmZvckVhY2goKFtrZXksIGVycm9yXSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdFtgJHtwcm9wS2V5fS4ke2tleX1gXSA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBTeW5jaHJvbm91cyByZXR1cm5cbiAgaWYgKCFhc3luYykge1xuICAgIHJldHVybiAoXG4gICAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICkgYXMgYW55O1xuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBhbnkgPSByZXN1bHQ7IC8vIFRPRE86IGFwcGx5IGZpbHRlcmluZ1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXJnZWQpO1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC52YWx1ZXMobWVyZ2VkKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcykudGhlbihhc3luYyAocmVzdWx0cykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogTW9kZWxFcnJvcnMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgW3BhcmVudFByb3AsIG5lc3RlZEVyclByb21pc2VdIG9mIE9iamVjdC5lbnRyaWVzKG5lc3RlZEVycm9ycykpIHtcbiAgICAgIGNvbnN0IG5lc3RlZFByb3BEZWNFcnJvcnMgPSAoYXdhaXQgbmVzdGVkRXJyUHJvbWlzZSkgYXMgUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIGFueVxuICAgICAgPjtcblxuICAgICAgaWYgKG5lc3RlZFByb3BEZWNFcnJvcnMpXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG5lc3RlZFByb3BEZWNFcnJvcnMpLmZvckVhY2goXG4gICAgICAgICAgKFtuZXN0ZWRQcm9wLCBuZXN0ZWRQcm9wRGVjRXJyb3JdKSA9PiB7XG4gICAgICAgICAgICBpZiAobmVzdGVkUHJvcERlY0Vycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmVzdGVkS2V5ID0gW3BhcmVudFByb3AsIG5lc3RlZFByb3BdLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgICByZXN1bHRbbmVzdGVkS2V5XSA9IG5lc3RlZFByb3BEZWNFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgcmVzID0gcmVzdWx0c1tpXTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIgJiYgcmVzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpW2tleV0gPSByZXMudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAocmVzdWx0IGFzIGFueSlba2V5XSA9XG4gICAgICAgICAgcmVzLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IHJlcy5yZWFzb24ubWVzc2FnZVxuICAgICAgICAgICAgOiBTdHJpbmcocmVzLnJlYXNvbiB8fCBcIlZhbGlkYXRpb24gZmFpbGVkXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDBcbiAgICAgID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG4iXX0=
|
|
423
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQ0FBK0I7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQ0FBMkI7QUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxtQkFBZ0I7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQ0FBaUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnREFBMkM7QUFNcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQ0FBMkI7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxnQ0FBcUI7QUFFckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBZ0I7QUFFL0M7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsS0FBMEIsRUFDMUIsSUFBWSxFQUNaLGFBQXFCLGNBQWMsQ0FBQyxPQUFPO0lBRTNDLE9BQU8sVUFBVSxDQUFDLHFCQUFxQixDQUNyQyxVQUFVLEVBQ1YsS0FBSyxFQUNMLElBQUksQ0FDK0MsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLE1BQU0sbUJBQW1CLEdBQTRDLEVBQUUsQ0FBQztJQUV4RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQ0UsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDakQsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUM3QixDQUFDO1lBQ0QsTUFBTSxHQUFH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OlsiaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE1vZGVsRXJyb3JzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGF0aFByb3h5RW5naW5lIH0gZnJvbSBcIi4uL3V0aWxzL1BhdGhQcm94eVwiO1xuaW1wb3J0IHsgQVNZTkNfTUVUQV9LRVksIFZBTElEQVRJT05fUEFSRU5UX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbmFsQXN5bmMsIERlY29yYXRvck1ldGFkYXRhQXN5bmMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHRvQ29uZGl0aW9uYWxQcm9taXNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRpb24gbWV0YWRhdGEgZGVjb3JhdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwcm9wZXJ0eSBvZiBhIG1vZGVsLFxuICogdXNpbmcgdGhlIHJlZmxlY3RpdmUgbWV0YWRhdGEga2V5LlxuICpcbiAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcyBjb250YWluaW5nIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBkZWNvcmF0b3JzIHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmbGVjdEtleSAtIFRoZSBtZXRhZGF0YSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVjb3JhdG9ycy5cbiAqICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RgLlxuICpcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIGRlY29yYXRvcnMgYXBwbGllZCB0byB0aGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25EZWNvcmF0b3JzKFxuICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJvcDogc3RyaW5nLFxuICByZWZsZWN0S2V5OiBzdHJpbmcgPSBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uIHtcbiAgcmV0dXJuIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgIHJlZmxlY3RLZXksXG4gICAgbW9kZWwsXG4gICAgcHJvcFxuICApIGFzIHVua25vd24gYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHJpZXZlcyBhbGwgdmFsaWRhdGFibGUgcHJvcGVydHkgZGVjb3JhdG9ycyBmcm9tIGEgZ2l2ZW4gbW9kZWwsIGV4Y2x1ZGluZyBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhIG1vZGVsIGluc3RhbmNlLCBmaWx0ZXJpbmcgb3V0IGFueSBwcm9wZXJ0aWVzXG4gKiBsaXN0ZWQgaW4gdGhlIGBwcm9wc1RvSWdub3JlYCBhcnJheS4gRm9yIGVhY2ggcmVtYWluaW5nIHByb3BlcnR5LCBpdCBjaGVja3Mgd2hldGhlciB2YWxpZGF0aW9uXG4gKiBkZWNvcmF0b3JzIGFyZSBwcmVzZW50IHVzaW5nIGBnZXRWYWxpZGF0aW9uRGVjb3JhdG9yc2AsIGFuZCBpZiBzbywgY29sbGVjdHMgdGhlbSBpbiB0aGUgcmVzdWx0IGFycmF5LlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gQSBnZW5lcmljIHBhcmFtZXRlciBleHRlbmRpbmcgdGhlIGBNb2RlbGAgY2xhc3MsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyBpbnNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIEFuIGluc3RhbmNlIG9mIGEgY2xhc3MgZXh0ZW5kaW5nIGBNb2RlbGAgZnJvbSB3aGljaCB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzIHdpbGwgYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNUb0lnbm9yZSAtIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdmFsaWRhdGlvbiBpbnNwZWN0aW9uLlxuICpcbiAqIEByZXR1cm4ge1ZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXX0gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBkZWNvcmF0b3IgZGVmaW5pdGlvbnNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwncyBwcm9wZXJ0aWVzLCBleGNsdWRpbmcgdGhvc2UgbGlzdGVkIGluIGBwcm9wc1RvSWdub3JlYC5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbW9kZWwpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHByb3ApICYmXG4gICAgICAhcHJvcHNUb0lnbm9yZS5pbmNsdWRlcyhwcm9wKVxuICAgICkge1xuICAgICAgY29uc3QgZGVjID0gZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMobW9kZWwsIHByb3ApO1xuICAgICAgaWYgKGRlYykgZGVjb3JhdGVkUHJvcGVydGllcy5wdXNoKGRlYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogU2FmZWx5IHNldHMgdGVtcG9yYXJ5IG1ldGFkYXRhIG9uIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBzZXRUZW1wb3JhcnlDb250ZXh0KFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBzeW1ib2wgfCBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHRhcmdldFtrZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogU2FmZWx5IHJlbW92ZXMgdGVtcG9yYXJ5IG1ldGFkYXRhIGZyb20gYW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KHRhcmdldDogYW55LCBrZXk6IHN5bWJvbCB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSBkZWxldGUgdGFyZ2V0W2tleV07XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdmFsaWRhdGlvbiB3aXRoIHRlbXBvcmFyeSBjb250ZXh0IGFuZCByZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICpcbiAqIEBwYXJhbSBuZXN0ZWRNb2RlbCAtIFRoZSBpbnN0YW5jZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHBhcmVudE1vZGVsIC0gUmVmZXJlbmNlIHRvIGEgcGFyZW50IG9iamVjdCBmb3IgbmVzdGVkIHZhbGlkYXRpb25cbiAqIEBwYXJhbSBpc0FzeW5jIC0gV2hldGhlciB0byBwZXJmb3JtIGFzeW5jIHZhbGlkYXRpb25cbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IGZyb20gaGFzRXJyb3JzKClcbiAqL1xuZnVuY3Rpb24gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG5lc3RlZE1vZGVsOiBNLFxuICBwYXJlbnRNb2RlbD86IE0sXG4gIGlzQXN5bmM/OiBBc3luYyxcbiAgLi4ucHJvcHNUb0lnbm9yZTogc3RyaW5nW11cbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPiB7XG4gIC8vIFNldCB0ZW1wb3JhcnkgY29udGV4dCBmb3IgbmVzdGVkIG1vZGVsc1xuICBpZiAocGFyZW50TW9kZWwpIHtcbiAgICBzZXRUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBWQUxJREFUSU9OX1BBUkVOVF9LRVksIHBhcmVudE1vZGVsKTtcbiAgfVxuICBzZXRUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBBU1lOQ19NRVRBX0tFWSwgISFpc0FzeW5jKTtcblxuICBjb25zdCBlcnJzID0gbmVzdGVkTW9kZWwuaGFzRXJyb3JzKC4uLnByb3BzVG9JZ25vcmUpIGFzIGFueTtcbiAgY2xlYW51cFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSk7XG4gIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBBU1lOQ19NRVRBX0tFWSk7XG4gIHJldHVybiBlcnJzIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRWYWx1ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBwcm9wOiBzdHJpbmcsXG4gIGNoaWxkVmFsdWU6IGFueSxcbiAgcGFyZW50TW9kZWw6IE0sXG4gIGFsbG93ZWRUeXBlczogc3RyaW5nW10sXG4gIGFzeW5jOiBib29sZWFuLFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTpcbiAgfCBzdHJpbmdcbiAgfCB1bmRlZmluZWRcbiAgfCBNb2RlbEVycm9yRGVmaW5pdGlvblxuICB8IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkIHwgTW9kZWxFcnJvckRlZmluaXRpb24+IHtcbiAgbGV0IGVycjpcbiAgICB8IE1vZGVsRXJyb3JEZWZpbml0aW9uXG4gICAgfCBzdHJpbmdcbiAgICB8IHVuZGVmaW5lZFxuICAgIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCBNb2RlbEVycm9yRGVmaW5pdGlvbj4gPSB1bmRlZmluZWQ7XG4gIGxldCBhdExlYXN0T25lTWF0Y2hlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGFsbG93ZWRUeXBlIG9mIGFsbG93ZWRUeXBlcykge1xuICAgIGNvbnN0IENvbnN0ciA9IE1vZGVsLmdldChhbGxvd2VkVHlwZSkgYXMgYW55O1xuICAgIGlmICghQ29uc3RyKSB7XG4gICAgICBlcnIgPSBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24oe1xuICAgICAgICBbcHJvcF06IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBVbmFibGUgdG8gdmVyaWZ5IHR5cGUgY29uc2lzdGVuY3ksIG1pc3NpbmcgbW9kZWwgcmVnaXN0cnkgZm9yICR7YWxsb3dlZFR5cGV9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjaGlsZFZhbHVlIGluc3RhbmNlb2YgQ29uc3RyKSB7XG4gICAgICBhdExlYXN0T25lTWF0Y2hlZCA9IHRydWU7XG4gICAgICBlcnIgPSBnZXROZXN0ZWRWYWxpZGF0aW9uRXJyb3JzKFxuICAgICAgICBjaGlsZFZhbHVlLFxuICAgICAgICBwYXJlbnRNb2RlbCxcbiAgICAgICAgYXN5bmMsXG4gICAgICAgIC4uLnByb3BzVG9JZ25vcmVcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoYXRMZWFzdE9uZU1hdGNoZWQpIHJldHVybiBlcnI7XG5cbiAgcmV0dXJuIChcbiAgICBlcnIgfHxcbiAgICBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24oe1xuICAgICAgW3Byb3BdOiB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYFZhbHVlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSBleHBlY3RlZCB0eXBlczogJHthbGxvd2VkVHlwZXMuam9pbihcIiwgXCIpfWAsXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICB2YWx1ZTogYW55LFxuICBkZWNvcmF0b3I6IERlY29yYXRvck1ldGFkYXRhQXN5bmMsXG4gIGFzeW5jPzogQXN5bmNcbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB2YWxpZGF0b3IgPSBWYWxpZGF0aW9uLmdldChkZWNvcmF0b3Iua2V5KTtcbiAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdmFsaWRhdG9yIGZvciAke2RlY29yYXRvci5rZXl9YCk7XG4gIH1cblxuICAvLyBza2lwIGFzeW5jIGRlY29yYXRvcnMgaWYgdmFsaWRhdGVEZWNvcmF0b3JzIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IChhc3luYyA9IGZhbHNlKVxuICBpZiAoIWFzeW5jICYmIGRlY29yYXRvci5wcm9wcy5hc3luYykgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG5cbiAgY29uc3QgZGVjb3JhdG9yUHJvcHMgPVxuICAgIGRlY29yYXRvci5rZXkgPT09IE1vZGVsS2V5cy5UWVBFXG4gICAgICA/IFtkZWNvcmF0b3IucHJvcHNdXG4gICAgICA6IGRlY29yYXRvci5wcm9wcyB8fCB7fTtcblxuICBjb25zdCBjb250ZXh0ID0gUGF0aFByb3h5RW5naW5lLmNyZWF0ZShtb2RlbCwge1xuICAgIGlnbm9yZVVuZGVmaW5lZDogdHJ1ZSxcbiAgICBpZ25vcmVOdWxsOiB0cnVlLFxuICB9KTtcblxuICBjb25zdCBtYXliZUFzeW5jRXJyb3JzID0gdmFsaWRhdG9yLmhhc0Vycm9ycyhcbiAgICB2YWx1ZSxcbiAgICBkZWNvcmF0b3Iua2V5ID09PSBNb2RlbEtleXMuVFlQRVxuICAgICAgPyAoeyB0eXBlczogKGRlY29yYXRvclByb3BzIGFzIGFueSlbMF0ubmFtZSB9IGFzIGFueSlcbiAgICAgIDogKGRlY29yYXRvclByb3BzIGFzIFZhbGlkYXRvck9wdGlvbnMpLFxuICAgIGNvbnRleHRcbiAgKTtcblxuICByZXR1cm4gdG9Db25kaXRpb25hbFByb21pc2UobWF5YmVBc3luY0Vycm9ycywgYXN5bmMpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRXhlY3V0ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgYSBzZXQgb2YgZGVjb3JhdG9ycyBhcHBsaWVkIHRvIGEgbW9kZWwncyBwcm9wZXJ0eSwgaGFuZGxpbmcgYm90aFxuICogc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9ucywgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIG5lc3RlZCB2YWxpZGF0aW9ucyBhbmQgbGlzdHMuXG4gKlxuICogQHN1bW1hcnlcbiAqIEl0ZXJhdGVzIG92ZXIgYW4gYXJyYXkgb2YgZGVjb3JhdG9yIG1ldGFkYXRhIG9iamVjdHMgYW5kIGFwcGxpZXMgZWFjaCB2YWxpZGF0aW9uIHJ1bGUgdG8gdGhlXG4gKiBwcm92aWRlZCB2YWx1ZS4gRm9yIGxpc3QgZGVjb3JhdG9ycyAoYFZhbGlkYXRpb25LZXlzLkxJU1RgKSwgaXQgcGVyZm9ybXMgZWxlbWVudC13aXNlIHZhbGlkYXRpb24sXG4gKiBzdXBwb3J0aW5nIG5lc3RlZCBtb2RlbCB2YWxpZGF0aW9uIGFuZCB0eXBlIGNoZWNrcy4gSWYgdGhlIGBhc3luY2AgZmxhZyBpcyBzZXQsIGFzeW5jaHJvbm91c1xuICogdmFsaWRhdGlvbiBpcyBzdXBwb3J0ZWQgdXNpbmcgYFByb21pc2UuYWxsYC4gVGhlIHJlc3VsdCBpcyBhIHJlY29yZCBtYXBwaW5nIHZhbGlkYXRpb24ga2V5cyB0b1xuICogZXJyb3IgbWVzc2FnZXMsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGVycm9ycyBhcmUgZm91bmQuXG4gKlxuICogQHRlbXBsYXRlIE0gLSBBIHR5cGUgcGFyYW1ldGVyIGV4dGVuZGluZyBgTW9kZWxgLCByZXByZXNlbnRpbmcgdGhlIG1vZGVsIHR5cGUgYmVpbmcgdmFsaWRhdGVkLlxuICogQHRlbXBsYXRlIEFzeW5jIC0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIC0gVGhlIG1vZGVsIGZpZWxkIG5hbWVcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgcHJvdmlkZWQgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSB7RGVjb3JhdG9yTWV0YWRhdGFBc3luY1tdfSBkZWNvcmF0b3JzIC0gQW4gYXJyYXkgb2YgbWV0YWRhdGEgb2JqZWN0cyByZXByZXNlbnRpbmcgdmFsaWRhdGlvbiBkZWNvcmF0b3JzLlxuICogQHBhcmFtIHtBc3luY30gW2FzeW5jXSAtIE9wdGlvbmFsIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcmV0dXJuIHtDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB8IHVuZGVmaW5lZH1cbiAqIFJldHVybnMgZWl0aGVyIGEgcmVjb3JkIG9mIHZhbGlkYXRpb24gZXJyb3JzIChrZXllZCBieSB0aGUgZGVjb3JhdG9yIGtleSkgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC5cbiAqIElmIGBhc3luY2AgaXMgdHJ1ZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzYW1lIHN0cnVjdHVyZS5cbiAqXG4gKiBAZnVuY3Rpb24gdmFsaWRhdGVEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcnM8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBtb2RlbDogTSxcbiAgcHJvcDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW10sXG4gIGFzeW5jPzogQXN5bmMsXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+PiA9IHt9O1xuXG4gIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAvLyBza2lwIGFzeW5jIGRlY29yYXRvcnMgaWYgdmFsaWRhdGVEZWNvcmF0b3JzIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IChhc3luYyA9IGZhbHNlKVxuICAgIGlmICghYXN5bmMgJiYgZGVjb3JhdG9yLnByb3BzLmFzeW5jKSBjb250aW51ZTtcblxuICAgIGxldCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVEZWNvcmF0b3IobW9kZWwsIHZhbHVlLCBkZWNvcmF0b3IsIGFzeW5jKTtcblxuICAgIC8qXG4gICAgSWYgdGhlIGRlY29yYXRvciBpcyBhIGxpc3QsIGVhY2ggZWxlbWVudCBtdXN0IGJlIGNoZWNrZWQuXG4gICAgV2hlbiAnYXN5bmMnIGlzIHRydWUsIHRoZSAnZXJyJyB3aWxsIGFsd2F5cyBiZSBhIHBlbmRpbmcgcHJvbWlzZSBpbml0aWFsbHksXG4gICAgc28gdGhlICchZXJyJyBjaGVjayB3aWxsIGV2YWx1YXRlIHRvIGZhbHNlIChldmVuIGlmIHRoZSBwcm9taXNlIGxhdGVyIHJlc29sdmVzIHdpdGggbm8gZXJyb3JzKVxuICAgICovXG4gICAgaWYgKGRlY29yYXRvci5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1QgJiYgKCF2YWxpZGF0aW9uRXJyb3JzIHx8IGFzeW5jKSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWUgaW5zdGFuY2VvZiBTZXQgPyBbLi4udmFsdWVdIDogdmFsdWU7XG4gICAgICBpZiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCB0eXBlczogc3RyaW5nW10gPSAoZGVjb3JhdG9yLnByb3BzLmNsYXNzIHx8XG4gICAgICAgICAgZGVjb3JhdG9yLnByb3BzLmNsYXp6IHx8XG4gICAgICAgICAgZGVjb3JhdG9yLnByb3BzLmN1c3RvbVR5cGVzKSBhcyBzdHJpbmdbXTtcbiAgICAgICAgdHlwZXMgPSAoQXJyYXkuaXNBcnJheSh0eXBlcykgPyB0eXBlcyA6IFt0eXBlc10pLm1hcCgoZTogYW55KSA9PiB7XG4gICAgICAgICAgZSA9IHR5cGVvZiBlID09PSBcImZ1bmN0aW9uXCIgJiYgIWUubmFtZSA/IGUoKSA6IGU7XG4gICAgICAgICAgcmV0dXJuIChlIGFzIGFueSkubmFtZSA/IChlIGFzIGFueSkubmFtZSA6IGU7XG4gICAgICAgIH0pIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBbdHlwZXNdLmZsYXQoKS5tYXAoKHQpID0+IFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgLy8gY29uc3QgcmVzZXJ2ZWQgPSBPYmplY3QudmFsdWVzKFJlc2VydmVkTW9kZWxzKS5tYXAoKHYpID0+IHYudG9Mb3dlckNhc2UoKSkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgY29uc3QgZXJycyA9IHZhbHVlcy5tYXAoKGNoaWxkVmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGlmIChNb2RlbC5pc01vZGVsKHYpICYmICFyZXNlcnZlZC5pbmNsdWRlcyh2KSB7XG4gICAgICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoY2hpbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUNoaWxkVmFsdWUoXG4gICAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICAgIGNoaWxkVmFsdWUsXG4gICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICB0eXBlcy5mbGF0KCksXG4gICAgICAgICAgICAgICEhYXN5bmMsXG4gICAgICAgICAgICAgIC4uLnByb3BzVG9JZ25vcmVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyByZXR1cm4gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9ycyhjaGlsZFZhbHVlLCBtb2RlbCwgYXN5bmMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXModHlwZW9mIGNoaWxkVmFsdWUpXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBcIlZhbHVlIGhhcyBubyB2YWxpZGF0YWJsZSB0eXBlXCI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMgPSBQcm9taXNlLmFsbChlcnJzKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFsbEVtcHR5ID0gcmVzdWx0LmV2ZXJ5KChyKSA9PiAhcik7XG4gICAgICAgICAgICByZXR1cm4gYWxsRW1wdHkgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gICAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFsbEVtcHR5ID0gZXJycy5ldmVyeSgocjogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiAhcik7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyA9IGVycnMubGVuZ3RoID4gMCAmJiAhYWxsRW1wdHkgPyBlcnJzIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9XG4gICAgICBkZWNvcmF0b3Iua2V5ID09PSBNb2RlbEtleXMuVFlQRSA/IFZhbGlkYXRpb25LZXlzLlRZUEUgOiBkZWNvcmF0b3Iua2V5O1xuICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzKSAocmVzdWx0IGFzIGFueSlbbmFtZV0gPSB2YWxpZGF0aW9uRXJyb3JzO1xuICB9XG5cbiAgaWYgKCFhc3luYylcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICA/IChyZXN1bHQgYXMgYW55KVxuICAgICAgOiAodW5kZWZpbmVkIGFzIGFueSk7XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQpIGFzIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPltdO1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlc29sdmVkVmFsdWVzKSA9PiB7XG4gICAgY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsID0gcmVzb2x2ZWRWYWx1ZXNbaV07XG4gICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzW2tleXNbaV1dID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzKS5sZW5ndGggPiAwID8gcmVzIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uIHZhbGlkYXRlXG4gKiBAdGVtcGxhdGUgTVxuICogQHRlbXBsYXRlIEFzeW5jXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFZhbGlkYXRlcyB0aGUgcHJvcGVydGllcyBvZiBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgdXNpbmcgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzLlxuICogU3VwcG9ydHMgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gZmxvd3MsIGRlcGVuZGluZyBvbiB0aGUgYGFzeW5jYCBmbGFnLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGZ1bmN0aW9uIGluc3BlY3RzIGEgZ2l2ZW4gbW9kZWwgb2JqZWN0LCBpZGVudGlmaWVzIGRlY29yYXRlZCBwcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSB2YWxpZGF0aW9uLFxuICogYW5kIGFwcGxpZXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsaWRhdGlvbiBydWxlcy4gSXQgYWxzbyBzdXBwb3J0cyBuZXN0ZWQgbW9kZWwgdmFsaWRhdGlvbiBhbmQgZ3JhY2VmdWxseVxuICogbWVyZ2VzIGFueSB2YWxpZGF0aW9uIGVycm9ycy4gRm9yIGNvbGxlY3Rpb25zIChBcnJheS9TZXQpLCBpdCBlbmZvcmNlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlIGBAbGlzdGAgZGVjb3JhdG9yXG4gKiBhbmQgY2hlY2tzIHRoZSB0eXBlIG9mIGVsZW1lbnRzLiBJZiBhIHByb3BlcnR5IGlzIGEgbmVzdGVkIG1vZGVsLCBpdCB3aWxsIGNhbGwgYGhhc0Vycm9yc2Agb24gaXQgYW5kIGZsYXR0ZW5cbiAqIHRoZSBuZXN0ZWQgZXJyb3Iga2V5cyB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBiZSB2YWxpZGF0ZWQuIE11c3QgZXh0ZW5kIGZyb20ge0BsaW5rIE1vZGVsfS5cbiAqIEBwYXJhbSB7QXN5bmN9IFthc3luY10gLSBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIGFzeW5jaHJvbm91cy5cbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwcm9wc1RvSWdub3JlIC0gQSB2YXJpYWRpYyBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgZHVyaW5nIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMge0NvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPn1cbiAqIFJldHVybnMgZWl0aGVyIGEge0BsaW5rIE1vZGVsRXJyb3JEZWZpbml0aW9ufSBjb250YWluaW5nIHZhbGlkYXRpb24gZXJyb3JzLFxuICogb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC4gV2hlbiBgYXN5bmNgIGlzIGB0cnVlYCwgcmV0dXJucyBhIFByb21pc2UuXG4gKlxuICogQHNlZSB7QGxpbmsgTW9kZWx9XG4gKiBAc2VlIHtAbGluayBNb2RlbEVycm9yRGVmaW5pdGlvbn1cbiAqIEBzZWUge0BsaW5rIHZhbGlkYXRlRGVjb3JhdG9yc31cbiAqIEBzZWUge0BsaW5rIGdldFZhbGlkYXRhYmxlUHJvcGVydGllc31cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgICAgcGFydGljaXBhbnQgdmFsaWRhdGVcbiAqICAgICBwYXJ0aWNpcGFudCBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXNcbiAqICAgICBwYXJ0aWNpcGFudCB2YWxpZGF0ZURlY29yYXRvcnNcbiAqICAgICBwYXJ0aWNpcGFudCBNb2RlbEluc3RhbmNlXG4gKiAgICAgQ2FsbGVyLT4+dmFsaWRhdGU6IGNhbGwgd2l0aCBvYmosIGFzeW5jLCBwcm9wc1RvSWdub3JlXG4gKiAgICAgdmFsaWRhdGUtPj5nZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM6IHJldHJpZXZlIGRlY29yYXRlZCBwcm9wc1xuICogICAgIGxvb3AgZm9yIGVhY2ggcHJvcGVydHlcbiAqICAgICAgICAgdmFsaWRhdGUtPj52YWxpZGF0ZURlY29yYXRvcnM6IHZhbGlkYXRlIHVzaW5nIGRlY29yYXRvcnNcbiAqICAgICAgICAgYWx0IGlzIG5lc3RlZCBtb2RlbFxuICogICAgICAgICAgICAgdmFsaWRhdGUtPj5Nb2RlbEluc3RhbmNlOiBjYWxsIGhhc0Vycm9ycygpXG4gKiAgICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICAgIGFsdCBhc3luY1xuICogICAgICAgICB2YWxpZGF0ZS0+PnZhbGlkYXRlOiBQcm9taXNlLmFsbFNldHRsZWQgZm9yIGVycm9yc1xuICogICAgIGVuZFxuICogICAgIHZhbGlkYXRlLS0+PkNhbGxlcjogcmV0dXJuIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICBhc3luYzogQXN5bmMsXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPVxuICAgIGdldFZhbGlkYXRhYmxlUHJvcGVydGllcyhtb2RlbCwgcHJvcHNUb0lnbm9yZSk7XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IG5lc3RlZEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGZvciAoY29uc3QgeyBwcm9wLCBkZWNvcmF0b3JzIH0gb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHByb3BLZXkgPSBTdHJpbmcocHJvcCk7XG4gICAgbGV0IHByb3BWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3Byb3BdO1xuXG4gICAgaWYgKCFkZWNvcmF0b3JzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2V0IHRoZSBkZWZhdWx0IHR5cGUgdmFsaWRhdG9yXG4gICAgY29uc3QgcHJpb3JpdHkgPSBbVmFsaWRhdGlvbktleXMuVFlQRSwgTW9kZWxLZXlzLlRZUEVdO1xuICAgIGNvbnN0IGRlc2lnblR5cGVEZWMgPSBwcmlvcml0eVxuICAgICAgLm1hcCgoa2V5KSA9PiBkZWNvcmF0b3JzLmZpbmQoKGQpID0+IGQua2V5ID09PSBrZXkpKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG5cbiAgICAvLyBFbnN1cmVzIHRoYXQgb25seSBvbmUgdHlwZSBkZWNvcmF0b3IgcmVtYWlucy5cbiAgICBpZiAoZGVzaWduVHlwZURlYz8ua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5UWVBFKSB7XG4gICAgICBkZWNvcmF0b3JzLnNwbGljZShcbiAgICAgICAgMCxcbiAgICAgICAgZGVjb3JhdG9ycy5sZW5ndGgsXG4gICAgICAgIC4uLmRlY29yYXRvcnMuZmlsdGVyKChkKSA9PiBkLmtleSAhPT0gTW9kZWxLZXlzLlRZUEUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghZGVzaWduVHlwZURlYykgY29udGludWU7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID1cbiAgICAgIGRlc2lnblR5cGVEZWMucHJvcHMuY2xhc3MgfHxcbiAgICAgIGRlc2lnblR5cGVEZWMucHJvcHMuY2xhenogfHxcbiAgICAgIGRlc2lnblR5cGVEZWMucHJvcHMuY3VzdG9tVHlwZXMgfHxcbiAgICAgIGRlc2lnblR5cGVEZWMucHJvcHMubmFtZTtcblxuICAgIC8vIFRTIGVtaXRzIFwiT2JqZWN0XCIgYXMgZGVzaWduOnR5cGUgZm9yIHVuaW9ucyAoc3RyaW5nIHwgbnVtYmVyKSBhbmQgaW50ZXJzZWN0aW9ucyAoQSAmIEIpLlxuICAgIC8vIFNpbmNlIHRoaXMgbWV0YWRhdGEgaXMgYW1iaWd1b3VzIGZvciB2YWxpZGF0aW9uLCBza2lwIGRlc2lnbjp0eXBlIGNoZWNrcyBpbiB0aGVzZSBjYXNlcy5cbiAgICAvLyBUbyBlbmZvcmNlIGRlc2lnbjp0eXBlIHZhbGlkYXRpb24gZXhwbGljaXRseSwgdGhlIEB0eXBlIHZhbGlkYXRvciBjYW4gYmUgdXNlZC5cbiAgICBpZiAoZGVzaWduVHlwZURlYy5rZXkgPT09IE1vZGVsS2V5cy5UWVBFICYmIGRlc2lnblR5cGUgPT09IFwiT2JqZWN0XCIpXG4gICAgICBkZWNvcmF0b3JzLnNoaWZ0KCk7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlcyA9IChcbiAgICAgIEFycmF5LmlzQXJyYXkoZGVzaWduVHlwZSkgPyBkZXNpZ25UeXBlIDogW2Rlc2lnblR5cGVdXG4gICAgKS5tYXAoKGU6IGFueSkgPT4ge1xuICAgICAgZSA9IHR5cGVvZiBlID09PSBcImZ1bmN0aW9uXCIgJiYgIWUubmFtZSA/IGUoKSA6IGU7XG4gICAgICByZXR1cm4gKGUgYXMgYW55KS5uYW1lID8gKGUgYXMgYW55KS5uYW1lIDogZTtcbiAgICB9KSBhcyBzdHJpbmdbXTtcblxuICAgIC8vIEhhbmRsZSBhcnJheSBvciBTZXQgdHlwZXMgYW5kIGVuZm9yY2UgdGhlIHByZXNlbmNlIG9mIEBsaXN0IGRlY29yYXRvclxuICAgIC8vIGlmIChbQXJyYXkubmFtZSwgU2V0Lm5hbWVdLmluY2x1ZGVzKGRlc2lnblR5cGUpKSB7fVxuICAgIGlmIChkZXNpZ25UeXBlcy5zb21lKCh0KSA9PiBbQXJyYXkubmFtZSwgU2V0Lm5hbWVdLmluY2x1ZGVzKHQpKSkge1xuICAgICAgaWYgKCFkZWNvcmF0b3JzLnNvbWUoKGQpID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUKSkge1xuICAgICAgICByZXN1bHRbcHJvcEtleV0gPSB7XG4gICAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgQXJyYXkgb3IgU2V0IHByb3BlcnR5ICcke3Byb3BLZXl9JyByZXF1aXJlcyBhIEBsaXN0IGRlY29yYXRvcmAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BWYWx1ZSAmJlxuICAgICAgICAhKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSB8fCBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTZXQpXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0W3Byb3BLZXldID0ge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYFByb3BlcnR5ICcke1N0cmluZyhwcm9wKX0nIG11c3QgYmUgZWl0aGVyIGFuIEFycmF5IG9yIGEgU2V0YCxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBkZXNpZ246dHlwZSBkZWNvcmF0b3IsIHNpbmNlIEBsaXN0IGRlY29yYXRvciBhbHJlYWR5IGVuc3VyZXMgdHlwZVxuICAgICAgZm9yIChsZXQgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGRlY29yYXRvcnNbaV0ua2V5ID09PSBNb2RlbEtleXMuVFlQRSkge1xuICAgICAgICAgIGRlY29yYXRvcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm9wVmFsdWUgPSBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTZXQgPyBbLi4ucHJvcFZhbHVlXSA6IHByb3BWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIHZhbGlkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHByb3BLZXksXG4gICAgICAgIHByb3BWYWx1ZSxcbiAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgYXN5bmMsXG4gICAgICAgIC4uLnByb3BzVG9JZ25vcmVcbiAgICAgICkgfHwge307XG5cbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHByb3BlcnRpZXMuXG4gICAgLy8gVG8gcHJldmVudCB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLCBcInByb3BWYWx1ZVwiIG11c3QgYmUgZGVmaW5lZCBhbmQgdmFsaWRhdGFibGVcbiAgICAvLyBsZXQgbmVzdGVkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgaXNDb25zdHIgPSBNb2RlbC5pc1Byb3BlcnR5TW9kZWwobW9kZWwsIHByb3BLZXkpO1xuICAgIGNvbnN0IGhhc1Byb3BWYWx1ZSA9IHByb3BWYWx1ZSAhPT0gbnVsbCAmJiBwcm9wVmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNDb25zdHIgJiYgaGFzUHJvcFZhbHVlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHByb3BWYWx1ZSBhcyBNb2RlbDtcbiAgICAgIGNvbnN0IGlzSW52YWxpZE1vZGVsID1cbiAgICAgICAgdHlwZW9mIGluc3RhbmNlICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZS5oYXNFcnJvcnMgIT09IFwiZnVuY3Rpb25cIjtcblxuICAgICAgaWYgKGlzSW52YWxpZE1vZGVsKSB7XG4gICAgICAgIC8vIHByb3BFcnJvcnNbVmFsaWRhdGlvbktleXMuVFlQRV0gPSBcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCI7XG4gICAgICAgIGNvbnNvbGUud2FybihcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgQ29uc3RyID0gKEFycmF5LmlzQXJyYXkoZGVzaWduVHlwZSkgPyBkZXNpZ25UeXBlIDogW2Rlc2lnblR5cGVdKVxuICAgICAgICAgIC5tYXAoKGQpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZCA9PT0gXCJmdW5jdGlvblwiICYmICFkLm5hbWUpIGQgPSBkKCk7XG4gICAgICAgICAgICByZXR1cm4gTW9kZWwuZ2V0KGQubmFtZSB8fCBkKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maW5kKChkKSA9PiAhIWQpIGFzIGFueTtcblxuICAgICAgICAvLyBFbnN1cmUgaW5zdGFuY2UgaXMgb2YgdGhlIGV4cGVjdGVkIG1vZGVsIGNsYXNzLlxuICAgICAgICBpZiAoIUNvbnN0ciB8fCAhKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RyKSkge1xuICAgICAgICAgIHByb3BFcnJvcnNbVmFsaWRhdGlvbktleXMuVFlQRV0gPSAhQ29uc3RyXG4gICAgICAgICAgICA/IGBVbmFibGUgdG8gdmVyaWZ5IHR5cGUgY29uc2lzdGVuY3ksIG1pc3NpbmcgbW9kZWwgcmVnaXN0cnkgZm9yICR7ZGVzaWduVHlwZXMudG9TdHJpbmcoKX0gb24gcHJvcCAke3Byb3BLZXl9YFxuICAgICAgICAgICAgOiBgVmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiAke0NvbnN0ci5uYW1lfWA7XG4gICAgICAgICAgZGVsZXRlIHByb3BFcnJvcnNbTW9kZWxLZXlzLlRZUEVdOyAvLyByZW1vdmUgZHVwbGljYXRlIHR5cGUgZXJyb3JcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXN0ZWRFcnJvcnNbcHJvcEtleV0gPSBnZXROZXN0ZWRWYWxpZGF0aW9uRXJyb3JzKFxuICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIGFzeW5jLFxuICAgICAgICAgICAgLi4ucHJvcHNUb0lnbm9yZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgdG8gdGhlIHJlc3VsdCBpZiB3ZSBoYXZlIGFueSBlcnJvcnNcbiAgICAvLyBBc3luYyBtb2RlIHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdW5kZWZpbmVkIHdoZW4gbm8gZXJyb3JzIGV4aXN0XG4gICAgaWYgKE9iamVjdC5rZXlzKHByb3BFcnJvcnMpLmxlbmd0aCA+IDAgfHwgYXN5bmMpXG4gICAgICByZXN1bHRbcHJvcEtleV0gPSBwcm9wRXJyb3JzO1xuXG4gICAgLy8gVGhlbiBtZXJnZSBhbnkgbmVzdGVkIGVycm9yc1xuICAgIGlmICghYXN5bmMpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG5lc3RlZEVycm9yc1twcm9wS2V5XSB8fCB7fSkuZm9yRWFjaCgoW2tleSwgZXJyb3JdKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0W2Ake3Byb3BLZXl9LiR7a2V5fWBdID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN5bmNocm9ub3VzIHJldHVyblxuICBpZiAoIWFzeW5jKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgICA/IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbihyZXN1bHQpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgKSBhcyBhbnk7XG4gIH1cblxuICBjb25zdCBtZXJnZWQ6IGFueSA9IHJlc3VsdDsgLy8gVE9ETzogYXBwbHkgZmlsdGVyaW5nXG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG1lcmdlZCk7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LnZhbHVlcyhtZXJnZWQpO1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKS50aGVuKGFzeW5jIChyZXN1bHRzKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBNb2RlbEVycm9ycyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBbcGFyZW50UHJvcCwgbmVzdGVkRXJyUHJvbWlzZV0gb2YgT2JqZWN0LmVudHJpZXMobmVzdGVkRXJyb3JzKSkge1xuICAgICAgY29uc3QgbmVzdGVkUHJvcERlY0Vycm9ycyA9IChhd2FpdCBuZXN0ZWRFcnJQcm9taXNlKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgYW55XG4gICAgICA+O1xuXG4gICAgICBpZiAobmVzdGVkUHJvcERlY0Vycm9ycylcbiAgICAgICAgT2JqZWN0LmVudHJpZXMobmVzdGVkUHJvcERlY0Vycm9ycykuZm9yRWFjaChcbiAgICAgICAgICAoW25lc3RlZFByb3AsIG5lc3RlZFByb3BEZWNFcnJvcl0pID0+IHtcbiAgICAgICAgICAgIGlmIChuZXN0ZWRQcm9wRGVjRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRLZXkgPSBbcGFyZW50UHJvcCwgbmVzdGVkUHJvcF0uam9pbihcIi5cIik7XG4gICAgICAgICAgICAgIHJlc3VsdFtuZXN0ZWRLZXldID0gbmVzdGVkUHJvcERlY0Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBjb25zdCByZXMgPSByZXN1bHRzW2ldO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAmJiByZXMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAocmVzdWx0IGFzIGFueSlba2V5XSA9IHJlcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAocmVzLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KVtrZXldID1cbiAgICAgICAgICByZXMucmVhc29uIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gcmVzLnJlYXNvbi5tZXNzYWdlXG4gICAgICAgICAgICA6IFN0cmluZyhyZXMucmVhc29uIHx8IFwiVmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0pIGFzIGFueTtcbn1cbiJdfQ==
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { DecorationBuilderBuild, DecorationBuilderEnd, DecorationBuilderMid, DecorationBuilderStart, FlavourResolver, IDecorationBuilder } from "./types";
|
|
2
|
+
export type DecoratorTypes = ClassDecorator | PropertyDecorator | MethodDecorator;
|
|
3
|
+
export type DecoratorFactory = (...args: any[]) => DecoratorTypes;
|
|
4
|
+
export type DecoratorFactoryArgs = {
|
|
5
|
+
decorator: DecoratorFactory;
|
|
6
|
+
args?: any[];
|
|
7
|
+
transform?: (args: any[]) => any[];
|
|
8
|
+
};
|
|
9
|
+
export type DecoratorData = DecoratorTypes | DecoratorFactoryArgs;
|
|
2
10
|
/**
|
|
3
11
|
* @description A decorator management class that handles flavoured decorators
|
|
4
12
|
* @summary The Decoration class provides a builder pattern for creating and managing decorators with different flavours.
|
|
@@ -88,15 +96,19 @@ export declare class Decoration implements IDecorationBuilder {
|
|
|
88
96
|
* @param decorators Decorators to define
|
|
89
97
|
* @return Builder instance for finishing the chain
|
|
90
98
|
*/
|
|
91
|
-
define(...decorators:
|
|
99
|
+
define(...decorators: DecoratorData[]): DecorationBuilderEnd & DecorationBuilderBuild;
|
|
92
100
|
/**
|
|
93
101
|
* @description Extends existing decorators
|
|
94
102
|
* @summary Adds additional decorators to the current context
|
|
95
103
|
* @param decorators Additional decorators
|
|
96
104
|
* @return {DecorationBuilderBuild} Builder instance for building the decorator
|
|
97
105
|
*/
|
|
98
|
-
extend(...decorators:
|
|
99
|
-
protected decoratorFactory(key: string, f?: string): (target: object, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) =>
|
|
106
|
+
extend(...decorators: DecoratorData[]): DecorationBuilderBuild;
|
|
107
|
+
protected decoratorFactory(key: string, f?: string): (target: object, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => {
|
|
108
|
+
target: object;
|
|
109
|
+
propertyKey: any;
|
|
110
|
+
descriptor: TypedPropertyDescriptor<any> | undefined;
|
|
111
|
+
};
|
|
100
112
|
/**
|
|
101
113
|
* @description Creates the final decorator function
|
|
102
114
|
* @summary Builds and returns the decorator factory function
|
|
@@ -113,23 +113,59 @@ export class Decoration {
|
|
|
113
113
|
decoratorFactory(key, f = DefaultFlavour) {
|
|
114
114
|
const contextDecorator = function contextDecorator(target, propertyKey, descriptor) {
|
|
115
115
|
const flavour = Decoration.flavourResolver(target);
|
|
116
|
+
const cache = Decoration.decorators[key];
|
|
116
117
|
let decorators;
|
|
117
|
-
const extras =
|
|
118
|
-
?
|
|
119
|
-
:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
118
|
+
const extras = cache[flavour]
|
|
119
|
+
? cache[flavour].extras
|
|
120
|
+
: cache[DefaultFlavour].extras;
|
|
121
|
+
const extraArgs = [
|
|
122
|
+
...(cache[DefaultFlavour].extras
|
|
123
|
+
? cache[DefaultFlavour].extras.values()
|
|
124
|
+
: []),
|
|
125
|
+
].reduce((accum, e, i) => {
|
|
126
|
+
if (e.args)
|
|
127
|
+
accum[i] = e.args;
|
|
128
|
+
return accum;
|
|
129
|
+
}, {});
|
|
130
|
+
if (cache &&
|
|
131
|
+
cache[flavour] &&
|
|
132
|
+
cache[flavour].decorators &&
|
|
133
|
+
cache[flavour].decorators.size) {
|
|
134
|
+
decorators = cache[flavour].decorators;
|
|
124
135
|
}
|
|
125
136
|
else {
|
|
126
|
-
decorators =
|
|
137
|
+
decorators = cache[DefaultFlavour].decorators;
|
|
127
138
|
}
|
|
139
|
+
const decoratorArgs = [
|
|
140
|
+
...cache[DefaultFlavour].decorators.values(),
|
|
141
|
+
].reduce((accum, e, i) => {
|
|
142
|
+
if (e.args)
|
|
143
|
+
accum[i] = e.args;
|
|
144
|
+
return accum;
|
|
145
|
+
}, {});
|
|
128
146
|
const toApply = [
|
|
129
147
|
...(decorators ? decorators.values() : []),
|
|
130
148
|
...(extras ? extras.values() : []),
|
|
131
149
|
];
|
|
132
|
-
toApply.
|
|
150
|
+
return toApply.reduce((_, d, i) => {
|
|
151
|
+
switch (typeof d) {
|
|
152
|
+
case "object": {
|
|
153
|
+
const { decorator, args, transform } = d;
|
|
154
|
+
const argz = args || i < (decorators ? decorators.size : 0)
|
|
155
|
+
? decoratorArgs[i]
|
|
156
|
+
: extraArgs[i - (decorators ? decorators.size : 0)] ||
|
|
157
|
+
(decorators ? decoratorArgs[i - decorators.size] : []);
|
|
158
|
+
const transformed = transform
|
|
159
|
+
? transform(argz || [])
|
|
160
|
+
: argz || [];
|
|
161
|
+
return decorator(...transformed)(target, propertyKey, descriptor);
|
|
162
|
+
}
|
|
163
|
+
case "function":
|
|
164
|
+
return d(target, propertyKey, descriptor);
|
|
165
|
+
default:
|
|
166
|
+
throw new Error(`Unexpected decorator type: ${typeof d}`);
|
|
167
|
+
}
|
|
168
|
+
}, { target, propertyKey, descriptor });
|
|
133
169
|
};
|
|
134
170
|
Object.defineProperty(contextDecorator, "name", {
|
|
135
171
|
value: [f, key].join("_decorator_for_"),
|
|
@@ -145,7 +181,7 @@ export class Decoration {
|
|
|
145
181
|
apply() {
|
|
146
182
|
if (!this.key)
|
|
147
183
|
throw new Error("No key provided for the decoration builder");
|
|
148
|
-
Decoration.register(this.key, this.flavour, this.decorators, this.extras);
|
|
184
|
+
Decoration.register(this.key, this.flavour, this.decorators || new Set(), this.extras);
|
|
149
185
|
return this.decoratorFactory(this.key, this.flavour);
|
|
150
186
|
}
|
|
151
187
|
/**
|
|
@@ -157,8 +193,9 @@ export class Decoration {
|
|
|
157
193
|
* @param [extras] Additional decorators
|
|
158
194
|
*/
|
|
159
195
|
static register(key, flavour, decorators, extras) {
|
|
160
|
-
if (!key)
|
|
196
|
+
if (!key) {
|
|
161
197
|
throw new Error("No key provided for the decoration builder");
|
|
198
|
+
}
|
|
162
199
|
if (!decorators)
|
|
163
200
|
throw new Error("No decorators provided for the decoration builder");
|
|
164
201
|
if (!flavour)
|
|
@@ -187,4 +224,4 @@ export class Decoration {
|
|
|
187
224
|
return new Decoration(flavour);
|
|
188
225
|
}
|
|
189
226
|
}
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjb3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9EZWNvcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsdUJBQW9CO0FBRTdDLDZEQUE2RDtBQUM3RCxTQUFTLHNCQUFzQixDQUFDLE1BQWM7SUFDNUMsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNyQjs7O09BR0c7YUFDWSxlQUFVLEdBU3JCLEVBQUUsQ0FBQztJQUVQOzs7T0FHRzthQUNZLG9CQUFlLEdBQW9CLHNCQUFzQixDQUFDO0lBbUJ6RSxZQUFvQixVQUFrQixjQUFjO1FBQWhDLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQUcsQ0FBQztJQUV4RDs7Ozs7T0FLRztJQUNILEdBQUcsQ0FBQyxHQUFXO1FBQ2IsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxRQUFRLENBQ2QsUUFBaUIsS0FBSyxFQUN0QixHQUFHLFVBQW9FO1FBRXZFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUN6RSxJQUNFLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ25DLENBQUMsS0FBSztZQUNOLElBQUksQ0FBQyxPQUFPLEtBQUssY0FBYztZQUUvQixNQUFNLElBQUksS0FBSyxDQUNiLDJFQUEyRSxDQUM1RSxDQUFDO1FBQ0osSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLGNBQWMsSUFBSSxLQUFLO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMs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R0FBRyxNQUFNLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBeUI7UUFDakQsVUFBVSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBVztRQUNwQixPQUFPLElBQUksVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJFbmQsXG4gIERlY29yYXRpb25CdWlsZGVyTWlkLFxuICBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0LFxuICBGbGF2b3VyUmVzb2x2ZXIsXG4gIElEZWNvcmF0aW9uQnVpbGRlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRGbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmZ1bmN0aW9uIGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXIodGFyZ2V0OiBvYmplY3QpIHtcbiAgcmV0dXJuIERlZmF1bHRGbGF2b3VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGRlY29yYXRvciBtYW5hZ2VtZW50IGNsYXNzIHRoYXQgaGFuZGxlcyBmbGF2b3VyZWQgZGVjb3JhdG9yc1xuICogQHN1bW1hcnkgVGhlIERlY29yYXRpb24gY2xhc3MgcHJvdmlkZXMgYSBidWlsZGVyIHBhdHRlcm4gZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBkZWNvcmF0b3JzIHdpdGggZGlmZmVyZW50IGZsYXZvdXJzLlxuICogSXQgc3VwcG9ydHMgcmVnaXN0ZXJpbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBjb250ZXh0LWF3YXJlIGZsYXZvdXIgcmVzb2x1dGlvbi5cbiAqIFRoZSBjbGFzcyBpbXBsZW1lbnRzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgZGVmaW5pbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMsXG4gKiBhbGxvd2luZyBmb3IgZnJhbWV3b3JrLXNwZWNpZmljIGRlY29yYXRvciBpbXBsZW1lbnRhdGlvbnMgd2hpbGUgbWFpbnRhaW5pbmcgYSBjb25zaXN0ZW50IEFQSS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGRlY29yYXRvciAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBwYXJhbWV0ZXIgZm9yIHRoZSBkZWNvcmF0b3IgY29udGV4dFxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgZGVjb3JhdGlvbiBmb3IgJ2NvbXBvbmVudCcgd2l0aCBkZWZhdWx0IGZsYXZvdXJcbiAqIGNvbnN0IGNvbXBvbmVudERlY29yYXRvciA9IG5ldyBEZWNvcmF0aW9uKClcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZShjdXN0b21Db21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGZsYXZvdXJlZCBkZWNvcmF0aW9uXG4gKiBjb25zdCB2dWVDb21wb25lbnQgPSBuZXcgRGVjb3JhdGlvbigndnVlJylcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZSh2dWVDb21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIEFwcGx5IHRoZSBkZWNvcmF0aW9uXG4gKiBAY29tcG9uZW50RGVjb3JhdG9yXG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7fVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdGlvblxuICogICBwYXJ0aWNpcGFudCBSIGFzIEZsYXZvdXJSZXNvbHZlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIERlY29yYXRvckZhY3RvcnlcbiAqXG4gKiAgIEMtPj5EOiBuZXcgRGVjb3JhdGlvbihmbGF2b3VyKVxuICogICBDLT4+RDogZm9yKGtleSlcbiAqICAgQy0+PkQ6IGRlZmluZShkZWNvcmF0b3JzKVxuICogICBELT4+RDogcmVnaXN0ZXIoa2V5LCBmbGF2b3VyLCBkZWNvcmF0b3JzKVxuICogICBELT4+RjogZGVjb3JhdG9yRmFjdG9yeShrZXksIGZsYXZvdXIpXG4gKiAgIEYtPj5SOiByZXNvbHZlKHRhcmdldClcbiAqICAgUi0tPj5GOiByZXNvbHZlZCBmbGF2b3VyXG4gKiAgIEYtPj5GOiBhcHBseSBkZWNvcmF0b3JzXG4gKiAgIEYtLT4+QzogZGVjb3JhdGVkIHRhcmdldFxuICovXG5leHBvcnQgY2xhc3MgRGVjb3JhdGlvbiBpbXBsZW1lbnRzIElEZWNvcmF0aW9uQnVpbGRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1hcCBvZiByZWdpc3RlcmVkIGRlY29yYXRvcnNcbiAgICogQHN1bW1hcnkgU3RvcmVzIGFsbCByZWdpc3RlcmVkIGRlY29yYXRvcnMgb3JnYW5pemVkIGJ5IGtleSBhbmQgZmxhdm91clxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb3JhdG9yczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7XG4gICAgICAgIGRlY29yYXRvcnM/OiBTZXQ8Q2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcj47XG4gICAgICAgIGV4dHJhcz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPjtcbiAgICAgIH1cbiAgICA+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIHJlc29sdmUgZmxhdm91ciBmcm9tIGEgdGFyZ2V0XG4gICAqIEBzdW1tYXJ5IFJlc29sdmVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgZmxhdm91ciBmb3IgYSBnaXZlbiB0YXJnZXRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZsYXZvdXJSZXNvbHZlcjogRmxhdm91clJlc29sdmVyID0gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRvcnM/OiBTZXQ8XG4gICAgQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvclxuICA+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBleHRyYXM/OiBTZXQ8Q2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGRlY29yYXRvciBrZXlcbiAgICovXG4gIHByaXZhdGUga2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmxhdm91cjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBrZXkgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgZGVjb3JhdGlvbiBjaGFpbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3JcbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJNaWR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGRlY29yYXRvcnMgd2l0aCBhZGRvbiBzdXBwb3J0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZG9uPWZhbHNlXSBXaGV0aGVyIHRoZSBkZWNvcmF0b3JzIGFyZSBhZGRvbnNcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgQXJyYXkgb2YgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHt0aGlzfSBDdXJyZW50IGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0ZShcbiAgICBhZGRvbjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIC4uLmRlY29yYXRvcnM6IChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVtdXG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrZXkgbXVzdCBiZSBwcm92aWRlZCBiZWZvcmUgZGVjb3JhdG9ycyBjYW4gYmUgYWRkZWRcIik7XG4gICAgaWYgKFxuICAgICAgKCFkZWNvcmF0b3JzIHx8ICFkZWNvcmF0b3JzLmxlbmd0aCkgJiZcbiAgICAgICFhZGRvbiAmJlxuICAgICAgdGhpcy5mbGF2b3VyICE9PSBEZWZhdWx0Rmxhdm91clxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNdXN0IHByb3ZpZGUgb3ZlcnJpZGVzIG9yIGFkZG9ucyB0byBvdmVycmlkZSBvciBleHRlbmQgZGVjYWYncyBkZWNvcmF0b3JzXCJcbiAgICAgICk7XG4gICAgaWYgKHRoaXMuZmxhdm91ciA9PT0gRGVmYXVsdEZsYXZvdXIgJiYgYWRkb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZhdWx0IGZsYXZvdXIgY2Fubm90IGJlIGV4dGVuZGVkXCIpO1xuXG4gICAgdGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gPSBuZXcgU2V0KFtcbiAgICAgIC4uLih0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSB8fCBuZXcgU2V0KCkpLnZhbHVlcygpLFxuICAgICAgLi4uZGVjb3JhdG9ycyxcbiAgICBdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBiYXNlIGRlY29yYXRvcnNcbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgcHJpbWFyeSBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIERlY29yYXRvcnMgdG8gZGVmaW5lXG4gICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZSBmb3IgZmluaXNoaW5nIHRoZSBjaGFpblxuICAgKi9cbiAgZGVmaW5lKFxuICAgIC4uLmRlY29yYXRvcnM6IChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVtdXG4gICk6IERlY29yYXRpb25CdWlsZGVyRW5kICYgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUoZmFsc2UsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHRlbmRzIGV4aXN0aW5nIGRlY29yYXRvcnNcbiAgICogQHN1bW1hcnkgQWRkcyBhZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJCdWlsZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgdGhlIGRlY29yYXRvclxuICAgKi9cbiAgZXh0ZW5kKFxuICAgIC4uLmRlY29yYXRvcnM6IChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVtdXG4gICk6IERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKHRydWUsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlY29yYXRvckZhY3Rvcnkoa2V5OiBzdHJpbmcsIGY6IHN0cmluZyA9IERlZmF1bHRGbGF2b3VyKSB7XG4gICAgY29uc3QgY29udGV4dERlY29yYXRvciA9IGZ1bmN0aW9uIGNvbnRleHREZWNvcmF0b3IoXG4gICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgICApIHtcbiAgICAgIGNvbnN0IGZsYXZvdXIgPSBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlcih0YXJnZXQpO1xuICAgICAgbGV0IGRlY29yYXRvcnM7XG4gICAgICBjb25zdCBleHRyYXMgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXVxuICAgICAgICA/IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmV4dHJhc1xuICAgICAgICA6IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW0RlZmF1bHRGbGF2b3VyXS5leHRyYXM7XG4gICAgICBpZiAoXG4gICAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldICYmXG4gICAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdICYmXG4gICAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmRlY29yYXRvcnNcbiAgICAgICkge1xuICAgICAgICBkZWNvcmF0b3JzID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9ycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtEZWZhdWx0Rmxhdm91cl0uZGVjb3JhdG9ycztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvQXBwbHkgPSBbXG4gICAgICAgIC4uLihkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgICAgLi4uKGV4dHJhcyA/IGV4dHJhcy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgIF07XG4gICAgICB0b0FwcGx5LmZvckVhY2goKGQpID0+XG4gICAgICAgIChkIGFzIGFueSkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvciwgZGVzY3JpcHRvcilcbiAgICAgICk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dERlY29yYXRvciwgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBbZiwga2V5XS5qb2luKFwiX2RlY29yYXRvcl9mb3JfXCIpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBjb250ZXh0RGVjb3JhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBmaW5hbCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvblxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueT8sIFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPyk6IGFueX0gVGhlIGdlbmVyYXRlZCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICovXG4gIGFwcGx5KCk6IChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApID0+IGFueSB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBEZWNvcmF0aW9uLnJlZ2lzdGVyKHRoaXMua2V5LCB0aGlzLmZsYXZvdXIsIHRoaXMuZGVjb3JhdG9ycywgdGhpcy5leHRyYXMpO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRvckZhY3RvcnkodGhpcy5rZXksIHRoaXMuZmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBkZWNvcmF0b3JzIGZvciBhIHNwZWNpZmljIGtleSBhbmQgZmxhdm91clxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gc3RvcmUgZGVjb3JhdG9ycyBpbiB0aGUgc3RhdGljIHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdG9yIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBEZWNvcmF0b3IgZmxhdm91clxuICAgKiBAcGFyYW0gW2RlY29yYXRvcnNdIFByaW1hcnkgZGVjb3JhdG9yc1xuICAgKiBAcGFyYW0gW2V4dHJhc10gQWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgZGVjb3JhdG9ycz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPixcbiAgICBleHRyYXM/OiBTZXQ8Q2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcj5cbiAgKSB7XG4gICAgaWYgKCFrZXkpIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBpZiAoIWRlY29yYXRvcnMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBkZWNvcmF0b3JzIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGZsYXZvdXIgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG5cbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSA9IHt9O1xuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0pXG4gICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSA9IHt9O1xuICAgIGlmIChkZWNvcmF0b3JzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICBpZiAoZXh0cmFzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGdsb2JhbCBmbGF2b3VyIHJlc29sdmVyXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGRlY29yYXRvciBmbGF2b3Vyc1xuICAgKiBAcGFyYW0ge0ZsYXZvdXJSZXNvbHZlcn0gcmVzb2x2ZXIgRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3Vyc1xuICAgKi9cbiAgc3RhdGljIHNldEZsYXZvdXJSZXNvbHZlcihyZXNvbHZlcjogRmxhdm91clJlc29sdmVyKSB7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIHN0YXRpYyBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKCkuZm9yKGtleSk7XG4gIH1cblxuICBzdGF0aWMgZmxhdm91cmVkQXMoZmxhdm91cjogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpO1xuICB9XG59XG4iXX0=
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjb3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9EZWNvcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsdUJBQW9CO0FBRTdDLDZEQUE2RDtBQUM3RCxTQUFTLHNCQUFzQixDQUFDLE1BQWM7SUFDNUMsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQWdCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFDckI7OztPQUdHO2FBQ1ksZUFBVSxHQVNyQixFQUFFLENBQUM7SUFFUDs7O09BR0c7YUFDWSxvQkFBZSxHQUFvQixzQkFBc0IsQ0FBQztJQWlCekUsWUFBb0IsVUFBa0IsY0FBYztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtJQUFHLENBQUM7SUFFeEQ7Ozs7O09BS0c7SUFDSCxHQUFHLENBQUMsR0FBVztRQUNiLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssUUFBUSxDQUNkLFFBQWlCLEtBQUssRUFDdEIsR0FBRyxVQUEyQjtRQUU5QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDekUsSUFDRSxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxDQUFDLEtBQUs7WUFDTixJQUFJLENBQUMsT0FBTyxLQUFLLGNBQWM7WUFFL0IsTUFBTSxJQUFJLEtBQUssQ0FDYiwyRUFBMkUsQ0FDNUUsQ0FBQztRQUNKLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxjQUFjLElBQUksS0FBSztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFD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Q0FBQyxVQUFVO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxPQUFPO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBRXBFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUN0QyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFVBQVU7WUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDNUUsSUFBSSxNQUFNO1lBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQXlCO1FBQ2pELFVBQVUsQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFlO1FBQ2hDLE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlY29yYXRpb25CdWlsZGVyQnVpbGQsXG4gIERlY29yYXRpb25CdWlsZGVyRW5kLFxuICBEZWNvcmF0aW9uQnVpbGRlck1pZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCxcbiAgRmxhdm91clJlc29sdmVyLFxuICBJRGVjb3JhdGlvbkJ1aWxkZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Rmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyKHRhcmdldDogb2JqZWN0KSB7XG4gIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbn1cblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yVHlwZXMgPVxuICB8IENsYXNzRGVjb3JhdG9yXG4gIHwgUHJvcGVydHlEZWNvcmF0b3JcbiAgfCBNZXRob2REZWNvcmF0b3I7XG5cbmV4cG9ydCB0eXBlIERlY29yYXRvckZhY3RvcnkgPSAoLi4uYXJnczogYW55W10pID0+IERlY29yYXRvclR5cGVzO1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5QXJncyA9IHtcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JGYWN0b3J5O1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybT86IChhcmdzOiBhbnlbXSkgPT4gYW55W107XG59O1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JEYXRhID0gRGVjb3JhdG9yVHlwZXMgfCBEZWNvcmF0b3JGYWN0b3J5QXJncztcbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgZGVjb3JhdG9yIG1hbmFnZW1lbnQgY2xhc3MgdGhhdCBoYW5kbGVzIGZsYXZvdXJlZCBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBUaGUgRGVjb3JhdGlvbiBjbGFzcyBwcm92aWRlcyBhIGJ1aWxkZXIgcGF0dGVybiBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMuXG4gKiBJdCBzdXBwb3J0cyByZWdpc3RlcmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGNvbnRleHQtYXdhcmUgZmxhdm91ciByZXNvbHV0aW9uLlxuICogVGhlIGNsYXNzIGltcGxlbWVudHMgYSBmbHVlbnQgaW50ZXJmYWNlIGZvciBkZWZpbmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3VycyxcbiAqIGFsbG93aW5nIGZvciBmcmFtZXdvcmstc3BlY2lmaWMgZGVjb3JhdG9yIGltcGxlbWVudGF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBhIGNvbnNpc3RlbnQgQVBJLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgZGVjb3JhdG9yIChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBmbGF2b3VyIHBhcmFtZXRlciBmb3IgdGhlIGRlY29yYXRvciBjb250ZXh0XG4gKiBAY2xhc3NcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBkZWNvcmF0aW9uIGZvciAnY29tcG9uZW50JyB3aXRoIGRlZmF1bHQgZmxhdm91clxuICogY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmV3IERlY29yYXRpb24oKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKGN1c3RvbUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgZmxhdm91cmVkIGRlY29yYXRpb25cbiAqIGNvbnN0IHZ1ZUNvbXBvbmVudCA9IG5ldyBEZWNvcmF0aW9uKCd2dWUnKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKHZ1ZUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQXBwbHkgdGhlIGRlY29yYXRpb25cbiAqIEBjb21wb25lbnREZWNvcmF0b3JcbiAqIGNsYXNzIE15Q29tcG9uZW50IHt9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgRmxhdm91clJlc29sdmVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRGVjb3JhdG9yRmFjdG9yeVxuICpcbiAqICAgQy0+PkQ6IG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpXG4gKiAgIEMtPj5EOiBmb3Ioa2V5KVxuICogICBDLT4+RDogZGVmaW5lKGRlY29yYXRvcnMpXG4gKiAgIEQtPj5EOiByZWdpc3RlcihrZXksIGZsYXZvdXIsIGRlY29yYXRvcnMpXG4gKiAgIEQtPj5GOiBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZmxhdm91cilcbiAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICogICBSLS0+PkY6IHJlc29sdmVkIGZsYXZvdXJcbiAqICAgRi0+PkY6IGFwcGx5IGRlY29yYXRvcnNcbiAqICAgRi0tPj5DOiBkZWNvcmF0ZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uIGltcGxlbWVudHMgSURlY29yYXRpb25CdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWFwIG9mIHJlZ2lzdGVyZWQgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTdG9yZXMgYWxsIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycyBvcmdhbml6ZWQgYnkga2V5IGFuZCBmbGF2b3VyXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPjtcbiAgICAgICAgZXh0cmFzPzogU2V0PERlY29yYXRvckRhdGE+O1xuICAgICAgfVxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3VyIGZyb20gYSB0YXJnZXRcbiAgICogQHN1bW1hcnkgUmVzb2x2ZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZmxhdm91clJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIgPSBkZWZhdWx0Rmxhdm91clJlc29sdmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBhZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICovXG4gIHByaXZhdGUgZXh0cmFzPzogU2V0PERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBkZWNvcmF0b3Iga2V5XG4gICAqL1xuICBwcml2YXRlIGtleT86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZsYXZvdXI6IHN0cmluZyA9IERlZmF1bHRGbGF2b3VyKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUga2V5IGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGRlY29yYXRpb24gY2hhaW4gd2l0aCB0aGUgc3BlY2lmaWVkIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyTWlkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBkZWNvcmF0b3JzIHdpdGggYWRkb24gc3VwcG9ydFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRvbj1mYWxzZV0gV2hldGhlciB0aGUgZGVjb3JhdG9ycyBhcmUgYWRkb25zXG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFycmF5IG9mIGRlY29yYXRvcnNcbiAgICogQHJldHVybiB7dGhpc30gQ3VycmVudCBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdGUoXG4gICAgYWRkb246IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAuLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW11cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImtleSBtdXN0IGJlIHByb3ZpZGVkIGJlZm9yZSBkZWNvcmF0b3JzIGNhbiBiZSBhZGRlZFwiKTtcbiAgICBpZiAoXG4gICAgICAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSAmJlxuICAgICAgIWFkZG9uICYmXG4gICAgICB0aGlzLmZsYXZvdXIgIT09IERlZmF1bHRGbGF2b3VyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk11c3QgcHJvdmlkZSBvdmVycmlkZXMgb3IgYWRkb25zIHRvIG92ZXJyaWRlIG9yIGV4dGVuZCBkZWNhZidzIGRlY29yYXRvcnNcIlxuICAgICAgKTtcbiAgICBpZiAodGhpcy5mbGF2b3VyID09PSBEZWZhdWx0Rmxhdm91ciAmJiBhZGRvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmF1bHQgZmxhdm91ciBjYW5ub3QgYmUgZXh0ZW5kZWRcIik7XG5cbiAgICB0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSA9IG5ldyBTZXQoW1xuICAgICAgLi4uKHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdIHx8IG5ldyBTZXQoKSkudmFsdWVzKCksXG4gICAgICAuLi5kZWNvcmF0b3JzLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGJhc2UgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBwcmltYXJ5IGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgRGVjb3JhdG9ycyB0byBkZWZpbmVcbiAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlIGZvciBmaW5pc2hpbmcgdGhlIGNoYWluXG4gICAqL1xuICBkZWZpbmUoXG4gICAgLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdXG4gICk6IERlY29yYXRpb25CdWlsZGVyRW5kICYgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUoZmFsc2UsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHRlbmRzIGV4aXN0aW5nIGRlY29yYXRvcnNcbiAgICogQHN1bW1hcnkgQWRkcyBhZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJCdWlsZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgdGhlIGRlY29yYXRvclxuICAgKi9cbiAgZXh0ZW5kKC4uLmRlY29yYXRvcnM6IERlY29yYXRvckRhdGFbXSk6IERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKHRydWUsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlY29yYXRvckZhY3Rvcnkoa2V5OiBzdHJpbmcsIGY6IHN0cmluZyA9IERlZmF1bHRGbGF2b3VyKSB7XG4gICAgY29uc3QgY29udGV4dERlY29yYXRvciA9IGZ1bmN0aW9uIGNvbnRleHREZWNvcmF0b3IoXG4gICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgICApIHtcbiAgICAgIGNvbnN0IGZsYXZvdXIgPSBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlcih0YXJnZXQpO1xuICAgICAgY29uc3QgY2FjaGUgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XTtcbiAgICAgIGxldCBkZWNvcmF0b3JzO1xuICAgICAgY29uc3QgZXh0cmFzID0gY2FjaGVbZmxhdm91cl1cbiAgICAgICAgPyBjYWNoZVtmbGF2b3VyXS5leHRyYXNcbiAgICAgICAgOiBjYWNoZVtEZWZhdWx0Rmxhdm91cl0uZXh0cmFzO1xuICAgICAgY29uc3QgZXh0cmFBcmdzID0gW1xuICAgICAgICAuLi4oKGNhY2hlW0RlZmF1bHRGbGF2b3VyXSBhcyBhbnkpLmV4dHJhc1xuICAgICAgICAgID8gKGNhY2hlW0RlZmF1bHRGbGF2b3VyXSBhcyBhbnkpLmV4dHJhcy52YWx1ZXMoKVxuICAgICAgICAgIDogW10pLFxuICAgICAgXS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8bnVtYmVyLCBhbnk+LCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlLmFyZ3MpIGFjY3VtW2ldID0gZS5hcmdzO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgY2FjaGUgJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0gJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycyAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzLnNpemVcbiAgICAgICkge1xuICAgICAgICBkZWNvcmF0b3JzID0gY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBjYWNoZVtEZWZhdWx0Rmxhdm91cl0uZGVjb3JhdG9ycztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb3JhdG9yQXJncyA9IFtcbiAgICAgICAgLi4uKGNhY2hlW0RlZmF1bHRGbGF2b3VyXSBhcyBhbnkpLmRlY29yYXRvcnMudmFsdWVzKCksXG4gICAgICBdLnJlZHVjZSgoYWNjdW06IFJlY29yZDxudW1iZXIsIGFueT4sIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUuYXJncykgYWNjdW1baV0gPSBlLmFyZ3M7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgY29uc3QgdG9BcHBseSA9IFtcbiAgICAgICAgLi4uKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JzLnZhbHVlcygpIDogW10pLFxuICAgICAgICAuLi4oZXh0cmFzID8gZXh0cmFzLnZhbHVlcygpIDogW10pLFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHRvQXBwbHkucmVkdWNlKFxuICAgICAgICAoXywgZCwgaSkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgICBjb25zdCB7IGRlY29yYXRvciwgYXJncywgdHJhbnNmb3JtIH0gPSBkIGFzIERlY29yYXRvckZhY3RvcnlBcmdzO1xuICAgICAgICAgICAgICBjb25zdCBhcmd6ID1cbiAgICAgICAgICAgICAgICBhcmdzIHx8IGkgPCAoZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMuc2l6ZSA6IDApXG4gICAgICAgICAgICAgICAgICA/IGRlY29yYXRvckFyZ3NbaV1cbiAgICAgICAgICAgICAgICAgIDogZXh0cmFBcmdzW2kgLSAoZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMuc2l6ZSA6IDApXSB8fFxuICAgICAgICAgICAgICAgICAgICAoZGVjb3JhdG9ycyA/IGRlY29yYXRvckFyZ3NbaSAtIGRlY29yYXRvcnMuc2l6ZV0gOiBbXSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICA/IHRyYW5zZm9ybShhcmd6IHx8IFtdKVxuICAgICAgICAgICAgICAgIDogYXJneiB8fCBbXTtcbiAgICAgICAgICAgICAgcmV0dXJuIChkZWNvcmF0b3IoLi4udHJhbnNmb3JtZWQpIGFzIGFueSkoXG4gICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICByZXR1cm4gKGQgYXMgYW55KSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBkZWNvcmF0b3IgdHlwZTogJHt0eXBlb2YgZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvciB9XG4gICAgICApO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHREZWNvcmF0b3IsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogW2YsIGtleV0uam9pbihcIl9kZWNvcmF0b3JfZm9yX1wiKSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gY29udGV4dERlY29yYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgZmluYWwgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgZGVjb3JhdG9yIGZhY3RvcnkgZnVuY3Rpb25cbiAgICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnk/LCBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcj8pOiBhbnl9IFRoZSBnZW5lcmF0ZWQgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gICAqL1xuICBhcHBseSgpOiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKSA9PiBhbnkge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBrZXkgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgRGVjb3JhdGlvbi5yZWdpc3RlcihcbiAgICAgIHRoaXMua2V5LFxuICAgICAgdGhpcy5mbGF2b3VyLFxuICAgICAgdGhpcy5kZWNvcmF0b3JzIHx8IG5ldyBTZXQoKSxcbiAgICAgIHRoaXMuZXh0cmFzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0b3JGYWN0b3J5KHRoaXMua2V5LCB0aGlzLmZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgZGVjb3JhdG9ycyBmb3IgYSBzcGVjaWZpYyBrZXkgYW5kIGZsYXZvdXJcbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgbWV0aG9kIHRvIHN0b3JlIGRlY29yYXRvcnMgaW4gdGhlIHN0YXRpYyByZWdpc3RyeVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRvciBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgRGVjb3JhdG9yIGZsYXZvdXJcbiAgICogQHBhcmFtIFtkZWNvcmF0b3JzXSBQcmltYXJ5IGRlY29yYXRvcnNcbiAgICogQHBhcmFtIFtleHRyYXNdIEFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVnaXN0ZXIoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZmxhdm91cjogc3RyaW5nLFxuICAgIGRlY29yYXRvcnM/OiBTZXQ8RGVjb3JhdG9yRGF0YT4sXG4gICAgZXh0cmFzPzogU2V0PERlY29yYXRvckRhdGE+XG4gICkge1xuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBrZXkgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgfVxuICAgIGlmICghZGVjb3JhdG9ycylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGRlY29yYXRvcnMgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZmxhdm91ciBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcblxuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0pIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldID0ge307XG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSlcbiAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdID0ge307XG4gICAgaWYgKGRlY29yYXRvcnMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzO1xuICAgIGlmIChleHRyYXMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmV4dHJhcyA9IGV4dHJhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZ2xvYmFsIGZsYXZvdXIgcmVzb2x2ZXJcbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgZGVjb3JhdG9yIGZsYXZvdXJzXG4gICAqIEBwYXJhbSB7Rmxhdm91clJlc29sdmVyfSByZXNvbHZlciBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXJzXG4gICAqL1xuICBzdGF0aWMgc2V0Rmxhdm91clJlc29sdmVyKHJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIpIHtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIHN0YXRpYyBmbGF2b3VyZWRBcyhmbGF2b3VyOiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0IHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZmxhdm91cik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* D->>M: Add property to array
|
|
24
24
|
* end
|
|
25
25
|
*/
|
|
26
|
-
export declare function prop(key?: string): (
|
|
26
|
+
export declare function prop(key?: string): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
|
|
27
27
|
/**
|
|
28
28
|
* @description Combined property decorator factory for metadata and attribute marking
|
|
29
29
|
* @summary Creates a decorator that both marks a property as a model attribute and assigns metadata to it
|