@fgv/ts-utils 1.8.2-csv.2 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fgv/ts-utils",
3
- "version": "1.8.2-csv.2",
3
+ "version": "1.9.1",
4
4
  "description": "Assorted Typescript Utilities",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/utils.d.ts CHANGED
@@ -8,6 +8,25 @@ import { Result } from './result';
8
8
  * @public
9
9
  */
10
10
  export declare function isKeyOf<T extends object>(key: string | number | symbol, item: T): key is keyof T;
11
+ /**
12
+ * Simple implicit pick function, which picks a set of properties from a supplied
13
+ * object. Ignores picked properties that do not exist regardless of type signature.
14
+ * @param from - The object from which keys are to be picked.
15
+ * @param include - The keys of the properties to be picked from `from`.
16
+ * @returns A new object containing the requested properties from `from`, where present.
17
+ * @public
18
+ */
19
+ export declare function pick<T extends object, K extends keyof T>(from: T, include: K[]): Pick<T, K>;
20
+ /**
21
+ * Simple implicit omit function, which picks all of the properties from a supplied
22
+ * object except those specified for exclusion.
23
+ * @param from - The object from which keys are to be picked.
24
+ * @param exclude - The keys of the properties to be excluded from the returned object.
25
+ * @returns A new object containing all of the properties from `from` that were not
26
+ * explicitly excluded.
27
+ * @public
28
+ */
29
+ export declare function omit<T extends object, K extends keyof T>(from: T, exclude: K[]): Omit<T, K>;
11
30
  /**
12
31
  * Gets the value of a property specified by key from an arbitrary object,
13
32
  * or a default value if the property does not exist.
package/utils.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/utils.js CHANGED
@@ -21,7 +21,7 @@
21
21
  * SOFTWARE.
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.optionalMapToPossiblyEmptyRecord = exports.optionalMapToRecord = exports.mapToRecord = exports.optionalRecordToPossiblyEmptyMap = exports.optionalRecordToMap = exports.recordToMap = exports.getTypeOfProperty = exports.getValueOfPropertyOrDefault = exports.isKeyOf = void 0;
24
+ exports.optionalMapToPossiblyEmptyRecord = exports.optionalMapToRecord = exports.mapToRecord = exports.optionalRecordToPossiblyEmptyMap = exports.optionalRecordToMap = exports.recordToMap = exports.getTypeOfProperty = exports.getValueOfPropertyOrDefault = exports.omit = exports.pick = exports.isKeyOf = void 0;
25
25
  const result_1 = require("./result");
26
26
  /**
27
27
  * Helper type-guard function to report whether a specified key is present in
@@ -36,6 +36,41 @@ function isKeyOf(key, item) {
36
36
  return item.hasOwnProperty(key);
37
37
  }
38
38
  exports.isKeyOf = isKeyOf;
39
+ /**
40
+ * Simple implicit pick function, which picks a set of properties from a supplied
41
+ * object. Ignores picked properties that do not exist regardless of type signature.
42
+ * @param from - The object from which keys are to be picked.
43
+ * @param include - The keys of the properties to be picked from `from`.
44
+ * @returns A new object containing the requested properties from `from`, where present.
45
+ * @public
46
+ */
47
+ function pick(from, include) {
48
+ const rtrn = {};
49
+ for (const key of include) {
50
+ if (key in from) {
51
+ rtrn[key] = from[key];
52
+ }
53
+ }
54
+ return rtrn;
55
+ }
56
+ exports.pick = pick;
57
+ /**
58
+ * Simple implicit omit function, which picks all of the properties from a supplied
59
+ * object except those specified for exclusion.
60
+ * @param from - The object from which keys are to be picked.
61
+ * @param exclude - The keys of the properties to be excluded from the returned object.
62
+ * @returns A new object containing all of the properties from `from` that were not
63
+ * explicitly excluded.
64
+ * @public
65
+ */
66
+ function omit(from, exclude) {
67
+ const rtrn = {};
68
+ for (const entry of Object.entries(from).filter((e) => !exclude.includes(e[0]))) {
69
+ rtrn[entry[0]] = entry[1];
70
+ }
71
+ return rtrn;
72
+ }
73
+ exports.omit = omit;
39
74
  /**
40
75
  * Gets the value of a property specified by key from an arbitrary object,
41
76
  * or a default value if the property does not exist.
@@ -162,4 +197,4 @@ function optionalMapToPossiblyEmptyRecord(src, factory) {
162
197
  return (src === undefined) ? (0, result_1.succeed)({}) : mapToRecord(src, factory);
163
198
  }
164
199
  exports.optionalMapToPossiblyEmptyRecord = optionalMapToPossiblyEmptyRecord;
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgscUNBQWlEO0FBRWpEOzs7Ozs7O0dBT0c7QUFDSCx3REFBd0Q7QUFDeEQsU0FBZ0IsT0FBTyxDQUFtQixHQUF5QixFQUFFLElBQU87SUFDeEUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFGRCwwQkFFQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQiwyQkFBMkIsQ0FDdkMsR0FBeUIsRUFDekIsSUFBTyxFQUNQLFlBQXNCO0lBRXRCLE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDekQsQ0FBQztBQU5ELGtFQU1DO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLGlCQUFpQixDQUM3QixHQUF5QixFQUN6QixJQUFPO0lBQ1AsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzdELENBQUM7QUFKRCw4Q0FJQztBQVFEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixXQUFXLENBQXFDLEdBQW1CLEVBQUUsT0FBc0M7SUFDdkgsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xDO2lCQUNJO2dCQUNELE9BQU8sSUFBQSxhQUFJLEVBQUMsR0FBRyxHQUFHLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDaEQ7U0FDSjtLQUNKO0lBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQWRELGtDQWNDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLG1CQUFtQixDQUFxQyxHQUE2QixFQUFFLE9BQXNDO0lBQ3pJLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRkQsa0RBRUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQXFDLEdBQTZCLEVBQUUsT0FBc0M7SUFDdEosT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLElBQUksR0FBRyxFQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBRkQsNEVBRUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsV0FBVyxDQUFxQyxHQUFnQixFQUFFLE9BQXNDO0lBQ3BILE1BQU0sTUFBTSxHQUFtQixFQUFvQixDQUFDO0lBQ3BELEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN0QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzthQUNyQztpQkFDSTtnQkFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ25EO1NBQ0o7S0FDSjtJQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFkRCxrQ0FjQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBcUMsR0FBMEIsRUFBRSxPQUFzQztJQUN0SSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUZELGtEQUVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGdDQUFnQyxDQUFxQyxHQUEwQixFQUFFLE9BQXNDO0lBQ25KLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxFQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUZELDRFQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciB0eXBlLWd1YXJkIGZ1bmN0aW9uIHRvIHJlcG9ydCB3aGV0aGVyIGEgc3BlY2lmaWVkIGtleSBpcyBwcmVzZW50IGluXHJcbiAqIGEgc3VwcGxpZWQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBiZSB0ZXN0ZWQuXHJcbiAqIEBwYXJhbSBpdGVtIC0gVGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQuXHJcbiAqIEByZXR1cm5zIFJldHVybnMgYHRydWVgIGlmIHRoZSBrZXkgaXMgcHJlc2VudCwgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0tleU9mPFQgZXh0ZW5kcyBvYmplY3Q+KGtleTogc3RyaW5nfG51bWJlcnxzeW1ib2wsIGl0ZW06IFQpOiBrZXkgaXMga2V5b2YgVCB7XHJcbiAgICByZXR1cm4gaXRlbS5oYXNPd25Qcm9wZXJ0eShrZXkpO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBzcGVjaWZpZWQgYnkga2V5IGZyb20gYW4gYXJiaXRyYXJ5IG9iamVjdCxcclxuICogb3IgYSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdC5cclxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgc3BlY2lmeWluZyB0aGUgcHJvcGVydHkgdG8gYmUgcmV0cmlldmVkLlxyXG4gKiBAcGFyYW0gaXRlbSAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgaXMgdG8gYmUgcmV0cmlldmVkLlxyXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gQW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgcHJvcGVydHlcclxuICogaXMgbm90IHByZXNlbnQgKGRlZmF1bHQgYHVuZGVmaW5lZGApLlxyXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSwgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlXHJcbiAqIHJlcXVlc3RlZCBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdC5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlT2ZQcm9wZXJ0eU9yRGVmYXVsdDxUIGV4dGVuZHMgb2JqZWN0PihcclxuICAgIGtleTogc3RyaW5nfG51bWJlcnxzeW1ib2wsXHJcbiAgICBpdGVtOiBULFxyXG4gICAgZGVmYXVsdFZhbHVlPzogdW5rbm93blxyXG4pOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBpc0tleU9mKGtleSwgaXRlbSkgPyBpdGVtW2tleV0gOiBkZWZhdWx0VmFsdWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSB0eXBlIG9mIGEgcHJvcGVydHkgc3BlY2lmaWVkIGJ5IGtleSBmcm9tIGFuIGFyYml0cmFyeSBvYmplY3QuXHJcbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHNwZWNpZnlpbmcgdGhlIHByb3BlcnR5IHRvIGJlIHRlc3RlZC5cclxuICogQHBhcmFtIGl0ZW0gLSBUaGUgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IGlzIHRvIGJlIHRlc3RlZC5cclxuICogQHJldHVybnMgVGhlIHR5cGUgb2YgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlXHJcbiAqIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBSZXR1cm5zIGAndW5kZWZpbmVkJ2AgKGEgc3RyaW5nKSBpZiB0aGUgcHJvcGVydHkgZXhpc3RzIGJ1dCBoYXMgdGhlIHZhbHVlXHJcbiAqIHVuZGVmaW5lZCBidXQgYHVuZGVmaW5lZGAgKHRoZSBsaXRlcmFsKSBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlT2ZQcm9wZXJ0eTxUIGV4dGVuZHMgb2JqZWN0PihcclxuICAgIGtleTogc3RyaW5nfG51bWJlcnxzeW1ib2wsXHJcbiAgICBpdGVtOiBUKTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdiaWdpbnQnIHwgJ2Jvb2xlYW4nIHwgJ3N5bWJvbCcgfCAndW5kZWZpbmVkJyB8ICd1bmRlZmluZWQnIHwgJ29iamVjdCcgfCAnZnVuY3Rpb24nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBpc0tleU9mKGtleSwgaXRlbSkgPyB0eXBlb2YgaXRlbVtrZXldIDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKipcclxuICogVHlwZSBmb3IgZmFjdG9yeSBtZXRob2RzIHdoaWNoIGNvbnZlcnQgYSBrZXktdmFsdWUgcGFpciB0byBhIG5ldyB1bmlxdWUgdmFsdWUuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbnR5cGUgS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSAoa2V5OiBUSywgdGhpbmc6IFRTKSA9PiBSZXN1bHQ8VEQ+O1xyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBmYWN0b3J5IG1ldGhvZCB0byBjb252ZXJ0IGEgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YC5cclxuICogQHBhcmFtIHNyYyAtIFRoZSBgUmVjb3JkYCB0byBiZSBjb252ZXJ0ZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgb24gc3VjY2Vzcywgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYVxyXG4gKiBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFRvTWFwPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogUmVjb3JkPFRLLCBUUz4sIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PE1hcDxUSywgVEQ+PiB7XHJcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPFRLLCBURD4oKTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHNyYykge1xyXG4gICAgICAgIGlmIChzcmNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1SZXN1bHQgPSBmYWN0b3J5KGtleSwgc3JjW2tleV0pO1xyXG4gICAgICAgICAgICBpZiAoaXRlbVJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xyXG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXksIGl0ZW1SZXN1bHQudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7a2V5fTogJHtpdGVtUmVzdWx0Lm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VjY2VlZChtYXApO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYFJlY29yZGAgdG8gYmUgY29udmVydGVkLCBvciB1bmRlZmluZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgaWYgY29udmVyc2lvbiBzdWNjZWVkcywgb3Ige0BsaW5rIFN1Y2Nlc3N9IHdpdGggYHVuZGVmaW5lZGBcclxuICogaWYgYHNyY2AgaXMgYHVuZGVmaW5lZGAuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsUmVjb3JkVG9NYXA8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBSZWNvcmQ8VEssIFRTPnx1bmRlZmluZWQsIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PE1hcDxUSywgVEQ+fHVuZGVmaW5lZD4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKHVuZGVmaW5lZCkgOiByZWNvcmRUb01hcChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YFxyXG4gKiBAcGFyYW0gc3JjIC0gVGhlIGBSZWNvcmRgIHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgKGVtcHR5IGlmIGBzcmNgIGlzIGB1bmRlZmluZWRgKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLlxyXG4gKiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFJlY29yZFRvUG9zc2libHlFbXB0eU1hcDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IFJlY29yZDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD4+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZChuZXcgTWFwPFRLLCBURD4oKSkgOiByZWNvcmRUb01hcChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYSBgTWFwPFRLLCBUUz5gIGludG8gYSBgUmVjb3JkPFRLLCBURD5gLlxyXG4gKiBAcGFyYW0gc3JjIC0gVGhlIGBNYXBgIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBgUmVjb3JkPFRLLCBURD5gIGlmIGNvbnZlcnNpb24gc3VjY2VlZHMsIG9yXHJcbiAqIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9SZWNvcmQ8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBNYXA8VEssIFRTPiwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPFRLLCBURD4gPSB7fSBhcyBSZWNvcmQ8VEssIFREPjtcclxuICAgIGZvciAoY29uc3Qga3ZwIG9mIHNyYykge1xyXG4gICAgICAgIGlmIChrdnBbMV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtUmVzdWx0ID0gZmFjdG9yeShrdnBbMF0sIGt2cFsxXSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtUmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRba3ZwWzBdXSA9IGl0ZW1SZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrdnBbMF19OiAke2l0ZW1SZXN1bHQubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZWVkKHJlY29yZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBgTWFwPHN0cmluZywgVFM+YCBpbnRvIGEgYFJlY29yZDxzdHJpbmcsIFREPmAgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYE1hcGAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyByZWNvcmQgaWYgY29udmVyc2lvbiBzdWNjZWVkcywgb3Ige0BsaW5rIFN1Y2Nlc3N9IHdpdGggYHVuZGVmaW5lZGAgaWZcclxuICogYHNyY2AgaXMgYHVuZGVmaW5lZGAuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsTWFwVG9SZWNvcmQ8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBNYXA8VEssIFRTPnx1bmRlZmluZWQsIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PFJlY29yZDxUSywgVEQ+fHVuZGVmaW5lZD4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKHVuZGVmaW5lZCkgOiBtYXBUb1JlY29yZChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYE1hcDxzdHJpbmcsIFRTPmAgaW50byBhIGBSZWNvcmQ8c3RyaW5nLCBURD5gXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYE1hcGAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyByZWNvcmQgKGVtcHR5IGlmIGBzcmNgIGlzIGB1bmRlZmluZWRgKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLlxyXG4gKiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbE1hcFRvUG9zc2libHlFbXB0eVJlY29yZDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IE1hcDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZCh7fSBhcyBSZWNvcmQ8VEssIFREPikgOiBtYXBUb1JlY29yZChzcmMsIGZhY3RvcnkpO1xyXG59XHJcbiJdfQ==
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgscUNBQWlEO0FBRWpEOzs7Ozs7O0dBT0c7QUFDSCx3REFBd0Q7QUFDeEQsU0FBZ0IsT0FBTyxDQUFtQixHQUF5QixFQUFFLElBQU87SUFDeEUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFGRCwwQkFFQztBQUdEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixJQUFJLENBQXNDLElBQU8sRUFBRSxPQUFZO0lBQzNFLE1BQU0sSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUU7UUFDdkIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6QjtLQUNKO0lBQ0QsT0FBTyxJQUFrQixDQUFDO0FBQzlCLENBQUM7QUFSRCxvQkFRQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFzQyxJQUFPLEVBQUUsT0FBWTtJQUMzRSxNQUFNLElBQUksR0FBd0IsRUFBRSxDQUFDO0lBQ3JDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFpQixDQUFDLENBQUMsRUFBRTtRQUM3RixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBZ0MsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1RDtJQUVELE9BQU8sSUFBa0IsQ0FBQztBQUM5QixDQUFDO0FBUEQs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LElBQUEsZ0JBQU8sRUFBQyxNQUFNLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBZEQsa0NBY0M7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQXFDLEdBQTBCLEVBQUUsT0FBc0M7SUFDdEksT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFGRCxrREFFQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixnQ0FBZ0MsQ0FBcUMsR0FBMEIsRUFBRSxPQUFzQztJQUNuSixPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsRUFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFGRCw0RUFFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXHJcbiAqIFNPRlRXQVJFLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IFJlc3VsdCwgZmFpbCwgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgdHlwZS1ndWFyZCBmdW5jdGlvbiB0byByZXBvcnQgd2hldGhlciBhIHNwZWNpZmllZCBrZXkgaXMgcHJlc2VudCBpblxyXG4gKiBhIHN1cHBsaWVkIG9iamVjdC5cclxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gYmUgdGVzdGVkLlxyXG4gKiBAcGFyYW0gaXRlbSAtIFRoZSBvYmplY3QgdG8gYmUgdGVzdGVkLlxyXG4gKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUga2V5IGlzIHByZXNlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG5leHBvcnQgZnVuY3Rpb24gaXNLZXlPZjxUIGV4dGVuZHMgb2JqZWN0PihrZXk6IHN0cmluZ3xudW1iZXJ8c3ltYm9sLCBpdGVtOiBUKToga2V5IGlzIGtleW9mIFQge1xyXG4gICAgcmV0dXJuIGl0ZW0uaGFzT3duUHJvcGVydHkoa2V5KTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBTaW1wbGUgaW1wbGljaXQgcGljayBmdW5jdGlvbiwgd2hpY2ggcGlja3MgYSBzZXQgb2YgcHJvcGVydGllcyBmcm9tIGEgc3VwcGxpZWRcclxuICogb2JqZWN0LiAgSWdub3JlcyBwaWNrZWQgcHJvcGVydGllcyB0aGF0IGRvIG5vdCBleGlzdCByZWdhcmRsZXNzIG9mIHR5cGUgc2lnbmF0dXJlLlxyXG4gKiBAcGFyYW0gZnJvbSAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCBrZXlzIGFyZSB0byBiZSBwaWNrZWQuXHJcbiAqIEBwYXJhbSBpbmNsdWRlIC0gVGhlIGtleXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gYmUgcGlja2VkIGZyb20gYGZyb21gLlxyXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIHByb3BlcnRpZXMgZnJvbSBgZnJvbWAsIHdoZXJlIHByZXNlbnQuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwaWNrPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPihmcm9tOiBULCBpbmNsdWRlOiBLW10pOiBQaWNrPFQsIEs+IHtcclxuICAgIGNvbnN0IHJ0cm46IFBhcnRpYWw8UGljazxULCBLPj4gPSB7fTtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIGluY2x1ZGUpIHtcclxuICAgICAgICBpZiAoa2V5IGluIGZyb20pIHtcclxuICAgICAgICAgICAgcnRybltrZXldID0gZnJvbVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBydHJuIGFzIFBpY2s8VCwgSz47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaW1wbGUgaW1wbGljaXQgb21pdCBmdW5jdGlvbiwgd2hpY2ggcGlja3MgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIGZyb20gYSBzdXBwbGllZFxyXG4gKiBvYmplY3QgZXhjZXB0IHRob3NlIHNwZWNpZmllZCBmb3IgZXhjbHVzaW9uLlxyXG4gKiBAcGFyYW0gZnJvbSAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCBrZXlzIGFyZSB0byBiZSBwaWNrZWQuXHJcbiAqIEBwYXJhbSBleGNsdWRlIC0gVGhlIGtleXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgcmV0dXJuZWQgb2JqZWN0LlxyXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3QgY29udGFpbmluZyBhbGwgb2YgdGhlIHByb3BlcnRpZXMgZnJvbSBgZnJvbWAgdGhhdCB3ZXJlIG5vdFxyXG4gKiBleHBsaWNpdGx5IGV4Y2x1ZGVkLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb21pdDxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVD4oZnJvbTogVCwgZXhjbHVkZTogS1tdKTogT21pdDxULCBLPiB7XHJcbiAgICBjb25zdCBydHJuOiBQYXJ0aWFsPE9taXQ8VCwgSz4+ID0ge307XHJcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIE9iamVjdC5lbnRyaWVzKGZyb20pLmZpbHRlcigoZSkgPT4gIWV4Y2x1ZGUuaW5jbHVkZXMoZVswXSBhcyBrZXlvZiBUIGFzIEspKSkge1xyXG4gICAgICAgIHJ0cm5bZW50cnlbMF0gYXMgdW5rbm93biBhcyBrZXlvZiBPbWl0PFQsIEs+XSA9IGVudHJ5WzFdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBydHJuIGFzIE9taXQ8VCwgSz47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHNwZWNpZmllZCBieSBrZXkgZnJvbSBhbiBhcmJpdHJhcnkgb2JqZWN0LFxyXG4gKiBvciBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LlxyXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBzcGVjaWZ5aW5nIHRoZSBwcm9wZXJ0eSB0byBiZSByZXRyaWV2ZWQuXHJcbiAqIEBwYXJhbSBpdGVtIC0gVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyB0byBiZSByZXRyaWV2ZWQuXHJcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBBbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBwcm9wZXJ0eVxyXG4gKiBpcyBub3QgcHJlc2VudCAoZGVmYXVsdCBgdW5kZWZpbmVkYCkuXHJcbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIHByb3BlcnR5LCBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGVcclxuICogcmVxdWVzdGVkIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVPZlByb3BlcnR5T3JEZWZhdWx0PFQgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gICAga2V5OiBzdHJpbmd8bnVtYmVyfHN5bWJvbCxcclxuICAgIGl0ZW06IFQsXHJcbiAgICBkZWZhdWx0VmFsdWU/OiB1bmtub3duXHJcbik6IHVua25vd24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGlzS2V5T2Yoa2V5LCBpdGVtKSA/IGl0ZW1ba2V5XSA6IGRlZmF1bHRWYWx1ZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIHR5cGUgb2YgYSBwcm9wZXJ0eSBzcGVjaWZpZWQgYnkga2V5IGZyb20gYW4gYXJiaXRyYXJ5IG9iamVjdC5cclxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgc3BlY2lmeWluZyB0aGUgcHJvcGVydHkgdG8gYmUgdGVzdGVkLlxyXG4gKiBAcGFyYW0gaXRlbSAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgaXMgdG8gYmUgdGVzdGVkLlxyXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgcmVxdWVzdGVkIHByb3BlcnR5LCBvciBgdW5kZWZpbmVkYCBpZiB0aGVcclxuICogcHJvcGVydHkgZG9lcyBub3QgZXhpc3QuXHJcbiAqIEBleGFtcGxlXHJcbiAqIFJldHVybnMgYCd1bmRlZmluZWQnYCAoYSBzdHJpbmcpIGlmIHRoZSBwcm9wZXJ0eSBleGlzdHMgYnV0IGhhcyB0aGUgdmFsdWVcclxuICogdW5kZWZpbmVkIGJ1dCBgdW5kZWZpbmVkYCAodGhlIGxpdGVyYWwpIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdC5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVPZlByb3BlcnR5PFQgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gICAga2V5OiBzdHJpbmd8bnVtYmVyfHN5bWJvbCxcclxuICAgIGl0ZW06IFQpOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2JpZ2ludCcgfCAnYm9vbGVhbicgfCAnc3ltYm9sJyB8ICd1bmRlZmluZWQnIHwgJ3VuZGVmaW5lZCcgfCAnb2JqZWN0JyB8ICdmdW5jdGlvbicgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGlzS2V5T2Yoa2V5LCBpdGVtKSA/IHR5cGVvZiBpdGVtW2tleV0gOiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUeXBlIGZvciBmYWN0b3J5IG1ldGhvZHMgd2hpY2ggY29udmVydCBhIGtleS12YWx1ZSBwYWlyIHRvIGEgbmV3IHVuaXF1ZSB2YWx1ZS5cclxuICogQHB1YmxpY1xyXG4gKi9cclxudHlwZSBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IChrZXk6IFRLLCB0aGluZzogVFMpID0+IFJlc3VsdDxURD47XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYSBgUmVjb3JkPFRLLCBUUz5gIGludG8gYSBgTWFwPFRLLCBURD5gLlxyXG4gKiBAcGFyYW0gc3JjIC0gVGhlIGBSZWNvcmRgIHRvIGJlIGNvbnZlcnRlZC5cclxuICogQHBhcmFtIGZhY3RvcnkgLSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzLlxyXG4gKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcmVzdWx0aW5nIG1hcCBvbiBzdWNjZXNzLCBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhXHJcbiAqIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkVG9NYXA8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBSZWNvcmQ8VEssIFRTPiwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD4+IHtcclxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8VEssIFREPigpO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3JjKSB7XHJcbiAgICAgICAgaWYgKHNyY1trZXldICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbVJlc3VsdCA9IGZhY3Rvcnkoa2V5LCBzcmNba2V5XSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtUmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgICAgICBtYXAuc2V0KGtleSwgaXRlbVJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrZXl9OiAke2l0ZW1SZXN1bHQubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZWVkKG1hcCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBgUmVjb3JkPFRLLCBUUz5gIGludG8gYSBgTWFwPFRLLCBURD5gLCBvciBgdW5kZWZpbmVkYC5cclxuICogQHBhcmFtIHNyYyAtIFRoZSBgUmVjb3JkYCB0byBiZSBjb252ZXJ0ZWQsIG9yIHVuZGVmaW5lZC5cclxuICogQHBhcmFtIGZhY3RvcnkgLSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzLlxyXG4gKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcmVzdWx0aW5nIG1hcCBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLCBvciB7QGxpbmsgU3VjY2Vzc30gd2l0aCBgdW5kZWZpbmVkYFxyXG4gKiBpZiBgc3JjYCBpcyBgdW5kZWZpbmVkYC4gUmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxSZWNvcmRUb01hcDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IFJlY29yZDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD58dW5kZWZpbmVkPiB7XHJcbiAgICByZXR1cm4gKHNyYyA9PT0gdW5kZWZpbmVkKSA/IHN1Y2NlZWQodW5kZWZpbmVkKSA6IHJlY29yZFRvTWFwKHNyYywgZmFjdG9yeSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBgUmVjb3JkPFRLLCBUUz5gIGludG8gYSBgTWFwPFRLLCBURD5gXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYFJlY29yZGAgdG8gYmUgY29udmVydGVkLCBvciBgdW5kZWZpbmVkYC5cclxuICogQHBhcmFtIGZhY3RvcnkgLSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzLlxyXG4gKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcmVzdWx0aW5nIG1hcCAoZW1wdHkgaWYgYHNyY2AgaXMgYHVuZGVmaW5lZGApIGlmIGNvbnZlcnNpb24gc3VjY2VlZHMuXHJcbiAqIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsUmVjb3JkVG9Qb3NzaWJseUVtcHR5TWFwPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogUmVjb3JkPFRLLCBUUz58dW5kZWZpbmVkLCBmYWN0b3J5OiBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLPik6IFJlc3VsdDxNYXA8VEssIFREPj4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKG5ldyBNYXA8VEssIFREPigpKSA6IHJlY29yZFRvTWFwKHNyYywgZmFjdG9yeSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhIGBNYXA8VEssIFRTPmAgaW50byBhIGBSZWNvcmQ8VEssIFREPmAuXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYE1hcGAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZC5cclxuICogQHBhcmFtIGZhY3RvcnkgLSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzLlxyXG4gKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcmVzdWx0aW5nIGBSZWNvcmQ8VEssIFREPmAgaWYgY29udmVyc2lvbiBzdWNjZWVkcywgb3JcclxuICoge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1JlY29yZDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IE1hcDxUSywgVFM+LCBmYWN0b3J5OiBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLPik6IFJlc3VsdDxSZWNvcmQ8VEssIFREPj4ge1xyXG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8VEssIFREPiA9IHt9IGFzIFJlY29yZDxUSywgVEQ+O1xyXG4gICAgZm9yIChjb25zdCBrdnAgb2Ygc3JjKSB7XHJcbiAgICAgICAgaWYgKGt2cFsxXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1SZXN1bHQgPSBmYWN0b3J5KGt2cFswXSwga3ZwWzFdKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1SZXN1bHQuaXNTdWNjZXNzKCkpIHtcclxuICAgICAgICAgICAgICAgIHJlY29yZFtrdnBbMF1dID0gaXRlbVJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGAke2t2cFswXX06ICR7aXRlbVJlc3VsdC5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1Y2NlZWQocmVjb3JkKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBmYWN0b3J5IG1ldGhvZCB0byBjb252ZXJ0IGFuIG9wdGlvbmFsIGBNYXA8c3RyaW5nLCBUUz5gIGludG8gYSBgUmVjb3JkPHN0cmluZywgVEQ+YCBvciBgdW5kZWZpbmVkYC5cclxuICogQHBhcmFtIHNyYyAtIFRoZSBgTWFwYCBvYmplY3QgdG8gYmUgY29udmVydGVkLCBvciBgdW5kZWZpbmVkYC5cclxuICogQHBhcmFtIGZhY3RvcnkgLSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzLlxyXG4gKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcmVzdWx0aW5nIHJlY29yZCBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLCBvciB7QGxpbmsgU3VjY2Vzc30gd2l0aCBgdW5kZWZpbmVkYCBpZlxyXG4gKiBgc3JjYCBpcyBgdW5kZWZpbmVkYC4gUmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxNYXBUb1JlY29yZDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IE1hcDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD58dW5kZWZpbmVkPiB7XHJcbiAgICByZXR1cm4gKHNyYyA9PT0gdW5kZWZpbmVkKSA/IHN1Y2NlZWQodW5kZWZpbmVkKSA6IG1hcFRvUmVjb3JkKHNyYywgZmFjdG9yeSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBgTWFwPHN0cmluZywgVFM+YCBpbnRvIGEgYFJlY29yZDxzdHJpbmcsIFREPmBcclxuICogQHBhcmFtIHNyYyAtIFRoZSBgTWFwYCBvYmplY3QgdG8gYmUgY29udmVydGVkLCBvciBgdW5kZWZpbmVkYC5cclxuICogQHBhcmFtIGZhY3RvcnkgLSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzLlxyXG4gKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcmVzdWx0aW5nIHJlY29yZCAoZW1wdHkgaWYgYHNyY2AgaXMgYHVuZGVmaW5lZGApIGlmIGNvbnZlcnNpb24gc3VjY2VlZHMuXHJcbiAqIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsTWFwVG9Qb3NzaWJseUVtcHR5UmVjb3JkPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogTWFwPFRLLCBUUz58dW5kZWZpbmVkLCBmYWN0b3J5OiBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLPik6IFJlc3VsdDxSZWNvcmQ8VEssIFREPj4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKHt9IGFzIFJlY29yZDxUSywgVEQ+KSA6IG1hcFRvUmVjb3JkKHNyYywgZmFjdG9yeSk7XHJcbn1cclxuIl19