footprintjs 9.44.0 → 9.44.2
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/CLAUDE.md +6 -5
- package/dist/esm/lib/capture/freeze.d.ts +51 -7
- package/dist/esm/lib/capture/freeze.js +289 -24
- package/dist/esm/lib/capture/valueKinds.d.ts +57 -0
- package/dist/esm/lib/capture/valueKinds.js +142 -0
- package/dist/esm/lib/memory/EventLog.d.ts +24 -6
- package/dist/esm/lib/memory/EventLog.js +30 -10
- package/dist/esm/lib/memory/admission.js +4 -3
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/equality.d.ts +55 -19
- package/dist/esm/lib/memory/equality.js +154 -51
- package/dist/esm/lib/memory/logModel.js +11 -4
- package/dist/esm/lib/memory/redaction.d.ts +21 -0
- package/dist/esm/lib/memory/redaction.js +64 -7
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -1
- package/dist/esm/lib/runner/ExecutionRuntime.js +15 -10
- package/dist/esm/lib/runner/snapshot.js +17 -3
- package/dist/esm/lib/slice/elementProvenance.js +2 -2
- package/dist/esm/lib/time-travel/chain.js +28 -26
- package/dist/lib/capture/freeze.js +292 -25
- package/dist/lib/capture/valueKinds.js +146 -0
- package/dist/lib/memory/EventLog.js +29 -9
- package/dist/lib/memory/admission.js +4 -3
- package/dist/lib/memory/borrowedMutation.js +2 -2
- package/dist/lib/memory/equality.js +154 -51
- package/dist/lib/memory/logModel.js +11 -4
- package/dist/lib/memory/redaction.js +66 -8
- package/dist/lib/runner/ExecutionRuntime.js +14 -9
- package/dist/lib/runner/snapshot.js +16 -2
- package/dist/lib/slice/elementProvenance.js +2 -2
- package/dist/lib/time-travel/chain.js +27 -25
- package/dist/types/lib/capture/freeze.d.ts +51 -7
- package/dist/types/lib/capture/valueKinds.d.ts +57 -0
- package/dist/types/lib/memory/EventLog.d.ts +24 -6
- package/dist/types/lib/memory/equality.d.ts +55 -19
- package/dist/types/lib/memory/redaction.d.ts +21 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -1
- package/package.json +2 -1
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
* and spelled nowhere else in `src/` — this rule asks for the scope one by name.
|
|
50
50
|
*/
|
|
51
51
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
-
exports.redactPatch = exports.scrubPatch = exports.MapperTaint = exports.needsPath = exports.useWalkLimit = exports.WALK_LIMIT = exports.RedactionRule = exports.CLEAR = void 0;
|
|
52
|
+
exports.redactPatch = exports.scrubPatch = exports.MapperTaint = exports.classBodies = exports.needsPath = exports.useWalkLimit = exports.WALK_LIMIT = exports.RedactionRule = exports.CLEAR = void 0;
|
|
53
53
|
const devMode_js_1 = require("../devMode.js");
|
|
54
54
|
const errorInfo_js_1 = require("../errors/errorInfo.js");
|
|
55
55
|
const pathOps_js_1 = require("./pathOps.js");
|
|
@@ -64,6 +64,17 @@ exports.CLEAR = Object.freeze({ kind: 'clear' });
|
|
|
64
64
|
* realistic scope-state key name.
|
|
65
65
|
*/
|
|
66
66
|
const MAX_PATTERN_KEY_LEN = 256;
|
|
67
|
+
/**
|
|
68
|
+
* The fields a policy declares under `key` — only when `fields` OWNS `key`.
|
|
69
|
+
* The key is a name from data (a state key, a nested key of a record handed
|
|
70
|
+
* out whole), and a plain-object lookup reads the prototype chain:
|
|
71
|
+
* `fields['constructor']` is `Object`, `fields['__proto__']` is
|
|
72
|
+
* `Object.prototype`. The walk then iterated them, so any `fields` policy
|
|
73
|
+
* failed the run with a TypeError on data holding such a key.
|
|
74
|
+
*/
|
|
75
|
+
function declaredFields(fields, key) {
|
|
76
|
+
return fields !== undefined && Object.prototype.hasOwnProperty.call(fields, key) ? fields[key] : undefined;
|
|
77
|
+
}
|
|
67
78
|
/** Policy patterns are predicates, not cursors over successive keys/events. */
|
|
68
79
|
function matchesPattern(value, patterns) {
|
|
69
80
|
if (!patterns)
|
|
@@ -428,7 +439,7 @@ class RedactionRule {
|
|
|
428
439
|
}
|
|
429
440
|
/** The secret fields of a top key: the policy's, plus any a mapper handed it ({@link MapperTaint}). */
|
|
430
441
|
fieldsOf(key) {
|
|
431
|
-
const declared = this.policy?.fields
|
|
442
|
+
const declared = declaredFields(this.policy?.fields, key);
|
|
432
443
|
const inherited = this.inherited?.get(key);
|
|
433
444
|
if (inherited === undefined)
|
|
434
445
|
return declared;
|
|
@@ -691,17 +702,20 @@ class RedactionRule {
|
|
|
691
702
|
return servedByPath(copy, undefined, targetsOf(paths), { rootDecided: false, memo: new WeakMap(), budget: walkLimit }, placeholder);
|
|
692
703
|
}
|
|
693
704
|
report() {
|
|
694
|
-
|
|
705
|
+
// Keyed by a Map, then made own data keys by `fromEntries`: a key a mapper
|
|
706
|
+
// wrote is a name from data, and on a plain object `toString` would read
|
|
707
|
+
// the inherited method and `__proto__` would call the prototype setter.
|
|
708
|
+
const fieldRedactions = new Map();
|
|
695
709
|
for (const [key, fields] of Object.entries(this.policy?.fields ?? {})) {
|
|
696
|
-
fieldRedactions
|
|
710
|
+
fieldRedactions.set(key, [...fields]);
|
|
697
711
|
}
|
|
698
712
|
// Fields a mapper handed to a new key are scrubbed under that key too.
|
|
699
713
|
for (const [key, fields] of this.inherited ?? []) {
|
|
700
|
-
fieldRedactions
|
|
714
|
+
fieldRedactions.set(key, [...new Set([...(fieldRedactions.get(key) ?? []), ...fields])]);
|
|
701
715
|
}
|
|
702
716
|
return {
|
|
703
717
|
redactedKeys: [...this.marked],
|
|
704
|
-
fieldRedactions,
|
|
718
|
+
fieldRedactions: Object.fromEntries(fieldRedactions),
|
|
705
719
|
patterns: (this.policy?.patterns ?? []).map((p) => p.source),
|
|
706
720
|
};
|
|
707
721
|
}
|
|
@@ -737,12 +751,15 @@ exports.useWalkLimit = useWalkLimit;
|
|
|
737
751
|
* inside one segment — and an ancestor whose NAME matches is masked whole
|
|
738
752
|
* before the walk goes below it, so the name decides. Conservative: `true`
|
|
739
753
|
* whenever in doubt.
|
|
754
|
+
*
|
|
755
|
+
* Linear in the length of `pattern.source`: every scan here is one forward
|
|
756
|
+
* pass ({@link classBodies}) or a regex that does constant work per position.
|
|
740
757
|
*/
|
|
741
758
|
function needsPath(pattern) {
|
|
742
759
|
const source = pattern.source;
|
|
743
760
|
if (/\.|\\[WSDBpPuxc0-9]|\[\^|\(\?[=!<]/.test(source))
|
|
744
761
|
return true;
|
|
745
|
-
for (const
|
|
762
|
+
for (const body of classBodies(source)) {
|
|
746
763
|
for (const [, low, high] of body.matchAll(/(\\?[\s\S])-(\\?[\s\S])/g)) {
|
|
747
764
|
if (low.length > 1 || high.length > 1 || (low <= '.' && high >= '.'))
|
|
748
765
|
return true;
|
|
@@ -751,6 +768,47 @@ function needsPath(pattern) {
|
|
|
751
768
|
return false;
|
|
752
769
|
}
|
|
753
770
|
exports.needsPath = needsPath;
|
|
771
|
+
/**
|
|
772
|
+
* The body of each character class in `source`, left to right: the text
|
|
773
|
+
* between a `[` and the first `]` after it that no `\` escapes (a `\` takes
|
|
774
|
+
* the character after it along). ONE forward pass.
|
|
775
|
+
*
|
|
776
|
+
* It replaces `source.matchAll(/\[((?:\\[\s\S]|[^\]\\])*)\]/g)` and gives the
|
|
777
|
+
* same bodies for every string (pinned against that regex as the control,
|
|
778
|
+
* test/lib/memory/security/needs-path-linear.security.test.ts). The regex was
|
|
779
|
+
* quadratic: after a `[` that never closed it retried at every later `[`,
|
|
780
|
+
* each retry rescanning to the end — `\[` repeated 32,000 times took 0.7 s,
|
|
781
|
+
* and `setPolicy` runs once per stage's scope (CodeQL js/polynomial-redos).
|
|
782
|
+
* The pass stops at the first `[` that never closes instead: a later `[`
|
|
783
|
+
* starts its body where the failed scan was also between two tokens, so it
|
|
784
|
+
* reads the same tail the same way and closes nowhere either.
|
|
785
|
+
*
|
|
786
|
+
* @internal Exported for that test only — not on any public door.
|
|
787
|
+
*/
|
|
788
|
+
function classBodies(source) {
|
|
789
|
+
const bodies = [];
|
|
790
|
+
let open = source.indexOf('[');
|
|
791
|
+
while (open !== -1) {
|
|
792
|
+
const close = closingBracket(source, open + 1);
|
|
793
|
+
if (close === -1)
|
|
794
|
+
break;
|
|
795
|
+
bodies.push(source.slice(open + 1, close));
|
|
796
|
+
open = source.indexOf('[', close + 1);
|
|
797
|
+
}
|
|
798
|
+
return bodies;
|
|
799
|
+
}
|
|
800
|
+
exports.classBodies = classBodies;
|
|
801
|
+
/** The index of the first `]` at or after `from` that no `\` escapes, else -1 (a trailing lone `\` escapes nothing and closes nothing). */
|
|
802
|
+
function closingBracket(source, from) {
|
|
803
|
+
let at = from;
|
|
804
|
+
while (at < source.length) {
|
|
805
|
+
const char = source[at];
|
|
806
|
+
if (char === ']')
|
|
807
|
+
return at;
|
|
808
|
+
at += char === '\\' ? 2 : 1;
|
|
809
|
+
}
|
|
810
|
+
return -1;
|
|
811
|
+
}
|
|
754
812
|
/** `servedLeaf`'s answer for a value it leaves as it is. */
|
|
755
813
|
const KEEP = Symbol('kept as it is');
|
|
756
814
|
/** Each field path as one literal key and, when dotted, as its segments. */
|
|
@@ -1284,4 +1342,4 @@ function redactPatch(patch, redactedSet) {
|
|
|
1284
1342
|
return scrubPatch(structuredClone(patch), redactedSet);
|
|
1285
1343
|
}
|
|
1286
1344
|
exports.redactPatch = redactPatch;
|
|
1287
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0RHOzs7QUFFSCw4Q0FBMEM7QUFFMUMseURBQXNFO0FBRXRFLDZDQUFzRjtBQUN0Rix5Q0FBbUM7QUFDbkMsdURBQXVFO0FBNEUxRCxRQUFBLEtBQUssR0FBcUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQVcsQ0FBQyxDQUFDO0FBRWpGOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBRWhDLCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBdUM7SUFDNUUsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDNUQsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFhLGFBQWE7SUFDaEIsTUFBTSxDQUE4QjtJQUNwQyxjQUFjLENBQTRCO0lBQ2xEO3dFQUNvRTtJQUM1RCxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzdCLDBHQUEwRztJQUNsRyxZQUFZLEdBQXNCLEVBQUUsQ0FBQztJQUNyQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ2hDOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFj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QVEsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQU0sQ0FBQyxDQUFDO1FBQzVCLElBQUEsc0JBQVMsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGlDQUFlLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFmRCxnQ0FlQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUFrQixFQUFFLFdBQXdCO0lBQ3RFLE9BQU8sVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRkQsa0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlZGFjdGlvbi50cyDigJQgVGhlIE9ORSBvd25lciBvZiB3aGF0IGEgcmVkYWN0aW9uIHBvbGljeSBzYXlzIGFib3V0IGEgdmFsdWUuXG4gKlxuICogVEhFIExBVyAob3duZXIgcnVsaW5nIChhKSkuIEEgcmVkYWN0aW9uIHBvbGljeSBjb3ZlcnMgRVZFUllUSElORyB0aGUgbGlicmFyeVxuICogcmV0YWlucyBvciBzZXJ2ZXMg4oCUIHRoZSBjb21taXQgbG9nIChib3RoIGVuY29kaW5ncyksIHRoZSByZWRhY3RlZCBtaXJyb3IsXG4gKiB0cmFja2VkIHJlYWRzL3dyaXRlcywgZXZlcnkgcmVjb3JkZXIgZXZlbnQgKGlubGluZSBhbmQgZGVmZXJyZWQpIGFuZCB0aGVcbiAqIHJlY29yZGVyIHJvd3MgYnVpbHQgZnJvbSB0aGVtLCB0aGUgbmFycmF0aXZlLCBzbmFwc2hvdHMsIGRpYWdub3N0aWNzLCBwYXVzZVxuICogcGF5bG9hZHMsIGJvdW5kYXJ5IHJlY29yZHMgYW5kIGxvZyBsaW5lcyDigJQgYW5kIE5FVkVSIHRoZSBsaXZlIGhlYXAgb3IgdGhlXG4gKiByZXN1bWUgY2hlY2twb2ludC4gVHdvIHZhbHVlcyBhcmUgdGhlIGNhbGxlcidzIG93biBhbmQgc3RheSByZWFsOiB0aGVcbiAqIGBydW4oKWAgcmVqZWN0aW9uICh0aGUgdGhyb3duIHZhbHVlIGl0c2VsZikgYW5kIHRoZSBsaXZlIGZvcmsgcmVzdWx0LlxuICpcbiAqIEEgcG9saWN5IHNlbGVjdHMgYnkgTkFNRSDigJQgYSBrZXksIGEgZG90dGVkIHBhdGgsIGEgZmllbGQg4oCUIG5ldmVyIGJ5XG4gKiBzY2FubmluZyBjb250ZW50LiBXaGF0IGNhcnJpZXMgYSBuYW1lOlxuICogICAtIHN0YXRlIOKAlCBpdHMgdXNlci1sZXZlbCBwYXRoICh7QGxpbmsgUmVkYWN0aW9uUnVsZS52ZXJkaWN0fSk7XG4gKiAgIC0gYSByZWNvcmQgaGFuZGVkIG91dCB3aG9sZSDigJQgcm9vdCBpbnB1dC9vdXRwdXQsIGEgc3ViZmxvdydzIG1hcHBlZCBzZWVkXG4gKiAgICAgYW5kIGV4aXQgc3RhdGUsIGEgcGF1c2UgcGF5bG9hZCwgYSB0aHJvd24gdmFsdWUg4oCUIGl0cyBrZXlzIGF0IGV2ZXJ5XG4gKiAgICAgZGVwdGggKHtAbGluayBSZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5fSk7XG4gKiAgIC0gYSBkaWFnbm9zdGljIGVudHJ5IOKAlCBgJGRlYnVnYC9gJGVycm9yYC9gJG1ldHJpY2AvYCRldmFsYC9gJGxvZ2AgYW5kIHRoZVxuICogICAgIGVuZ2luZSdzIG93biDigJQgdGhlIHJlY29yZCBgeyBbbmFtZV06IHZhbHVlIH1gOiBpdHMgbmFtZSBJUyBhIHN0YXRlIGtleVxuICogICAgICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5yZXRhaW5EaWFnbm9zdGljfSkuIGBwb2xpY3kuZGlhZ25vc3RpY3NgIGFkZHNcbiAqICAgICBkaWFnbm9zdGljLW9ubHkgc2VsZWN0b3JzIG9uIHRvcDsgZmxvdy1tZXNzYWdlIHRleHQgaGFzIG5vIG5hbWUgb2YgaXRzXG4gKiAgICAgb3duLCBzbyBvbmx5IHRoZXkgc2VsZWN0IGl0O1xuICogICAtIGEgc3ViZmxvdyBtYXBwZXIncyBjb3B5IOKAlCBhIGtleSBhbiBgaW5wdXRNYXBwZXJgL2BvdXRwdXRNYXBwZXJgIChvciBhXG4gKiAgICAgYHBhcmFsbGVsRm9yRWFjaGAgaXRlbXMgc2VsZWN0b3IpIHdyb3RlIGluaGVyaXRzIHRoZSByZWRhY3Rpb24gb2YgdGhlXG4gKiAgICAgc2VsZWN0ZWQgdmFsdWUgaXQgY29waWVkICh7QGxpbmsgTWFwcGVyVGFpbnR9KS5cbiAqIEEgbWFyayBpcyBhIE5BTUUsIHJ1bi13aWRlLCB1bnRpbCB0aGUga2V5IGlzIGRlbGV0ZWQ7IGEgcGF1c2UgY2FycmllcyB0aGVcbiAqIG1hcmtzIOKAlCBuYW1lcyBvbmx5IOKAlCB0byB0aGUgcmVzdW1lZCBydW4gKHtAbGluayBSZWRhY3Rpb25SdWxlLm1hcmtzRm9yQ2hlY2twb2ludH0pLlxuICogQSB2YWx1ZSB3aXRoIG5vIG5hbWUg4oCUIGEgc2NhbGFyIHJvb3QgaW5wdXQvb3V0cHV0IG9yIHBhdXNlIHBheWxvYWQsIGZyZWVcbiAqIGVycm9yIHRleHQg4oCUIGlzIHNlbGVjdGVkIGJ5IG5vdGhpbmcuIGBlbWl0UGF0dGVybnNgIGlzIHRoZSBvbmUgc2VwYXJhdGVcbiAqIHNjcnViOiBhIGAkZW1pdGAgcGF5bG9hZCBpcyBzZWxlY3RlZCBieSBpdHMgZXZlbnQgbmFtZS5cbiAqXG4gKiBIT1cgT05FIE9XTkVSIEtFRVBTIElULiBFdmVyeSBzdGFnZWQgd3JpdGUgYW5kIGV2ZXJ5IHRyYWNrZWQgcmVhZCBwYXNzZXNcbiAqIHRocm91Z2ggYFN0YWdlQ29udGV4dGAsIHNvIGBTdGFnZUNvbnRleHRgIGFza3MgVEhJUyBydWxlIOKAlCBub3QgdGhlIGNhbGxlciDigJRcbiAqIHdoYXQgdGhlIHBvbGljeSBzYXlzIGFib3V0IHRoZSBwYXRoIGl0IGlzIGFib3V0IHRvIHJldGFpbi4gQSBgU2NvcGVGYWNhZGVgXG4gKiB3cml0ZSwgYSBzdWJmbG93IGBpbnB1dE1hcHBlcmAgc2VlZCwgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjayBhbmQgYVxuICogcmVzdW1lIHJlLXNlZWQgYXJlIHRoZW4gYWxsIHRoZSBzYW1lIGNhc2U6IHRoZSBmdW5uZWwgZGVjaWRlcywgdGhlIGNhbGxlclxuICogY2Fubm90IGZvcmdldCB0by4gVGhlIGZhY2FkZSB1c2VzIHRoZSBzYW1lIHJ1bGUgZm9yIHRoZSB2YWx1ZXMgaXQgaGFuZHMgdG9cbiAqIHJlY29yZGVyczsgYFN1YmZsb3dFeGVjdXRvcmAgdXNlcyBpdCBmb3IgdGhlIG5hcnJhdGVkIHNlZWQgYW5kXG4gKiBgRmxvd2NoYXJ0VHJhdmVyc2VyLmV4ZWN1dGVgIGZvciByb290IGlucHV0L291dHB1dCBiZWZvcmUgZGlzcGF0Y2guIEJlZm9yZSA5LjE5LjBcbiAqIHRoZSBmYWNhZGUgaGVsZCB0aGUgdmVyZGljdCBhbG9uZSwgYW5kIGV2ZXJ5IHBhdGggdGhhdCB3cm90ZSBvciByZWFkIHBhc3RcbiAqIHRoZSBmYWNhZGUg4oCUIGZpdmUgb2YgdGhlbSDigJQgcmV0YWluZWQgcGxhaW50ZXh0IHVuZGVyIGEgcG9saWN5LlxuICpcbiAqIFRXTyBQTEFDRUhPTERFUlMsIEJPVEggSElTVE9SSUNBTDogdGhlIGNvbW1pdCBsb2cgYW5kIHRoZSBtaXJyb3IgY2FycnlcbiAqIGAnUkVEQUNURUQnYCAoYHNjcnViUGF0Y2hgIC8gYHJlZGFjdFBhdGNoYCwgYmVsb3cg4oCUIHRoZSBzdHJpbmdzIHVuY2hhbmdlZCBzaW5jZSA0LngpOyBldmVyeSBzY29wZS10aWVyIHZpZXcg4oCUXG4gKiBzY29wZSByZWNvcmRlciBldmVudHMsIGBzdGFnZVJlYWRzYC9gc3RhZ2VXcml0ZXNgLCBuYXJyYXRpdmUg4oCUIGNhcnJpZXNcbiAqIGAnW1JFREFDVEVEXSdgLiBOZWl0aGVyIHN0cmluZyBjaGFuZ2VkIGluIDkuMTkuMC4gVGhlIHN0cmluZ3MgdGhlbXNlbHZlcyBhcmVcbiAqIG93bmVkIGJ5IGBtZW1vcnkvcGxhY2Vob2xkZXJzLnRzYCAoYExPR19QTEFDRUhPTERFUmAgLyBgU0NPUEVfUExBQ0VIT0xERVJgKVxuICogYW5kIHNwZWxsZWQgbm93aGVyZSBlbHNlIGluIGBzcmMvYCDigJQgdGhpcyBydWxlIGFza3MgZm9yIHRoZSBzY29wZSBvbmUgYnkgbmFtZS5cbiAqL1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25NYXJrcyB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IG5hdGl2ZUdldCwgbmF0aXZlSGFzLCBuYXRpdmVTZXQsIG93bmVkUm9vdE9mLCBvd25TcGluZSB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBERUxJTSB9IGZyb20gJy4vcGF0aHMuanMnO1xuaW1wb3J0IHsgTE9HX1BMQUNFSE9MREVSLCBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4vcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBEZWNsYXJhdGl2ZSBrZXkvcGF0aCByZWRhY3Rpb24gZm9yIHJlY29yZGVkIHN0YXRlIGFuZCBib3VuZGFyeSByZWNvcmRzLlxuICpcbiAqIENvbmZpZ3VyZSBhdCB0aGUgc2NvcGUgY2xhc3MgbGV2ZWwgKHN0YXRpYyBwcm9wZXJ0eSkgb3IgcGFzcyB0b1xuICogRmxvd0NoYXJ0RXhlY3V0b3IgdG8gYXBwbHkgYWNyb3NzIGFsbCBzdGFnZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkYWN0aW9uUG9saWN5IHtcbiAgLyoqIEV4YWN0IGtleSBuYW1lcyB0byBhbHdheXMgcmVkYWN0IChlLmcuIFsnc3NuJywgJ2NyZWRpdENhcmQnXSkuICovXG4gIGtleXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJlZ2V4IHBhdHRlcm5zIOKAlCBhbnkga2V5IG1hdGNoaW5nIGEgcGF0dGVybiBpcyBhdXRvLXJlZGFjdGVkLlxuICAgKlxuICAgKiBQYXR0ZXJuIG1hdGNoaW5nIGlzIHNraXBwZWQgZm9yIGtleXMgdGhhdCBleGNlZWQgYW4gaW50ZXJuYWwgbGVuZ3RoIGNhcFxuICAgKiAoZGVzaWduZWQgdG8gcHJldmVudCBSZURvUyBvbiBwYXRob2xvZ2ljYWwgcGF0dGVybnMpLiBGb3IgdmVyeSBsb25nIGtleVxuICAgKiBuYW1lcywgdXNlIGBrZXlzYCAoZXhhY3QgbWF0Y2gpIGluc3RlYWQgb2YgcGF0dGVybnMuXG4gICAqL1xuICBwYXR0ZXJucz86IFJlZ0V4cFtdO1xuICAvKiogRmllbGQtbGV2ZWwgcmVkYWN0aW9uIHdpdGhpbiBvYmplY3RzIOKAlCBrZXkg4oaSIGFycmF5IG9mIGZpZWxkcyB0byBzY3J1Yi5cbiAgICogIFN1cHBvcnRzIGRvdC1ub3RhdGlvbiBmb3IgbmVzdGVkIHBhdGhzIChlLmcuICdhZGRyZXNzLnppcCcpLiAqL1xuICBmaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIC8qKlxuICAgKiBEaWFnbm9zdGljLW9ubHkgc2VsZWN0b3JzLCBJTiBBRERJVElPTiB0byB0aGUgc3RhdGUgc2VsZWN0b3JzIGFib3ZlICh3aGljaFxuICAgKiBhbHJlYWR5IGNvdmVyIGEgZGlhZ25vc3RpYyBlbnRyeSBieSBpdHMgbmFtZTogYGtleXM6IFsndG9rZW4nXWAgbWFza3NcbiAgICogYCRkZWJ1ZygndG9rZW4nLCDigKYpYCkuIFVzZSB0aGVzZSBmb3IgbmFtZXMgeW91IG1hc2sgaW4gZGlhZ25vc3RpY3MgYnV0XG4gICAqIG5vdCBpbiBzdGF0ZS4gUGF0aHMgc3RhcnQgd2l0aCBsb2dzL2Vycm9ycy9tZXRyaWNzL2V2YWxzLCBlLmcuXG4gICAqIGBsb2dzLnByb2ZpbGUudG9rZW5gLiBPbmx5IGZsb3dNZXNzYWdlcy5kZXNjcmlwdGlvbiBhbmRcbiAgICogZmxvd01lc3NhZ2VzLnJhdGlvbmFsZSBhcmUgcGF5bG9hZHM7IGZsb3cgdG9wb2xvZ3kvdGltaW5nIG1ldGFkYXRhIHN0YXlzXG4gICAqIGludGFjdC4gQXBwbGllZCBiZWZvcmUgcmV0ZW50aW9uLCBub3QgcmV0cm9hY3RpdmVseSB0byBleGlzdGluZyBiYWdzLlxuICAgKi9cbiAgZGlhZ25vc3RpY3M/OiBQaWNrPFJlZGFjdGlvblBvbGljeSwgJ2tleXMnIHwgJ3BhdHRlcm5zJyB8ICdmaWVsZHMnPjtcbiAgLyoqXG4gICAqIFJlZ2V4IHBhdHRlcm5zIG1hdGNoZWQgYWdhaW5zdCBgRW1pdEV2ZW50Lm5hbWVgIGZvciBgc2NvcGUuJGVtaXQoLi4uKWBcbiAgICogY2FsbHMuIEFueSBlbWl0IGV2ZW50IHdob3NlIG5hbWUgbWF0Y2hlcyBoYXMgaXRzIHBheWxvYWQgcmVwbGFjZWQgd2l0aFxuICAgKiB0aGUgc3RyaW5nIGAnW1JFREFDVEVEXSdgIGJlZm9yZSBkaXNwYXRjaCB0byByZWNvcmRlcnMuXG4gICAqIEdsb2JhbC9zdGlja3kgcGF0dGVybnMgc3RhcnQgYXQgaW5kZXggemVybyBvbiBldmVyeSB0ZXN0OyB0aGVpciBmbGFnc1xuICAgKiByZXRhaW4gdGhlaXIgdXN1YWwgbWVhbmluZy4gVGhpcyBkb2VzIG5vdCBzY3J1YiBkaWFnbm9zdGljIHNpZGUgYmFncy5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgdHNcbiAgICogeyBlbWl0UGF0dGVybnM6IFsvXFwuYXV0aFxcLi8sIC9cXC5iaWxsaW5nXFwuL10gfVxuICAgKiAvLyBIaWRlcyBwYXlsb2FkcyBvZiBldmVudHMgbGlrZSAnbXlhcHAuYXV0aC5jaGVjaycgYW5kICdteWFwcC5iaWxsaW5nLnNwZW5kJ1xuICAgKiBgYGBcbiAgICovXG4gIGVtaXRQYXR0ZXJucz86IFJlZ0V4cFtdO1xufVxuXG4vKipcbiAqIFN0YXRlIHJlZGFjdGlvbiByZXBvcnQuIE5ldmVyIGluY2x1ZGVzIHZhbHVlczsgZW1pdCBhbmQgZGlhZ25vc3RpY1xuICogc2VsZWN0b3JzL2FjdGl2aXR5IGFyZSBub3QgcmVwcmVzZW50ZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25SZXBvcnQge1xuICAvKiogS2V5cyBmdWxseSByZWRhY3RlZCAoZXhhY3QgbWF0Y2ggb3IgcGF0dGVybiBtYXRjaCkuICovXG4gIHJlZGFjdGVkS2V5czogc3RyaW5nW107XG4gIC8qKiBLZXlzIHdpdGggZmllbGQtbGV2ZWwgcmVkYWN0aW9uIOKGkiB3aGljaCBmaWVsZHMgd2VyZSBzY3J1YmJlZC4gKi9cbiAgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIC8qKiBQYXR0ZXJuIHNvdXJjZXMgdGhhdCB3ZXJlIGFjdGl2ZSAoZS5nLiBbJ3Bhc3N3b3JkfHNlY3JldCddKS4gKi9cbiAgcGF0dGVybnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHBvbGljeSBzYXlzIGFib3V0IHRoZSB2YWx1ZSBhdCBvbmUgdXNlci1sZXZlbCBwYXRoLlxuICpcbiAqIC0gYCdjbGVhcidgICDigJQgbm90aGluZyB0byBzY3J1YjsgcmV0YWluIGFuZCBzZXJ2ZSB0aGUgdmFsdWUgYXMgaXQgaXMuXG4gKiAtIGAnd2hvbGUnYCAg4oCUIHRoZSBlbnRpcmUgdmFsdWUgaXMgc2VjcmV0LiBga2V5YCBpcyB0aGUgcG9saWN5IG9yIG1hcmtlZFxuICogICBrZXkgdGhhdCBkZWNpZGVkIGl0ICh0aGUgcGF0aCBpdHNlbGYgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMpLlxuICogLSBgJ2ZpZWxkcydgIOKAlCB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IHdob3NlIGBwYXRoc2AgKGRvdC1wYXRocyBJTlNJREUgdGhlXG4gKiAgIHZhbHVlLCByZWxhdGl2ZSB0byBpdCkgYXJlIHNlY3JldDsgZXZlcnl0aGluZyBlbHNlIGluIGl0IGlzIG5vdC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVkYWN0aW9uVmVyZGljdCA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnY2xlYXInIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICd3aG9sZSc7IHJlYWRvbmx5IGtleTogc3RyaW5nIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdmaWVsZHMnOyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBjb25zdCBDTEVBUjogUmVkYWN0aW9uVmVyZGljdCA9IE9iamVjdC5mcmVlemUoeyBraW5kOiAnY2xlYXInIH0gYXMgY29uc3QpO1xuXG4vKipcbiAqIE1heGltdW0ga2V5IGxlbmd0aCAoY2hhcmFjdGVycykgdGhhdCB3aWxsIGJlIHRlc3RlZCBhZ2FpbnN0IHJlZ2V4IHJlZGFjdGlvblxuICogcGF0dGVybnMuIEtleXMgbG9uZ2VyIHRoYW4gdGhpcyBhcmUgc2tpcHBlZCBmb3IgcGF0dGVybiBtYXRjaGluZyB0byBwcmV2ZW50XG4gKiBSZURvUzogYSBwYXRob2xvZ2ljYWwgcmVnZXggdGVzdGVkIGFnYWluc3QgYW4gdW5ib3VuZGVkbHkgbG9uZyBrZXkgc3RyaW5nXG4gKiBjYW4gY2F1c2UgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy4gMjU2IGNoYXJhY3RlcnMgY29tZm9ydGFibHkgZXhjZWVkcyBhbnlcbiAqIHJlYWxpc3RpYyBzY29wZS1zdGF0ZSBrZXkgbmFtZS5cbiAqL1xuY29uc3QgTUFYX1BBVFRFUk5fS0VZX0xFTiA9IDI1NjtcblxuLyoqIFBvbGljeSBwYXR0ZXJucyBhcmUgcHJlZGljYXRlcywgbm90IGN1cnNvcnMgb3ZlciBzdWNjZXNzaXZlIGtleXMvZXZlbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4odmFsdWU6IHN0cmluZywgcGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcGF0dGVybnMpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgLy8gT25seSB0aGVzZSBmbGFncyBjb25zdW1lIGxhc3RJbmRleC4gT3JkaW5hcnkgKGluY2x1ZGluZyBmcm96ZW4pXG4gICAgLy8gcmVnZXhlcyBuZWVkIG5vIHdyaXRhYmxlIGN1cnNvciB0byBtYXRjaC4gS2VlcCBhbGwgb3JpZ2luYWwgZmxhZ3MuXG4gICAgaWYgKHBhdHRlcm4uZ2xvYmFsIHx8IHBhdHRlcm4uc3RpY2t5KSBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgaWYgKHBhdHRlcm4udGVzdCh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZGFjdGlvblJ1bGUge1xuICBwcml2YXRlIHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRpYWdub3N0aWNSdWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkO1xuICAvKiogV2hldGhlciBgcG9saWN5YCBuYW1lcyBhbnl0aGluZyBhIHN0YXRlIHZlcmRpY3QgY2FuIGFjdCBvbiDigJQgY29tcHV0ZWRcbiAgICogIG9uY2UgcGVyIGBzZXRQb2xpY3lgIHNvIHtAbGluayBpc0luZXJ0fSBpcyBhIHR3by1maWVsZCBjaGVjay4gKi9cbiAgcHJpdmF0ZSBwb2xpY3lBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIFRoZSBwb2xpY3kncyBwYXR0ZXJucyB0aGF0IGNhbiBkZXBlbmQgb24gYSB3aG9sZSBkb3R0ZWQgcGF0aCAoe0BsaW5rIG5lZWRzUGF0aH0pIOKAlCBwZXIgYHNldFBvbGljeWAuICovXG4gIHByaXZhdGUgcGF0aFBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSA9IFtdO1xuICBwcml2YXRlIHdhbGtMaW1pdFdhcm5lZCA9IGZhbHNlO1xuICAvKipcbiAgICogS2V5cyBtYXJrZWQgc2VjcmV0IGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuIOKAlCBieSBhIHBlci1jYWxsXG4gICAqIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAsIG9yIGJ5IGFueSB3cml0ZSB0aGUgcG9saWN5IHJlZGFjdGVkIHdob2xlLlxuICAgKiBPTkUgc2V0IHBlciBydW4sIHNoYXJlZCBieSBldmVyeSBzY29wZSBhbmQgY29udGV4dCAodGhlIGV4ZWN1dG9yIGJ1aWxkc1xuICAgKiB0aGUgcnVsZSBvbmNlIHBlciBydW4gYW5kIGluc3RhbGxzIGl0IG9uIHRoZSBydW50aW1lIHJvb3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWQ6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogRmllbGRzIGEgc3ViZmxvdyBtYXBwZXIgaGFuZGVkIHRvIGEgTkVXIGtleSBhbG9uZyB3aXRoIHRoZSB2YWx1ZSB0aGV5XG4gICAqIGJlbG9uZyB0byDigJQgdGFyZ2V0IGtleSDihpIgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRocyAoYW4gb2JqZWN0IGNvcGllZFxuICAgKiBieSByZWZlcmVuY2UgZnJvbSBhIGBmaWVsZHNgLXNlbGVjdGVkIGtleTsge0BsaW5rIE1hcHBlclRhaW50fSkuXG4gICAqIFJ1bi13aWRlLCBieSBuYW1lLCBsaWtlIHtAbGluayBtYXJrZWR9LlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0ZWQ6IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoaXMgcnVuJ3MgdGhyb3duIHZhbHVlcyBzZXJ2ZWQgbWFza2VkICh0aGVpciB0ZXh0IHNlbGVjdGVkLCBvciBhIHNlbGVjdGVkIGtleSBpbnNpZGUgdGhlbSkg4oaSIHRoZWlyIHNlcnZlZCBmb3JtLiAqL1xuICBwcml2YXRlIG1hc2tlZEVycm9yczogTWFwPHVua25vd24sIFN0cnVjdHVyZWRFcnJvckluZm8+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHBvbGljeT86IFJlZGFjdGlvblBvbGljeSwgbWFya2VkPzogU2V0PHN0cmluZz4pIHtcbiAgICB0aGlzLm1hcmtlZCA9IG1hcmtlZCA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgZ2V0UG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgc2V0UG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSBwb2xpY3k/LmRpYWdub3N0aWNzO1xuICAgIHRoaXMuZGlhZ25vc3RpY1J1bGUgPSBkaWFnbm9zdGljc1xuICAgICAgPyBuZXcgUmVkYWN0aW9uUnVsZSh7IGtleXM6IGRpYWdub3N0aWNzLmtleXMsIHBhdHRlcm5zOiBkaWFnbm9zdGljcy5wYXR0ZXJucywgZmllbGRzOiBkaWFnbm9zdGljcy5maWVsZHMgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucGF0aFBhdHRlcm5zID0gKHBvbGljeT8ucGF0dGVybnMgPz8gW10pLmZpbHRlcihuZWVkc1BhdGgpO1xuICAgIHRoaXMucG9saWN5QWN0aXZlID1cbiAgICAgIHBvbGljeSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoKHBvbGljeS5rZXlzPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIChwb2xpY3kucGF0dGVybnM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICAgT2JqZWN0LmtleXMocG9saWN5LmZpZWxkcyA/PyB7fSkubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoaXMgcnVsZSBoYXMgbm90aGluZyB0byBzYXkgYWJvdXQgQU5ZIHBhdGgg4oCUIG5vIGtleSwgcGF0dGVyblxuICAgKiBvciBmaWVsZCBpbiB0aGUgcG9saWN5IGFuZCBubyBrZXkgbWFya2VkIHNvIGZhci4gVGhlIG5vLXBvbGljeSBmYXN0XG4gICAqIHBhdGg6IGBTdGFnZUNvbnRleHRgIHNraXBzIHRoZSB2ZXJkaWN0IChhbmQgaXRzIHBhdGggYWxsb2NhdGlvbikgb25cbiAgICogZXZlcnkgdHJhY2tlZCByZWFkIGFuZCBzdGFnZWQgd3JpdGUgd2hpbGUgdGhpcyBob2xkcy4gQSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIG1hcmtzIGEga2V5IGFuZCBlbmRzIGl0LlxuICAgKi9cbiAgaXNJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiAhdGhpcy5wb2xpY3lBY3RpdmUgJiYgdGhpcy5pbmhlcml0ZWQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmVkIG1hcmtlZC1rZXlzIHNldCDigJQgZm9yIHRoZSBgQGludGVybmFsYCBzaGFyaW5nIHByb3RvY29sIGFuZCBgZGVjaWRlKClgLiAqL1xuICBtYXJrZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQ7XG4gIH1cblxuICB1c2VNYXJrZWRLZXlzKHNoYXJlZDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIG1hcmsoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgfVxuXG4gIC8qKiBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIG1hcmsgYW5kIGFueSBmaWVsZHMgYSBtYXBwZXIgZ2F2ZSBpdDsgYSBwb2xpY3kgdmVyZGljdCBzdXJ2aXZlcyBpdC4gKi9cbiAgdW5tYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuaW5oZXJpdGVkPy5kZWxldGUoa2V5KSAmJiB0aGlzLmluaGVyaXRlZC5zaXplID09PSAwKSB0aGlzLmluaGVyaXRlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBLZXktbGV2ZWwgdmVyZGljdDogbWFya2VkLCBsaXN0ZWQgaW4gYHBvbGljeS5rZXlzYCwgb3IgbWF0Y2hpbmcgYSBwYXR0ZXJuLiAqL1xuICBpc0tleVJlZGFjdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWFya2VkLmhhcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucG9saWN5LmtleXM/LmluY2x1ZGVzKGtleSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wb2xpY3kucGF0dGVybnM7XG4gICAgaWYgKCFwYXR0ZXJucyB8fCBwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAoa2V5Lmxlbmd0aCA+IE1BWF9QQVRURVJOX0tFWV9MRU4pIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIFJlZGFjdGlvblBvbGljeToga2V5ICcke2tleS5zbGljZSgwLCA0MCl9Li4uJyAoJHtrZXkubGVuZ3RofSBjaGFycykgZXhjZWVkcyBgICtcbiAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAnVXNlIHBvbGljeS5rZXlzIGZvciBleGFjdCBtYXRjaGluZyBvZiBsb25nIGtleSBuYW1lcy4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlc1BhdHRlcm4oa2V5LCBwYXR0ZXJucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGFuIGVtaXR0ZWQgcGF5bG9hZCBCRUZPUkUgZGlzcGF0Y2gvY2FwdHVyZS4gRW1pdCBuYW1lcyBhcmUgbm90XG4gICAqIHN0YXRlIHBhdGhzOiBubyBrZXktbGVuZ3RoIGNhcCwgbWFya3Mgb3IgZmllbGQgc2NydWIgYXBwbGllcyBoZXJlLlxuICAgKiBBIGNsZWFyIHBheWxvYWQga2VlcHMgaXRzIGlkZW50aXR5OyBkaWFnbm9zdGljIGJhZ3MgYXJlIHVudG91Y2hlZC5cbiAgICovXG4gIHJldGFpbkVtaXQobmFtZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKG5hbWUsIHRoaXMucG9saWN5Py5lbWl0UGF0dGVybnMpID8gU0NPUEVfUExBQ0VIT0xERVIgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhIE5BTUVEIGRpYWdub3N0aWMgZW50cnkg4oCUIGBhZGRyZXNzYCBpcyBgW2NoYW5uZWwsIC4uLnBhdGgsIG5hbWVdYFxuICAgKiAoYCRkZWJ1ZygndG9rZW4nLCB2KWAg4oaSIGBbJ2xvZ3MnLCAndG9rZW4nXWA7IGAkbG9nKHYpYCDihpIgYFsnbG9ncycsXG4gICAqICdtZXNzYWdlcyddYCkuIFRIRSBNQVBQSU5HOiB0aGUgZW50cnkgaXMgdGhlIHJlY29yZCBgeyBbbmFtZV06IHZhbHVlIH1gXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUsIHNvIGl0IGlzIHJldGFpbmVkIGFzIGEgYm91bmRhcnkgcmVjb3JkIGhvbGRpbmcgdGhlXG4gICAqIHN0YXRlIGtleSBgbmFtZWAgd291bGQgYmUg4oCUIHRoZSBzdGF0ZSB2ZXJkaWN0IGF0IGBbLi4ucGF0aCwgbmFtZV1gIChrZXlzLFxuICAgKiBwYXR0ZXJucyBhbmQgbWFya3MgYXQgZXZlcnkgZG90dGVkIHByZWZpeCBhbmQgYXQgdGhlIG5hbWUgaXRzZWxmOyB0aGUgdG9wXG4gICAqIGtleSdzIGBmaWVsZHNgKSwgdGhlbiBldmVyeSBuZXN0ZWQgb3duIGtleSB3aG9zZSBuYW1lIG9yIGRvdHRlZCBwYXRoIGlzXG4gICAqIHNlbGVjdGVkICh7QGxpbmsgcmV0YWluQm91bmRhcnl9J3Mgd2FsaykuIFRoZSBjaGFubmVsIHRha2VzIG5vIHBhcnQ6XG4gICAqIGBsb2dzLnRva2VuYCwgYGVycm9ycy50b2tlbmAgYW5kIGBtZXRyaWNzLnRva2VuYCBhcmUgYWxsIHRoZSBzdGF0ZSBrZXlcbiAgICogYHRva2VuYC4gYHBvbGljeS5kaWFnbm9zdGljc2AgKGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIHJvb3RlZCBhdCB0aGVcbiAgICogY2hhbm5lbCkgYXBwbGllcyBvbiB0b3AuIENsZWFyIHZhbHVlcyBrZWVwIHRoZWlyIGlkZW50aXR5LlxuICAgKi9cbiAgcmV0YWluRGlhZ25vc3RpYyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5pc0luZXJ0KCkgPyB2YWx1ZSA6IHRoaXMucmV0YWluTmFtZWQoYWRkcmVzcy5zbGljZSgxKSwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gdGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywga2VwdCkgOiBrZXB0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBmbG93LW1lc3NhZ2UgdGV4dCAoYGZsb3dNZXNzYWdlcy5kZXNjcmlwdGlvbmAgLyBgLnJhdGlvbmFsZWApOiB0ZXh0XG4gICAqIHRoZSBlbmdpbmUgY29tcG9zZXMgaGFzIG5vIG5hbWUgb2YgaXRzIG93biwgc28gbm8gc3RhdGUgc2VsZWN0b3IgcmVhY2hlc1xuICAgKiBpdCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0LlxuICAgKi9cbiAgcmV0YWluRmxvd1RleHQoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY1J1bGUgPyAodGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywgdGV4dCkgYXMgc3RyaW5nKSA6IHRleHQ7XG4gIH1cblxuICAvKioge0BsaW5rIHJldGFpbkRpYWdub3N0aWN9J3Mgc3RhdGUgaGFsZjogdGhlIHZhbHVlIG5hbWVkIGJ5IGBwYXRoYCAoaXRzIGxhc3Qgc2VnbWVudCksIHNlcnZlZCB3aG9sZS4gKi9cbiAgcHJpdmF0ZSByZXRhaW5OYW1lZChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBuYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPVxuICAgICAgcGF0aC5sZW5ndGggPiAxICYmIHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSA/IHsga2luZDogJ3dob2xlJywga2V5OiBuYW1lIH0gOiB0aGlzLnZlcmRpY3QocGF0aCk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IGtlcHQgPSBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICBpZiAoa2VwdCA9PT0gbnVsbCB8fCB0eXBlb2Yga2VwdCAhPT0gJ29iamVjdCcpIHJldHVybiBrZXB0O1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKGtlcHQsIGJhc2UsIHRoaXMuZG90dGVkVGFyZ2V0cyhiYXNlKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlcnZlZCBmb3JtIG9mIGEgdGhyb3duIHZhbHVlLCBkZWNpZGVkIE9OQ0UgYXQgaXRzIGVycm9yIHNpdGUgZnJvbSB0aGVcbiAgICogdGV4dCB0aGUgZGlhZ25vc3RpYyBjb2xsZWN0b3IgcmV0YWluZWQgZm9yIGBlcnJvcnMuc3RhZ2VFeGVjdXRpb25FcnJvcmBcbiAgICogKGBrZXB0YCkgYW5kIGZyb20gdGhlIHZhbHVlIGl0c2VsZiDigJQgYSByZWNvcmQgaGFuZGVkIG91dCB3aG9sZSwgbWFza2VkXG4gICAqIHdoZW4gb25lIG9mIGl0cyBvd24ga2V5cywgYXQgYW55IGRlcHRoLCBjYXJyaWVzIGEgc2VsZWN0ZWQgbmFtZS5cbiAgICogVW5tYXNrZWQ6IHRvZGF5J3Mgc3RydWN0dXJlZCBpbmZvLiBNYXNrZWQ6IHRoZSBlcnJvcidzIGBuYW1lYC9gY29kZWAga2VwdCxcbiAgICogbm8gYGlzc3Vlc2AgKHRoZXkgcXVvdGUgdGhlIGlucHV0KSBhbmQgbm8gYHJhd2AgZXJyb3IgKGl0IGhvbGRzIHRoZSB0ZXh0XG4gICAqIGFuZCB0aGUga2V5cyk7IHRoZSBtZXNzYWdlIGlzIHRoZSBwbGFjZWhvbGRlciB3aGVuIHRoZSB0ZXh0IHdhcyBzZWxlY3RlZCxcbiAgICogdGhlIHRleHQgaXRzZWxmIHdoZW4gb25seSBhIGtleSB3YXMg4oCUIHJlbWVtYmVyZWQgc28gYG9uUnVuRmFpbGVkYCwgdGhlXG4gICAqIGxvZ2dlciBhbmQgYSBmb3JrIGVudmVsb3BlIHNlcnZlIHRoZSBzYW1lIGZvcm0gKHtAbGluayBzZXJ2ZWRFcnJvcn0pLiBUaGVcbiAgICogdGhyb3duIHZhbHVlIGl0c2VsZiBzdGF5cyByZWFsLlxuICAgKi9cbiAgcmV0YWluU3RhZ2VFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAga2VwdDogdW5rbm93bixcbiAgKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB9IHtcbiAgICBjb25zdCBpbmZvID0gZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gICAgY29uc3QgdGV4dFNlbGVjdGVkID0ga2VwdCAhPT0gdGV4dDtcbiAgICBpZiAoIXRleHRTZWxlY3RlZCAmJiAhdGhpcy5jYXJyaWVzU2VsZWN0ZWRLZXkoZXJyb3IpKSByZXR1cm4geyBtZXNzYWdlOiB0ZXh0LCBzdHJ1Y3R1cmVkRXJyb3I6IGluZm8gfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGV4dFNlbGVjdGVkID8gU3RyaW5nKGtlcHQpIDogdGV4dDtcbiAgICBjb25zdCBtYXNrZWQ6IFN0cnVjdHVyZWRFcnJvckluZm8gPSB7XG4gICAgICBtZXNzYWdlOiB0ZXh0U2VsZWN0ZWQgPyBtZXNzYWdlIDogaW5mby5tZXNzYWdlLFxuICAgICAgLi4uKGluZm8ubmFtZSAhPT0gdW5kZWZpbmVkICYmIHsgbmFtZTogaW5mby5uYW1lIH0pLFxuICAgICAgLi4uKGluZm8uY29kZSAhPT0gdW5kZWZpbmVkICYmIHsgY29kZTogaW5mby5jb2RlIH0pLFxuICAgICAgcmF3OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICAodGhpcy5tYXNrZWRFcnJvcnMgPz89IG5ldyBNYXAoKSkuc2V0KGVycm9yLCBtYXNrZWQpO1xuICAgIHJldHVybiB7IG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvcjogbWFza2VkIH07XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHRocm93biB2YWx1ZSBjYXJyeSBhIHNlbGVjdGVkIG5hbWUg4oCUIGFuIG93biBrZXksIGF0IGFueSBkZXB0aCwgdGhhdFxuICAgKiB0aGUgcG9saWN5IG9yIGEgbWFyayBzZWxlY3RzPyBUb3RhbDogYSB2YWx1ZSB3aG9zZSBrZXlzIGNhbm5vdCBiZSByZWFkIGlzXG4gICAqIHNlcnZlZCBtYXNrZWQgKHRoZSBzYWZlIHNpZGUpLCBuZXZlciBhIHNlY29uZCB0aHJvdyBmcm9tIGFuIGVycm9yIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGNhcnJpZXNTZWxlY3RlZEtleSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRocm93bkNhcnJpZXModmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZXlzIHRoYXQgY2Fubm90IGJlIHJlYWQgKGEgdGhyb3dpbmcgZ2V0dGVyLCBhIHJldm9rZWQgUHJveHkpIG9yIGEgd2FsayBwYXN0IGl0c1xuICAgICAgLy8gbGltaXQ6IHNlcnZlZCBpbiB0aGUgbWFza2VkIGZvcm0g4oCUIGl0cyB0ZXh0IGtlcHQsIG5vIGByYXdgLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSB0aHJvd24gdmFsdWUgYW5kIHdoYXQgYSBsb2dnZXIgb3IgYSBzZXJpYWxpemVyIHByaW50cyB3aXRoIGl0OiBpdHMgb3duXG4gICAqIGtleXMgYXQgZXZlcnkgZGVwdGgsIGFuZCBpdHMgYGNhdXNlYCAvIGFuIGBBZ2dyZWdhdGVFcnJvcmAncyBgZXJyb3JzYCDigJQgb3duXG4gICAqIE5PTi1lbnVtZXJhYmxlIGtleXMgbm8ga2V5IHdhbGsgc2VlcyDigJQgZWFjaCB3YWxrZWQgdGhlIHNhbWUgd2F5IChhIGN5Y2xlXG4gICAqIGFtb25nIHRoZW0gaXMgZm9sbG93ZWQgb25jZSkuXG4gICAqL1xuICBwcml2YXRlIHRocm93bkNhcnJpZXModmFsdWU6IG9iamVjdCwgc2VlbjogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmIChzZWxlY3RzQnlQYXRoKHZhbHVlLCB1bmRlZmluZWQsIHRoaXMuZG90dGVkVGFyZ2V0cyh1bmRlZmluZWQpLCB0aGlzLm5hbWVzV2FsayhmYWxzZSksIG5ldyBNYXAoKSwgMCkuc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvd24gPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkgPyAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXJyb3JzID0gb3duKCdlcnJvcnMnKTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgW293bignY2F1c2UnKSwgLi4uKEFycmF5LmlzQXJyYXkoZXJyb3JzKSA/IGVycm9ycyA6IFtdKV0pIHtcbiAgICAgIGlmIChwYXJ0ICE9PSBudWxsICYmIHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0JyAmJiB0aGlzLnRocm93bkNhcnJpZXMocGFydCwgc2VlbikpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleS1sZXZlbCBydWxlcyBhcyB0aGUgcGF0aCB3YWxrIGFza3MgdGhlbSAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhXG4gICAqIG5lc3RlZCBrZXkgaXMgc2VsZWN0ZWQgYnkgaXRzIG93biBOQU1FIChtYXJrcywga2V5cywgcGF0dGVybnMpLCBhbmQg4oCUIHVuZGVyXG4gICAqIHBhdHRlcm5zIG9ubHkg4oCUIGJ5IGl0cyBkb3R0ZWQgcGF0aDsgYSBkZWNsYXJlZCAob3IgaW5oZXJpdGVkKSBmaWVsZCBiZWxvdyBhXG4gICAqIGtleSBvZiBpdHMgbmFtZSBpcyBhIHRhcmdldC4gRG90dGVkIGtleXMgYW5kIG1hcmtzIGFyZSBUQVJHRVRTIGZyb20gdGhlXG4gICAqIHdhbGsncyByb290ICh7QGxpbmsgZG90dGVkVGFyZ2V0c30pLCBzbyB3aXRob3V0IHBhdHRlcm5zIG5vIGRlY2lzaW9uXG4gICAqIGRlcGVuZHMgb24gdGhlIHBhdGggYW5kIHRoZSB3YWxrIHNoYXJlcyB0aGVtIHBlciBvYmplY3QgKGxpbmVhciBvbiBhIERBRykuXG4gICAqIGByb290RGVjaWRlZGA6IHRoZSByb290J3Mgb3duIGtleXMgd2VyZSBhbHJlYWR5IGRlY2lkZWQgKGByZXRhaW5SZWNvcmRgKS5cbiAgICovXG4gIHByaXZhdGUgbmFtZXNXYWxrKHJvb3REZWNpZGVkOiBib29sZWFuKTogV2FsayB7XG4gICAgY29uc3QgYnlQYXRoID0gdGhpcy5wYXRoUGF0dGVybnM7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzOiB7XG4gICAgICAgIG1hc2tzOiAobmFtZSkgPT4gdGhpcy5pc0tleVJlZGFjdGVkKG5hbWUpLFxuICAgICAgICAuLi4oYnlQYXRoLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICAgIHBhdGhNYXNrczogKHBhdGg6IHN0cmluZykgPT4gcGF0aC5sZW5ndGggPD0gTUFYX1BBVFRFUk5fS0VZX0xFTiAmJiBtYXRjaGVzUGF0dGVybihwYXRoLCBieVBhdGgpLFxuICAgICAgICB9KSxcbiAgICAgICAgZmllbGRzOiAobmFtZSkgPT4gdGhpcy5maWVsZHNPZihuYW1lKSxcbiAgICAgIH0sXG4gICAgICByb290RGVjaWRlZCxcbiAgICAgIC4uLihieVBhdGgubGVuZ3RoID09PSAwICYmIHsgbWVtbzogbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4oKSB9KSxcbiAgICAgIGJ1ZGdldDogd2Fsa0xpbWl0LFxuICAgICAgb25MaW1pdDogKCkgPT4gdGhpcy53YXJuV2Fsa0xpbWl0KGJ5UGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPbmNlIHBlciBydWxlLCBpbiBkZXYgbW9kZTogYSBwYXRoIHdhbGsgcGFzc2VkIGl0cyBsaW1pdCBhbmQgc2VydmVkIGl0cyByZW1haW5kZXIgYXMgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBwcml2YXRlIHdhcm5XYWxrTGltaXQocGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2Fsa0xpbWl0V2FybmVkIHx8ICFpc0Rldk1vZGUoKSkgcmV0dXJuO1xuICAgIHRoaXMud2Fsa0xpbWl0V2FybmVkID0gdHJ1ZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGEgdmFsdWUgd2l0aCBtb3JlIHRoYW4gJHt3YWxrTGltaXR9IHBhdGhzIHVuZGVyIHRoZSBwYXRoIHBhdHRlcm4ocykgYCArXG4gICAgICAgIGAke3BhdHRlcm5zLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9IOKAlCB0aGUgcGF0aHMgcGFzdCB0aGF0IHdlcmUgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gYCArXG4gICAgICAgICdBIHBhdHRlcm4gdGhhdCBuYW1lcyBhIEtFWSAobm8gZG90LCBubyBsb29rYXJvdW5kKSBpcyBkZWNpZGVkIHBlciBvYmplY3Q7IHByZWZlciBvbmUsIG9yIGtleXMvZmllbGRzLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZG90dGVkIGtleXMgYW5kIG1hcmtzIHRoYXQgbmFtZSBhIHBhdGggdW5kZXIgYGJhc2VgICh0aGUgd2FsaydzIHJvb3Q6XG4gICAqIGB1bmRlZmluZWRgIGZvciBhIHJlY29yZCdzIG93biBrZXlzLCBhbiBlbnRyeSdzIG5hbWUgZm9yIGEgZGlhZ25vc3RpYyksXG4gICAqIGFzIHRhcmdldHMgcmVsYXRpdmUgdG8gaXQg4oCUIGEgZG90dGVkIHJ1bGUgaXMgZXhhY3QgdG8gaXRzIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGRvdHRlZFRhcmdldHMoYmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGFyZ2V0W10ge1xuICAgIGNvbnN0IHByZWZpeCA9IGJhc2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYCR7YmFzZX0uYDtcbiAgICBjb25zdCBvdXQ6IFRhcmdldFtdID0gW107XG4gICAgY29uc3QgYWRkID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcuJykgfHwgIW5hbWUuc3RhcnRzV2l0aChwcmVmaXgpIHx8IG5hbWUubGVuZ3RoID09PSBwcmVmaXgubGVuZ3RoKSByZXR1cm47XG4gICAgICBvdXQucHVzaChuYW1lLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJykpO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMubWFya2VkKSBhZGQobmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucG9saWN5Py5rZXlzID8/IFtdKSBhZGQobmFtZSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGFueSBvYnNlcnZlciBpcyBzZXJ2ZWQgZm9yIGEgdGhyb3duIHZhbHVlIOKAlCByZXRyeSwgdGhyb3R0bGUsIHJ1blxuICAgKiBmYWlsdXJlLCBhIGZvcmsgZW52ZWxvcGUsIHRoZSBsb2dnZXI6IGl0cyByZW1lbWJlcmVkIHN0YWdlIGZvcm0sIGVsc2UgdGhlXG4gICAqIHNhbWUgZGVjaXNpb24gbWFkZSBub3cgKGFuZCByZW1lbWJlcmVkKSwgZWxzZSBpdHMgc3RydWN0dXJlZCBpbmZvLlxuICAgKi9cbiAgc2VydmVkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHtcbiAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9yKGVycm9yKTtcbiAgICAvLyBFYWNoIGV2ZW50IGdldHMgaXRzIG93biBvYmplY3QsIGFzIGV4dHJhY3RFcnJvckluZm8gZ2l2ZXMgaXQgb25lLlxuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgbG9nZ2VyIGlzIGhhbmRlZDogdGhlIHRocm93biB2YWx1ZSBpdHNlbGYgdW5sZXNzIHRoZSBwb2xpY3kgbWFza2VkIGl0cyB0ZXh0LiAqL1xuICBsb2dnYWJsZUVycm9yKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBlcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgbWFza2VkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICAgIGlmIChrbm93biB8fCB0aGlzLmlzRGlhZ25vc3RpY0luZXJ0KCkpIHJldHVybiBrbm93bjtcbiAgICBjb25zdCB0ZXh0ID0gdGhyb3duVGV4dChlcnJvcik7XG4gICAgdGhpcy5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCB0aGlzLnJldGFpbkRpYWdub3N0aWMoWydlcnJvcnMnLCAnc3RhZ2VFeGVjdXRpb25FcnJvciddLCB0ZXh0KSk7XG4gICAgcmV0dXJuIHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGhpbmcgY2FuIG1hc2sgYSBkaWFnbm9zdGljIGVudHJ5IG9yIGEgdGhyb3duIHZhbHVlIOKAlCBubyBzdGF0ZSBzZWxlY3RvcixcbiAgICogbm8gbWFyaywgbm8gZGlhZ25vc3RpYyBzZWxlY3RvcjogdGhlIGNvbGxlY3RvcnMnIGFuZCB0aGUgZXJyb3IgcGF0aHMnIGZhc3RcbiAgICogcGF0aCAoYSBuby1wb2xpY3kgcnVuIG5ldmVyIHJlYWRzIGEgcGF5bG9hZCwgaW5jbHVkaW5nIGJvcnJvd2VkIGdldHRlcnMpLlxuICAgKi9cbiAgaXNEaWFnbm9zdGljSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmVydCgpICYmIHRoaXMuaXNGbG93VGV4dEluZXJ0KCk7XG4gIH1cblxuICAvKiogTm90aGluZyBjYW4gbWFzayBmbG93LW1lc3NhZ2UgdGV4dCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0ICh7QGxpbmsgcmV0YWluRmxvd1RleHR9KS4gKi9cbiAgaXNGbG93VGV4dEluZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kaWFnbm9zdGljUnVsZSB8fCB0aGlzLmRpYWdub3N0aWNSdWxlLmlzSW5lcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBmb3IgYSB1c2VyLWxldmVsIHBhdGgg4oCUIGBbJ3Byb2ZpbGUnXWAgZm9yIGEgc2NvcGUga2V5LFxuICAgKiBgWydwcm9maWxlJywgJ2F1dGgnXWAgZm9yIGEgbmVzdGVkIHdyaXRlIHN1Y2ggYXMgYSBzdWJmbG93IHNlZWQuXG4gICAqXG4gICAqIEV2ZXJ5IGRvdHRlZCBwcmVmaXggaXMgdGVzdGVkIGF0IGtleSBsZXZlbCAoYHByb2ZpbGVgLCB0aGVuXG4gICAqIGBwcm9maWxlLmF1dGhgKSwgc28gYSBwb2xpY3kgdGhhdCBuYW1lcyBhIGtleSBjb3ZlcnMgZXZlcnl0aGluZyB3cml0dGVuXG4gICAqIGJlbmVhdGggaXQuIGBmaWVsZHNgIGFyZSBkZWNsYXJlZCByZWxhdGl2ZSB0byB0aGUgVE9QIGtleTsgZm9yIGEgbmVzdGVkXG4gICAqIHBhdGggdGhleSBhcmUgcmUtYmFzZWQgb250byB0aGUgdmFsdWUgYmVpbmcgd3JpdHRlbiwgYW5kIGEgZmllbGQgdGhhdFxuICAgKiBuYW1lcyB0aGUgd3JpdHRlbiBwYXRoIGV4YWN0bHkgbWFrZXMgdGhlIHdob2xlIHZhbHVlIHNlY3JldC5cbiAgICovXG4gIHZlcmRpY3QocGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLnZlcmRpY3RPZktleShwYXRoWzBdKTtcbiAgICBsZXQgZG90dGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3R0ZWQgPSBpID09PSAwID8gcGF0aFswXSA6IGAke2RvdHRlZH0uJHtwYXRoW2ldfWA7XG4gICAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGRvdHRlZCkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2YocGF0aFswXSk7XG4gICAgaWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIENMRUFSO1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGZpZWxkcyB9O1xuICAgIGNvbnN0IHJlbCA9IHBhdGguc2xpY2UoMSkuam9pbignLicpO1xuICAgIGNvbnN0IGluc2lkZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgLy8gVGhlIHdyaXR0ZW4gcGF0aCBJUyBhIHNlY3JldCBmaWVsZDogdGhlIHdob2xlIHZhbHVlIGlzIHNlY3JldCwgYW5kXG4gICAgICAvLyB0aGUga2V5IHRoYXQgZGVjaWRlZCBpdCBpcyB0aGF0IGRvdHRlZCBwYXRoIOKAlCBuZXZlciB0aGUgdG9wIGtleSxcbiAgICAgIC8vIHdob3NlIHNpYmxpbmdzIHN0YXkgY2xlYXIuXG4gICAgICBpZiAoZmllbGQgPT09IHJlbCkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiBkb3R0ZWQgfTtcbiAgICAgIGlmIChmaWVsZC5zdGFydHNXaXRoKGAke3JlbH0uYCkpIGluc2lkZS5wdXNoKGZpZWxkLnNsaWNlKHJlbC5sZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGUubGVuZ3RoID4gMCA/IHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGluc2lkZSB9IDogQ0xFQVI7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGBrZXlgIHdyaXR0ZW4gb3IgcmVhZCB1bmRlciBgcGF0aGAg4oCUIHRoZSBjb21tb25cbiAgICogc2luZ2xlLXNlZ21lbnQgY2FzZSAoYHBhdGhgIGVtcHR5OiBldmVyeSBmYWNhZGUgd3JpdGUgYW5kIHJlYWQpIGRlY2lkZXNcbiAgICogb24gdGhlIGtleSBzdHJpbmcgYWxvbmUsIG5vIGFycmF5IGFsbG9jYXRlZC5cbiAgICovXG4gIHZlcmRpY3RBdChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPT09IDAgPyB0aGlzLnZlcmRpY3RPZktleShrZXkpIDogdGhpcy52ZXJkaWN0KFsuLi5wYXRoLCBrZXldKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlLXNlZ21lbnQgdmVyZGljdDoga2V5LWxldmVsIGhpdCDihpIgd2hvbGU7IGRlY2xhcmVkIG9yIGluaGVyaXRlZCBmaWVsZHMg4oaSIGZpZWxkcy4gKi9cbiAgcHJpdmF0ZSB2ZXJkaWN0T2ZLZXkoa2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGtleSkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2Yoa2V5KTtcbiAgICByZXR1cm4gZmllbGRzICE9PSB1bmRlZmluZWQgJiYgZmllbGRzLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXksIHBhdGhzOiBmaWVsZHMgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqIFRoZSBzZWNyZXQgZmllbGRzIG9mIGEgdG9wIGtleTogdGhlIHBvbGljeSdzLCBwbHVzIGFueSBhIG1hcHBlciBoYW5kZWQgaXQgKHtAbGluayBNYXBwZXJUYWludH0pLiAqL1xuICBwcml2YXRlIGZpZWxkc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRlY2xhcmVkID0gdGhpcy5wb2xpY3k/LmZpZWxkcz8uW2tleV07XG4gICAgY29uc3QgaW5oZXJpdGVkID0gdGhpcy5pbmhlcml0ZWQ/LmdldChrZXkpO1xuICAgIGlmIChpbmhlcml0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlY2xhcmVkO1xuICAgIHJldHVybiBkZWNsYXJlZCA9PT0gdW5kZWZpbmVkID8gaW5oZXJpdGVkIDogWy4uLm5ldyBTZXQoWy4uLmRlY2xhcmVkLCAuLi5pbmhlcml0ZWRdKV07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bidzIG1hcmtzIGFuZCB0aGUgZmllbGRzIG1hcHBlcnMgaGFuZGVkIHRvIG5ldyBrZXlzLCBhcyBOQU1FUyDigJQgd2hhdFxuICAgKiBhIHBhdXNlIGNhcnJpZXMgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChubyBwb2xpY3ksIG5vIHBlci1jYWxsIG1hcmspLlxuICAgKi9cbiAgbWFya3NGb3JDaGVja3BvaW50KCk6IFJlZGFjdGlvbk1hcmtzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiB0aGlzLmluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBrZXlzOiBbLi4udGhpcy5tYXJrZWRdLFxuICAgICAgLi4uKHRoaXMuaW5oZXJpdGVkICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBmaWVsZHM6IE9iamVjdC5mcm9tRW50cmllcyhbLi4udGhpcy5pbmhlcml0ZWRdLm1hcCgoW2tleSwgcGF0aHNdKSA9PiBba2V5LCBbLi4ucGF0aHNdXSkpLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBTZWVkIGEgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlIG1hcmtzIGl0cyBwYXVzZSBjYXJyaWVkICh7QGxpbmsgbWFya3NGb3JDaGVja3BvaW50fSkuICovXG4gIHJlc3RvcmVNYXJrcyhtYXJrczogUmVkYWN0aW9uTWFya3MpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBtYXJrcy5rZXlzKSB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHBhdGhzXSBvZiBPYmplY3QuZW50cmllcyhtYXJrcy5maWVsZHMgPz8ge30pKSB0aGlzLmluaGVyaXRGaWVsZHMoa2V5LCBwYXRocyk7XG4gIH1cblxuICAvKipcbiAgICogQSBzdWJmbG93IG1hcHBlcidzIGNvcHkgaW5oZXJpdHMgdGhlIGZpZWxkcyBvZiB0aGUgdmFsdWUgaXQgY29waWVkOlxuICAgKiBgdGFyZ2V0YCBpcyBhIGtleSB0aGUgbWFwcGVyIHdyb3RlOyBgcGF0aHNgIHRoZSBzb3VyY2Uga2V5J3MgZmllbGQgcGF0aHNcbiAgICogKGRlY2xhcmVkIG9yIHRoZW1zZWx2ZXMgaW5oZXJpdGVkKS4gUnVuLXdpZGUsIGJ5IG5hbWUsIGxpa2UgYSBtYXJrLlxuICAgKi9cbiAgaW5oZXJpdEZpZWxkcyh0YXJnZXQ6IHN0cmluZywgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgcHJpb3IgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KHRhcmdldCkgPz8gW107XG4gICAgKHRoaXMuaW5oZXJpdGVkID8/PSBuZXcgTWFwKCkpLnNldCh0YXJnZXQsIFsuLi5uZXcgU2V0KFsuLi5wcmlvciwgLi4ucGF0aHNdKV0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZXJkaWN0IG9mIGEga2V5IGEgbWFwcGVyIHJlYWQg4oCUIGBydW5zYCAodGhlIHJ1biBuYW1lc3BhY2VzKSBpcyBzZWxlY3RlZCB3aGVuIGFueSBuYW1lc3BhY2VkIGtleSBpcy4gKi9cbiAgdmVyZGljdE9mUmVhZChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy52ZXJkaWN0T2ZLZXkoa2V5KTtcbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IGtleSAhPT0gJ3J1bnMnIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2ZXJkaWN0O1xuICAgIGZvciAoY29uc3Qgc3BhY2Ugb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChzcGFjZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3BhY2UgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgaW5uZXIgb2YgT2JqZWN0LmtleXMoc3BhY2UpKSB7XG4gICAgICAgIGlmICh0aGlzLnZlcmRpY3RPZktleShpbm5lcikua2luZCAhPT0gJ2NsZWFyJykgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5IH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCAvIHNlcnZlZCBmb3JtIG9mIGEgdmFsdWUgYXQgYSBwYXRoOiB0aGUgcGxhY2Vob2xkZXIsIGFcbiAgICogc2NydWJiZWQgQ0xPTkUsIG9yIHRoZSB2YWx1ZSBpdHNlbGYgKHNhbWUgcmVmZXJlbmNlIOKAlCByZWNvcmRlcnMgcmVjZWl2ZVxuICAgKiBib3Jyb3dlZCBsaXZlIHJlZmVyZW5jZXMgZm9yIGNsZWFyIHZhbHVlcywgYXMgdGhleSBhbHdheXMgaGF2ZSkuXG4gICAqIGBwbGFjZWhvbGRlcmAgZGVmYXVsdHMgdG8gdGhlIHNjb3BlLXRpZXIgYCdbUkVEQUNURURdJ2A7IHRoZSBtaXJyb3Igc2VlZFxuICAgKiBwYXNzZXMgdGhlIGxvZydzIGAnUkVEQUNURUQnYC5cbiAgICovXG4gIHJldGFpbihwYXRoOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24sIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IHVua25vd24ge1xuICAgIHJldHVybiBSZWRhY3Rpb25SdWxlLmFwcGx5KHRoaXMudmVyZGljdChwYXRoKSwgdmFsdWUsIHBsYWNlaG9sZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIFNUQVRFIHJlY29yZCAoc3RhdGUgcmVhZCwgbWlycm9yIHNlZWQpOiBlYWNoIG93blxuICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXkgdGhyb3VnaCB7QGxpbmsgcmV0YWlufS4gRmllbGRzIGFyZSBwYXRocyBpbnNpZGUgdGhhdFxuICAgKiBrZXllZCB2YWx1ZS4gU2NhbGFycyBhbmQgcm9vdCBhcnJheXMgcGFzcyB0aHJvdWdoLiBCb3VuZGFyeSByZWNvcmRzIGFkZFxuICAgKiB0aGUgbmVzdGVkLWtleSB3YWxrOiB7QGxpbmsgcmV0YWluQm91bmRhcnl9LlxuICAgKiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCB3aGVuIHVuY2hhbmdlZC4gQW4gaW5lcnQgcnVsZSBkb2VzIG5vdCBlbnVtZXJhdGVcbiAgICogdGhlIHZhbHVlLCBzbyBldmVuIGFuIGFjY2Vzc29yIGlzIHVudG91Y2hlZCBvbiB0aGUgbm8tcG9saWN5IGZhc3QgcGF0aC5cbiAgICovXG4gIHJldGFpblJlY29yZDxUPihyZWNvcmQ6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCByZWNvcmQgPT09IG51bGwgfHwgdHlwZW9mIHJlY29yZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShyZWNvcmQpKSByZXR1cm4gcmVjb3JkO1xuICAgIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpbihba2V5XSwgdmFsdWUsIHBsYWNlaG9sZGVyKTtcbiAgICAgIGlmIChrZXB0ID09PSB2YWx1ZSkgY29udGludWU7XG4gICAgICBvdXQgPz89IHsgLi4uKHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICAgIG91dFtrZXldID0ga2VwdDtcbiAgICB9XG4gICAgcmV0dXJuIChvdXQgPz8gcmVjb3JkKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgQk9VTkRBUlkgcmVjb3JkIOKAlCByb290IGlucHV0L291dHB1dCBhbmQgYSBzdWJmbG93J3NcbiAgICogbWFwcGVkIHNlZWQsIGJlZm9yZSBhbnkgb2JzZXJ2ZXIgc2VlcyBpdC4ge0BsaW5rIHJldGFpblJlY29yZH0gZGVjaWRlcyBlYWNoXG4gICAqIHRvcCBrZXk7IHRoZW4gZXZlcnkgTkVTVEVEIG93biBrZXkgaXMgYSBrZXkgdG9vOiBzZWNyZXQgd2hlbiBpdHMgb3duIG5hbWVcbiAgICogb3IgaXRzIGRvdHRlZCBwYXRoIGlzIHJlZGFjdGVkIGF0IGtleSBsZXZlbCAoYGtleXM6IFsnc2VjcmV0J11gIGNvdmVyc1xuICAgKiBgeyB3cmFwcGVyOiB7IHNlY3JldCB9IH1gOyBhIHJvb3QgYXJyYXkncyBlbGVtZW50cyBhcmUgd2Fsa2VkIHRoZSBzYW1lXG4gICAqIHdheSksIGFuZCBpdHMgZGVjbGFyZWQgYGZpZWxkc2Agc2NydWJiZWQgaW5zaWRlIGl0IChgZmllbGRzOiB7IHByb2ZpbGU6XG4gICAqIFsndG9rZW4nXSB9YCBjb3ZlcnMgYHsgd3JhcHBlcjogeyBwcm9maWxlOiB7IHRva2VuIH0gfSB9YCkuIERlY2lkZWQgcGVyXG4gICAqIFBBVEgsIGNvcHktb24td3JpdGUgcGVyIHBhdGggKHtAbGluayBzZXJ2ZWRCeVBhdGh9KTogYW4gb2JqZWN0IHNoYXJlZCBieVxuICAgKiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBvbmUgYSBwYXRoIHJ1bGUgbmFtZXMgYW5kIHNlcnZlZCBhcyBpdCBpcyBhdFxuICAgKiB0aGUgb3RoZXI7IGEgY3ljbGUgZWRnZSBsYW5kcyBvbiB0aGUgc2VydmVkIGNvcHksIG5ldmVyIG9uIGFuIHVuc2NydWJiZWRcbiAgICogb3JpZ2luYWw7IHRoZSBsaXZlIHZhbHVlIGlzIG5ldmVyIHRvdWNoZWQuIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHdoZW5cbiAgICogbm90aGluZyBuZXN0ZWQgaXMgc2VjcmV0LCBhbmQgYW4gaW5lcnQgcnVsZSBlbnVtZXJhdGVzIG5vdGhpbmcuIFN0YXRlXG4gICAqIGtlZXBzIGl0cyBvd24gcGF0aCB2ZXJkaWN0cyAoe0BsaW5rIHZlcmRpY3R9KTsgdGhpcyB3YWxrIGlzIGZvciByZWNvcmRzXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUuXG4gICAqL1xuICByZXRhaW5Cb3VuZGFyeTxUPihyZWNvcmQ6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIC8vIEEgbWFza2VkIHN0YWdlIGVycm9yIGluc2lkZSB0aGUgcmVjb3JkIChhIGZvcmsgZW52ZWxvcGUncyBgcmVzdWx0YCkgaXNcbiAgICAvLyBzZXJ2ZWQgaW4gaXRzIG1hc2tlZCBmb3JtOiBhbiBFcnJvcidzIG1lc3NhZ2UgaXMgbm9uLWVudW1lcmFibGUgYW5kIGFcbiAgICAvLyB0aHJvd24gc3RyaW5nIGlzIGEgcGxhaW4gdmFsdWUsIHNvIG5vIGtleSB3YWxrIHNlZXMgZWl0aGVyLlxuICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMubWFza2VkRXJyb3JzPy5zaXplID8gKHRoaXMud2l0aFNlcnZlZEVycm9ycyhyZWNvcmQpIGFzIFQpIDogcmVjb3JkO1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCBzZXJ2ZWQgPT09IG51bGwgfHwgdHlwZW9mIHNlcnZlZCAhPT0gJ29iamVjdCcpIHJldHVybiBzZXJ2ZWQ7XG4gICAgY29uc3QgdG9wID0gdGhpcy5yZXRhaW5SZWNvcmQoc2VydmVkLCBwbGFjZWhvbGRlcikgYXMgdW5rbm93biBhcyBvYmplY3Q7XG4gICAgLy8gQmVsb3cgdGhlIHRvcCBrZXlzLCBvbmUgZGVjaXNpb24gcGVyIFBBVEggKHRoZSB3aG9sZSByZWNvcmQgaXMgdGhlIHdhbGsncyByb290LCBzbyBhIGN5Y2xlXG4gICAgLy8gYmFjayB0byBpdCBsYW5kcyBvbiB0aGUgc2VydmVkIGNvcHkpLlxuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgodG9wLCB1bmRlZmluZWQsIHRoaXMuZG90dGVkVGFyZ2V0cyh1bmRlZmluZWQpLCB0aGlzLm5hbWVzV2Fsayh0cnVlKSwgcGxhY2Vob2xkZXIpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ29weS1vbi13cml0ZSBvdmVyIGNvbnRhaW5lcnM6IGV2ZXJ5IHJlbWVtYmVyZWQgbWFza2VkIGVycm9yIGJlY29tZXMgaXRzXG4gICAqIHNlcnZlZCBmb3JtIOKAlCBhbiBvYmplY3QgZXJyb3IgaXRzIG1hc2tlZCBzdHJ1Y3R1cmVkIGluZm8sIGEgdGhyb3duXG4gICAqIHN0cmluZy9udW1iZXIgaXRzIG1hc2tlZCB0ZXh0ICh0aGUgdmFsdWUga2VlcHMgYmVpbmcgYSBzY2FsYXIpLiBBIHNjYWxhciBpc1xuICAgKiBtYXRjaGVkIGJ5IFZBTFVFLCBzbyBhbiB1bnJlbGF0ZWQgZmllbGQgdGhhdCBoYXBwZW5zIHRvIGVxdWFsIGEgbWFza2VkXG4gICAqIHRocm93biBzdHJpbmcgaXMgbWFza2VkIHRvbzogb3Zlci1tYXNraW5nIGlzIHRoZSBzYWZlIGRpcmVjdGlvbi5cbiAgICogYHVuZGVmaW5lZGAvYG51bGxgL2Jvb2xlYW5zIGFyZSBuZXZlciBzd2FwcGVkIOKAlCB0aGV5IGNhcnJ5IG5vIHRleHQsIGFuZFxuICAgKiBzd2FwcGluZyB0aGVtIHdvdWxkIHJld3JpdGUgb3JkaW5hcnkgZGF0YSBzaGFwZXMuXG4gICAqXG4gICAqIENZQ0xFLVNBRkUgKHJldmlldyBmaW5kaW5nIDIpLiBUaGUgY29udGFpbmVycyB0aGF0IGNhbiBSRUFDSCBhIG1hc2tlZFxuICAgKiBlcnJvciBhcmUgZm91bmQgZmlyc3QgKHtAbGluayByZWFjaGluZ01hc2tlZEVycm9yc30g4oCUIHRoZSB3aG9sZSByZWFjaGFibGVcbiAgICogZ3JhcGgsIGN5Y2xlcyBpbmNsdWRlZCk7IGVhY2ggb2YgdGhlbSBpcyBjb3BpZWQsIGl0cyBjb3B5IGFsbG9jYXRlZCBhbmRcbiAgICogcmVtZW1iZXJlZCBCRUZPUkUgaXRzIGNoaWxkcmVuIGFyZSBmaWxsZWQsIHNvIGFuIGVkZ2UgYmFjayB0byBpdCDigJQgYSBjeWNsZVxuICAgKiDigJQgbGFuZHMgb24gdGhlIGNvcHksIG5ldmVyIG9uIHRoZSBvcmlnaW5hbCB0aGF0IHN0aWxsIGhvbGRzIHRoZSByYXcgZXJyb3IuXG4gICAqIEV2ZXJ5IG90aGVyIGNvbnRhaW5lciBrZWVwcyBpdHMgaWRlbnRpdHkuXG4gICAqL1xuICBwcml2YXRlIHdpdGhTZXJ2ZWRFcnJvcnModmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBsZWFmID0gdGhpcy5zZXJ2ZWRMZWFmKHZhbHVlKTtcbiAgICBpZiAobGVhZiAhPT0gS0VFUCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbGVhZiA9PT0gS0VFUCA/IHZhbHVlIDogbGVhZjtcbiAgICBjb25zdCByZWFjaGluZyA9IHRoaXMucmVhY2hpbmdNYXNrZWRFcnJvcnModmFsdWUpO1xuICAgIGlmICghcmVhY2hpbmcuaGFzKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IGNvcGllcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBjb25zdCBjb3B5T2YgPSAobm9kZTogb2JqZWN0KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgY29uc3Qga25vd24gPSBjb3BpZXMuZ2V0KG5vZGUpO1xuICAgICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcbiAgICAgIGNvbnN0IGNvcHkgPSAoQXJyYXkuaXNBcnJheShub2RlKSA/IG5vZGUuc2xpY2UoKSA6IHsgLi4ubm9kZSB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvcGllcy5zZXQobm9kZSwgY29weSk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSB0aGlzLnNlcnZlZExlYWYoY2hpbGQpO1xuICAgICAgICBpZiAoc2VydmVkICE9PSBLRUVQKSBjb3B5W2tleV0gPSBzZXJ2ZWQ7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgcmVhY2hpbmcuaGFzKGNoaWxkKSkgY29weVtrZXldID0gY29weU9mKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3B5O1xuICAgIH07XG4gICAgcmV0dXJuIGNvcHlPZih2YWx1ZSk7XG4gIH1cblxuICAvKiogQSBtYXNrZWQgZXJyb3IncyBzZXJ2ZWQgZm9ybSDigJQgYEtFRVBgIGZvciBhbnl0aGluZyBlbHNlIChhIHNjYWxhciBuZXZlciBzd2FwcGVkLCBhIGNvbnRhaW5lcikuICovXG4gIHByaXZhdGUgc2VydmVkTGVhZih2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gS0VFUDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcnM/LmdldCh2YWx1ZSk7XG4gICAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IEtFRVA7XG4gICAgfVxuICAgIGNvbnN0IHN3YXBwYWJsZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnO1xuICAgIGNvbnN0IG1hc2tlZCA9IHN3YXBwYWJsZSA/IHRoaXMubWFza2VkRXJyb3JzPy5nZXQodmFsdWUpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBtYXNrZWQgPyBtYXNrZWQubWVzc2FnZSA6IEtFRVA7XG4gIH1cblxuICAvKiogRXZlcnkgY29udGFpbmVyIHVuZGVyIGByb290YCAoaXRzZWxmIGluY2x1ZGVkKSBmcm9tIHdoaWNoIHNvbWUgcGF0aCByZWFjaGVzIGEgbWFza2VkIGVycm9yLiAqL1xuICBwcml2YXRlIHJlYWNoaW5nTWFza2VkRXJyb3JzKHJvb3Q6IG9iamVjdCk6IFNldDxvYmplY3Q+IHtcbiAgICBjb25zdCBwYXJlbnRzID0gbmV3IE1hcDxvYmplY3QsIG9iamVjdFtdPigpO1xuICAgIGNvbnN0IGhvbGRlcnM6IG9iamVjdFtdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8b2JqZWN0Pihbcm9vdF0pO1xuICAgIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhub2RlKSkge1xuICAgICAgICBpZiAodGhpcy5zZXJ2ZWRMZWFmKGNoaWxkKSAhPT0gS0VFUCkge1xuICAgICAgICAgIGhvbGRlcnMucHVzaChub2RlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9mID0gcGFyZW50cy5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAob2YgPT09IHVuZGVmaW5lZCkgcGFyZW50cy5zZXQoY2hpbGQsIFtub2RlXSk7XG4gICAgICAgIGVsc2Ugb2YucHVzaChub2RlKTtcbiAgICAgICAgaWYgKCFzZWVuLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChjaGlsZCk7XG4gICAgICAgICAgc3RhY2sucHVzaChjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVhY2hpbmcgPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgICB3aGlsZSAoaG9sZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gaG9sZGVycy5wb3AoKSE7XG4gICAgICBpZiAocmVhY2hpbmcuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICAgIHJlYWNoaW5nLmFkZChub2RlKTtcbiAgICAgIGhvbGRlcnMucHVzaCguLi4ocGFyZW50cy5nZXQobm9kZSkgPz8gW10pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYWNoaW5nO1xuICB9XG5cbiAgLyoqIERvZXMgYHZhbHVlYCBob2xkIG9uZSBvZiBgcGF0aHNgIOKAlCBhbiBvd24ga2V5IG9mIHRoYXQgbmFtZSwgb3IgYSBkb3R0ZWQgcGF0aCBpbnNpZGUgaXQ/ICovXG4gIHN0YXRpYyBob2xkc1BhdGhzKHZhbHVlOiBvYmplY3QsIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmIChwYXRocyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBwYXRoKSB8fCAocGF0aC5pbmNsdWRlcygnLicpICYmIG5hdGl2ZUhhcyh2YWx1ZSwgcGF0aCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSB3aG9sZSBTVEFURSDigJQge0BsaW5rIHJldGFpblJlY29yZH0gb3ZlciB0aGUgcm9vdFxuICAgKiBrZXlzIEFORCBvdmVyIGV2ZXJ5IHJ1biBuYW1lc3BhY2UgdW5kZXIgYHJ1bnNgIChmb3JrIGNoaWxkcmVuIHdyaXRlXG4gICAqIHRoZXJlOyBhIGNoZWNrcG9pbnQncyBgc2hhcmVkU3RhdGVgIGNhcnJpZXMgaXQgYmFjayBhcyBhIHNlZWQpLiBUaGlzIGlzXG4gICAqIHdoYXQgc2VlZHMgdGhlIHJlZGFjdGVkIG1pcnJvcjogdGhlIHN0b3JlJ3Mgc3RhcnRpbmcgc3RhdGUsIHNjcnViYmVkXG4gICAqIHdpdGggdGhlIGxvZydzIHBsYWNlaG9sZGVyLCBzbyBhIHBvbGljeSBrZXkgdGhhdCBhcnJpdmVzIGJ5IHNlZWQgYW5kIGlzXG4gICAqIG5ldmVyIHJlLXdyaXR0ZW4gaXMgc3RpbGwgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci5cbiAgICovXG4gIHJldGFpblN0YXRlPFQ+KHN0YXRlOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5yZXRhaW5SZWNvcmQoc3RhdGUsIHBsYWNlaG9sZGVyKTtcbiAgICBpZiAoa2VwdCA9PT0gbnVsbCB8fCB0eXBlb2Yga2VwdCAhPT0gJ29iamVjdCcpIHJldHVybiBrZXB0O1xuICAgIGNvbnN0IHJ1bnMgPSAoa2VwdCBhcyB7IHJ1bnM/OiB1bmtub3duIH0pLnJ1bnM7XG4gICAgaWYgKHJ1bnMgPT09IG51bGwgfHwgdHlwZW9mIHJ1bnMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocnVucykpIHJldHVybiBrZXB0O1xuICAgIGxldCBzY3J1YmJlZFJ1bnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3J1bklkLCByZWNvcmRdIG9mIE9iamVjdC5lbnRyaWVzKHJ1bnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICBjb25zdCBrZXB0UnVuID0gdGhpcy5yZXRhaW5SZWNvcmQocmVjb3JkLCBwbGFjZWhvbGRlcik7XG4gICAgICBpZiAoa2VwdFJ1biA9PT0gcmVjb3JkKSBjb250aW51ZTtcbiAgICAgIHNjcnViYmVkUnVucyA/Pz0geyAuLi4ocnVucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICAgIHNjcnViYmVkUnVuc1tydW5JZF0gPSBrZXB0UnVuO1xuICAgIH1cbiAgICByZXR1cm4gc2NydWJiZWRSdW5zID09PSB1bmRlZmluZWQgPyBrZXB0IDogKHsgLi4uKGtlcHQgYXMgb2JqZWN0KSwgcnVuczogc2NydWJiZWRSdW5zIH0gYXMgVCk7XG4gIH1cblxuICAvKiogQXBwbHkgYSB2ZXJkaWN0IHRvIGEgdmFsdWUg4oCUIHNlZSB7QGxpbmsgcmV0YWlufS4gKi9cbiAgc3RhdGljIGFwcGx5KHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsIHZhbHVlOiB1bmtub3duLCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiB1bmtub3duIHtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIHJldHVybiBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzLCBwbGFjZWhvbGRlcikgPz8gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZGVlcCBjbG9uZSBvZiBgdmFsdWVgIHdpdGggdGhlIGdpdmVuIGRvdC1wYXRocyByZXBsYWNlZCBieSB0aGVcbiAgICogcGxhY2Vob2xkZXIg4oCUIGB1bmRlZmluZWRgIHdoZW4gYHZhbHVlYCBpcyBub3QgYW4gb2JqZWN0ICh0aGVyZSBpcyBub3RoaW5nXG4gICAqIHRvIHNjcnViIGluIGEgc2NhbGFyOyB0aGUgY2FsbGVyIGtlZXBzIHRoZSB2YWx1ZSkuIFRoZSBjbG9uZSByZWZ1c2VzIGFuXG4gICAqIHVuY2xvbmVhYmxlIHZhbHVlLiBBIHBhdGggbmFtZXMgYSBsaXRlcmFsIGtleSAoYCdhLmInYCBhcyBvbmUgcHJvcGVydHkpXG4gICAqIGFuZCwgd2hlbiBkb3R0ZWQsIHRoZSBuZXN0ZWQgcGF0aDsgZWFjaCBpcyBzY3J1YmJlZCB3aGVyZSBpdCBleGlzdHMsIHBlclxuICAgKiBQQVRIIOKAlCBhIG5vZGUgdGhlIGNsb25lIHNoYXJlcyBiZXR3ZWVuIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG5hbWVkXG4gICAqIG9uZSBvbmx5ICh7QGxpbmsgc2VydmVkQnlQYXRofSkuIFBhdGhzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBpZ25vcmVkIOKAlFxuICAgKiBzY3J1YmJpbmcgbmV2ZXIgaW52ZW50cyBhIGZpZWxkLlxuICAgKi9cbiAgc3RhdGljIHNjcnViRmllbGRzKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBUaGUgY2xvbmUgZGV0YWNoZXMgdGhlIHJldGFpbmVkIHZhbHVlIChhbmQgcmVmdXNlcyBhbiB1bmNsb25lYWJsZSBvbmUpOyB0aGUgc2NydWIgb24gaXQgaXNcbiAgICAvLyBkZWNpZGVkIHBlciBQQVRILCBzbyBhIG5vZGUgdGhlIGNsb25lIHNoYXJlcyBiZXR3ZWVuIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG5hbWVkIG9uZSBvbmx5LlxuICAgIGNvbnN0IGNvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpIGFzIG9iamVjdDtcbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKFxuICAgICAgY29weSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhcmdldHNPZihwYXRocyksXG4gICAgICB7IHJvb3REZWNpZGVkOiBmYWxzZSwgbWVtbzogbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4oKSwgYnVkZ2V0OiB3YWxrTGltaXQgfSxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnBvbGljeT8uZmllbGRzID8/IHt9KSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zW2tleV0gPSBbLi4uZmllbGRzXTtcbiAgICB9XG4gICAgLy8gRmllbGRzIGEgbWFwcGVyIGhhbmRlZCB0byBhIG5ldyBrZXkgYXJlIHNjcnViYmVkIHVuZGVyIHRoYXQga2V5IHRvby5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5pbmhlcml0ZWQgPz8gW10pIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9uc1trZXldID0gWy4uLm5ldyBTZXQoWy4uLihmaWVsZFJlZGFjdGlvbnNba2V5XSA/PyBbXSksIC4uLmZpZWxkc10pXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMubWFya2VkXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9ucyxcbiAgICAgIHBhdHRlcm5zOiAodGhpcy5wb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5tYXAoKHApID0+IHAuc291cmNlKSxcbiAgICB9O1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgCBUaGUgcGF0aCB3YWxrIOKAlCBvbmUgZGVjaXNpb24gcGVyIFBBVEgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gQSBydWxlIHRoYXQgbmFtZXMgYSBQQVRIIChhIGRvdHRlZCBrZXksIGEgcGF0dGVybiwgYSBmaWVsZCkgbXVzdCBiZSBleGFjdFxuLy8gZXZlbiB3aGVuIG9uZSBvYmplY3QgaXMgcmVhY2hhYmxlIGF0IHR3byBwYXRoczogdGhlIGRlY2lzaW9uIGlzIG1hZGUgcGVyXG4vLyBwYXRoLCBuZXZlciBwZXIgb2JqZWN0LCBhbmQgYSBjb3B5IGlzIG1hZGUgcGVyIHBhdGggKGNvcHktb24td3JpdGUpIOKAlCBuZXZlclxuLy8gYSBzY3J1YiBpbiBwbGFjZSBvbiBhIG5vZGUgYW5vdGhlciBwYXRoIHN0aWxsIHNob3dzLiBBIGtleS1OQU1FIHJ1bGUgaXMgdGhlXG4vLyBzYW1lIGF0IGV2ZXJ5IHBhdGgsIHNvIGEgc2hhcmVkIG5vZGUgaXQgbWFza3MgaXMgbWFza2VkIGV2ZXJ5d2hlcmUg4oCUIHRoZVxuLy8gc2FmZSBzaWRlLiBBIGN5Y2xlIGVkZ2UgaXMgbm90IGZvbGxvd2VkOiBpdCBpcyBwb2ludGVkIGF0IHRoZSBhbmNlc3RvcidzXG4vLyBzZXJ2ZWQgY29weS5cbi8vXG4vLyBMSU5FQVIgT04gQSBEQUcuIERvdHRlZCBrZXlzIGFuZCBtYXJrcyBhcmUgd2Fsa2VkIGFzIFRBUkdFVFMgKHBhdGgtcmVsYXRpdmVcbi8vIHN0YXRlLCBsaWtlIGZpZWxkcyksIGFuZCBhIHBhdHRlcm4gdGhhdCBjYW4gb25seSBtYXRjaCB3aXRoaW4gYSBrZXkgTkFNRVxuLy8gKHtAbGluayBuZWVkc1BhdGh9IOKAlCB0aGUgY29tbW9uIGNhc2UsIGAvcGFzc3dvcmQvaWApIGlzIGRlY2lkZWQgYnkgdGhlIG5hbWUsXG4vLyBzbyBhIGRlY2lzaW9uIGRlcGVuZHMgb25seSBvbiB0aGUgb2JqZWN0IGFuZCB0aGUgdGFyZ2V0cyBzdGlsbCBsaXZlIGF0IGl0IOKAlFxuLy8gbWVtb2l6ZWQgcGVyIChvYmplY3QsIHRhcmdldHMpOiBhbiBvYmplY3Qgc2hhcmVkIGJ5IG1hbnkgcGF0aHMgKGFuIGFnZW50J3Ncbi8vIGxpbmtlZCBoaXN0b3J5KSBpcyBkZWNpZGVkIG9uY2UsIGFuZCBpdHMgc2VydmVkIGNvcHkgaXMgc2hhcmVkIHRvby4gT25seSBhXG4vLyBnZW51aW5lbHkgUEFUSC1kZXBlbmRlbnQgcGF0dGVybiAoYC9eYVxcLmIkL2ApIHdhbGtzIHBhdGhzOyBwYXN0XG4vLyB7QGxpbmsgV0FMS19MSU1JVH0gcGF0aCB2aXNpdHMgc3VjaCBhIHdhbGsgc2VydmVzIHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGFzXG4vLyB0aGUgcGxhY2Vob2xkZXIgKHRoZSBzYWZlIHNpZGUpLCB3YXJucyBvbmNlIGluIGRldiBtb2RlLCBhbmQgbmV2ZXIgZmFpbHMuXG5cbi8qKiBBIGZpZWxkIHN0aWxsIHRvIHJlYWNoIGJlbG93IGEgbm9kZTogdGhlIHBhdGggc2VnbWVudHMgbGVmdCB0byB3YWxrLiAqL1xudHlwZSBUYXJnZXQgPSByZWFkb25seSBzdHJpbmdbXTtcblxuLyoqIEhvdyBhIHdhbGsgZGVjaWRlcyBhbiBlZGdlLiAqL1xuaW50ZXJmYWNlIFdhbGsge1xuICAvKiogS2V5LWxldmVsIHJ1bGVzIGF0IGV2ZXJ5IG5lc3RlZCBrZXkg4oCUIGFic2VudCBmb3IgYSBiYXJlIGZpZWxkIHNjcnViICh0YXJnZXRzIG9ubHkpLiAqL1xuICByZWFkb25seSBuYW1lcz86IHtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYXQgdGhpcyBuZXN0ZWQga2V5IGJ5IGl0cyBvd24gTkFNRSAobWFya3MsIGtleXMsIHBhdHRlcm5zKS4gKi9cbiAgICBtYXNrcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIC8qKiBTZWxlY3RlZCB3aG9sZSBieSB0aGUgZG90dGVkIFBBVEgg4oCUIHByZXNlbnQgb25seSB1bmRlciBwYXR0ZXJucyAoYSBwYXR0ZXJuIGlzIHRlc3RlZCBvbiB0aGUgcGF0aCkuICovXG4gICAgcGF0aE1hc2tzPyhwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIC8qKiBUaGUgZGVjbGFyZWQgZmllbGRzIGJlbG93IGEga2V5IG9mIHRoaXMgbmFtZS4gKi9cbiAgICBmaWVsZHMobmFtZTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBUaGUgcm9vdCdzIG93biBrZXlzIHdlcmUgZGVjaWRlZCBieSB0aGUgY2FsbGVyIChgcmV0YWluUmVjb3JkYCk6IHdhbGsgYmVsb3cgdGhlbSBvbmx5LiAqL1xuICByZWFkb25seSByb290RGVjaWRlZDogYm9vbGVhbjtcbiAgLyoqIERlY2lzaW9ucyBzaGFyZWQgcGVyIChvYmplY3QsIHRhcmdldHMpIOKAlCBhYnNlbnQgd2hlbiBhIGRlY2lzaW9uIGRlcGVuZHMgb24gdGhlIHBhdGguICovXG4gIHJlYWRvbmx5IG1lbW8/OiBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogUGF0aCB2aXNpdHMgbGVmdC4gKi9cbiAgYnVkZ2V0OiBudW1iZXI7XG4gIC8qKiBUb2xkIG9uY2Ugd2hlbiB0aGUgd2FsayBwYXNzZXMgaXRzIGxpbWl0LiAqL1xuICByZWFkb25seSBvbkxpbWl0PzogKCkgPT4gdm9pZDtcbiAgLyoqIFRoZSB3YWxrIGhhcyBwYXNzZWQgaXRzIGxpbWl0OiB3aGF0IGl0IGhhcyBub3QgdmlzaXRlZCBpcyBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBsaW1pdGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXRoIHZpc2l0cyBvbmUgd2FsayBtYXkgbWFrZSDigJQgcmVhY2hhYmxlIG9ubHkgdW5kZXIgYSBQQVRILWRlcGVuZGVudFxuICogcGF0dGVybiBvdmVyIGEgdmFsdWUgd2hvc2UgcGF0aHMgb3V0bnVtYmVyIGl0cyBvYmplY3RzIChhIGxpbmtlZCBoaXN0b3J5LCBhXG4gKiBEQUcpOiBldmVyeSBvdGhlciB3YWxrIHNoYXJlcyBpdHMgZGVjaXNpb25zIHBlciBvYmplY3QgYW5kIHN0YXlzIGxpbmVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IFdBTEtfTElNSVQgPSAxXzAwMF8wMDA7XG5cbi8qKiBUaGUgbGltaXQgd2Fsa3MgdXNlOiB7QGxpbmsgV0FMS19MSU1JVH0sIHVubGVzcyBhIHRlc3QgbG93ZXJlZCBpdCAoe0BsaW5rIHVzZVdhbGtMaW1pdH0pLiAqL1xubGV0IHdhbGtMaW1pdDogbnVtYmVyID0gV0FMS19MSU1JVDtcblxuLyoqXG4gKiBAaW50ZXJuYWwgVGVzdHMgb25seSDigJQgbm90IG9uIGFueSBwdWJsaWMgZG9vcjogd2Fsa3MgdXNlIGBsaW1pdGAgdW50aWwgdGhlXG4gKiByZXR1cm5lZCByZXN0b3JlIGlzIGNhbGxlZCwgc28gYSB0ZXN0IHJlYWNoZXMgdGhlIG92ZXItbGltaXQgcGF0aCBpbiBhXG4gKiB0aG91c2FuZCB2aXNpdHMgaW5zdGVhZCBvZiBhIG1pbGxpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VXYWxrTGltaXQobGltaXQ6IG51bWJlcik6ICgpID0+IHZvaWQge1xuICBjb25zdCBwcmlvciA9IHdhbGtMaW1pdDtcbiAgd2Fsa0xpbWl0ID0gbGltaXQ7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgd2Fsa0xpbWl0ID0gcHJpb3I7XG4gIH07XG59XG5cbi8qKlxuICogQ2FuIGBwYXR0ZXJuYCBtYXRjaCBhIGRvdHRlZCBQQVRIIHdoZXJlIGl0IG1hdGNoZXMgbm9uZSBvZiB0aGUgcGF0aCdzXG4gKiBzZWdtZW50IE5BTUVTPyBPbmx5IHRocm91Z2ggYSBjb25zdHJ1Y3QgdGhhdCBjYW4gbWF0Y2ggb3IgdGVzdCB0aGUgYC5gXG4gKiBiZXR3ZWVuIHNlZ21lbnRzOiBgLmAgaXRzZWxmLCBhbiBlc2NhcGUgdGhhdCBjYW4gc3RhbmQgZm9yIGl0IChgXFxXIFxcUyBcXERcbiAqIFxcQiBcXHAgXFxQIFxcdSBcXHggXFxjYCwgYSBkaWdpdCBlc2NhcGUpLCBhIG5lZ2F0ZWQgY2xhc3MsIGEgY2xhc3MgcmFuZ2UgdGhhdFxuICogc3BhbnMgYC5gLCBhIGxvb2thcm91bmQgb3IgYSBuYW1lZCBncm91cC4gQW55dGhpbmcgZWxzZSBtYXRjaGVzIGEgcGF0aCBvbmx5XG4gKiBpbnNpZGUgb25lIHNlZ21lbnQg4oCUIGFuZCBhbiBhbmNlc3RvciB3aG9zZSBOQU1FIG1hdGNoZXMgaXMgbWFza2VkIHdob2xlXG4gKiBiZWZvcmUgdGhlIHdhbGsgZ29lcyBiZWxvdyBpdCwgc28gdGhlIG5hbWUgZGVjaWRlcy4gQ29uc2VydmF0aXZlOiBgdHJ1ZWBcbiAqIHdoZW5ldmVyIGluIGRvdWJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNQYXRoKHBhdHRlcm46IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2UgPSBwYXR0ZXJuLnNvdXJjZTtcbiAgaWYgKC9cXC58XFxcXFtXU0RCcFB1eGMwLTldfFxcW1xcXnxcXChcXD9bPSE8XS8udGVzdChzb3VyY2UpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBbLCBib2R5XSBvZiBzb3VyY2UubWF0Y2hBbGwoL1xcWygoPzpcXFxcW1xcc1xcU118W15cXF1cXFxcXSkqKVxcXS9nKSkge1xuICAgIGZvciAoY29uc3QgWywgbG93LCBoaWdoXSBvZiBib2R5Lm1hdGNoQWxsKC8oXFxcXD9bXFxzXFxTXSktKFxcXFw/W1xcc1xcU10pL2cpKSB7XG4gICAgICBpZiAobG93Lmxlbmd0aCA+IDEgfHwgaGlnaC5sZW5ndGggPiAxIHx8IChsb3cgPD0gJy4nICYmIGhpZ2ggPj0gJy4nKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIGBzZXJ2ZWRMZWFmYCdzIGFuc3dlciBmb3IgYSB2YWx1ZSBpdCBsZWF2ZXMgYXMgaXQgaXMuICovXG5jb25zdCBLRUVQOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdrZXB0IGFzIGl0IGlzJyk7XG5cbi8qKiBFYWNoIGZpZWxkIHBhdGggYXMgb25lIGxpdGVyYWwga2V5IGFuZCwgd2hlbiBkb3R0ZWQsIGFzIGl0cyBzZWdtZW50cy4gKi9cbmZ1bmN0aW9uIHRhcmdldHNPZihwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBUYXJnZXRbXSB7XG4gIGNvbnN0IG91dDogVGFyZ2V0W10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzID8/IFtdKSB7XG4gICAgb3V0LnB1c2goW3BhdGhdKTtcbiAgICBpZiAocGF0aC5pbmNsdWRlcygnLicpKSBvdXQucHVzaChwYXRoLnNwbGl0KCcuJykpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgbWVtbyBrZXkgb2YgYSB0YXJnZXQgc3RhdGUg4oCUIG9yZGVyLWZyZWUuICovXG5mdW5jdGlvbiBzaWduYXR1cmVPZih0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0YXJnZXRzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IHRhcmdldHNcbiAgICAgICAgLm1hcCgodCkgPT4gdC5qb2luKCdcXHUwMDFmJykpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLmpvaW4oJ1xcdTAwMWUnKTtcbn1cblxuLyoqIE9uZSBlZGdlJ3MgZGVjaXNpb246IHRoZSB2YWx1ZSB1bmRlciBga2V5YCBpcyBtYXNrZWQgaGVyZSwgb3IgdGhlc2UgdGFyZ2V0cyBjb250aW51ZSBiZWxvdyBpdC4gKi9cbmZ1bmN0aW9uIGRlY2lkZUVkZ2UoXG4gIGtleTogc3RyaW5nLFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIGRlcHRoOiBudW1iZXIsXG4pOiB7IG1hc2tlZDogYm9vbGVhbjsgYmVsb3c6IFRhcmdldFtdIH0ge1xuICBjb25zdCBiZWxvdzogVGFyZ2V0W10gPSBbXTtcbiAgbGV0IG1hc2tlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgaWYgKHRhcmdldFswXSAhPT0ga2V5KSBjb250aW51ZTtcbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMSkgbWFza2VkID0gdHJ1ZTtcbiAgICBlbHNlIGJlbG93LnB1c2godGFyZ2V0LnNsaWNlKDEpKTtcbiAgfVxuICBjb25zdCBuYW1lcyA9IHdhbGsucm9vdERlY2lkZWQgJiYgZGVwdGggPT09IDAgPyB1bmRlZmluZWQgOiB3YWxrLm5hbWVzO1xuICBpZiAobmFtZXMgIT09IHVuZGVmaW5lZCAmJiAhbWFza2VkKSB7XG4gICAgbWFza2VkID1cbiAgICAgIG5hbWVzLm1hc2tzKGtleSkgfHxcbiAgICAgIChuYW1lcy5wYXRoTWFza3MgIT09IHVuZGVmaW5lZCAmJiBkb3R0ZWQgIT09IHVuZGVmaW5lZCAmJiBuYW1lcy5wYXRoTWFza3MoYCR7ZG90dGVkfS4ke2tleX1gKSk7XG4gICAgYmVsb3cucHVzaCguLi50YXJnZXRzT2YobmFtZXMuZmllbGRzKGtleSkpKTtcbiAgfVxuICByZXR1cm4geyBtYXNrZWQsIGJlbG93IH07XG59XG5cbi8qKiBPbmUgc3RlcCBkb3duIGEgd2FsaydzIHBhdGg6IGNvdW50IHRoZSB2aXNpdCDigJQgYGZhbHNlYCBvbmNlIHRoZSB3YWxrIGlzIHBhc3QgaXRzIGxpbWl0LiAqL1xuZnVuY3Rpb24gdmlzaXQod2FsazogV2Fsayk6IGJvb2xlYW4ge1xuICBpZiAoLS13YWxrLmJ1ZGdldCA+PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCF3YWxrLmxpbWl0ZWQpIHtcbiAgICB3YWxrLmxpbWl0ZWQgPSB0cnVlO1xuICAgIHdhbGsub25MaW1pdD8uKCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIElzIGFueXRoaW5nIHNlbGVjdGVkIG9uIHNvbWUgUEFUSCB1bmRlciBgbm9kZWA/IFJlYWQtb25seTsgYSBjeWNsZSBlZGdlIGlzXG4gKiBub3QgZm9sbG93ZWQuIGBiYWNrYCBpcyB0aGUgc2hhbGxvd2VzdCBhbmNlc3RvciBhIHNraXBwZWQgY3ljbGUgZWRnZSBiZWxvd1xuICogcmVhY2hlZCDigJQgYSBgZmFsc2VgIHRoYXQgcmVzdHMgb24gb25lIGlzIG5vdCBzaGFyZWQgKG1lbW8pLlxuICovXG5mdW5jdGlvbiBzZWxlY3RzQnlQYXRoKFxuICBub2RlOiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgYW5jZXN0b3JzOiBNYXA8b2JqZWN0LCBudW1iZXI+LFxuICBkZXB0aDogbnVtYmVyLFxuKTogeyBzZWxlY3RlZDogYm9vbGVhbjsgYmFjazogbnVtYmVyIH0ge1xuICAvLyBQYXN0IHRoZSBsaW1pdDogYXNzdW1lIGEgc2VsZWN0aW9uIOKAlCB0aGUgY29weSBzZXJ2ZXMgdGhlIHVudmlzaXRlZCByZW1haW5kZXIgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICBpZiAoIXZpc2l0KHdhbGspKSByZXR1cm4geyBzZWxlY3RlZDogdHJ1ZSwgYmFjazogSW5maW5pdHkgfTtcbiAgaWYgKHdhbGsubmFtZXMgPT09IHVuZGVmaW5lZCAmJiB0YXJnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgc2VsZWN0ZWQ6IGZhbHNlLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBzaWcgPSB3YWxrLm1lbW8gPyBzaWduYXR1cmVPZih0YXJnZXRzKSA6ICcnO1xuICBjb25zdCBrbm93biA9IHdhbGsubWVtbz8uZ2V0KG5vZGUpPy5nZXQoYHMke3NpZ31gKTtcbiAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiB7IHNlbGVjdGVkOiBrbm93biBhcyBib29sZWFuLCBiYWNrOiBJbmZpbml0eSB9O1xuICBhbmNlc3RvcnMuc2V0KG5vZGUsIGRlcHRoKTtcbiAgbGV0IGJhY2sgPSBJbmZpbml0eTtcbiAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgY29uc3QgZWRnZSA9IGRlY2lkZUVkZ2Uoa2V5LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIGRlcHRoKTtcbiAgICBpZiAoZWRnZS5tYXNrZWQpIHtcbiAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgY29uc3QgYXQgPSBhbmNlc3RvcnMuZ2V0KGNoaWxkKTtcbiAgICBpZiAoYXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGF0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZFBhdGggPSB3YWxrLm5hbWVzPy5wYXRoTWFza3MgPyAoZG90dGVkID09PSB1bmRlZmluZWQgPyBrZXkgOiBgJHtkb3R0ZWR9LiR7a2V5fWApIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJlbG93ID0gc2VsZWN0c0J5UGF0aChjaGlsZCwgY2hpbGRQYXRoID8/IGtleSwgZWRnZS5iZWxvdywgd2FsaywgYW5jZXN0b3JzLCBkZXB0aCArIDEpO1xuICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBiZWxvdy5iYWNrKTtcbiAgICBpZiAoYmVsb3cuc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhbmNlc3RvcnMuZGVsZXRlKG5vZGUpO1xuICBpZiAod2Fsay5tZW1vICYmIChzZWxlY3RlZCB8fCBiYWNrID49IGRlcHRoKSkgcmVtZW1iZXIod2Fsay5tZW1vLCBub2RlLCBgcyR7c2lnfWAsIHNlbGVjdGVkKTtcbiAgcmV0dXJuIHsgc2VsZWN0ZWQsIGJhY2s6IGJhY2sgPCBkZXB0aCA/IGJhY2sgOiBJbmZpbml0eSB9O1xufVxuXG5mdW5jdGlvbiByZW1lbWJlcihtZW1vOiBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+LCBub2RlOiBvYmplY3QsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBsZXQgZW50cmllcyA9IG1lbW8uZ2V0KG5vZGUpO1xuICBpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSBtZW1vLnNldChub2RlLCAoZW50cmllcyA9IG5ldyBNYXAoKSkpO1xuICBlbnRyaWVzLnNldChrZXksIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVkIGNvcHkgb2YgYG5vZGVgLCBjb3B5LW9uLXdyaXRlIFBFUiBQQVRILiBFdmVyeSBjb250YWluZXIgZW50ZXJlZFxuICogZ2V0cyBpdHMgY29weSBCRUZPUkUgaXRzIGNoaWxkcmVuIGFyZSB3YWxrZWQsIHNvIGEgY3ljbGUgZWRnZSBpcyBwb2ludGVkIGF0XG4gKiB0aGUgYW5jZXN0b3IncyBjb3B5IOKAlCBuZXZlciBiYWNrIGF0IGFuIHVuc2NydWJiZWQgb3JpZ2luYWw7IGEgY29udGFpbmVyIGlzXG4gKiBzZXJ2ZWQgYXMgaXRzZWxmIHdoZW4gbm90aGluZyB1bmRlciBpdCBjaGFuZ2VkIGFuZCBubyBjeWNsZSBwYXNzZXMgdGhyb3VnaFxuICogaXQuIEEgcHJ1bmVkIGRlc2NlbnQgKGEgYmFyZSBmaWVsZCBzY3J1YiBvZiBhbiBhY3ljbGljIHZhbHVlKSBza2lwcyBzdWJ0cmVlc1xuICogbm8gdGFyZ2V0IHJlYWNoZXMuIGBiYWNrYCBpcyB0aGUgc2hhbGxvd2VzdCBhbmNlc3RvciBhIGN5Y2xlIGVkZ2UgYmVsb3dcbiAqIHJlYWNoZWQgKGBJbmZpbml0eWA6IG5vbmUpOyBhIGNvcHkgdGhhdCByZXN0cyBvbiBub25lIGlzIHNoYXJlZCAobWVtbykuXG4gKi9cbmZ1bmN0aW9uIGNvcHlCeVBhdGgoXG4gIG5vZGU6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBwbGFjZWhvbGRlcjogc3RyaW5nLFxuICBhbmNlc3RvcnM6IE1hcDxvYmplY3QsIHsgY29weTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGRlcHRoOiBudW1iZXIgfT4sXG4gIGRlcHRoOiBudW1iZXIsXG4gIHBydW5lOiBib29sZWFuLFxuKTogeyBvdXQ6IHVua25vd247IGJhY2s6IG51bWJlciB9IHtcbiAgLy8gUGFzdCB0aGUgbGltaXQ6IHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGlzIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIg4oCUIG5ldmVyIHJhdy5cbiAgaWYgKCF2aXNpdCh3YWxrKSkgcmV0dXJuIHsgb3V0OiBwbGFjZWhvbGRlciwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3Qgc2lnID0gd2Fsay5tZW1vID8gYGMke3NpZ25hdHVyZU9mKHRhcmdldHMpfWAgOiAnJztcbiAgY29uc3Qga25vd24gPSB3YWxrLm1lbW8/LmdldChub2RlKT8uZ2V0KHNpZyk7XG4gIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBvdXQ6IGtub3duLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBmcmFtZSA9IHtcbiAgICBjb3B5OiAoQXJyYXkuaXNBcnJheShub2RlKSA/IG5vZGUuc2xpY2UoKSA6IHsgLi4ubm9kZSB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBkZXB0aCxcbiAgfTtcbiAgYW5jZXN0b3JzLnNldChub2RlLCBmcmFtZSk7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGxldCBiYWNrID0gSW5maW5pdHk7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgY29uc3QgZWRnZSA9IGRlY2lkZUVkZ2Uoa2V5LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIGRlcHRoKTtcbiAgICBpZiAoZWRnZS5tYXNrZWQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IHBsYWNlaG9sZGVyO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGFuY2VzdG9yID0gYW5jZXN0b3JzLmdldChjaGlsZCk7XG4gICAgaWYgKGFuY2VzdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IGFuY2VzdG9yLmNvcHk7XG4gICAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYW5jZXN0b3IuZGVwdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcnVuZSAmJiBlZGdlLmJlbG93Lmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgY29uc3QgY2hpbGRQYXRoID0gd2Fsay5uYW1lcz8ucGF0aE1hc2tzID8gKGRvdHRlZCA9PT0gdW5kZWZpbmVkID8ga2V5IDogYCR7ZG90dGVkfS4ke2tleX1gKSA6IGtleTtcbiAgICBjb25zdCBiZWxvdyA9IGNvcHlCeVBhdGgoY2hpbGQsIGNoaWxkUGF0aCwgZWRnZS5iZWxvdywgd2FsaywgcGxhY2Vob2xkZXIsIGFuY2VzdG9ycywgZGVwdGggKyAxLCBwcnVuZSk7XG4gICAgaWYgKGJlbG93Lm91dCAhPT0gY2hpbGQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IGJlbG93Lm91dDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYmVsb3cuYmFjayk7XG4gIH1cbiAgYW5jZXN0b3JzLmRlbGV0ZShub2RlKTtcbiAgY29uc3Qgb3V0ID0gY2hhbmdlZCB8fCBiYWNrIDw9IGRlcHRoID8gZnJhbWUuY29weSA6IG5vZGU7XG4gIGlmICh3YWxrLm1lbW8gJiYgYmFjayA+PSBkZXB0aCkgcmVtZW1iZXIod2Fsay5tZW1vLCBub2RlLCBzaWcsIG91dCk7XG4gIHJldHVybiB7IG91dCwgYmFjazogYmFjayA8IGRlcHRoID8gYmFjayA6IEluZmluaXR5IH07XG59XG5cbi8qKiBEb2VzIGFueSBwYXRoIGZyb20gYHJvb3RgIGNvbWUgYmFjayB0byBhbiBvYmplY3Qgb24gaXQ/ICovXG5mdW5jdGlvbiBoYXNDeWNsZShyb290OiBvYmplY3QpOiBib29sZWFuIHtcbiAgY29uc3QgZG9uZSA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgY29uc3Qgb25QYXRoID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gIGNvbnN0IHZpc2l0Tm9kZSA9IChub2RlOiBvYmplY3QpOiBib29sZWFuID0+IHtcbiAgICBpZiAob25QYXRoLmhhcyhub2RlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGRvbmUuaGFzKG5vZGUpKSByZXR1cm4gZmFsc2U7XG4gICAgb25QYXRoLmFkZChub2RlKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXMobm9kZSkpIHtcbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmIHZpc2l0Tm9kZShjaGlsZCkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBvblBhdGguZGVsZXRlKG5vZGUpO1xuICAgIGRvbmUuYWRkKG5vZGUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgcmV0dXJuIHZpc2l0Tm9kZShyb290KTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVkIGZvcm0gb2YgYHJvb3RgIHVuZGVyIGEgd2FsazogYHJvb3RgIGl0c2VsZiB3aGVuIG5vIHBhdGggc2VsZWN0c1xuICogYW55dGhpbmcsIGVsc2UgaXRzIGNvcHktb24td3JpdGUgY29weSAocGFzdCB0aGUgd2FsayBsaW1pdCwgaXRzIHVudmlzaXRlZFxuICogcmVtYWluZGVyIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIpLiBUaHJvd3Mg4oCUIHRoZSBjYWxsZXIgcmVmdXNlcyB0byBzZXJ2ZVxuICog4oCUIG9uIGFuIGVudW1lcmFibGUgZ2V0dGVyIHRoYXQgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBzZXJ2ZWRCeVBhdGgoXG4gIHJvb3Q6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBwbGFjZWhvbGRlcjogc3RyaW5nLFxuKTogdW5rbm93biB7XG4gIGlmICghc2VsZWN0c0J5UGF0aChyb290LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIG5ldyBNYXAoKSwgMCkuc2VsZWN0ZWQpIHJldHVybiByb290O1xuICB3YWxrLmJ1ZGdldCA9IHdhbGtMaW1pdDtcbiAgLy8gQSBiYXJlIGZpZWxkIHNjcnViIG9mIGFuIGFjeWNsaWMgdmFsdWUgd2Fsa3MgaXRzIHRhcmdldHMgb25seTogbm8gY3ljbGUgY2FuIGJyaW5nIGFuXG4gIC8vIHVuc2NydWJiZWQgb3JpZ2luYWwgYmFjay4gRXZlcnkgb3RoZXIgd2FsayB2aXNpdHMgZXZlcnkgcGF0aCAoYSBjeWNsZSBlZGdlIGFueXdoZXJlXG4gIC8vIG11c3QgbGFuZCBvbiBhIHNlcnZlZCBjb3B5KS5cbiAgY29uc3QgcHJ1bmUgPSB3YWxrLm5hbWVzID09PSB1bmRlZmluZWQgJiYgIWhhc0N5Y2xlKHJvb3QpO1xuICByZXR1cm4gY29weUJ5UGF0aChyb290LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIHBsYWNlaG9sZGVyLCBuZXcgTWFwKCksIDAsIHBydW5lKS5vdXQ7XG59XG5cbi8qKiBBIHBsYWluIHJlY29yZCDigJQgdGhlIG9ubHkgc2hhcGUgYSBtYXBwZXIgaXMgaGFuZGVkIGFzIGEgcmVjb3JkaW5nIHZpZXcgKGEgY2xhc3MgaW5zdGFuY2Uga2VlcHMgaXRzIHByb3RvdHlwZSkuICovXG5mdW5jdGlvbiBpc1BsYWluUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuLyoqIFRoZSBzdHJpY3RlciBvZiB0d28gdmVyZGljdHMgb24gdGhlIHNhbWUgdmFsdWU6IHdob2xlIG92ZXIgZmllbGRzIG92ZXIgY2xlYXI7IGZpZWxkcyB1bml0ZS4gKi9cbmZ1bmN0aW9uIHN0cmljdGVyKGE6IFJlZGFjdGlvblZlcmRpY3QgfCB1bmRlZmluZWQsIGI6IFJlZGFjdGlvblZlcmRpY3QpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgaWYgKGEgPT09IHVuZGVmaW5lZCB8fCBhLmtpbmQgPT09ICdjbGVhcicgfHwgYi5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gYjtcbiAgaWYgKGEua2luZCA9PT0gJ3dob2xlJyB8fCBiLmtpbmQgPT09ICdjbGVhcicpIHJldHVybiBhO1xuICByZXR1cm4geyBraW5kOiAnZmllbGRzJywga2V5OiBhLmtleSwgcGF0aHM6IFsuLi5uZXcgU2V0KFsuLi5hLnBhdGhzLCAuLi5iLnBhdGhzXSldIH07XG59XG5cbi8qKlxuICogVEhFIFRBSU5UIFJVTEUgYXQgYSBzdWJmbG93IG1hcHBlciBib3VuZGFyeSAoYW4gYGlucHV0TWFwcGVyYCBzZWVkaW5nIGFcbiAqIHN1YmZsb3csIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdpbmcgaXQgYmFjayk6IGEga2V5IHRoZSBtYXBwZXIgd3JpdGVzXG4gKiBpbmhlcml0cyB0aGUgcmVkYWN0aW9uIG9mIHRoZSBTRUxFQ1RFRCB2YWx1ZSBpdCBjb3BpZWQg4oCUIGEgbWFyayAob3JcbiAqIGluaGVyaXRlZCBmaWVsZHMpLCBieSBuYW1lLCBsaWtlIGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCDigJRcbiAqIHNvIHRoZSBzdWJmbG93J3Mgc2VlZCwgbG9nLCBtaXJyb3IsIHJlYWRzLCBuYXJyYXRpdmUgYW5kIHJlc3VsdHMsIGFuZCB0aGVcbiAqIHBhcmVudCdzIG1lcmdlLWJhY2ssIHJldGFpbiB0aGUgY29weSBhcyB0aGV5IHJldGFpbiBpdHMgc291cmNlLiBEZWNpZGVkIGJ5XG4gKiB3aGljaCB2YWx1ZXMgdGhlIG1hcHBlciBSRUFEOlxuICpcbiAqICAgLSBTQU1FIE5BTUUg4oCUIGEgdmFsdWUgcGFzc2VkIG9uIHVuZGVyIHRoZSBuYW1lIGl0IHdhcyByZWFkIHVuZGVyIGtlZXBzXG4gKiAgICAgdGhhdCBuYW1lJ3MgdmVyZGljdCAoYHsgY291bnQ6IHAuY291bnQgfWAsIGB7IC4uLnAgfWApOiBhIGNsZWFyIHZhbHVlXG4gKiAgICAgc3RheXMgY2xlYXIsIHdoZXJldmVyIGVsc2UgdGhlIG1hcHBlciByZWFkIGEgc2VjcmV0LlxuICogICAtIEVYQUNUIOKAlCBhbiBvdXRwdXQgT0JKRUNUIHRoYXQgSVMgKGJ5IHJlZmVyZW5jZSkgYSB2YWx1ZSB0aGUgbWFwcGVyIHJlYWRcbiAqICAgICBpbmhlcml0cyB0aGF0IGtleSdzIHZlcmRpY3Q6IHdob2xlIHN0YXlzIHdob2xlLCBgZmllbGRzYCBoYW5kIHRoZWlyIHBhdGhzXG4gKiAgICAgdG8gdGhlIG5ldyBrZXksIGNsZWFyIHN0YXlzIGNsZWFyLiBUaGUgcmVjb3JkIHRoZSBtYXBwZXIgd2FzIEhBTkRFRCxcbiAqICAgICBwYXNzZWQgb24gd2hvbGUgKGAocCkgPT4gKHsgY3R4OiBwIH0pYCksIGhhbmRzIGV2ZXJ5IHNlbGVjdGVkIGtleSBvZiBpdFxuICogICAgIHRvIHRoZSBuZXcga2V5IGFzIGEgZmllbGQgKGBjdHgudG9rZW5gKS5cbiAqICAgLSBDT05TRVJWQVRJVkUg4oCUIGFueSBvdGhlciBvdXRwdXQgKGEgcHJpbWl0aXZlIHVuZGVyIGEgbmV3IG5hbWUsIG9yIGFuXG4gKiAgICAgb2JqZWN0IHRoZSBtYXBwZXIgYnVpbHQpIGlzIHNlbGVjdGVkIFdIT0xFIHdoZW4gdGhlIG1hcHBlciByZWFkIGFcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSDigJQgYSB3aG9sZS1zZWxlY3RlZCBrZXksIG9yIGEgc2VsZWN0ZWQgRklFTEQgb2YgYVxuICogICAgIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZCDigJQgb3Igd2hlbiBpdCBlbWJlZHMgYSBzZWxlY3RlZCByZWNvcmQgYnlcbiAqICAgICByZWZlcmVuY2U7IHRoZSBsaWJyYXJ5IGNhbm5vdCB0ZWxsIHdoYXQgYSBjb21wdXRlZCB2YWx1ZSBjYXJyaWVzLlxuICogICAgIChWYWx1ZXMgYXJlIG5ldmVyIG1hdGNoZWQgYnkgRVFVQUxJVFkgYWNyb3NzIG5hbWVzOiBhbiBlcXVhbCBwcmltaXRpdmVcbiAqICAgICB3b3VsZCBvdmVyLW1hdGNoIHVucmVsYXRlZCBrZXlzLilcbiAqXG4gKiBIT1cgRkFSIEEgTUFSSyBSRUFDSEVTOiBhIE5BTUUsIHJ1bi13aWRlLCBmcm9tIHRoZSBtb21lbnQgaXQgaXMgbWFkZSDigJQgZXZlcnlcbiAqIGtleSBvZiB0aGF0IG5hbWUgaW4gdGhlIHN1YmZsb3csIHRoZSBwYXJlbnQsIGEgc2libGluZyBhbmQgZXZlcnkgbGF0ZXIgc3RhZ2VcbiAqIGlzIHNlbGVjdGVkIGluIHdoYXRldmVyIGlzIHNlcnZlZCwgdW50aWwgdGhlIGtleSBpcyBkZWxldGVkOyBhIHBhdXNlIGNhcnJpZXNcbiAqIGl0IHRvIHRoZSByZXN1bWVkIHJ1biAoYEZsb3djaGFydENoZWNrcG9pbnQucmVkYWN0aW9uTWFya3NgKS5cbiAqXG4gKiBBIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZCB0aGF0IGhvbGRzIGEgc2VsZWN0ZWQgZmllbGQgaXMgaGFuZGVkIHRvIHRoZVxuICogbWFwcGVyIGFzIGEgdmlldyBvZiBpdHMgb3duLCBzbyByZWFkaW5nIHRoZSByZWNvcmQgKHRvIHBhc3MgaXQgb24sIG9yIHRvXG4gKiB0ZXN0IGl0cyB0eXBlKSBpcyBub3QgcmVhZGluZyB0aGUgZmllbGQuIFJlYWRpbmcgYHJ1bnNgICh0aGUgbmFtZXNwYWNlIHJvb3RcbiAqIGZvcmsgY2hpbGRyZW4gd3JpdGUgdW5kZXIpIHJlYWRzIGV2ZXJ5IG5hbWVzcGFjZWQga2V5LiBSZWNvcmRpbmcgc3RvcHMgd2hlblxuICogdGhlIG1hcHBlciByZXR1cm5zOyB7QGxpbmsgaW5oZXJpdH0gaGFuZHMgYmFjayB0aGUgb3V0cHV0IHdpdGggZXZlcnkgdmlldyBpdFxuICogcmV0dXJuZWQgc3dhcHBlZCBmb3IgdGhlIHJlY29yZCBiZWhpbmQgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXBwZXJUYWludCB7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGUgbWFwcGVyIHJlYWQg4oaSIHRoZSB2ZXJkaWN0IG9mIHRoZSBrZXkgaXQgcmVhZCBpdCB1bmRlci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VzID0gbmV3IE1hcDxvYmplY3QsIFJlZGFjdGlvblZlcmRpY3Q+KCk7XG4gIC8qKiBFYWNoIGtleSB0aGUgbWFwcGVyIHJlYWQg4oaSIHRoZSB2YWx1ZXMgaXQgcmVhZCB1bmRlciB0aGF0IG5hbWUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd25bXT4oKTtcbiAgLyoqIEVhY2ggYGZpZWxkc2AgdmlldyBoYW5kZWQgb3V0IOKGkiB0aGUgcmVjb3JkIGJlaGluZCBpdCBhbmQgaXRzIHZlcmRpY3QuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3MgPSBuZXcgTWFwPG9iamVjdCwgeyByYXc6IG9iamVjdDsgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCB9PigpO1xuICAvKiogRWFjaCByZWNvcmQgdGhlIG1hcHBlciB3YXMgaGFuZGVkIOKGkiBhcyBhIHZpZXcgKHBhc3NlZCBvbiB3aG9sZSwgaXQgaGFuZHMgb24gaXRzIHNlbGVjdGVkIGtleXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZHMgPSBuZXcgTWFwPG9iamVjdCwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gIC8qKiBUaGUgc2VsZWN0ZWQgdmFsdWVzIHRoZSBtYXBwZXIgcmVhZCAod2hvbGUga2V5cywgc2VsZWN0ZWQgZmllbGRzKSDigJQgd2hhdCBpdCBjb3VsZCBwbGFudCBieSByZWZlcmVuY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjcmV0UmVhZHM6IHVua25vd25bXSA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkUmVhZCA9IGZhbHNlO1xuICBwcml2YXRlIG9wZW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBydWxlOiBSZWRhY3Rpb25SdWxlKSB7fVxuXG4gIC8qKiBgdW5kZWZpbmVkYCB3aGlsZSB0aGUgcnVuJ3MgcnVsZSBpcyBpbmVydCDigJQgbm90aGluZyBhIG1hcHBlciByZWFkcyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gIHN0YXRpYyBvZihydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkKTogTWFwcGVyVGFpbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gbmV3IE1hcHBlclRhaW50KHJ1bGUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvcmQgYSBtYXBwZXIgaXMgaGFuZGVkOiB0aGUgc2FtZSBvd24ga2V5cyBhbmQgdmFsdWVzLCBlYWNoIHJlYWRcbiAgICogcmVjb3JkZWQuIEFuIGFjY2Vzc29yIHBlciBrZXksIG5vdCBhIFByb3h5IOKAlCBhIG1hcHBlciBtYXkgc3ByZWFkLCBjbG9uZSBvclxuICAgKiBzZXJpYWxpemUgd2hhdCBpdCBpcyBoYW5kZWQuIEFuIGFzc2lnbm1lbnQgbGFuZHMgb24gdGhlIHZpZXcsIG5ldmVyIG9uIHRoZVxuICAgKiBsaXZlIHJlY29yZCBiZWhpbmQgaXQuIEFueXRoaW5nIGJ1dCBhIHBsYWluIHJlY29yZCBpcyBoYW5kZWQgb3ZlciBhcyBpdCBpcy5cbiAgICovXG4gIHdhdGNoPFQ+KHJlY29yZDogVCk6IFQge1xuICAgIGlmICghaXNQbGFpblJlY29yZChyZWNvcmQpKSByZXR1cm4gcmVjb3JkO1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdPZihyZWNvcmQsIChrZXkpID0+IHRoaXMuc2VydmVkKGtleSwgcmVjb3JkW2tleV0pKTtcbiAgICB0aGlzLnJlY29yZHMuc2V0KHZpZXcsIHJlY29yZCk7XG4gICAgcmV0dXJuIHZpZXcgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWFwcGVyIHJldHVybmVkIGBvdXRwdXRgOiBldmVyeSBrZXkgaXQgd3JvdGUgaW5oZXJpdHMgd2hhdCBpdCBjb3BpZWRcbiAgICogKHNlZSB0aGUgY2xhc3MpLiBSZXR1cm5zIHRoZSBvdXRwdXQgdG8gdXNlIOKAlCB0aGUgc2FtZSBvYmplY3QgdW5sZXNzIGEgdmlld1xuICAgKiBoYWQgdG8gYmUgc3dhcHBlZCBiYWNrIGZvciB0aGUgcmVjb3JkIGJlaGluZCBpdC5cbiAgICovXG4gIGluaGVyaXQ8VD4ob3V0cHV0OiBUKTogVCB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgaWYgKG91dHB1dCA9PT0gbnVsbCB8fCB0eXBlb2Ygb3V0cHV0ICE9PSAnb2JqZWN0JykgcmV0dXJuIG91dHB1dDtcbiAgICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdXRwdXQpKSB7XG4gICAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcGllZFZlcmRpY3QodGFyZ2V0LCB2YWx1ZSk7XG4gICAgICBpZiAoY29waWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSZWFkIHx8IHRoaXMuZW1iZWRzU2VsZWN0ZWQodmFsdWUsIG5ldyBXZWFrU2V0KCkpKSB0aGlzLnJ1bGUubWFyayh0YXJnZXQpO1xuICAgICAgfSBlbHNlIGlmIChjb3BpZWQua2luZCA9PT0gJ3dob2xlJykgdGhpcy5ydWxlLm1hcmsodGFyZ2V0KTtcbiAgICAgIGVsc2UgaWYgKGNvcGllZC5raW5kID09PSAnZmllbGRzJykgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHModGFyZ2V0LCBjb3BpZWQucGF0aHMpO1xuICAgICAgY29uc3QgcmF3ID0gdGhpcy5iZWhpbmQodmFsdWUpO1xuICAgICAgLy8gQW4gb2JqZWN0IHBhc3NlZCBvbiBCWSBSRUZFUkVOQ0UgbWF5IGNhcnJ5IHdoYXQgdGhlIG1hcHBlciBwbGFudGVkIGluIGl0XG4gICAgICAvLyAoYE9iamVjdC5hc3NpZ24ocC5yZXF1ZXN0LCB7IGF1dGg6IHAudG9rZW4gfSlgLCBgcC5saXN0LnB1c2gocC50b2tlbilgKTpcbiAgICAgIC8vIGVhY2ggcGxhY2UgaXQgaG9sZHMgYSBzZWxlY3RlZCB2YWx1ZSB0aGUgbWFwcGVyIHJlYWQgaXMgYSBmaWVsZCBvZiB0aGUgbmV3IGtleS5cbiAgICAgIGlmIChjb3BpZWQgIT09IHVuZGVmaW5lZCAmJiBjb3BpZWQua2luZCAhPT0gJ3dob2xlJyAmJiByYXcgIT09IG51bGwgJiYgdHlwZW9mIHJhdyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgcGxhbnRlZCA9IHRoaXMucGxhbnRlZFBhdGhzKHJhdyk7XG4gICAgICAgIGlmIChwbGFudGVkLmxlbmd0aCA+IDApIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKHRhcmdldCwgcGxhbnRlZCk7XG4gICAgICB9XG4gICAgICBpZiAocmF3ICE9PSB2YWx1ZSkge1xuICAgICAgICBvdXQgPz89IChBcnJheS5pc0FycmF5KG91dHB1dCkgPyBbLi4ub3V0cHV0XSA6IHsgLi4ub3V0cHV0IH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBvdXRbdGFyZ2V0XSA9IHJhdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChvdXQgPz8gb3V0cHV0KSBhcyBUO1xuICB9XG5cbiAgLyoqIFdoYXQgb25lIHJlY29yZGVkIHJlYWQgaGFuZHMgdGhlIG1hcHBlciAoc2VlIHRoZSBjbGFzcykuICovXG4gIHByaXZhdGUgc2VydmVkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICghdGhpcy5vcGVuKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgcmVhZCA9IHRoaXMuYnlOYW1lLmdldChrZXkpO1xuICAgIGlmIChyZWFkID09PSB1bmRlZmluZWQpIHRoaXMuYnlOYW1lLnNldChrZXksIFt2YWx1ZV0pO1xuICAgIGVsc2UgcmVhZC5wdXNoKHZhbHVlKTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQoa2V5LCB2YWx1ZSk7XG4gICAgLy8gQW4gYWJzZW50IGtleSBjYXJyaWVzIG5vIHNlY3JldDsgbmVpdGhlciBkb2VzIGEgdmFsdWUgd2l0aCBubyBmaWVsZHMgKGEgc2NhbGFyKSBvciBub25lIG9mXG4gICAgLy8gaXRzIHNlbGVjdGVkIG9uZXMg4oCUIHN0YXRlIHJldGFpbnMgdGhvc2UgYXMgdGhleSBhcmUgdG9vLlxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICFSZWRhY3Rpb25SdWxlLmhvbGRzUGF0aHModmFsdWUsIHZlcmRpY3QucGF0aHMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbWVtYmVyKHZhbHVlLCB2ZXJkaWN0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BsYWluUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHRoaXMuZmllbGRzVmlldyh2YWx1ZSwgdmVyZGljdCk7XG4gICAgfVxuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWFkID0gdHJ1ZTtcbiAgICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHRoaXMuc2VjcmV0UmVhZHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbWVtYmVyKHZhbHVlLCB2ZXJkaWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtZW1iZXIodmFsdWU6IHVua25vd24sIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QpOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5zb3VyY2VzLnNldCh2YWx1ZSwgc3RyaWN0ZXIodGhpcy5zb3VyY2VzLmdldCh2YWx1ZSksIHZlcmRpY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIEEgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkOiByZWFkaW5nIG9uZSBvZiBpdHMgc2VsZWN0ZWQgZmllbGRzIChvciBhIHBhdGgncyBmaXJzdCBzZWdtZW50KSBpcyBhIHNlbGVjdGVkIHJlYWQuICovXG4gIHByaXZhdGUgZmllbGRzVmlldyhyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ICYgeyBraW5kOiAnZmllbGRzJyB9KTogb2JqZWN0IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB2ZXJkaWN0LnBhdGhzKSBzZWxlY3RlZC5hZGQocGF0aCkuYWRkKHBhdGguc3BsaXQoJy4nKVswXSk7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlld09mKHJlY29yZCwgKGtleSkgPT4ge1xuICAgICAgaWYgKHRoaXMub3BlbiAmJiBzZWxlY3RlZC5oYXMoa2V5KSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVhZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VjcmV0UmVhZHMucHVzaChyZWNvcmRba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjb3JkW2tleV07XG4gICAgfSk7XG4gICAgdGhpcy52aWV3cy5zZXQodmlldywgeyByYXc6IHJlY29yZCwgdmVyZGljdCB9KTtcbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIHByaXZhdGUgdmlld09mKHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlYWQ6IChrZXk6IHN0cmluZykgPT4gdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB2aWV3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZCkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHJlYWQoa2V5KSxcbiAgICAgICAgc2V0OiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmlldywga2V5LCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgLyoqIFRoZSByZWNvcmQgYmVoaW5kIGEgdmlldyB0aGUgbWFwcGVyIHJldHVybmVkOyBhbnkgb3RoZXIgdmFsdWUgYXMgaXQgaXMuICovXG4gIHByaXZhdGUgYmVoaW5kKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcy52aWV3cy5nZXQodmFsdWUpPy5yYXcgPz8gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSkgPz8gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgYHRhcmdldGAgaW5oZXJpdHMgZnJvbSBgdmFsdWVgIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzXG4gICAqIG5laXRoZXIgYSB2YWx1ZSB0aGUgbWFwcGVyIHJlYWQgbm9yIG9uZSBwYXNzZWQgdW5kZXIgaXRzIG93biBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBjb3BpZWRWZXJkaWN0KHRhcmdldDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3QgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3cy5nZXQodmFsdWUpO1xuICAgICAgaWYgKHZpZXcpIHJldHVybiB2aWV3LnZlcmRpY3Q7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGRzT2YocmVjb3JkKTtcbiAgICAgIGNvbnN0IGtub3duID0gdGhpcy5zb3VyY2VzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoa25vd24pIHJldHVybiBrbm93bjtcbiAgICB9XG4gICAgY29uc3QgcmVhZCA9IHRoaXMuYnlOYW1lLmdldCh0YXJnZXQpO1xuICAgIHJldHVybiByZWFkPy5zb21lKCh2KSA9PiBPYmplY3QuaXModiwgdmFsdWUpKSA/IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKHRhcmdldCwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEEgd2hvbGUgcmVjb3JkJ3Mgc2VsZWN0ZWQga2V5cywgYXMgZmllbGRzIG9mIHdoYXRldmVyIGtleSBpdCBpcyBwYXNzZWQgb24gdW5kZXIuICovXG4gIHByaXZhdGUgc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgY29uc3QgdmVyZGljdCA9IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKGtleSwgcmVjb3JkW2tleV0pO1xuICAgICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcGF0aHMucHVzaChrZXkpO1xuICAgICAgZWxzZSBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgZm9yIChjb25zdCBwYXRoIG9mIHZlcmRpY3QucGF0aHMpIHBhdGhzLnB1c2goYCR7a2V5fS4ke3BhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRocy5sZW5ndGggPT09IDAgPyBDTEVBUiA6IHsga2luZDogJ2ZpZWxkcycsIGtleTogJycsIHBhdGhzIH07XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgYHJvb3RgIChhbiBvYmplY3QgdGhlIG1hcHBlciBwYXNzZWQgb24gYnkgcmVmZXJlbmNlKSBob2xkcyBvbmUgb2YgdGhlXG4gICAqIHNlbGVjdGVkIFBSSU1JVElWRVMgaXQgcmVhZCDigJQgbWF0Y2hlZCBieSB2YWx1ZSwgb25seSBhZ2FpbnN0IHdoYXQgdGhpc1xuICAgKiBtYXBwZXIgcmVhZCBhbmQgb25seSBpbnNpZGUgd2hhdCBpdCBwYXNzZWQgb24sIHNvIG92ZXItbWF0Y2hpbmcgYW4gZXF1YWxcbiAgICogdmFsdWUgaXMgdGhlIHNhZmUgc2lkZS4gT25lIHJlbGF0aXZlIHBhdGggcGVyIHBsYWNlLCBhIHNoYXJlZCBvYmplY3QgYXRcbiAgICogZWFjaCBvZiBpdHMgcGF0aHM7IGEgY3ljbGUgZWRnZSBpcyBub3QgZm9sbG93ZWQuXG4gICAqL1xuICBwcml2YXRlIHBsYW50ZWRQYXRocyhyb290OiBvYmplY3QpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VjcmV0cyA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgICBjb25zdCBjb2xsZWN0ID0gKHZhbHVlOiB1bmtub3duLCBzZWVuOiBTZXQ8b2JqZWN0Pik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSBzZWNyZXRzLmFkZCh2YWx1ZSk7XG4gICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBjb2xsZWN0KGNoaWxkLCBzZWVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy5zZWNyZXRSZWFkcykgY29sbGVjdCh2YWx1ZSwgbmV3IFNldCgpKTtcbiAgICBpZiAoc2VjcmV0cy5zaXplID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgbWVtbyA9IG5ldyBNYXA8b2JqZWN0LCBzdHJpbmdbXT4oKTtcbiAgICBjb25zdCBvblBhdGggPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgICBjb25zdCBpbnNpZGUgPSAobm9kZTogb2JqZWN0KTogc3RyaW5nW10gPT4ge1xuICAgICAgY29uc3Qga25vd24gPSBtZW1vLmdldChub2RlKTtcbiAgICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4ga25vd247XG4gICAgICBpZiAob25QYXRoLmhhcyhub2RlKSkgcmV0dXJuIFtdO1xuICAgICAgb25QYXRoLmFkZChub2RlKTtcbiAgICAgIGNvbnN0IGZvdW5kOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcpIGZvciAoY29uc3Qgc3ViIG9mIGluc2lkZShjaGlsZCkpIGZvdW5kLnB1c2goYCR7a2V5fS4ke3N1Yn1gKTtcbiAgICAgICAgZWxzZSBpZiAoc2VjcmV0cy5oYXMoY2hpbGQpKSBmb3VuZC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgICBvblBhdGguZGVsZXRlKG5vZGUpO1xuICAgICAgbWVtby5zZXQobm9kZSwgZm91bmQpO1xuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH07XG4gICAgcmV0dXJuIGluc2lkZShyb290KTtcbiAgfVxuXG4gIC8qKiBEb2VzIGEgdmFsdWUgdGhlIG1hcHBlciBCVUlMVCBlbWJlZCwgYnkgcmVmZXJlbmNlLCBhIHNlbGVjdGVkIHJlY29yZCBpdCByZWFkIG9yIHdhcyBoYW5kZWQ/ICovXG4gIHByaXZhdGUgZW1iZWRzU2VsZWN0ZWQodmFsdWU6IHVua25vd24sIHNlZW46IFdlYWtTZXQ8b2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICBpZiAodGhpcy52aWV3cy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKTtcbiAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkc09mKHJlY29yZCkua2luZCAhPT0gJ2NsZWFyJztcbiAgICBjb25zdCBrbm93biA9IHRoaXMuc291cmNlcy5nZXQodmFsdWUpO1xuICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkICYmIGtub3duLmtpbmQgIT09ICdjbGVhcicpIHJldHVybiB0cnVlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGlmICh0aGlzLmVtYmVkc1NlbGVjdGVkKGNoaWxkLCBzZWVuKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGNvbW1pdCBsb2cncyBzY3J1YjogYHBhdGNoYCB3aXRoIHtAbGluayBMT0dfUExBQ0VIT0xERVJ9IGF0IGV2ZXJ5IHBhdGggaW4gYHJlZGFjdGVkUGF0aHNgIHRoYXRcbiAqIGhvbGRzIGEgZGVmaW5lZCB2YWx1ZSDigJQgdGhlIGNvcHkgYFN0YWdlQ29udGV4dCDCtyBjb21taXRgIHJlY29yZHMgYW5kIGZlZWRzIHRoZSByZWRhY3RlZCBtaXJyb3IuXG4gKlxuICogQ0xPTkUtRlJFRSAoOS4zMy4wKS4gVGhlIHBhdGNoIGlzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBjb21taXQtdGltZSBwYXlsb2FkLCBhbHJlYWR5IHRoZSByZWNvcmQnc1xuICogb3duIGNvcHkgKGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBjb21taXRgIGNsb25lcyBlYWNoIHN1cnZpdmluZyBwYXRoIG9uY2U7IHRoZSBidWZmZXIgaXMgZHJvcHBlZCBhdFxuICogY29tbWl0KSwgc28gdGhlIHNjcnViIGNvcGllcyBvbmx5IHdoYXQgaXQgbXVzdCBub3QgZWRpdCBpbiBwbGFjZTpcbiAqICAgLSBubyBwYXRoIHRvIHNjcnViIChubyBwb2xpY3ksIG5vIHBlci1jYWxsIG1hcmsg4oCUIHRoZSBjb21tb24gY2FzZSkg4oaSIGBwYXRjaGAgSVRTRUxGLCBubyBjb3B5IGF0IGFsbDtcbiAqICAgLSBvdGhlcndpc2Ug4oaSIGEgbmV3IHJvb3QgYW5kIGEgc2hhbGxvdyBjb3B5IG9mIGVhY2ggY29udGFpbmVyIG9uIGEgc2NydWJiZWQgcGF0aCAoYHBhdGhPcHMgwrdcbiAqICAgICBvd25TcGluZWApLCBldmVyeSBvdGhlciBzdWJ0cmVlIHNoYXJlZCB3aXRoIGBwYXRjaGAuIGBwYXRjaGAgaXMgbmV2ZXIgZWRpdGVkLlxuICogVGhlIGVuZ2luZSBjYWxsZWQgdGhlIHB1YmxpYyB7QGxpbmsgcmVkYWN0UGF0Y2h9IChhIHdob2xlIGBzdHJ1Y3R1cmVkQ2xvbmVgKSB0d2ljZSBwZXIgY29tbWl0IGJlZm9yZVxuICogOS4zMy4wLiBUaGUgYnl0ZXMgYXJlIHRoZSBzYW1lOiBhIHNjcnViYmVkIHBhdGggaG9sZHMgdGhlIHBsYWNlaG9sZGVyLCBldmVyeSBvdGhlciBwYXRoIHRoZSB2YWx1ZSB0aGVcbiAqIGJ1ZmZlciBjbG9uZWQgKHBpbm5lZCBieSB0aGUgOS4xOC4xIC8gOS4xOS4xIHJlZGFjdGlvbiBieXRlIHRlc3RzKS5cbiAqXG4gKiBQYXRocyBhcmUgc2NydWJiZWQgaW4gdGhlIHNldCdzIG9yZGVyLCBhZ2FpbnN0IHRoZSB0cmVlIGFzIHNjcnViYmVkIHNvIGZhcjogYSBwYXRoIHVuZGVyIG9uZSBhbHJlYWR5XG4gKiBzY3J1YmJlZCBmaW5kcyBhIHN0cmluZywgbm90IGEgY29udGFpbmVyLCBhbmQgaXMgbGVmdCBhbG9uZSAoYXMgYmVmb3JlKS5cbiAqXG4gKiBJTlRFUk5BTCDigJQgdGhlIHJlc3VsdCBzaGFyZXMgc3RydWN0dXJlIHdpdGggYHBhdGNoYC4gQSBjYWxsZXIgb3V0c2lkZSB0aGUgY29tbWl0IHBhdGggd2FudHNcbiAqIHtAbGluayByZWRhY3RQYXRjaH0uXG4gKlxuICogQHBhcmFtIHJlZGFjdGVkUGF0aHMgREVMSU0tam9pbmVkIHBhdGhzIChgVHJhbnNhY3Rpb25CdWZmZXJgJ3MgYHJlZGFjdGVkUGF0aHNgOyBhIGJ1bmRsZSdzXG4gKiAgIGByZWRhY3RlZFBhdGhzYCBhcnJheSB3b3JrcyB0b28pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NydWJQYXRjaChwYXRjaDogTWVtb3J5UGF0Y2gsIHJlZGFjdGVkUGF0aHM6IEl0ZXJhYmxlPHN0cmluZz4pOiBNZW1vcnlQYXRjaCB7XG4gIGxldCBvdXQ6IE1lbW9yeVBhdGNoIHwgdW5kZWZpbmVkO1xuICBsZXQgb3duZWQ6IFdlYWtTZXQ8b2JqZWN0PiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBmbGF0IG9mIHJlZGFjdGVkUGF0aHMpIHtcbiAgICBjb25zdCBzZWdzID0gZmxhdC5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgY3VycmVudCA9IG91dCA/PyBwYXRjaDtcbiAgICBpZiAoIW5hdGl2ZUhhcyhjdXJyZW50LCBzZWdzKSB8fCBuYXRpdmVHZXQoY3VycmVudCwgc2VncykgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgICAgIG91dCA9IG93bmVkUm9vdE9mKHBhdGNoLCBvd25lZCkgYXMgTWVtb3J5UGF0Y2g7XG4gICAgfVxuICAgIG93blNwaW5lKG91dCwgc2Vncywgb3duZWQhKTtcbiAgICBuYXRpdmVTZXQob3V0LCBzZWdzLCBMT0dfUExBQ0VIT0xERVIpO1xuICB9XG4gIHJldHVybiBvdXQgPz8gcGF0Y2g7XG59XG5cbi8qKlxuICogUmVkYWN0cyBzZW5zaXRpdmUgdmFsdWVzIGluIGEgcGF0Y2ggZm9yIGxvZ2dpbmcvZGVidWdnaW5nIOKAlCB0aGUgUFVCTElDIHNjcnViIChgZm9vdHByaW50anMvYWR2YW5jZWRgKSxcbiAqIGl0cyBjb250cmFjdCB1bmNoYW5nZWQgc2luY2UgNC54OiBhIGZyZXNoIGRlZXAgY29weSBvZiBgcGF0Y2hgIChgc3RydWN0dXJlZENsb25lYCkgd2l0aFxuICoge0BsaW5rIExPR19QTEFDRUhPTERFUn0gYXQgZXZlcnkgbGlzdGVkIHBhdGggdGhhdCBob2xkcyBhIGRlZmluZWQgdmFsdWUuIFNoYXJlcyBub3RoaW5nIHdpdGggYHBhdGNoYFxuICogYW5kIG5ldmVyIGVkaXRzIGl0LiAoTW92ZWQgaGVyZSBmcm9tIGBtZW1vcnkvdXRpbHMudHNgIGluIDkuMzMuMDsgdGhlIGVuZ2luZSdzIG93biBjb21taXQgcGF0aCB1c2VzIHRoZVxuICogY2xvbmUtZnJlZSB7QGxpbmsgc2NydWJQYXRjaH0uKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0UGF0Y2gocGF0Y2g6IE1lbW9yeVBhdGNoLCByZWRhY3RlZFNldDogU2V0PHN0cmluZz4pOiBNZW1vcnlQYXRjaCB7XG4gIHJldHVybiBzY3J1YlBhdGNoKHN0cnVjdHVyZWRDbG9uZShwYXRjaCksIHJlZGFjdGVkU2V0KTtcbn1cbiJdfQ==
|
|
1345
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0RHOzs7QUFFSCw4Q0FBMEM7QUFFMUMseURBQXNFO0FBRXRFLDZDQUFzRjtBQUN0Rix5Q0FBbUM7QUFDbkMsdURBQXVFO0FBNEUxRCxRQUFBLEtBQUssR0FBcUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQVcsQ0FBQyxDQUFDO0FBRWpGOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBRWhDOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUE0QyxFQUFFLEdBQVc7SUFDL0UsT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzdHLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsU0FBUyxjQUFjLENBQUMsS0FBYSxFQUFFLFFBQXVDO0lBQzVFLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUIsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixrRUFBa0U7UUFDbEUscUVBQXFFO1FBQ3JFLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzVELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QyxDQUFD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QkFBUyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFBLHNCQUFTLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLFNBQVM7WUFBRSxTQUFTO1FBQ2xGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1lBQzlCLEdBQUcsR0FBRyxJQUFBLHdCQUFXLEVBQUMsS0FBSyxFQUFFLEtBQUssQ0FBZ0IsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBQSxxQkFBUSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBTSxDQUFDLENBQUM7UUFDNUIsSUFBQSxzQkFBUyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsaUNBQWUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFDdEIsQ0FBQztBQWZELGdDQWVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEtBQWtCLEVBQUUsV0FBd0I7SUFDdEUsT0FBTyxVQUFVLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFGRCxrQ0FFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVkYWN0aW9uLnRzIOKAlCBUaGUgT05FIG93bmVyIG9mIHdoYXQgYSByZWRhY3Rpb24gcG9saWN5IHNheXMgYWJvdXQgYSB2YWx1ZS5cbiAqXG4gKiBUSEUgTEFXIChvd25lciBydWxpbmcgKGEpKS4gQSByZWRhY3Rpb24gcG9saWN5IGNvdmVycyBFVkVSWVRISU5HIHRoZSBsaWJyYXJ5XG4gKiByZXRhaW5zIG9yIHNlcnZlcyDigJQgdGhlIGNvbW1pdCBsb2cgKGJvdGggZW5jb2RpbmdzKSwgdGhlIHJlZGFjdGVkIG1pcnJvcixcbiAqIHRyYWNrZWQgcmVhZHMvd3JpdGVzLCBldmVyeSByZWNvcmRlciBldmVudCAoaW5saW5lIGFuZCBkZWZlcnJlZCkgYW5kIHRoZVxuICogcmVjb3JkZXIgcm93cyBidWlsdCBmcm9tIHRoZW0sIHRoZSBuYXJyYXRpdmUsIHNuYXBzaG90cywgZGlhZ25vc3RpY3MsIHBhdXNlXG4gKiBwYXlsb2FkcywgYm91bmRhcnkgcmVjb3JkcyBhbmQgbG9nIGxpbmVzIOKAlCBhbmQgTkVWRVIgdGhlIGxpdmUgaGVhcCBvciB0aGVcbiAqIHJlc3VtZSBjaGVja3BvaW50LiBUd28gdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIGFuZCBzdGF5IHJlYWw6IHRoZVxuICogYHJ1bigpYCByZWplY3Rpb24gKHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmKSBhbmQgdGhlIGxpdmUgZm9yayByZXN1bHQuXG4gKlxuICogQSBwb2xpY3kgc2VsZWN0cyBieSBOQU1FIOKAlCBhIGtleSwgYSBkb3R0ZWQgcGF0aCwgYSBmaWVsZCDigJQgbmV2ZXIgYnlcbiAqIHNjYW5uaW5nIGNvbnRlbnQuIFdoYXQgY2FycmllcyBhIG5hbWU6XG4gKiAgIC0gc3RhdGUg4oCUIGl0cyB1c2VyLWxldmVsIHBhdGggKHtAbGluayBSZWRhY3Rpb25SdWxlLnZlcmRpY3R9KTtcbiAqICAgLSBhIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlIOKAlCByb290IGlucHV0L291dHB1dCwgYSBzdWJmbG93J3MgbWFwcGVkIHNlZWRcbiAqICAgICBhbmQgZXhpdCBzdGF0ZSwgYSBwYXVzZSBwYXlsb2FkLCBhIHRocm93biB2YWx1ZSDigJQgaXRzIGtleXMgYXQgZXZlcnlcbiAqICAgICBkZXB0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnl9KTtcbiAqICAgLSBhIGRpYWdub3N0aWMgZW50cnkg4oCUIGAkZGVidWdgL2AkZXJyb3JgL2AkbWV0cmljYC9gJGV2YWxgL2AkbG9nYCBhbmQgdGhlXG4gKiAgICAgZW5naW5lJ3Mgb3duIOKAlCB0aGUgcmVjb3JkIGB7IFtuYW1lXTogdmFsdWUgfWA6IGl0cyBuYW1lIElTIGEgc3RhdGUga2V5XG4gKiAgICAgKHtAbGluayBSZWRhY3Rpb25SdWxlLnJldGFpbkRpYWdub3N0aWN9KS4gYHBvbGljeS5kaWFnbm9zdGljc2AgYWRkc1xuICogICAgIGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMgb24gdG9wOyBmbG93LW1lc3NhZ2UgdGV4dCBoYXMgbm8gbmFtZSBvZiBpdHNcbiAqICAgICBvd24sIHNvIG9ubHkgdGhleSBzZWxlY3QgaXQ7XG4gKiAgIC0gYSBzdWJmbG93IG1hcHBlcidzIGNvcHkg4oCUIGEga2V5IGFuIGBpbnB1dE1hcHBlcmAvYG91dHB1dE1hcHBlcmAgKG9yIGFcbiAqICAgICBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtcyBzZWxlY3Rvcikgd3JvdGUgaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGVcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSBpdCBjb3BpZWQgKHtAbGluayBNYXBwZXJUYWludH0pLlxuICogQSBtYXJrIGlzIGEgTkFNRSwgcnVuLXdpZGUsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzIHRoZVxuICogbWFya3Mg4oCUIG5hbWVzIG9ubHkg4oCUIHRvIHRoZSByZXN1bWVkIHJ1biAoe0BsaW5rIFJlZGFjdGlvblJ1bGUubWFya3NGb3JDaGVja3BvaW50fSkuXG4gKiBBIHZhbHVlIHdpdGggbm8gbmFtZSDigJQgYSBzY2FsYXIgcm9vdCBpbnB1dC9vdXRwdXQgb3IgcGF1c2UgcGF5bG9hZCwgZnJlZVxuICogZXJyb3IgdGV4dCDigJQgaXMgc2VsZWN0ZWQgYnkgbm90aGluZy4gYGVtaXRQYXR0ZXJuc2AgaXMgdGhlIG9uZSBzZXBhcmF0ZVxuICogc2NydWI6IGEgYCRlbWl0YCBwYXlsb2FkIGlzIHNlbGVjdGVkIGJ5IGl0cyBldmVudCBuYW1lLlxuICpcbiAqIEhPVyBPTkUgT1dORVIgS0VFUFMgSVQuIEV2ZXJ5IHN0YWdlZCB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIHBhc3Nlc1xuICogdGhyb3VnaCBgU3RhZ2VDb250ZXh0YCwgc28gYFN0YWdlQ29udGV4dGAgYXNrcyBUSElTIHJ1bGUg4oCUIG5vdCB0aGUgY2FsbGVyIOKAlFxuICogd2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHBhdGggaXQgaXMgYWJvdXQgdG8gcmV0YWluLiBBIGBTY29wZUZhY2FkZWBcbiAqIHdyaXRlLCBhIHN1YmZsb3cgYGlucHV0TWFwcGVyYCBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrIGFuZCBhXG4gKiByZXN1bWUgcmUtc2VlZCBhcmUgdGhlbiBhbGwgdGhlIHNhbWUgY2FzZTogdGhlIGZ1bm5lbCBkZWNpZGVzLCB0aGUgY2FsbGVyXG4gKiBjYW5ub3QgZm9yZ2V0IHRvLiBUaGUgZmFjYWRlIHVzZXMgdGhlIHNhbWUgcnVsZSBmb3IgdGhlIHZhbHVlcyBpdCBoYW5kcyB0b1xuICogcmVjb3JkZXJzOyBgU3ViZmxvd0V4ZWN1dG9yYCB1c2VzIGl0IGZvciB0aGUgbmFycmF0ZWQgc2VlZCBhbmRcbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIuZXhlY3V0ZWAgZm9yIHJvb3QgaW5wdXQvb3V0cHV0IGJlZm9yZSBkaXNwYXRjaC4gQmVmb3JlIDkuMTkuMFxuICogdGhlIGZhY2FkZSBoZWxkIHRoZSB2ZXJkaWN0IGFsb25lLCBhbmQgZXZlcnkgcGF0aCB0aGF0IHdyb3RlIG9yIHJlYWQgcGFzdFxuICogdGhlIGZhY2FkZSDigJQgZml2ZSBvZiB0aGVtIOKAlCByZXRhaW5lZCBwbGFpbnRleHQgdW5kZXIgYSBwb2xpY3kuXG4gKlxuICogVFdPIFBMQUNFSE9MREVSUywgQk9USCBISVNUT1JJQ0FMOiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlIG1pcnJvciBjYXJyeVxuICogYCdSRURBQ1RFRCdgIChgc2NydWJQYXRjaGAgLyBgcmVkYWN0UGF0Y2hgLCBiZWxvdyDigJQgdGhlIHN0cmluZ3MgdW5jaGFuZ2VkIHNpbmNlIDQueCk7IGV2ZXJ5IHNjb3BlLXRpZXIgdmlldyDigJRcbiAqIHNjb3BlIHJlY29yZGVyIGV2ZW50cywgYHN0YWdlUmVhZHNgL2BzdGFnZVdyaXRlc2AsIG5hcnJhdGl2ZSDigJQgY2Fycmllc1xuICogYCdbUkVEQUNURURdJ2AuIE5laXRoZXIgc3RyaW5nIGNoYW5nZWQgaW4gOS4xOS4wLiBUaGUgc3RyaW5ncyB0aGVtc2VsdmVzIGFyZVxuICogb3duZWQgYnkgYG1lbW9yeS9wbGFjZWhvbGRlcnMudHNgIChgTE9HX1BMQUNFSE9MREVSYCAvIGBTQ09QRV9QTEFDRUhPTERFUmApXG4gKiBhbmQgc3BlbGxlZCBub3doZXJlIGVsc2UgaW4gYHNyYy9gIOKAlCB0aGlzIHJ1bGUgYXNrcyBmb3IgdGhlIHNjb3BlIG9uZSBieSBuYW1lLlxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5hdGl2ZVNldCwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIsIFNDT1BFX1BMQUNFSE9MREVSIH0gZnJvbSAnLi9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIERlY2xhcmF0aXZlIGtleS9wYXRoIHJlZGFjdGlvbiBmb3IgcmVjb3JkZWQgc3RhdGUgYW5kIGJvdW5kYXJ5IHJlY29yZHMuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIERpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIElOIEFERElUSU9OIHRvIHRoZSBzdGF0ZSBzZWxlY3RvcnMgYWJvdmUgKHdoaWNoXG4gICAqIGFscmVhZHkgY292ZXIgYSBkaWFnbm9zdGljIGVudHJ5IGJ5IGl0cyBuYW1lOiBga2V5czogWyd0b2tlbiddYCBtYXNrc1xuICAgKiBgJGRlYnVnKCd0b2tlbicsIOKApilgKS4gVXNlIHRoZXNlIGZvciBuYW1lcyB5b3UgbWFzayBpbiBkaWFnbm9zdGljcyBidXRcbiAgICogbm90IGluIHN0YXRlLiBQYXRocyBzdGFydCB3aXRoIGxvZ3MvZXJyb3JzL21ldHJpY3MvZXZhbHMsIGUuZy5cbiAgICogYGxvZ3MucHJvZmlsZS50b2tlbmAuIE9ubHkgZmxvd01lc3NhZ2VzLmRlc2NyaXB0aW9uIGFuZFxuICAgKiBmbG93TWVzc2FnZXMucmF0aW9uYWxlIGFyZSBwYXlsb2FkczsgZmxvdyB0b3BvbG9neS90aW1pbmcgbWV0YWRhdGEgc3RheXNcbiAgICogaW50YWN0LiBBcHBsaWVkIGJlZm9yZSByZXRlbnRpb24sIG5vdCByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nIGJhZ3MuXG4gICAqL1xuICBkaWFnbm9zdGljcz86IFBpY2s8UmVkYWN0aW9uUG9saWN5LCAna2V5cycgfCAncGF0dGVybnMnIHwgJ2ZpZWxkcyc+O1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMgbWF0Y2hlZCBhZ2FpbnN0IGBFbWl0RXZlbnQubmFtZWAgZm9yIGBzY29wZS4kZW1pdCguLi4pYFxuICAgKiBjYWxscy4gQW55IGVtaXQgZXZlbnQgd2hvc2UgbmFtZSBtYXRjaGVzIGhhcyBpdHMgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqIHRoZSBzdHJpbmcgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoIHRvIHJlY29yZGVycy5cbiAgICogR2xvYmFsL3N0aWNreSBwYXR0ZXJucyBzdGFydCBhdCBpbmRleCB6ZXJvIG9uIGV2ZXJ5IHRlc3Q7IHRoZWlyIGZsYWdzXG4gICAqIHJldGFpbiB0aGVpciB1c3VhbCBtZWFuaW5nLiBUaGlzIGRvZXMgbm90IHNjcnViIGRpYWdub3N0aWMgc2lkZSBiYWdzLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGB0c1xuICAgKiB7IGVtaXRQYXR0ZXJuczogWy9cXC5hdXRoXFwuLywgL1xcLmJpbGxpbmdcXC4vXSB9XG4gICAqIC8vIEhpZGVzIHBheWxvYWRzIG9mIGV2ZW50cyBsaWtlICdteWFwcC5hdXRoLmNoZWNrJyBhbmQgJ215YXBwLmJpbGxpbmcuc3BlbmQnXG4gICAqIGBgYFxuICAgKi9cbiAgZW1pdFBhdHRlcm5zPzogUmVnRXhwW107XG59XG5cbi8qKlxuICogU3RhdGUgcmVkYWN0aW9uIHJlcG9ydC4gTmV2ZXIgaW5jbHVkZXMgdmFsdWVzOyBlbWl0IGFuZCBkaWFnbm9zdGljXG4gKiBzZWxlY3RvcnMvYWN0aXZpdHkgYXJlIG5vdCByZXByZXNlbnRlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblJlcG9ydCB7XG4gIC8qKiBLZXlzIGZ1bGx5IHJlZGFjdGVkIChleGFjdCBtYXRjaCBvciBwYXR0ZXJuIG1hdGNoKS4gKi9cbiAgcmVkYWN0ZWRLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgd2l0aCBmaWVsZC1sZXZlbCByZWRhY3Rpb24g4oaSIHdoaWNoIGZpZWxkcyB3ZXJlIHNjcnViYmVkLiAqL1xuICBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIFBhdHRlcm4gc291cmNlcyB0aGF0IHdlcmUgYWN0aXZlIChlLmcuIFsncGFzc3dvcmR8c2VjcmV0J10pLiAqL1xuICBwYXR0ZXJuczogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHZhbHVlIGF0IG9uZSB1c2VyLWxldmVsIHBhdGguXG4gKlxuICogLSBgJ2NsZWFyJ2AgIOKAlCBub3RoaW5nIHRvIHNjcnViOyByZXRhaW4gYW5kIHNlcnZlIHRoZSB2YWx1ZSBhcyBpdCBpcy5cbiAqIC0gYCd3aG9sZSdgICDigJQgdGhlIGVudGlyZSB2YWx1ZSBpcyBzZWNyZXQuIGBrZXlgIGlzIHRoZSBwb2xpY3kgb3IgbWFya2VkXG4gKiAgIGtleSB0aGF0IGRlY2lkZWQgaXQgKHRoZSBwYXRoIGl0c2VsZiBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycykuXG4gKiAtIGAnZmllbGRzJ2Ag4oCUIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3Qgd2hvc2UgYHBhdGhzYCAoZG90LXBhdGhzIElOU0lERSB0aGVcbiAqICAgdmFsdWUsIHJlbGF0aXZlIHRvIGl0KSBhcmUgc2VjcmV0OyBldmVyeXRoaW5nIGVsc2UgaW4gaXQgaXMgbm90LlxuICovXG5leHBvcnQgdHlwZSBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdjbGVhcicgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3dob2xlJzsgcmVhZG9ubHkga2V5OiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2ZpZWxkcyc7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IENMRUFSOiBSZWRhY3Rpb25WZXJkaWN0ID0gT2JqZWN0LmZyZWV6ZSh7IGtpbmQ6ICdjbGVhcicgfSBhcyBjb25zdCk7XG5cbi8qKlxuICogTWF4aW11bSBrZXkgbGVuZ3RoIChjaGFyYWN0ZXJzKSB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgcmVnZXggcmVkYWN0aW9uXG4gKiBwYXR0ZXJucy4gS2V5cyBsb25nZXIgdGhhbiB0aGlzIGFyZSBza2lwcGVkIGZvciBwYXR0ZXJuIG1hdGNoaW5nIHRvIHByZXZlbnRcbiAqIFJlRG9TOiBhIHBhdGhvbG9naWNhbCByZWdleCB0ZXN0ZWQgYWdhaW5zdCBhbiB1bmJvdW5kZWRseSBsb25nIGtleSBzdHJpbmdcbiAqIGNhbiBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLiAyNTYgY2hhcmFjdGVycyBjb21mb3J0YWJseSBleGNlZWRzIGFueVxuICogcmVhbGlzdGljIHNjb3BlLXN0YXRlIGtleSBuYW1lLlxuICovXG5jb25zdCBNQVhfUEFUVEVSTl9LRVlfTEVOID0gMjU2O1xuXG4vKipcbiAqIFRoZSBmaWVsZHMgYSBwb2xpY3kgZGVjbGFyZXMgdW5kZXIgYGtleWAg4oCUIG9ubHkgd2hlbiBgZmllbGRzYCBPV05TIGBrZXlgLlxuICogVGhlIGtleSBpcyBhIG5hbWUgZnJvbSBkYXRhIChhIHN0YXRlIGtleSwgYSBuZXN0ZWQga2V5IG9mIGEgcmVjb3JkIGhhbmRlZFxuICogb3V0IHdob2xlKSwgYW5kIGEgcGxhaW4tb2JqZWN0IGxvb2t1cCByZWFkcyB0aGUgcHJvdG90eXBlIGNoYWluOlxuICogYGZpZWxkc1snY29uc3RydWN0b3InXWAgaXMgYE9iamVjdGAsIGBmaWVsZHNbJ19fcHJvdG9fXyddYCBpc1xuICogYE9iamVjdC5wcm90b3R5cGVgLiBUaGUgd2FsayB0aGVuIGl0ZXJhdGVkIHRoZW0sIHNvIGFueSBgZmllbGRzYCBwb2xpY3lcbiAqIGZhaWxlZCB0aGUgcnVuIHdpdGggYSBUeXBlRXJyb3Igb24gZGF0YSBob2xkaW5nIHN1Y2ggYSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVkRmllbGRzKGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkgPyBmaWVsZHNba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFBvbGljeSBwYXR0ZXJucyBhcmUgcHJlZGljYXRlcywgbm90IGN1cnNvcnMgb3ZlciBzdWNjZXNzaXZlIGtleXMvZXZlbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4odmFsdWU6IHN0cmluZywgcGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcGF0dGVybnMpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgLy8gT25seSB0aGVzZSBmbGFncyBjb25zdW1lIGxhc3RJbmRleC4gT3JkaW5hcnkgKGluY2x1ZGluZyBmcm96ZW4pXG4gICAgLy8gcmVnZXhlcyBuZWVkIG5vIHdyaXRhYmxlIGN1cnNvciB0byBtYXRjaC4gS2VlcCBhbGwgb3JpZ2luYWwgZmxhZ3MuXG4gICAgaWYgKHBhdHRlcm4uZ2xvYmFsIHx8IHBhdHRlcm4uc3RpY2t5KSBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgaWYgKHBhdHRlcm4udGVzdCh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZGFjdGlvblJ1bGUge1xuICBwcml2YXRlIHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRpYWdub3N0aWNSdWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkO1xuICAvKiogV2hldGhlciBgcG9saWN5YCBuYW1lcyBhbnl0aGluZyBhIHN0YXRlIHZlcmRpY3QgY2FuIGFjdCBvbiDigJQgY29tcHV0ZWRcbiAgICogIG9uY2UgcGVyIGBzZXRQb2xpY3lgIHNvIHtAbGluayBpc0luZXJ0fSBpcyBhIHR3by1maWVsZCBjaGVjay4gKi9cbiAgcHJpdmF0ZSBwb2xpY3lBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIFRoZSBwb2xpY3kncyBwYXR0ZXJucyB0aGF0IGNhbiBkZXBlbmQgb24gYSB3aG9sZSBkb3R0ZWQgcGF0aCAoe0BsaW5rIG5lZWRzUGF0aH0pIOKAlCBwZXIgYHNldFBvbGljeWAuICovXG4gIHByaXZhdGUgcGF0aFBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSA9IFtdO1xuICBwcml2YXRlIHdhbGtMaW1pdFdhcm5lZCA9IGZhbHNlO1xuICAvKipcbiAgICogS2V5cyBtYXJrZWQgc2VjcmV0IGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuIOKAlCBieSBhIHBlci1jYWxsXG4gICAqIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAsIG9yIGJ5IGFueSB3cml0ZSB0aGUgcG9saWN5IHJlZGFjdGVkIHdob2xlLlxuICAgKiBPTkUgc2V0IHBlciBydW4sIHNoYXJlZCBieSBldmVyeSBzY29wZSBhbmQgY29udGV4dCAodGhlIGV4ZWN1dG9yIGJ1aWxkc1xuICAgKiB0aGUgcnVsZSBvbmNlIHBlciBydW4gYW5kIGluc3RhbGxzIGl0IG9uIHRoZSBydW50aW1lIHJvb3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWQ6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogRmllbGRzIGEgc3ViZmxvdyBtYXBwZXIgaGFuZGVkIHRvIGEgTkVXIGtleSBhbG9uZyB3aXRoIHRoZSB2YWx1ZSB0aGV5XG4gICAqIGJlbG9uZyB0byDigJQgdGFyZ2V0IGtleSDihpIgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRocyAoYW4gb2JqZWN0IGNvcGllZFxuICAgKiBieSByZWZlcmVuY2UgZnJvbSBhIGBmaWVsZHNgLXNlbGVjdGVkIGtleTsge0BsaW5rIE1hcHBlclRhaW50fSkuXG4gICAqIFJ1bi13aWRlLCBieSBuYW1lLCBsaWtlIHtAbGluayBtYXJrZWR9LlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0ZWQ6IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoaXMgcnVuJ3MgdGhyb3duIHZhbHVlcyBzZXJ2ZWQgbWFza2VkICh0aGVpciB0ZXh0IHNlbGVjdGVkLCBvciBhIHNlbGVjdGVkIGtleSBpbnNpZGUgdGhlbSkg4oaSIHRoZWlyIHNlcnZlZCBmb3JtLiAqL1xuICBwcml2YXRlIG1hc2tlZEVycm9yczogTWFwPHVua25vd24sIFN0cnVjdHVyZWRFcnJvckluZm8+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHBvbGljeT86IFJlZGFjdGlvblBvbGljeSwgbWFya2VkPzogU2V0PHN0cmluZz4pIHtcbiAgICB0aGlzLm1hcmtlZCA9IG1hcmtlZCA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgZ2V0UG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgc2V0UG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSBwb2xpY3k/LmRpYWdub3N0aWNzO1xuICAgIHRoaXMuZGlhZ25vc3RpY1J1bGUgPSBkaWFnbm9zdGljc1xuICAgICAgPyBuZXcgUmVkYWN0aW9uUnVsZSh7IGtleXM6IGRpYWdub3N0aWNzLmtleXMsIHBhdHRlcm5zOiBkaWFnbm9zdGljcy5wYXR0ZXJucywgZmllbGRzOiBkaWFnbm9zdGljcy5maWVsZHMgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucGF0aFBhdHRlcm5zID0gKHBvbGljeT8ucGF0dGVybnMgPz8gW10pLmZpbHRlcihuZWVkc1BhdGgpO1xuICAgIHRoaXMucG9saWN5QWN0aXZlID1cbiAgICAgIHBvbGljeSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoKHBvbGljeS5rZXlzPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIChwb2xpY3kucGF0dGVybnM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICAgT2JqZWN0LmtleXMocG9saWN5LmZpZWxkcyA/PyB7fSkubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoaXMgcnVsZSBoYXMgbm90aGluZyB0byBzYXkgYWJvdXQgQU5ZIHBhdGgg4oCUIG5vIGtleSwgcGF0dGVyblxuICAgKiBvciBmaWVsZCBpbiB0aGUgcG9saWN5IGFuZCBubyBrZXkgbWFya2VkIHNvIGZhci4gVGhlIG5vLXBvbGljeSBmYXN0XG4gICAqIHBhdGg6IGBTdGFnZUNvbnRleHRgIHNraXBzIHRoZSB2ZXJkaWN0IChhbmQgaXRzIHBhdGggYWxsb2NhdGlvbikgb25cbiAgICogZXZlcnkgdHJhY2tlZCByZWFkIGFuZCBzdGFnZWQgd3JpdGUgd2hpbGUgdGhpcyBob2xkcy4gQSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIG1hcmtzIGEga2V5IGFuZCBlbmRzIGl0LlxuICAgKi9cbiAgaXNJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiAhdGhpcy5wb2xpY3lBY3RpdmUgJiYgdGhpcy5pbmhlcml0ZWQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmVkIG1hcmtlZC1rZXlzIHNldCDigJQgZm9yIHRoZSBgQGludGVybmFsYCBzaGFyaW5nIHByb3RvY29sIGFuZCBgZGVjaWRlKClgLiAqL1xuICBtYXJrZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQ7XG4gIH1cblxuICB1c2VNYXJrZWRLZXlzKHNoYXJlZDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIG1hcmsoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgfVxuXG4gIC8qKiBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIG1hcmsgYW5kIGFueSBmaWVsZHMgYSBtYXBwZXIgZ2F2ZSBpdDsgYSBwb2xpY3kgdmVyZGljdCBzdXJ2aXZlcyBpdC4gKi9cbiAgdW5tYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuaW5oZXJpdGVkPy5kZWxldGUoa2V5KSAmJiB0aGlzLmluaGVyaXRlZC5zaXplID09PSAwKSB0aGlzLmluaGVyaXRlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBLZXktbGV2ZWwgdmVyZGljdDogbWFya2VkLCBsaXN0ZWQgaW4gYHBvbGljeS5rZXlzYCwgb3IgbWF0Y2hpbmcgYSBwYXR0ZXJuLiAqL1xuICBpc0tleVJlZGFjdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWFya2VkLmhhcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucG9saWN5LmtleXM/LmluY2x1ZGVzKGtleSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wb2xpY3kucGF0dGVybnM7XG4gICAgaWYgKCFwYXR0ZXJucyB8fCBwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAoa2V5Lmxlbmd0aCA+IE1BWF9QQVRURVJOX0tFWV9MRU4pIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIFJlZGFjdGlvblBvbGljeToga2V5ICcke2tleS5zbGljZSgwLCA0MCl9Li4uJyAoJHtrZXkubGVuZ3RofSBjaGFycykgZXhjZWVkcyBgICtcbiAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAnVXNlIHBvbGljeS5rZXlzIGZvciBleGFjdCBtYXRjaGluZyBvZiBsb25nIGtleSBuYW1lcy4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlc1BhdHRlcm4oa2V5LCBwYXR0ZXJucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGFuIGVtaXR0ZWQgcGF5bG9hZCBCRUZPUkUgZGlzcGF0Y2gvY2FwdHVyZS4gRW1pdCBuYW1lcyBhcmUgbm90XG4gICAqIHN0YXRlIHBhdGhzOiBubyBrZXktbGVuZ3RoIGNhcCwgbWFya3Mgb3IgZmllbGQgc2NydWIgYXBwbGllcyBoZXJlLlxuICAgKiBBIGNsZWFyIHBheWxvYWQga2VlcHMgaXRzIGlkZW50aXR5OyBkaWFnbm9zdGljIGJhZ3MgYXJlIHVudG91Y2hlZC5cbiAgICovXG4gIHJldGFpbkVtaXQobmFtZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKG5hbWUsIHRoaXMucG9saWN5Py5lbWl0UGF0dGVybnMpID8gU0NPUEVfUExBQ0VIT0xERVIgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhIE5BTUVEIGRpYWdub3N0aWMgZW50cnkg4oCUIGBhZGRyZXNzYCBpcyBgW2NoYW5uZWwsIC4uLnBhdGgsIG5hbWVdYFxuICAgKiAoYCRkZWJ1ZygndG9rZW4nLCB2KWAg4oaSIGBbJ2xvZ3MnLCAndG9rZW4nXWA7IGAkbG9nKHYpYCDihpIgYFsnbG9ncycsXG4gICAqICdtZXNzYWdlcyddYCkuIFRIRSBNQVBQSU5HOiB0aGUgZW50cnkgaXMgdGhlIHJlY29yZCBgeyBbbmFtZV06IHZhbHVlIH1gXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUsIHNvIGl0IGlzIHJldGFpbmVkIGFzIGEgYm91bmRhcnkgcmVjb3JkIGhvbGRpbmcgdGhlXG4gICAqIHN0YXRlIGtleSBgbmFtZWAgd291bGQgYmUg4oCUIHRoZSBzdGF0ZSB2ZXJkaWN0IGF0IGBbLi4ucGF0aCwgbmFtZV1gIChrZXlzLFxuICAgKiBwYXR0ZXJucyBhbmQgbWFya3MgYXQgZXZlcnkgZG90dGVkIHByZWZpeCBhbmQgYXQgdGhlIG5hbWUgaXRzZWxmOyB0aGUgdG9wXG4gICAqIGtleSdzIGBmaWVsZHNgKSwgdGhlbiBldmVyeSBuZXN0ZWQgb3duIGtleSB3aG9zZSBuYW1lIG9yIGRvdHRlZCBwYXRoIGlzXG4gICAqIHNlbGVjdGVkICh7QGxpbmsgcmV0YWluQm91bmRhcnl9J3Mgd2FsaykuIFRoZSBjaGFubmVsIHRha2VzIG5vIHBhcnQ6XG4gICAqIGBsb2dzLnRva2VuYCwgYGVycm9ycy50b2tlbmAgYW5kIGBtZXRyaWNzLnRva2VuYCBhcmUgYWxsIHRoZSBzdGF0ZSBrZXlcbiAgICogYHRva2VuYC4gYHBvbGljeS5kaWFnbm9zdGljc2AgKGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIHJvb3RlZCBhdCB0aGVcbiAgICogY2hhbm5lbCkgYXBwbGllcyBvbiB0b3AuIENsZWFyIHZhbHVlcyBrZWVwIHRoZWlyIGlkZW50aXR5LlxuICAgKi9cbiAgcmV0YWluRGlhZ25vc3RpYyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5pc0luZXJ0KCkgPyB2YWx1ZSA6IHRoaXMucmV0YWluTmFtZWQoYWRkcmVzcy5zbGljZSgxKSwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gdGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywga2VwdCkgOiBrZXB0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBmbG93LW1lc3NhZ2UgdGV4dCAoYGZsb3dNZXNzYWdlcy5kZXNjcmlwdGlvbmAgLyBgLnJhdGlvbmFsZWApOiB0ZXh0XG4gICAqIHRoZSBlbmdpbmUgY29tcG9zZXMgaGFzIG5vIG5hbWUgb2YgaXRzIG93biwgc28gbm8gc3RhdGUgc2VsZWN0b3IgcmVhY2hlc1xuICAgKiBpdCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0LlxuICAgKi9cbiAgcmV0YWluRmxvd1RleHQoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY1J1bGUgPyAodGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywgdGV4dCkgYXMgc3RyaW5nKSA6IHRleHQ7XG4gIH1cblxuICAvKioge0BsaW5rIHJldGFpbkRpYWdub3N0aWN9J3Mgc3RhdGUgaGFsZjogdGhlIHZhbHVlIG5hbWVkIGJ5IGBwYXRoYCAoaXRzIGxhc3Qgc2VnbWVudCksIHNlcnZlZCB3aG9sZS4gKi9cbiAgcHJpdmF0ZSByZXRhaW5OYW1lZChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBuYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPVxuICAgICAgcGF0aC5sZW5ndGggPiAxICYmIHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSA/IHsga2luZDogJ3dob2xlJywga2V5OiBuYW1lIH0gOiB0aGlzLnZlcmRpY3QocGF0aCk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IGtlcHQgPSBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICBpZiAoa2VwdCA9PT0gbnVsbCB8fCB0eXBlb2Yga2VwdCAhPT0gJ29iamVjdCcpIHJldHVybiBrZXB0O1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKGtlcHQsIGJhc2UsIHRoaXMuZG90dGVkVGFyZ2V0cyhiYXNlKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlcnZlZCBmb3JtIG9mIGEgdGhyb3duIHZhbHVlLCBkZWNpZGVkIE9OQ0UgYXQgaXRzIGVycm9yIHNpdGUgZnJvbSB0aGVcbiAgICogdGV4dCB0aGUgZGlhZ25vc3RpYyBjb2xsZWN0b3IgcmV0YWluZWQgZm9yIGBlcnJvcnMuc3RhZ2VFeGVjdXRpb25FcnJvcmBcbiAgICogKGBrZXB0YCkgYW5kIGZyb20gdGhlIHZhbHVlIGl0c2VsZiDigJQgYSByZWNvcmQgaGFuZGVkIG91dCB3aG9sZSwgbWFza2VkXG4gICAqIHdoZW4gb25lIG9mIGl0cyBvd24ga2V5cywgYXQgYW55IGRlcHRoLCBjYXJyaWVzIGEgc2VsZWN0ZWQgbmFtZS5cbiAgICogVW5tYXNrZWQ6IHRvZGF5J3Mgc3RydWN0dXJlZCBpbmZvLiBNYXNrZWQ6IHRoZSBlcnJvcidzIGBuYW1lYC9gY29kZWAga2VwdCxcbiAgICogbm8gYGlzc3Vlc2AgKHRoZXkgcXVvdGUgdGhlIGlucHV0KSBhbmQgbm8gYHJhd2AgZXJyb3IgKGl0IGhvbGRzIHRoZSB0ZXh0XG4gICAqIGFuZCB0aGUga2V5cyk7IHRoZSBtZXNzYWdlIGlzIHRoZSBwbGFjZWhvbGRlciB3aGVuIHRoZSB0ZXh0IHdhcyBzZWxlY3RlZCxcbiAgICogdGhlIHRleHQgaXRzZWxmIHdoZW4gb25seSBhIGtleSB3YXMg4oCUIHJlbWVtYmVyZWQgc28gYG9uUnVuRmFpbGVkYCwgdGhlXG4gICAqIGxvZ2dlciBhbmQgYSBmb3JrIGVudmVsb3BlIHNlcnZlIHRoZSBzYW1lIGZvcm0gKHtAbGluayBzZXJ2ZWRFcnJvcn0pLiBUaGVcbiAgICogdGhyb3duIHZhbHVlIGl0c2VsZiBzdGF5cyByZWFsLlxuICAgKi9cbiAgcmV0YWluU3RhZ2VFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAga2VwdDogdW5rbm93bixcbiAgKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB9IHtcbiAgICBjb25zdCBpbmZvID0gZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gICAgY29uc3QgdGV4dFNlbGVjdGVkID0ga2VwdCAhPT0gdGV4dDtcbiAgICBpZiAoIXRleHRTZWxlY3RlZCAmJiAhdGhpcy5jYXJyaWVzU2VsZWN0ZWRLZXkoZXJyb3IpKSByZXR1cm4geyBtZXNzYWdlOiB0ZXh0LCBzdHJ1Y3R1cmVkRXJyb3I6IGluZm8gfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGV4dFNlbGVjdGVkID8gU3RyaW5nKGtlcHQpIDogdGV4dDtcbiAgICBjb25zdCBtYXNrZWQ6IFN0cnVjdHVyZWRFcnJvckluZm8gPSB7XG4gICAgICBtZXNzYWdlOiB0ZXh0U2VsZWN0ZWQgPyBtZXNzYWdlIDogaW5mby5tZXNzYWdlLFxuICAgICAgLi4uKGluZm8ubmFtZSAhPT0gdW5kZWZpbmVkICYmIHsgbmFtZTogaW5mby5uYW1lIH0pLFxuICAgICAgLi4uKGluZm8uY29kZSAhPT0gdW5kZWZpbmVkICYmIHsgY29kZTogaW5mby5jb2RlIH0pLFxuICAgICAgcmF3OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICAodGhpcy5tYXNrZWRFcnJvcnMgPz89IG5ldyBNYXAoKSkuc2V0KGVycm9yLCBtYXNrZWQpO1xuICAgIHJldHVybiB7IG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvcjogbWFza2VkIH07XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHRocm93biB2YWx1ZSBjYXJyeSBhIHNlbGVjdGVkIG5hbWUg4oCUIGFuIG93biBrZXksIGF0IGFueSBkZXB0aCwgdGhhdFxuICAgKiB0aGUgcG9saWN5IG9yIGEgbWFyayBzZWxlY3RzPyBUb3RhbDogYSB2YWx1ZSB3aG9zZSBrZXlzIGNhbm5vdCBiZSByZWFkIGlzXG4gICAqIHNlcnZlZCBtYXNrZWQgKHRoZSBzYWZlIHNpZGUpLCBuZXZlciBhIHNlY29uZCB0aHJvdyBmcm9tIGFuIGVycm9yIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGNhcnJpZXNTZWxlY3RlZEtleSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRocm93bkNhcnJpZXModmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZXlzIHRoYXQgY2Fubm90IGJlIHJlYWQgKGEgdGhyb3dpbmcgZ2V0dGVyLCBhIHJldm9rZWQgUHJveHkpIG9yIGEgd2FsayBwYXN0IGl0c1xuICAgICAgLy8gbGltaXQ6IHNlcnZlZCBpbiB0aGUgbWFza2VkIGZvcm0g4oCUIGl0cyB0ZXh0IGtlcHQsIG5vIGByYXdgLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSB0aHJvd24gdmFsdWUgYW5kIHdoYXQgYSBsb2dnZXIgb3IgYSBzZXJpYWxpemVyIHByaW50cyB3aXRoIGl0OiBpdHMgb3duXG4gICAqIGtleXMgYXQgZXZlcnkgZGVwdGgsIGFuZCBpdHMgYGNhdXNlYCAvIGFuIGBBZ2dyZWdhdGVFcnJvcmAncyBgZXJyb3JzYCDigJQgb3duXG4gICAqIE5PTi1lbnVtZXJhYmxlIGtleXMgbm8ga2V5IHdhbGsgc2VlcyDigJQgZWFjaCB3YWxrZWQgdGhlIHNhbWUgd2F5IChhIGN5Y2xlXG4gICAqIGFtb25nIHRoZW0gaXMgZm9sbG93ZWQgb25jZSkuXG4gICAqL1xuICBwcml2YXRlIHRocm93bkNhcnJpZXModmFsdWU6IG9iamVjdCwgc2VlbjogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmIChzZWxlY3RzQnlQYXRoKHZhbHVlLCB1bmRlZmluZWQsIHRoaXMuZG90dGVkVGFyZ2V0cyh1bmRlZmluZWQpLCB0aGlzLm5hbWVzV2FsayhmYWxzZSksIG5ldyBNYXAoKSwgMCkuc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvd24gPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkgPyAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXJyb3JzID0gb3duKCdlcnJvcnMnKTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgW293bignY2F1c2UnKSwgLi4uKEFycmF5LmlzQXJyYXkoZXJyb3JzKSA/IGVycm9ycyA6IFtdKV0pIHtcbiAgICAgIGlmIChwYXJ0ICE9PSBudWxsICYmIHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0JyAmJiB0aGlzLnRocm93bkNhcnJpZXMocGFydCwgc2VlbikpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleS1sZXZlbCBydWxlcyBhcyB0aGUgcGF0aCB3YWxrIGFza3MgdGhlbSAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhXG4gICAqIG5lc3RlZCBrZXkgaXMgc2VsZWN0ZWQgYnkgaXRzIG93biBOQU1FIChtYXJrcywga2V5cywgcGF0dGVybnMpLCBhbmQg4oCUIHVuZGVyXG4gICAqIHBhdHRlcm5zIG9ubHkg4oCUIGJ5IGl0cyBkb3R0ZWQgcGF0aDsgYSBkZWNsYXJlZCAob3IgaW5oZXJpdGVkKSBmaWVsZCBiZWxvdyBhXG4gICAqIGtleSBvZiBpdHMgbmFtZSBpcyBhIHRhcmdldC4gRG90dGVkIGtleXMgYW5kIG1hcmtzIGFyZSBUQVJHRVRTIGZyb20gdGhlXG4gICAqIHdhbGsncyByb290ICh7QGxpbmsgZG90dGVkVGFyZ2V0c30pLCBzbyB3aXRob3V0IHBhdHRlcm5zIG5vIGRlY2lzaW9uXG4gICAqIGRlcGVuZHMgb24gdGhlIHBhdGggYW5kIHRoZSB3YWxrIHNoYXJlcyB0aGVtIHBlciBvYmplY3QgKGxpbmVhciBvbiBhIERBRykuXG4gICAqIGByb290RGVjaWRlZGA6IHRoZSByb290J3Mgb3duIGtleXMgd2VyZSBhbHJlYWR5IGRlY2lkZWQgKGByZXRhaW5SZWNvcmRgKS5cbiAgICovXG4gIHByaXZhdGUgbmFtZXNXYWxrKHJvb3REZWNpZGVkOiBib29sZWFuKTogV2FsayB7XG4gICAgY29uc3QgYnlQYXRoID0gdGhpcy5wYXRoUGF0dGVybnM7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzOiB7XG4gICAgICAgIG1hc2tzOiAobmFtZSkgPT4gdGhpcy5pc0tleVJlZGFjdGVkKG5hbWUpLFxuICAgICAgICAuLi4oYnlQYXRoLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICAgIHBhdGhNYXNrczogKHBhdGg6IHN0cmluZykgPT4gcGF0aC5sZW5ndGggPD0gTUFYX1BBVFRFUk5fS0VZX0xFTiAmJiBtYXRjaGVzUGF0dGVybihwYXRoLCBieVBhdGgpLFxuICAgICAgICB9KSxcbiAgICAgICAgZmllbGRzOiAobmFtZSkgPT4gdGhpcy5maWVsZHNPZihuYW1lKSxcbiAgICAgIH0sXG4gICAgICByb290RGVjaWRlZCxcbiAgICAgIC4uLihieVBhdGgubGVuZ3RoID09PSAwICYmIHsgbWVtbzogbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4oKSB9KSxcbiAgICAgIGJ1ZGdldDogd2Fsa0xpbWl0LFxuICAgICAgb25MaW1pdDogKCkgPT4gdGhpcy53YXJuV2Fsa0xpbWl0KGJ5UGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPbmNlIHBlciBydWxlLCBpbiBkZXYgbW9kZTogYSBwYXRoIHdhbGsgcGFzc2VkIGl0cyBsaW1pdCBhbmQgc2VydmVkIGl0cyByZW1haW5kZXIgYXMgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBwcml2YXRlIHdhcm5XYWxrTGltaXQocGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2Fsa0xpbWl0V2FybmVkIHx8ICFpc0Rldk1vZGUoKSkgcmV0dXJuO1xuICAgIHRoaXMud2Fsa0xpbWl0V2FybmVkID0gdHJ1ZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGEgdmFsdWUgd2l0aCBtb3JlIHRoYW4gJHt3YWxrTGltaXR9IHBhdGhzIHVuZGVyIHRoZSBwYXRoIHBhdHRlcm4ocykgYCArXG4gICAgICAgIGAke3BhdHRlcm5zLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9IOKAlCB0aGUgcGF0aHMgcGFzdCB0aGF0IHdlcmUgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gYCArXG4gICAgICAgICdBIHBhdHRlcm4gdGhhdCBuYW1lcyBhIEtFWSAobm8gZG90LCBubyBsb29rYXJvdW5kKSBpcyBkZWNpZGVkIHBlciBvYmplY3Q7IHByZWZlciBvbmUsIG9yIGtleXMvZmllbGRzLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZG90dGVkIGtleXMgYW5kIG1hcmtzIHRoYXQgbmFtZSBhIHBhdGggdW5kZXIgYGJhc2VgICh0aGUgd2FsaydzIHJvb3Q6XG4gICAqIGB1bmRlZmluZWRgIGZvciBhIHJlY29yZCdzIG93biBrZXlzLCBhbiBlbnRyeSdzIG5hbWUgZm9yIGEgZGlhZ25vc3RpYyksXG4gICAqIGFzIHRhcmdldHMgcmVsYXRpdmUgdG8gaXQg4oCUIGEgZG90dGVkIHJ1bGUgaXMgZXhhY3QgdG8gaXRzIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGRvdHRlZFRhcmdldHMoYmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGFyZ2V0W10ge1xuICAgIGNvbnN0IHByZWZpeCA9IGJhc2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYCR7YmFzZX0uYDtcbiAgICBjb25zdCBvdXQ6IFRhcmdldFtdID0gW107XG4gICAgY29uc3QgYWRkID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcuJykgfHwgIW5hbWUuc3RhcnRzV2l0aChwcmVmaXgpIHx8IG5hbWUubGVuZ3RoID09PSBwcmVmaXgubGVuZ3RoKSByZXR1cm47XG4gICAgICBvdXQucHVzaChuYW1lLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJykpO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMubWFya2VkKSBhZGQobmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucG9saWN5Py5rZXlzID8/IFtdKSBhZGQobmFtZSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGFueSBvYnNlcnZlciBpcyBzZXJ2ZWQgZm9yIGEgdGhyb3duIHZhbHVlIOKAlCByZXRyeSwgdGhyb3R0bGUsIHJ1blxuICAgKiBmYWlsdXJlLCBhIGZvcmsgZW52ZWxvcGUsIHRoZSBsb2dnZXI6IGl0cyByZW1lbWJlcmVkIHN0YWdlIGZvcm0sIGVsc2UgdGhlXG4gICAqIHNhbWUgZGVjaXNpb24gbWFkZSBub3cgKGFuZCByZW1lbWJlcmVkKSwgZWxzZSBpdHMgc3RydWN0dXJlZCBpbmZvLlxuICAgKi9cbiAgc2VydmVkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHtcbiAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9yKGVycm9yKTtcbiAgICAvLyBFYWNoIGV2ZW50IGdldHMgaXRzIG93biBvYmplY3QsIGFzIGV4dHJhY3RFcnJvckluZm8gZ2l2ZXMgaXQgb25lLlxuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgbG9nZ2VyIGlzIGhhbmRlZDogdGhlIHRocm93biB2YWx1ZSBpdHNlbGYgdW5sZXNzIHRoZSBwb2xpY3kgbWFza2VkIGl0cyB0ZXh0LiAqL1xuICBsb2dnYWJsZUVycm9yKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBlcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgbWFza2VkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICAgIGlmIChrbm93biB8fCB0aGlzLmlzRGlhZ25vc3RpY0luZXJ0KCkpIHJldHVybiBrbm93bjtcbiAgICBjb25zdCB0ZXh0ID0gdGhyb3duVGV4dChlcnJvcik7XG4gICAgdGhpcy5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCB0aGlzLnJldGFpbkRpYWdub3N0aWMoWydlcnJvcnMnLCAnc3RhZ2VFeGVjdXRpb25FcnJvciddLCB0ZXh0KSk7XG4gICAgcmV0dXJuIHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGhpbmcgY2FuIG1hc2sgYSBkaWFnbm9zdGljIGVudHJ5IG9yIGEgdGhyb3duIHZhbHVlIOKAlCBubyBzdGF0ZSBzZWxlY3RvcixcbiAgICogbm8gbWFyaywgbm8gZGlhZ25vc3RpYyBzZWxlY3RvcjogdGhlIGNvbGxlY3RvcnMnIGFuZCB0aGUgZXJyb3IgcGF0aHMnIGZhc3RcbiAgICogcGF0aCAoYSBuby1wb2xpY3kgcnVuIG5ldmVyIHJlYWRzIGEgcGF5bG9hZCwgaW5jbHVkaW5nIGJvcnJvd2VkIGdldHRlcnMpLlxuICAgKi9cbiAgaXNEaWFnbm9zdGljSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmVydCgpICYmIHRoaXMuaXNGbG93VGV4dEluZXJ0KCk7XG4gIH1cblxuICAvKiogTm90aGluZyBjYW4gbWFzayBmbG93LW1lc3NhZ2UgdGV4dCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0ICh7QGxpbmsgcmV0YWluRmxvd1RleHR9KS4gKi9cbiAgaXNGbG93VGV4dEluZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kaWFnbm9zdGljUnVsZSB8fCB0aGlzLmRpYWdub3N0aWNSdWxlLmlzSW5lcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBmb3IgYSB1c2VyLWxldmVsIHBhdGgg4oCUIGBbJ3Byb2ZpbGUnXWAgZm9yIGEgc2NvcGUga2V5LFxuICAgKiBgWydwcm9maWxlJywgJ2F1dGgnXWAgZm9yIGEgbmVzdGVkIHdyaXRlIHN1Y2ggYXMgYSBzdWJmbG93IHNlZWQuXG4gICAqXG4gICAqIEV2ZXJ5IGRvdHRlZCBwcmVmaXggaXMgdGVzdGVkIGF0IGtleSBsZXZlbCAoYHByb2ZpbGVgLCB0aGVuXG4gICAqIGBwcm9maWxlLmF1dGhgKSwgc28gYSBwb2xpY3kgdGhhdCBuYW1lcyBhIGtleSBjb3ZlcnMgZXZlcnl0aGluZyB3cml0dGVuXG4gICAqIGJlbmVhdGggaXQuIGBmaWVsZHNgIGFyZSBkZWNsYXJlZCByZWxhdGl2ZSB0byB0aGUgVE9QIGtleTsgZm9yIGEgbmVzdGVkXG4gICAqIHBhdGggdGhleSBhcmUgcmUtYmFzZWQgb250byB0aGUgdmFsdWUgYmVpbmcgd3JpdHRlbiwgYW5kIGEgZmllbGQgdGhhdFxuICAgKiBuYW1lcyB0aGUgd3JpdHRlbiBwYXRoIGV4YWN0bHkgbWFrZXMgdGhlIHdob2xlIHZhbHVlIHNlY3JldC5cbiAgICovXG4gIHZlcmRpY3QocGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLnZlcmRpY3RPZktleShwYXRoWzBdKTtcbiAgICBsZXQgZG90dGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3R0ZWQgPSBpID09PSAwID8gcGF0aFswXSA6IGAke2RvdHRlZH0uJHtwYXRoW2ldfWA7XG4gICAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGRvdHRlZCkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2YocGF0aFswXSk7XG4gICAgaWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIENMRUFSO1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGZpZWxkcyB9O1xuICAgIGNvbnN0IHJlbCA9IHBhdGguc2xpY2UoMSkuam9pbignLicpO1xuICAgIGNvbnN0IGluc2lkZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgLy8gVGhlIHdyaXR0ZW4gcGF0aCBJUyBhIHNlY3JldCBmaWVsZDogdGhlIHdob2xlIHZhbHVlIGlzIHNlY3JldCwgYW5kXG4gICAgICAvLyB0aGUga2V5IHRoYXQgZGVjaWRlZCBpdCBpcyB0aGF0IGRvdHRlZCBwYXRoIOKAlCBuZXZlciB0aGUgdG9wIGtleSxcbiAgICAgIC8vIHdob3NlIHNpYmxpbmdzIHN0YXkgY2xlYXIuXG4gICAgICBpZiAoZmllbGQgPT09IHJlbCkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiBkb3R0ZWQgfTtcbiAgICAgIGlmIChmaWVsZC5zdGFydHNXaXRoKGAke3JlbH0uYCkpIGluc2lkZS5wdXNoKGZpZWxkLnNsaWNlKHJlbC5sZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGUubGVuZ3RoID4gMCA/IHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGluc2lkZSB9IDogQ0xFQVI7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGBrZXlgIHdyaXR0ZW4gb3IgcmVhZCB1bmRlciBgcGF0aGAg4oCUIHRoZSBjb21tb25cbiAgICogc2luZ2xlLXNlZ21lbnQgY2FzZSAoYHBhdGhgIGVtcHR5OiBldmVyeSBmYWNhZGUgd3JpdGUgYW5kIHJlYWQpIGRlY2lkZXNcbiAgICogb24gdGhlIGtleSBzdHJpbmcgYWxvbmUsIG5vIGFycmF5IGFsbG9jYXRlZC5cbiAgICovXG4gIHZlcmRpY3RBdChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPT09IDAgPyB0aGlzLnZlcmRpY3RPZktleShrZXkpIDogdGhpcy52ZXJkaWN0KFsuLi5wYXRoLCBrZXldKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlLXNlZ21lbnQgdmVyZGljdDoga2V5LWxldmVsIGhpdCDihpIgd2hvbGU7IGRlY2xhcmVkIG9yIGluaGVyaXRlZCBmaWVsZHMg4oaSIGZpZWxkcy4gKi9cbiAgcHJpdmF0ZSB2ZXJkaWN0T2ZLZXkoa2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGtleSkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2Yoa2V5KTtcbiAgICByZXR1cm4gZmllbGRzICE9PSB1bmRlZmluZWQgJiYgZmllbGRzLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXksIHBhdGhzOiBmaWVsZHMgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqIFRoZSBzZWNyZXQgZmllbGRzIG9mIGEgdG9wIGtleTogdGhlIHBvbGljeSdzLCBwbHVzIGFueSBhIG1hcHBlciBoYW5kZWQgaXQgKHtAbGluayBNYXBwZXJUYWludH0pLiAqL1xuICBwcml2YXRlIGZpZWxkc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRlY2xhcmVkID0gZGVjbGFyZWRGaWVsZHModGhpcy5wb2xpY3k/LmZpZWxkcywga2V5KTtcbiAgICBjb25zdCBpbmhlcml0ZWQgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KGtleSk7XG4gICAgaWYgKGluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjbGFyZWQ7XG4gICAgcmV0dXJuIGRlY2xhcmVkID09PSB1bmRlZmluZWQgPyBpbmhlcml0ZWQgOiBbLi4ubmV3IFNldChbLi4uZGVjbGFyZWQsIC4uLmluaGVyaXRlZF0pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgbWFya3MgYW5kIHRoZSBmaWVsZHMgbWFwcGVycyBoYW5kZWQgdG8gbmV3IGtleXMsIGFzIE5BTUVTIOKAlCB3aGF0XG4gICAqIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4gKGBGbG93Y2hhcnRDaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzYCkuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vbmUgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyaykuXG4gICAqL1xuICBtYXJrc0ZvckNoZWNrcG9pbnQoKTogUmVkYWN0aW9uTWFya3MgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLm1hcmtlZC5zaXplID09PSAwICYmIHRoaXMuaW5oZXJpdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IFsuLi50aGlzLm1hcmtlZF0sXG4gICAgICAuLi4odGhpcy5pbmhlcml0ZWQgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGZpZWxkczogT2JqZWN0LmZyb21FbnRyaWVzKFsuLi50aGlzLmluaGVyaXRlZF0ubWFwKChba2V5LCBwYXRoc10pID0+IFtrZXksIFsuLi5wYXRoc11dKSksXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFNlZWQgYSByZXN1bWVkIHJ1bidzIHJ1bGUgd2l0aCB0aGUgbWFya3MgaXRzIHBhdXNlIGNhcnJpZWQgKHtAbGluayBtYXJrc0ZvckNoZWNrcG9pbnR9KS4gKi9cbiAgcmVzdG9yZU1hcmtzKG1hcmtzOiBSZWRhY3Rpb25NYXJrcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG1hcmtzLmtleXMpIHRoaXMubWFya2VkLmFkZChrZXkpO1xuICAgIGZvciAoY29uc3QgW2tleSwgcGF0aHNdIG9mIE9iamVjdC5lbnRyaWVzKG1hcmtzLmZpZWxkcyA/PyB7fSkpIHRoaXMuaW5oZXJpdEZpZWxkcyhrZXksIHBhdGhzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHN1YmZsb3cgbWFwcGVyJ3MgY29weSBpbmhlcml0cyB0aGUgZmllbGRzIG9mIHRoZSB2YWx1ZSBpdCBjb3BpZWQ6XG4gICAqIGB0YXJnZXRgIGlzIGEga2V5IHRoZSBtYXBwZXIgd3JvdGU7IGBwYXRoc2AgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRoc1xuICAgKiAoZGVjbGFyZWQgb3IgdGhlbXNlbHZlcyBpbmhlcml0ZWQpLiBSdW4td2lkZSwgYnkgbmFtZSwgbGlrZSBhIG1hcmsuXG4gICAqL1xuICBpbmhlcml0RmllbGRzKHRhcmdldDogc3RyaW5nLCBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMuaW5oZXJpdGVkPy5nZXQodGFyZ2V0KSA/PyBbXTtcbiAgICAodGhpcy5pbmhlcml0ZWQgPz89IG5ldyBNYXAoKSkuc2V0KHRhcmdldCwgWy4uLm5ldyBTZXQoWy4uLnByaW9yLCAuLi5wYXRoc10pXSk7XG4gIH1cblxuICAvKiogVGhlIHZlcmRpY3Qgb2YgYSBrZXkgYSBtYXBwZXIgcmVhZCDigJQgYHJ1bnNgICh0aGUgcnVuIG5hbWVzcGFjZXMpIGlzIHNlbGVjdGVkIHdoZW4gYW55IG5hbWVzcGFjZWQga2V5IGlzLiAqL1xuICB2ZXJkaWN0T2ZSZWFkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnZlcmRpY3RPZktleShrZXkpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwga2V5ICE9PSAncnVucycgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZlcmRpY3Q7XG4gICAgZm9yIChjb25zdCBzcGFjZSBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgICAgaWYgKHNwYWNlID09PSBudWxsIHx8IHR5cGVvZiBzcGFjZSAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBpbm5lciBvZiBPYmplY3Qua2V5cyhzcGFjZSkpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyZGljdE9mS2V5KGlubmVyKS5raW5kICE9PSAnY2xlYXInKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIC8gc2VydmVkIGZvcm0gb2YgYSB2YWx1ZSBhdCBhIHBhdGg6IHRoZSBwbGFjZWhvbGRlciwgYVxuICAgKiBzY3J1YmJlZCBDTE9ORSwgb3IgdGhlIHZhbHVlIGl0c2VsZiAoc2FtZSByZWZlcmVuY2Ug4oCUIHJlY29yZGVycyByZWNlaXZlXG4gICAqIGJvcnJvd2VkIGxpdmUgcmVmZXJlbmNlcyBmb3IgY2xlYXIgdmFsdWVzLCBhcyB0aGV5IGFsd2F5cyBoYXZlKS5cbiAgICogYHBsYWNlaG9sZGVyYCBkZWZhdWx0cyB0byB0aGUgc2NvcGUtdGllciBgJ1tSRURBQ1RFRF0nYDsgdGhlIG1pcnJvciBzZWVkXG4gICAqIHBhc3NlcyB0aGUgbG9nJ3MgYCdSRURBQ1RFRCdgLlxuICAgKi9cbiAgcmV0YWluKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCB2YWx1ZTogdW5rbm93biwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogdW5rbm93biB7XG4gICAgcmV0dXJuIFJlZGFjdGlvblJ1bGUuYXBwbHkodGhpcy52ZXJkaWN0KHBhdGgpLCB2YWx1ZSwgcGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgU1RBVEUgcmVjb3JkIChzdGF0ZSByZWFkLCBtaXJyb3Igc2VlZCk6IGVhY2ggb3duXG4gICAqIGVudW1lcmFibGUgc3RyaW5nIGtleSB0aHJvdWdoIHtAbGluayByZXRhaW59LiBGaWVsZHMgYXJlIHBhdGhzIGluc2lkZSB0aGF0XG4gICAqIGtleWVkIHZhbHVlLiBTY2FsYXJzIGFuZCByb290IGFycmF5cyBwYXNzIHRocm91Z2guIEJvdW5kYXJ5IHJlY29yZHMgYWRkXG4gICAqIHRoZSBuZXN0ZWQta2V5IHdhbGs6IHtAbGluayByZXRhaW5Cb3VuZGFyeX0uXG4gICAqIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHdoZW4gdW5jaGFuZ2VkLiBBbiBpbmVydCBydWxlIGRvZXMgbm90IGVudW1lcmF0ZVxuICAgKiB0aGUgdmFsdWUsIHNvIGV2ZW4gYW4gYWNjZXNzb3IgaXMgdW50b3VjaGVkIG9uIHRoZSBuby1wb2xpY3kgZmFzdCBwYXRoLlxuICAgKi9cbiAgcmV0YWluUmVjb3JkPFQ+KHJlY29yZDogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHJlY29yZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3Qga2VwdCA9IHRoaXMucmV0YWluKFtrZXldLCB2YWx1ZSwgcGxhY2Vob2xkZXIpO1xuICAgICAgaWYgKGtlcHQgPT09IHZhbHVlKSBjb250aW51ZTtcbiAgICAgIG91dCA/Pz0geyAuLi4ocmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgb3V0W2tleV0gPSBrZXB0O1xuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyByZWNvcmQpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSBCT1VOREFSWSByZWNvcmQg4oCUIHJvb3QgaW5wdXQvb3V0cHV0IGFuZCBhIHN1YmZsb3cnc1xuICAgKiBtYXBwZWQgc2VlZCwgYmVmb3JlIGFueSBvYnNlcnZlciBzZWVzIGl0LiB7QGxpbmsgcmV0YWluUmVjb3JkfSBkZWNpZGVzIGVhY2hcbiAgICogdG9wIGtleTsgdGhlbiBldmVyeSBORVNURUQgb3duIGtleSBpcyBhIGtleSB0b286IHNlY3JldCB3aGVuIGl0cyBvd24gbmFtZVxuICAgKiBvciBpdHMgZG90dGVkIHBhdGggaXMgcmVkYWN0ZWQgYXQga2V5IGxldmVsIChga2V5czogWydzZWNyZXQnXWAgY292ZXJzXG4gICAqIGB7IHdyYXBwZXI6IHsgc2VjcmV0IH0gfWA7IGEgcm9vdCBhcnJheSdzIGVsZW1lbnRzIGFyZSB3YWxrZWQgdGhlIHNhbWVcbiAgICogd2F5KSwgYW5kIGl0cyBkZWNsYXJlZCBgZmllbGRzYCBzY3J1YmJlZCBpbnNpZGUgaXQgKGBmaWVsZHM6IHsgcHJvZmlsZTpcbiAgICogWyd0b2tlbiddIH1gIGNvdmVycyBgeyB3cmFwcGVyOiB7IHByb2ZpbGU6IHsgdG9rZW4gfSB9IH1gKS4gRGVjaWRlZCBwZXJcbiAgICogUEFUSCwgY29weS1vbi13cml0ZSBwZXIgcGF0aCAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhbiBvYmplY3Qgc2hhcmVkIGJ5XG4gICAqIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG9uZSBhIHBhdGggcnVsZSBuYW1lcyBhbmQgc2VydmVkIGFzIGl0IGlzIGF0XG4gICAqIHRoZSBvdGhlcjsgYSBjeWNsZSBlZGdlIGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSwgbmV2ZXIgb24gYW4gdW5zY3J1YmJlZFxuICAgKiBvcmlnaW5hbDsgdGhlIGxpdmUgdmFsdWUgaXMgbmV2ZXIgdG91Y2hlZC4gUmV0dXJucyB0aGUgU0FNRSBvYmplY3Qgd2hlblxuICAgKiBub3RoaW5nIG5lc3RlZCBpcyBzZWNyZXQsIGFuZCBhbiBpbmVydCBydWxlIGVudW1lcmF0ZXMgbm90aGluZy4gU3RhdGVcbiAgICoga2VlcHMgaXRzIG93biBwYXRoIHZlcmRpY3RzICh7QGxpbmsgdmVyZGljdH0pOyB0aGlzIHdhbGsgaXMgZm9yIHJlY29yZHNcbiAgICogaGFuZGVkIG91dCB3aG9sZS5cbiAgICovXG4gIHJldGFpbkJvdW5kYXJ5PFQ+KHJlY29yZDogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgLy8gQSBtYXNrZWQgc3RhZ2UgZXJyb3IgaW5zaWRlIHRoZSByZWNvcmQgKGEgZm9yayBlbnZlbG9wZSdzIGByZXN1bHRgKSBpc1xuICAgIC8vIHNlcnZlZCBpbiBpdHMgbWFza2VkIGZvcm06IGFuIEVycm9yJ3MgbWVzc2FnZSBpcyBub24tZW51bWVyYWJsZSBhbmQgYVxuICAgIC8vIHRocm93biBzdHJpbmcgaXMgYSBwbGFpbiB2YWx1ZSwgc28gbm8ga2V5IHdhbGsgc2VlcyBlaXRoZXIuXG4gICAgY29uc3Qgc2VydmVkID0gdGhpcy5tYXNrZWRFcnJvcnM/LnNpemUgPyAodGhpcy53aXRoU2VydmVkRXJyb3JzKHJlY29yZCkgYXMgVCkgOiByZWNvcmQ7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHNlcnZlZCA9PT0gbnVsbCB8fCB0eXBlb2Ygc2VydmVkICE9PSAnb2JqZWN0JykgcmV0dXJuIHNlcnZlZDtcbiAgICBjb25zdCB0b3AgPSB0aGlzLnJldGFpblJlY29yZChzZXJ2ZWQsIHBsYWNlaG9sZGVyKSBhcyB1bmtub3duIGFzIG9iamVjdDtcbiAgICAvLyBCZWxvdyB0aGUgdG9wIGtleXMsIG9uZSBkZWNpc2lvbiBwZXIgUEFUSCAodGhlIHdob2xlIHJlY29yZCBpcyB0aGUgd2FsaydzIHJvb3QsIHNvIGEgY3ljbGVcbiAgICAvLyBiYWNrIHRvIGl0IGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSkuXG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aCh0b3AsIHVuZGVmaW5lZCwgdGhpcy5kb3R0ZWRUYXJnZXRzKHVuZGVmaW5lZCksIHRoaXMubmFtZXNXYWxrKHRydWUpLCBwbGFjZWhvbGRlcikgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5LW9uLXdyaXRlIG92ZXIgY29udGFpbmVyczogZXZlcnkgcmVtZW1iZXJlZCBtYXNrZWQgZXJyb3IgYmVjb21lcyBpdHNcbiAgICogc2VydmVkIGZvcm0g4oCUIGFuIG9iamVjdCBlcnJvciBpdHMgbWFza2VkIHN0cnVjdHVyZWQgaW5mbywgYSB0aHJvd25cbiAgICogc3RyaW5nL251bWJlciBpdHMgbWFza2VkIHRleHQgKHRoZSB2YWx1ZSBrZWVwcyBiZWluZyBhIHNjYWxhcikuIEEgc2NhbGFyIGlzXG4gICAqIG1hdGNoZWQgYnkgVkFMVUUsIHNvIGFuIHVucmVsYXRlZCBmaWVsZCB0aGF0IGhhcHBlbnMgdG8gZXF1YWwgYSBtYXNrZWRcbiAgICogdGhyb3duIHN0cmluZyBpcyBtYXNrZWQgdG9vOiBvdmVyLW1hc2tpbmcgaXMgdGhlIHNhZmUgZGlyZWN0aW9uLlxuICAgKiBgdW5kZWZpbmVkYC9gbnVsbGAvYm9vbGVhbnMgYXJlIG5ldmVyIHN3YXBwZWQg4oCUIHRoZXkgY2Fycnkgbm8gdGV4dCwgYW5kXG4gICAqIHN3YXBwaW5nIHRoZW0gd291bGQgcmV3cml0ZSBvcmRpbmFyeSBkYXRhIHNoYXBlcy5cbiAgICpcbiAgICogQ1lDTEUtU0FGRSAocmV2aWV3IGZpbmRpbmcgMikuIFRoZSBjb250YWluZXJzIHRoYXQgY2FuIFJFQUNIIGEgbWFza2VkXG4gICAqIGVycm9yIGFyZSBmb3VuZCBmaXJzdCAoe0BsaW5rIHJlYWNoaW5nTWFza2VkRXJyb3JzfSDigJQgdGhlIHdob2xlIHJlYWNoYWJsZVxuICAgKiBncmFwaCwgY3ljbGVzIGluY2x1ZGVkKTsgZWFjaCBvZiB0aGVtIGlzIGNvcGllZCwgaXRzIGNvcHkgYWxsb2NhdGVkIGFuZFxuICAgKiByZW1lbWJlcmVkIEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIGZpbGxlZCwgc28gYW4gZWRnZSBiYWNrIHRvIGl0IOKAlCBhIGN5Y2xlXG4gICAqIOKAlCBsYW5kcyBvbiB0aGUgY29weSwgbmV2ZXIgb24gdGhlIG9yaWdpbmFsIHRoYXQgc3RpbGwgaG9sZHMgdGhlIHJhdyBlcnJvci5cbiAgICogRXZlcnkgb3RoZXIgY29udGFpbmVyIGtlZXBzIGl0cyBpZGVudGl0eS5cbiAgICovXG4gIHByaXZhdGUgd2l0aFNlcnZlZEVycm9ycyh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IGxlYWYgPSB0aGlzLnNlcnZlZExlYWYodmFsdWUpO1xuICAgIGlmIChsZWFmICE9PSBLRUVQIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBsZWFmID09PSBLRUVQID8gdmFsdWUgOiBsZWFmO1xuICAgIGNvbnN0IHJlYWNoaW5nID0gdGhpcy5yZWFjaGluZ01hc2tlZEVycm9ycyh2YWx1ZSk7XG4gICAgaWYgKCFyZWFjaGluZy5oYXModmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgY29waWVzID0gbmV3IE1hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAgIGNvbnN0IGNvcHlPZiA9IChub2RlOiBvYmplY3QpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IGNvcGllcy5nZXQobm9kZSk7XG4gICAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgICAgY29uc3QgY29weSA9IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29waWVzLnNldChub2RlLCBjb3B5KTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMuc2VydmVkTGVhZihjaGlsZCk7XG4gICAgICAgIGlmIChzZXJ2ZWQgIT09IEtFRVApIGNvcHlba2V5XSA9IHNlcnZlZDtcbiAgICAgICAgZWxzZSBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiByZWFjaGluZy5oYXMoY2hpbGQpKSBjb3B5W2tleV0gPSBjb3B5T2YoY2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfTtcbiAgICByZXR1cm4gY29weU9mKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBBIG1hc2tlZCBlcnJvcidzIHNlcnZlZCBmb3JtIOKAlCBgS0VFUGAgZm9yIGFueXRoaW5nIGVsc2UgKGEgc2NhbGFyIG5ldmVyIHN3YXBwZWQsIGEgY29udGFpbmVyKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWRMZWFmKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBLRUVQO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KHZhbHVlKTtcbiAgICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogS0VFUDtcbiAgICB9XG4gICAgY29uc3Qgc3dhcHBhYmxlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgY29uc3QgbWFza2VkID0gc3dhcHBhYmxlID8gdGhpcy5tYXNrZWRFcnJvcnM/LmdldCh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG1hc2tlZCA/IG1hc2tlZC5tZXNzYWdlIDogS0VFUDtcbiAgfVxuXG4gIC8qKiBFdmVyeSBjb250YWluZXIgdW5kZXIgYHJvb3RgIChpdHNlbGYgaW5jbHVkZWQpIGZyb20gd2hpY2ggc29tZSBwYXRoIHJlYWNoZXMgYSBtYXNrZWQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhY2hpbmdNYXNrZWRFcnJvcnMocm9vdDogb2JqZWN0KTogU2V0PG9iamVjdD4ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG4gICAgY29uc3QgaG9sZGVyczogb2JqZWN0W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxvYmplY3Q+KFtyb290XSk7XG4gICAgY29uc3Qgc3RhY2s6IG9iamVjdFtdID0gW3Jvb3RdO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG5vZGUpKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcnZlZExlYWYoY2hpbGQpICE9PSBLRUVQKSB7XG4gICAgICAgICAgaG9sZGVycy5wdXNoKG5vZGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb2YgPSBwYXJlbnRzLmdldChjaGlsZCk7XG4gICAgICAgIGlmIChvZiA9PT0gdW5kZWZpbmVkKSBwYXJlbnRzLnNldChjaGlsZCwgW25vZGVdKTtcbiAgICAgICAgZWxzZSBvZi5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoIXNlZW4uaGFzKGNoaWxkKSkge1xuICAgICAgICAgIHNlZW4uYWRkKGNoaWxkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWFjaGluZyA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIHdoaWxlIChob2xkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBob2xkZXJzLnBvcCgpITtcbiAgICAgIGlmIChyZWFjaGluZy5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgcmVhY2hpbmcuYWRkKG5vZGUpO1xuICAgICAgaG9sZGVycy5wdXNoKC4uLihwYXJlbnRzLmdldChub2RlKSA/PyBbXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhY2hpbmc7XG4gIH1cblxuICAvKiogRG9lcyBgdmFsdWVgIGhvbGQgb25lIG9mIGBwYXRoc2Ag4oCUIGFuIG93biBrZXkgb2YgdGhhdCBuYW1lLCBvciBhIGRvdHRlZCBwYXRoIGluc2lkZSBpdD8gKi9cbiAgc3RhdGljIGhvbGRzUGF0aHModmFsdWU6IG9iamVjdCwgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHBhdGgpIHx8IChwYXRoLmluY2x1ZGVzKCcuJykgJiYgbmF0aXZlSGFzKHZhbHVlLCBwYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIHdob2xlIFNUQVRFIOKAlCB7QGxpbmsgcmV0YWluUmVjb3JkfSBvdmVyIHRoZSByb290XG4gICAqIGtleXMgQU5EIG92ZXIgZXZlcnkgcnVuIG5hbWVzcGFjZSB1bmRlciBgcnVuc2AgKGZvcmsgY2hpbGRyZW4gd3JpdGVcbiAgICogdGhlcmU7IGEgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAgY2FycmllcyBpdCBiYWNrIGFzIGEgc2VlZCkuIFRoaXMgaXNcbiAgICogd2hhdCBzZWVkcyB0aGUgcmVkYWN0ZWQgbWlycm9yOiB0aGUgc3RvcmUncyBzdGFydGluZyBzdGF0ZSwgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgbG9nJ3MgcGxhY2Vob2xkZXIsIHNvIGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgc2VlZCBhbmQgaXNcbiAgICogbmV2ZXIgcmUtd3JpdHRlbiBpcyBzdGlsbCBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcmV0YWluU3RhdGU8VD4oc3RhdGU6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpblJlY29yZChzdGF0ZSwgcGxhY2Vob2xkZXIpO1xuICAgIGlmIChrZXB0ID09PSBudWxsIHx8IHR5cGVvZiBrZXB0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGtlcHQ7XG4gICAgY29uc3QgcnVucyA9IChrZXB0IGFzIHsgcnVucz86IHVua25vd24gfSkucnVucztcbiAgICBpZiAocnVucyA9PT0gbnVsbCB8fCB0eXBlb2YgcnVucyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydW5zKSkgcmV0dXJuIGtlcHQ7XG4gICAgbGV0IHNjcnViYmVkUnVuczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBbcnVuSWQsIHJlY29yZF0gb2YgT2JqZWN0LmVudHJpZXMocnVucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IGtlcHRSdW4gPSB0aGlzLnJldGFpblJlY29yZChyZWNvcmQsIHBsYWNlaG9sZGVyKTtcbiAgICAgIGlmIChrZXB0UnVuID09PSByZWNvcmQpIGNvbnRpbnVlO1xuICAgICAgc2NydWJiZWRSdW5zID8/PSB7IC4uLihydW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgc2NydWJiZWRSdW5zW3J1bklkXSA9IGtlcHRSdW47XG4gICAgfVxuICAgIHJldHVybiBzY3J1YmJlZFJ1bnMgPT09IHVuZGVmaW5lZCA/IGtlcHQgOiAoeyAuLi4oa2VwdCBhcyBvYmplY3QpLCBydW5zOiBzY3J1YmJlZFJ1bnMgfSBhcyBUKTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhIHZlcmRpY3QgdG8gYSB2YWx1ZSDigJQgc2VlIHtAbGluayByZXRhaW59LiAqL1xuICBzdGF0aWMgYXBwbHkodmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCwgdmFsdWU6IHVua25vd24sIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgcmV0dXJuIFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMsIHBsYWNlaG9sZGVyKSA/PyB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQSBkZWVwIGNsb25lIG9mIGB2YWx1ZWAgd2l0aCB0aGUgZ2l2ZW4gZG90LXBhdGhzIHJlcGxhY2VkIGJ5IHRoZVxuICAgKiBwbGFjZWhvbGRlciDigJQgYHVuZGVmaW5lZGAgd2hlbiBgdmFsdWVgIGlzIG5vdCBhbiBvYmplY3QgKHRoZXJlIGlzIG5vdGhpbmdcbiAgICogdG8gc2NydWIgaW4gYSBzY2FsYXI7IHRoZSBjYWxsZXIga2VlcHMgdGhlIHZhbHVlKS4gVGhlIGNsb25lIHJlZnVzZXMgYW5cbiAgICogdW5jbG9uZWFibGUgdmFsdWUuIEEgcGF0aCBuYW1lcyBhIGxpdGVyYWwga2V5IChgJ2EuYidgIGFzIG9uZSBwcm9wZXJ0eSlcbiAgICogYW5kLCB3aGVuIGRvdHRlZCwgdGhlIG5lc3RlZCBwYXRoOyBlYWNoIGlzIHNjcnViYmVkIHdoZXJlIGl0IGV4aXN0cywgcGVyXG4gICAqIFBBVEgg4oCUIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWRcbiAgICogb25lIG9ubHkgKHtAbGluayBzZXJ2ZWRCeVBhdGh9KS4gUGF0aHMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIGlnbm9yZWQg4oCUXG4gICAqIHNjcnViYmluZyBuZXZlciBpbnZlbnRzIGEgZmllbGQuXG4gICAqL1xuICBzdGF0aWMgc2NydWJGaWVsZHMoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUixcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBjbG9uZSBkZXRhY2hlcyB0aGUgcmV0YWluZWQgdmFsdWUgKGFuZCByZWZ1c2VzIGFuIHVuY2xvbmVhYmxlIG9uZSk7IHRoZSBzY3J1YiBvbiBpdCBpc1xuICAgIC8vIGRlY2lkZWQgcGVyIFBBVEgsIHNvIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWQgb25lIG9ubHkuXG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkgYXMgb2JqZWN0O1xuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgoXG4gICAgICBjb3B5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFyZ2V0c09mKHBhdGhzKSxcbiAgICAgIHsgcm9vdERlY2lkZWQ6IGZhbHNlLCBtZW1vOiBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PigpLCBidWRnZXQ6IHdhbGtMaW1pdCB9LFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIC8vIEtleWVkIGJ5IGEgTWFwLCB0aGVuIG1hZGUgb3duIGRhdGEga2V5cyBieSBgZnJvbUVudHJpZXNgOiBhIGtleSBhIG1hcHBlclxuICAgIC8vIHdyb3RlIGlzIGEgbmFtZSBmcm9tIGRhdGEsIGFuZCBvbiBhIHBsYWluIG9iamVjdCBgdG9TdHJpbmdgIHdvdWxkIHJlYWRcbiAgICAvLyB0aGUgaW5oZXJpdGVkIG1ldGhvZCBhbmQgYF9fcHJvdG9fX2Agd291bGQgY2FsbCB0aGUgcHJvdG90eXBlIHNldHRlci5cbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucG9saWN5Py5maWVsZHMgPz8ge30pKSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnMuc2V0KGtleSwgWy4uLmZpZWxkc10pO1xuICAgIH1cbiAgICAvLyBGaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleSBhcmUgc2NydWJiZWQgdW5kZXIgdGhhdCBrZXkgdG9vLlxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLmluaGVyaXRlZCA/PyBbXSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zLnNldChrZXksIFsuLi5uZXcgU2V0KFsuLi4oZmllbGRSZWRhY3Rpb25zLmdldChrZXkpID8/IFtdKSwgLi4uZmllbGRzXSldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMubWFya2VkXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9uczogT2JqZWN0LmZyb21FbnRyaWVzKGZpZWxkUmVkYWN0aW9ucyksXG4gICAgICBwYXR0ZXJuczogKHRoaXMucG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgVGhlIHBhdGggd2FsayDigJQgb25lIGRlY2lzaW9uIHBlciBQQVRIIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIEEgcnVsZSB0aGF0IG5hbWVzIGEgUEFUSCAoYSBkb3R0ZWQga2V5LCBhIHBhdHRlcm4sIGEgZmllbGQpIG11c3QgYmUgZXhhY3Rcbi8vIGV2ZW4gd2hlbiBvbmUgb2JqZWN0IGlzIHJlYWNoYWJsZSBhdCB0d28gcGF0aHM6IHRoZSBkZWNpc2lvbiBpcyBtYWRlIHBlclxuLy8gcGF0aCwgbmV2ZXIgcGVyIG9iamVjdCwgYW5kIGEgY29weSBpcyBtYWRlIHBlciBwYXRoIChjb3B5LW9uLXdyaXRlKSDigJQgbmV2ZXJcbi8vIGEgc2NydWIgaW4gcGxhY2Ugb24gYSBub2RlIGFub3RoZXIgcGF0aCBzdGlsbCBzaG93cy4gQSBrZXktTkFNRSBydWxlIGlzIHRoZVxuLy8gc2FtZSBhdCBldmVyeSBwYXRoLCBzbyBhIHNoYXJlZCBub2RlIGl0IG1hc2tzIGlzIG1hc2tlZCBldmVyeXdoZXJlIOKAlCB0aGVcbi8vIHNhZmUgc2lkZS4gQSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZDogaXQgaXMgcG9pbnRlZCBhdCB0aGUgYW5jZXN0b3Inc1xuLy8gc2VydmVkIGNvcHkuXG4vL1xuLy8gTElORUFSIE9OIEEgREFHLiBEb3R0ZWQga2V5cyBhbmQgbWFya3MgYXJlIHdhbGtlZCBhcyBUQVJHRVRTIChwYXRoLXJlbGF0aXZlXG4vLyBzdGF0ZSwgbGlrZSBmaWVsZHMpLCBhbmQgYSBwYXR0ZXJuIHRoYXQgY2FuIG9ubHkgbWF0Y2ggd2l0aGluIGEga2V5IE5BTUVcbi8vICh7QGxpbmsgbmVlZHNQYXRofSDigJQgdGhlIGNvbW1vbiBjYXNlLCBgL3Bhc3N3b3JkL2lgKSBpcyBkZWNpZGVkIGJ5IHRoZSBuYW1lLFxuLy8gc28gYSBkZWNpc2lvbiBkZXBlbmRzIG9ubHkgb24gdGhlIG9iamVjdCBhbmQgdGhlIHRhcmdldHMgc3RpbGwgbGl2ZSBhdCBpdCDigJRcbi8vIG1lbW9pemVkIHBlciAob2JqZWN0LCB0YXJnZXRzKTogYW4gb2JqZWN0IHNoYXJlZCBieSBtYW55IHBhdGhzIChhbiBhZ2VudCdzXG4vLyBsaW5rZWQgaGlzdG9yeSkgaXMgZGVjaWRlZCBvbmNlLCBhbmQgaXRzIHNlcnZlZCBjb3B5IGlzIHNoYXJlZCB0b28uIE9ubHkgYVxuLy8gZ2VudWluZWx5IFBBVEgtZGVwZW5kZW50IHBhdHRlcm4gKGAvXmFcXC5iJC9gKSB3YWxrcyBwYXRoczsgcGFzdFxuLy8ge0BsaW5rIFdBTEtfTElNSVR9IHBhdGggdmlzaXRzIHN1Y2ggYSB3YWxrIHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhc1xuLy8gdGhlIHBsYWNlaG9sZGVyICh0aGUgc2FmZSBzaWRlKSwgd2FybnMgb25jZSBpbiBkZXYgbW9kZSwgYW5kIG5ldmVyIGZhaWxzLlxuXG4vKiogQSBmaWVsZCBzdGlsbCB0byByZWFjaCBiZWxvdyBhIG5vZGU6IHRoZSBwYXRoIHNlZ21lbnRzIGxlZnQgdG8gd2Fsay4gKi9cbnR5cGUgVGFyZ2V0ID0gcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKiBIb3cgYSB3YWxrIGRlY2lkZXMgYW4gZWRnZS4gKi9cbmludGVyZmFjZSBXYWxrIHtcbiAgLyoqIEtleS1sZXZlbCBydWxlcyBhdCBldmVyeSBuZXN0ZWQga2V5IOKAlCBhYnNlbnQgZm9yIGEgYmFyZSBmaWVsZCBzY3J1YiAodGFyZ2V0cyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbmFtZXM/OiB7XG4gICAgLyoqIFNlbGVjdGVkIHdob2xlIGF0IHRoaXMgbmVzdGVkIGtleSBieSBpdHMgb3duIE5BTUUgKG1hcmtzLCBrZXlzLCBwYXR0ZXJucykuICovXG4gICAgbWFza3MobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYnkgdGhlIGRvdHRlZCBQQVRIIOKAlCBwcmVzZW50IG9ubHkgdW5kZXIgcGF0dGVybnMgKGEgcGF0dGVybiBpcyB0ZXN0ZWQgb24gdGhlIHBhdGgpLiAqL1xuICAgIHBhdGhNYXNrcz8ocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogVGhlIGRlY2xhcmVkIGZpZWxkcyBiZWxvdyBhIGtleSBvZiB0aGlzIG5hbWUuICovXG4gICAgZmllbGRzKG5hbWU6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogVGhlIHJvb3QncyBvd24ga2V5cyB3ZXJlIGRlY2lkZWQgYnkgdGhlIGNhbGxlciAoYHJldGFpblJlY29yZGApOiB3YWxrIGJlbG93IHRoZW0gb25seS4gKi9cbiAgcmVhZG9ubHkgcm9vdERlY2lkZWQ6IGJvb2xlYW47XG4gIC8qKiBEZWNpc2lvbnMgc2hhcmVkIHBlciAob2JqZWN0LCB0YXJnZXRzKSDigJQgYWJzZW50IHdoZW4gYSBkZWNpc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXRoLiAqL1xuICByZWFkb25seSBtZW1vPzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFBhdGggdmlzaXRzIGxlZnQuICovXG4gIGJ1ZGdldDogbnVtYmVyO1xuICAvKiogVG9sZCBvbmNlIHdoZW4gdGhlIHdhbGsgcGFzc2VzIGl0cyBsaW1pdC4gKi9cbiAgcmVhZG9ubHkgb25MaW1pdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBUaGUgd2FsayBoYXMgcGFzc2VkIGl0cyBsaW1pdDogd2hhdCBpdCBoYXMgbm90IHZpc2l0ZWQgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgbGltaXRlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGF0aCB2aXNpdHMgb25lIHdhbGsgbWF5IG1ha2Ug4oCUIHJlYWNoYWJsZSBvbmx5IHVuZGVyIGEgUEFUSC1kZXBlbmRlbnRcbiAqIHBhdHRlcm4gb3ZlciBhIHZhbHVlIHdob3NlIHBhdGhzIG91dG51bWJlciBpdHMgb2JqZWN0cyAoYSBsaW5rZWQgaGlzdG9yeSwgYVxuICogREFHKTogZXZlcnkgb3RoZXIgd2FsayBzaGFyZXMgaXRzIGRlY2lzaW9ucyBwZXIgb2JqZWN0IGFuZCBzdGF5cyBsaW5lYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBXQUxLX0xJTUlUID0gMV8wMDBfMDAwO1xuXG4vKiogVGhlIGxpbWl0IHdhbGtzIHVzZToge0BsaW5rIFdBTEtfTElNSVR9LCB1bmxlc3MgYSB0ZXN0IGxvd2VyZWQgaXQgKHtAbGluayB1c2VXYWxrTGltaXR9KS4gKi9cbmxldCB3YWxrTGltaXQ6IG51bWJlciA9IFdBTEtfTElNSVQ7XG5cbi8qKlxuICogQGludGVybmFsIFRlc3RzIG9ubHkg4oCUIG5vdCBvbiBhbnkgcHVibGljIGRvb3I6IHdhbGtzIHVzZSBgbGltaXRgIHVudGlsIHRoZVxuICogcmV0dXJuZWQgcmVzdG9yZSBpcyBjYWxsZWQsIHNvIGEgdGVzdCByZWFjaGVzIHRoZSBvdmVyLWxpbWl0IHBhdGggaW4gYVxuICogdGhvdXNhbmQgdmlzaXRzIGluc3RlYWQgb2YgYSBtaWxsaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlV2Fsa0xpbWl0KGxpbWl0OiBudW1iZXIpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcHJpb3IgPSB3YWxrTGltaXQ7XG4gIHdhbGtMaW1pdCA9IGxpbWl0O1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHdhbGtMaW1pdCA9IHByaW9yO1xuICB9O1xufVxuXG4vKipcbiAqIENhbiBgcGF0dGVybmAgbWF0Y2ggYSBkb3R0ZWQgUEFUSCB3aGVyZSBpdCBtYXRjaGVzIG5vbmUgb2YgdGhlIHBhdGgnc1xuICogc2VnbWVudCBOQU1FUz8gT25seSB0aHJvdWdoIGEgY29uc3RydWN0IHRoYXQgY2FuIG1hdGNoIG9yIHRlc3QgdGhlIGAuYFxuICogYmV0d2VlbiBzZWdtZW50czogYC5gIGl0c2VsZiwgYW4gZXNjYXBlIHRoYXQgY2FuIHN0YW5kIGZvciBpdCAoYFxcVyBcXFMgXFxEXG4gKiBcXEIgXFxwIFxcUCBcXHUgXFx4IFxcY2AsIGEgZGlnaXQgZXNjYXBlKSwgYSBuZWdhdGVkIGNsYXNzLCBhIGNsYXNzIHJhbmdlIHRoYXRcbiAqIHNwYW5zIGAuYCwgYSBsb29rYXJvdW5kIG9yIGEgbmFtZWQgZ3JvdXAuIEFueXRoaW5nIGVsc2UgbWF0Y2hlcyBhIHBhdGggb25seVxuICogaW5zaWRlIG9uZSBzZWdtZW50IOKAlCBhbmQgYW4gYW5jZXN0b3Igd2hvc2UgTkFNRSBtYXRjaGVzIGlzIG1hc2tlZCB3aG9sZVxuICogYmVmb3JlIHRoZSB3YWxrIGdvZXMgYmVsb3cgaXQsIHNvIHRoZSBuYW1lIGRlY2lkZXMuIENvbnNlcnZhdGl2ZTogYHRydWVgXG4gKiB3aGVuZXZlciBpbiBkb3VidC5cbiAqXG4gKiBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiBgcGF0dGVybi5zb3VyY2VgOiBldmVyeSBzY2FuIGhlcmUgaXMgb25lIGZvcndhcmRcbiAqIHBhc3MgKHtAbGluayBjbGFzc0JvZGllc30pIG9yIGEgcmVnZXggdGhhdCBkb2VzIGNvbnN0YW50IHdvcmsgcGVyIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNQYXRoKHBhdHRlcm46IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2UgPSBwYXR0ZXJuLnNvdXJjZTtcbiAgaWYgKC9cXC58XFxcXFtXU0RCcFB1eGMwLTldfFxcW1xcXnxcXChcXD9bPSE8XS8udGVzdChzb3VyY2UpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBib2R5IG9mIGNsYXNzQm9kaWVzKHNvdXJjZSkpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxvdywgaGlnaF0gb2YgYm9keS5tYXRjaEFsbCgvKFxcXFw/W1xcc1xcU10pLShcXFxcP1tcXHNcXFNdKS9nKSkge1xuICAgICAgaWYgKGxvdy5sZW5ndGggPiAxIHx8IGhpZ2gubGVuZ3RoID4gMSB8fCAobG93IDw9ICcuJyAmJiBoaWdoID49ICcuJykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVGhlIGJvZHkgb2YgZWFjaCBjaGFyYWN0ZXIgY2xhc3MgaW4gYHNvdXJjZWAsIGxlZnQgdG8gcmlnaHQ6IHRoZSB0ZXh0XG4gKiBiZXR3ZWVuIGEgYFtgIGFuZCB0aGUgZmlyc3QgYF1gIGFmdGVyIGl0IHRoYXQgbm8gYFxcYCBlc2NhcGVzIChhIGBcXGAgdGFrZXNcbiAqIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQgYWxvbmcpLiBPTkUgZm9yd2FyZCBwYXNzLlxuICpcbiAqIEl0IHJlcGxhY2VzIGBzb3VyY2UubWF0Y2hBbGwoL1xcWygoPzpcXFxcW1xcc1xcU118W15cXF1cXFxcXSkqKVxcXS9nKWAgYW5kIGdpdmVzIHRoZVxuICogc2FtZSBib2RpZXMgZm9yIGV2ZXJ5IHN0cmluZyAocGlubmVkIGFnYWluc3QgdGhhdCByZWdleCBhcyB0aGUgY29udHJvbCxcbiAqIHRlc3QvbGliL21lbW9yeS9zZWN1cml0eS9uZWVkcy1wYXRoLWxpbmVhci5zZWN1cml0eS50ZXN0LnRzKS4gVGhlIHJlZ2V4IHdhc1xuICogcXVhZHJhdGljOiBhZnRlciBhIGBbYCB0aGF0IG5ldmVyIGNsb3NlZCBpdCByZXRyaWVkIGF0IGV2ZXJ5IGxhdGVyIGBbYCxcbiAqIGVhY2ggcmV0cnkgcmVzY2FubmluZyB0byB0aGUgZW5kIOKAlCBgXFxbYCByZXBlYXRlZCAzMiwwMDAgdGltZXMgdG9vayAwLjcgcyxcbiAqIGFuZCBgc2V0UG9saWN5YCBydW5zIG9uY2UgcGVyIHN0YWdlJ3Mgc2NvcGUgKENvZGVRTCBqcy9wb2x5bm9taWFsLXJlZG9zKS5cbiAqIFRoZSBwYXNzIHN0b3BzIGF0IHRoZSBmaXJzdCBgW2AgdGhhdCBuZXZlciBjbG9zZXMgaW5zdGVhZDogYSBsYXRlciBgW2BcbiAqIHN0YXJ0cyBpdHMgYm9keSB3aGVyZSB0aGUgZmFpbGVkIHNjYW4gd2FzIGFsc28gYmV0d2VlbiB0d28gdG9rZW5zLCBzbyBpdFxuICogcmVhZHMgdGhlIHNhbWUgdGFpbCB0aGUgc2FtZSB3YXkgYW5kIGNsb3NlcyBub3doZXJlIGVpdGhlci5cbiAqXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRoYXQgdGVzdCBvbmx5IOKAlCBub3Qgb24gYW55IHB1YmxpYyBkb29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NCb2RpZXMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW4gPSBzb3VyY2UuaW5kZXhPZignWycpO1xuICB3aGlsZSAob3BlbiAhPT0gLTEpIHtcbiAgICBjb25zdCBjbG9zZSA9IGNsb3NpbmdCcmFja2V0KHNvdXJjZSwgb3BlbiArIDEpO1xuICAgIGlmIChjbG9zZSA9PT0gLTEpIGJyZWFrO1xuICAgIGJvZGllcy5wdXNoKHNvdXJjZS5zbGljZShvcGVuICsgMSwgY2xvc2UpKTtcbiAgICBvcGVuID0gc291cmNlLmluZGV4T2YoJ1snLCBjbG9zZSArIDEpO1xuICB9XG4gIHJldHVybiBib2RpZXM7XG59XG5cbi8qKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGBdYCBhdCBvciBhZnRlciBgZnJvbWAgdGhhdCBubyBgXFxgIGVzY2FwZXMsIGVsc2UgLTEgKGEgdHJhaWxpbmcgbG9uZSBgXFxgIGVzY2FwZXMgbm90aGluZyBhbmQgY2xvc2VzIG5vdGhpbmcpLiAqL1xuZnVuY3Rpb24gY2xvc2luZ0JyYWNrZXQoc291cmNlOiBzdHJpbmcsIGZyb206IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBhdCA9IGZyb207XG4gIHdoaWxlIChhdCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc291cmNlW2F0XTtcbiAgICBpZiAoY2hhciA9PT0gJ10nKSByZXR1cm4gYXQ7XG4gICAgYXQgKz0gY2hhciA9PT0gJ1xcXFwnID8gMiA6IDE7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKiogYHNlcnZlZExlYWZgJ3MgYW5zd2VyIGZvciBhIHZhbHVlIGl0IGxlYXZlcyBhcyBpdCBpcy4gKi9cbmNvbnN0IEtFRVA6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2tlcHQgYXMgaXQgaXMnKTtcblxuLyoqIEVhY2ggZmllbGQgcGF0aCBhcyBvbmUgbGl0ZXJhbCBrZXkgYW5kLCB3aGVuIGRvdHRlZCwgYXMgaXRzIHNlZ21lbnRzLiAqL1xuZnVuY3Rpb24gdGFyZ2V0c09mKHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMgPz8gW10pIHtcbiAgICBvdXQucHVzaChbcGF0aF0pO1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcuJykpIG91dC5wdXNoKHBhdGguc3BsaXQoJy4nKSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRoZSBtZW1vIGtleSBvZiBhIHRhcmdldCBzdGF0ZSDigJQgb3JkZXItZnJlZS4gKi9cbmZ1bmN0aW9uIHNpZ25hdHVyZU9mKHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRhcmdldHMubGVuZ3RoID09PSAwXG4gICAgPyAnJ1xuICAgIDogdGFyZ2V0c1xuICAgICAgICAubWFwKCh0KSA9PiB0LmpvaW4oJ1xcdTAwMWYnKSlcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAuam9pbignXFx1MDAxZScpO1xufVxuXG4vKiogT25lIGVkZ2UncyBkZWNpc2lvbjogdGhlIHZhbHVlIHVuZGVyIGBrZXlgIGlzIG1hc2tlZCBoZXJlLCBvciB0aGVzZSB0YXJnZXRzIGNvbnRpbnVlIGJlbG93IGl0LiAqL1xuZnVuY3Rpb24gZGVjaWRlRWRnZShcbiAga2V5OiBzdHJpbmcsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgZGVwdGg6IG51bWJlcixcbik6IHsgbWFza2VkOiBib29sZWFuOyBiZWxvdzogVGFyZ2V0W10gfSB7XG4gIGNvbnN0IGJlbG93OiBUYXJnZXRbXSA9IFtdO1xuICBsZXQgbWFza2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBpZiAodGFyZ2V0WzBdICE9PSBrZXkpIGNvbnRpbnVlO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAxKSBtYXNrZWQgPSB0cnVlO1xuICAgIGVsc2UgYmVsb3cucHVzaCh0YXJnZXQuc2xpY2UoMSkpO1xuICB9XG4gIGNvbnN0IG5hbWVzID0gd2Fsay5yb290RGVjaWRlZCAmJiBkZXB0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHdhbGsubmFtZXM7XG4gIGlmIChuYW1lcyAhPT0gdW5kZWZpbmVkICYmICFtYXNrZWQpIHtcbiAgICBtYXNrZWQgPVxuICAgICAgbmFtZXMubWFza3Moa2V5KSB8fFxuICAgICAgKG5hbWVzLnBhdGhNYXNrcyAhPT0gdW5kZWZpbmVkICYmIGRvdHRlZCAhPT0gdW5kZWZpbmVkICYmIG5hbWVzLnBhdGhNYXNrcyhgJHtkb3R0ZWR9LiR7a2V5fWApKTtcbiAgICBiZWxvdy5wdXNoKC4uLnRhcmdldHNPZihuYW1lcy5maWVsZHMoa2V5KSkpO1xuICB9XG4gIHJldHVybiB7IG1hc2tlZCwgYmVsb3cgfTtcbn1cblxuLyoqIE9uZSBzdGVwIGRvd24gYSB3YWxrJ3MgcGF0aDogY291bnQgdGhlIHZpc2l0IOKAlCBgZmFsc2VgIG9uY2UgdGhlIHdhbGsgaXMgcGFzdCBpdHMgbGltaXQuICovXG5mdW5jdGlvbiB2aXNpdCh3YWxrOiBXYWxrKTogYm9vbGVhbiB7XG4gIGlmICgtLXdhbGsuYnVkZ2V0ID49IDApIHJldHVybiB0cnVlO1xuICBpZiAoIXdhbGsubGltaXRlZCkge1xuICAgIHdhbGsubGltaXRlZCA9IHRydWU7XG4gICAgd2Fsay5vbkxpbWl0Py4oKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSXMgYW55dGhpbmcgc2VsZWN0ZWQgb24gc29tZSBQQVRIIHVuZGVyIGBub2RlYD8gUmVhZC1vbmx5OyBhIGN5Y2xlIGVkZ2UgaXNcbiAqIG5vdCBmb2xsb3dlZC4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgc2tpcHBlZCBjeWNsZSBlZGdlIGJlbG93XG4gKiByZWFjaGVkIOKAlCBhIGBmYWxzZWAgdGhhdCByZXN0cyBvbiBvbmUgaXMgbm90IHNoYXJlZCAobWVtbykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdHNCeVBhdGgoXG4gIG5vZGU6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBhbmNlc3RvcnM6IE1hcDxvYmplY3QsIG51bWJlcj4sXG4gIGRlcHRoOiBudW1iZXIsXG4pOiB7IHNlbGVjdGVkOiBib29sZWFuOyBiYWNrOiBudW1iZXIgfSB7XG4gIC8vIFBhc3QgdGhlIGxpbWl0OiBhc3N1bWUgYSBzZWxlY3Rpb24g4oCUIHRoZSBjb3B5IHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gIGlmICghdmlzaXQod2FsaykpIHJldHVybiB7IHNlbGVjdGVkOiB0cnVlLCBiYWNrOiBJbmZpbml0eSB9O1xuICBpZiAod2Fsay5uYW1lcyA9PT0gdW5kZWZpbmVkICYmIHRhcmdldHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBzZWxlY3RlZDogZmFsc2UsIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IHNpZyA9IHdhbGsubWVtbyA/IHNpZ25hdHVyZU9mKHRhcmdldHMpIDogJyc7XG4gIGNvbnN0IGtub3duID0gd2Fsay5tZW1vPy5nZXQobm9kZSk/LmdldChgcyR7c2lnfWApO1xuICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc2VsZWN0ZWQ6IGtub3duIGFzIGJvb2xlYW4sIGJhY2s6IEluZmluaXR5IH07XG4gIGFuY2VzdG9ycy5zZXQobm9kZSwgZGVwdGgpO1xuICBsZXQgYmFjayA9IEluZmluaXR5O1xuICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9IGFuY2VzdG9ycy5nZXQoY2hpbGQpO1xuICAgIGlmIChhdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHdhbGsubmFtZXM/LnBhdGhNYXNrcyA/IChkb3R0ZWQgPT09IHVuZGVmaW5lZCA/IGtleSA6IGAke2RvdHRlZH0uJHtrZXl9YCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYmVsb3cgPSBzZWxlY3RzQnlQYXRoKGNoaWxkLCBjaGlsZFBhdGggPz8ga2V5LCBlZGdlLmJlbG93LCB3YWxrLCBhbmNlc3RvcnMsIGRlcHRoICsgMSk7XG4gICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGJlbG93LmJhY2spO1xuICAgIGlmIChiZWxvdy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGFuY2VzdG9ycy5kZWxldGUobm9kZSk7XG4gIGlmICh3YWxrLm1lbW8gJiYgKHNlbGVjdGVkIHx8IGJhY2sgPj0gZGVwdGgpKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIGBzJHtzaWd9YCwgc2VsZWN0ZWQpO1xuICByZXR1cm4geyBzZWxlY3RlZCwgYmFjazogYmFjayA8IGRlcHRoID8gYmFjayA6IEluZmluaXR5IH07XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyKG1lbW86IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4sIG5vZGU6IG9iamVjdCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGxldCBlbnRyaWVzID0gbWVtby5nZXQobm9kZSk7XG4gIGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIG1lbW8uc2V0KG5vZGUsIChlbnRyaWVzID0gbmV3IE1hcCgpKSk7XG4gIGVudHJpZXMuc2V0KGtleSwgdmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgY29weSBvZiBgbm9kZWAsIGNvcHktb24td3JpdGUgUEVSIFBBVEguIEV2ZXJ5IGNvbnRhaW5lciBlbnRlcmVkXG4gKiBnZXRzIGl0cyBjb3B5IEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIHdhbGtlZCwgc28gYSBjeWNsZSBlZGdlIGlzIHBvaW50ZWQgYXRcbiAqIHRoZSBhbmNlc3RvcidzIGNvcHkg4oCUIG5ldmVyIGJhY2sgYXQgYW4gdW5zY3J1YmJlZCBvcmlnaW5hbDsgYSBjb250YWluZXIgaXNcbiAqIHNlcnZlZCBhcyBpdHNlbGYgd2hlbiBub3RoaW5nIHVuZGVyIGl0IGNoYW5nZWQgYW5kIG5vIGN5Y2xlIHBhc3NlcyB0aHJvdWdoXG4gKiBpdC4gQSBwcnVuZWQgZGVzY2VudCAoYSBiYXJlIGZpZWxkIHNjcnViIG9mIGFuIGFjeWNsaWMgdmFsdWUpIHNraXBzIHN1YnRyZWVzXG4gKiBubyB0YXJnZXQgcmVhY2hlcy4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgY3ljbGUgZWRnZSBiZWxvd1xuICogcmVhY2hlZCAoYEluZmluaXR5YDogbm9uZSk7IGEgY29weSB0aGF0IHJlc3RzIG9uIG5vbmUgaXMgc2hhcmVkIChtZW1vKS5cbiAqL1xuZnVuY3Rpb24gY29weUJ5UGF0aChcbiAgbm9kZTogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4gIGFuY2VzdG9yczogTWFwPG9iamVjdCwgeyBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgZGVwdGg6IG51bWJlciB9PixcbiAgZGVwdGg6IG51bWJlcixcbiAgcHJ1bmU6IGJvb2xlYW4sXG4pOiB7IG91dDogdW5rbm93bjsgYmFjazogbnVtYmVyIH0ge1xuICAvLyBQYXN0IHRoZSBsaW1pdDogdGhlIHVudmlzaXRlZCByZW1haW5kZXIgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlciDigJQgbmV2ZXIgcmF3LlxuICBpZiAoIXZpc2l0KHdhbGspKSByZXR1cm4geyBvdXQ6IHBsYWNlaG9sZGVyLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBzaWcgPSB3YWxrLm1lbW8gPyBgYyR7c2lnbmF0dXJlT2YodGFyZ2V0cyl9YCA6ICcnO1xuICBjb25zdCBrbm93biA9IHdhbGsubWVtbz8uZ2V0KG5vZGUpPy5nZXQoc2lnKTtcbiAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiB7IG91dDoga25vd24sIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IGZyYW1lID0ge1xuICAgIGNvcHk6IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRlcHRoLFxuICB9O1xuICBhbmNlc3RvcnMuc2V0KG5vZGUsIGZyYW1lKTtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgbGV0IGJhY2sgPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gcGxhY2Vob2xkZXI7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgY29uc3QgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KGNoaWxkKTtcbiAgICBpZiAoYW5jZXN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYW5jZXN0b3IuY29weTtcbiAgICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBhbmNlc3Rvci5kZXB0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHBydW5lICYmIGVkZ2UuYmVsb3cubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBjaGlsZFBhdGggPSB3YWxrLm5hbWVzPy5wYXRoTWFza3MgPyAoZG90dGVkID09PSB1bmRlZmluZWQgPyBrZXkgOiBgJHtkb3R0ZWR9LiR7a2V5fWApIDoga2V5O1xuICAgIGNvbnN0IGJlbG93ID0gY29weUJ5UGF0aChjaGlsZCwgY2hpbGRQYXRoLCBlZGdlLmJlbG93LCB3YWxrLCBwbGFjZWhvbGRlciwgYW5jZXN0b3JzLCBkZXB0aCArIDEsIHBydW5lKTtcbiAgICBpZiAoYmVsb3cub3V0ICE9PSBjaGlsZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYmVsb3cub3V0O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBiZWxvdy5iYWNrKTtcbiAgfVxuICBhbmNlc3RvcnMuZGVsZXRlKG5vZGUpO1xuICBjb25zdCBvdXQgPSBjaGFuZ2VkIHx8IGJhY2sgPD0gZGVwdGggPyBmcmFtZS5jb3B5IDogbm9kZTtcbiAgaWYgKHdhbGsubWVtbyAmJiBiYWNrID49IGRlcHRoKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIHNpZywgb3V0KTtcbiAgcmV0dXJuIHsgb3V0LCBiYWNrOiBiYWNrIDwgZGVwdGggPyBiYWNrIDogSW5maW5pdHkgfTtcbn1cblxuLyoqIERvZXMgYW55IHBhdGggZnJvbSBgcm9vdGAgY29tZSBiYWNrIHRvIGFuIG9iamVjdCBvbiBpdD8gKi9cbmZ1bmN0aW9uIGhhc0N5Y2xlKHJvb3Q6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBkb25lID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICBjb25zdCBvblBhdGggPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgdmlzaXROb2RlID0gKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZG9uZS5oYXMobm9kZSkpIHJldHVybiBmYWxzZTtcbiAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhub2RlKSkge1xuICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgdmlzaXROb2RlKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgZG9uZS5hZGQobm9kZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICByZXR1cm4gdmlzaXROb2RlKHJvb3QpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBgcm9vdGAgdW5kZXIgYSB3YWxrOiBgcm9vdGAgaXRzZWxmIHdoZW4gbm8gcGF0aCBzZWxlY3RzXG4gKiBhbnl0aGluZywgZWxzZSBpdHMgY29weS1vbi13cml0ZSBjb3B5IChwYXN0IHRoZSB3YWxrIGxpbWl0LCBpdHMgdW52aXNpdGVkXG4gKiByZW1haW5kZXIgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlcikuIFRocm93cyDigJQgdGhlIGNhbGxlciByZWZ1c2VzIHRvIHNlcnZlXG4gKiDigJQgb24gYW4gZW51bWVyYWJsZSBnZXR0ZXIgdGhhdCB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHNlcnZlZEJ5UGF0aChcbiAgcm9vdDogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4pOiB1bmtub3duIHtcbiAgaWYgKCFzZWxlY3RzQnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgbmV3IE1hcCgpLCAwKS5zZWxlY3RlZCkgcmV0dXJuIHJvb3Q7XG4gIHdhbGsuYnVkZ2V0ID0gd2Fsa0xpbWl0O1xuICAvLyBBIGJhcmUgZmllbGQgc2NydWIgb2YgYW4gYWN5Y2xpYyB2YWx1ZSB3YWxrcyBpdHMgdGFyZ2V0cyBvbmx5OiBubyBjeWNsZSBjYW4gYnJpbmcgYW5cbiAgLy8gdW5zY3J1YmJlZCBvcmlnaW5hbCBiYWNrLiBFdmVyeSBvdGhlciB3YWxrIHZpc2l0cyBldmVyeSBwYXRoIChhIGN5Y2xlIGVkZ2UgYW55d2hlcmVcbiAgLy8gbXVzdCBsYW5kIG9uIGEgc2VydmVkIGNvcHkpLlxuICBjb25zdCBwcnVuZSA9IHdhbGsubmFtZXMgPT09IHVuZGVmaW5lZCAmJiAhaGFzQ3ljbGUocm9vdCk7XG4gIHJldHVybiBjb3B5QnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgcGxhY2Vob2xkZXIsIG5ldyBNYXAoKSwgMCwgcHJ1bmUpLm91dDtcbn1cblxuLyoqIEEgcGxhaW4gcmVjb3JkIOKAlCB0aGUgb25seSBzaGFwZSBhIG1hcHBlciBpcyBoYW5kZWQgYXMgYSByZWNvcmRpbmcgdmlldyAoYSBjbGFzcyBpbnN0YW5jZSBrZWVwcyBpdHMgcHJvdG90eXBlKS4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5SZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG4vKiogVGhlIHN0cmljdGVyIG9mIHR3byB2ZXJkaWN0cyBvbiB0aGUgc2FtZSB2YWx1ZTogd2hvbGUgb3ZlciBmaWVsZHMgb3ZlciBjbGVhcjsgZmllbGRzIHVuaXRlLiAqL1xuZnVuY3Rpb24gc3RyaWN0ZXIoYTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCwgYjogUmVkYWN0aW9uVmVyZGljdCk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkIHx8IGEua2luZCA9PT0gJ2NsZWFyJyB8fCBiLmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBiO1xuICBpZiAoYS5raW5kID09PSAnd2hvbGUnIHx8IGIua2luZCA9PT0gJ2NsZWFyJykgcmV0dXJuIGE7XG4gIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IGEua2V5LCBwYXRoczogWy4uLm5ldyBTZXQoWy4uLmEucGF0aHMsIC4uLmIucGF0aHNdKV0gfTtcbn1cblxuLyoqXG4gKiBUSEUgVEFJTlQgUlVMRSBhdCBhIHN1YmZsb3cgbWFwcGVyIGJvdW5kYXJ5IChhbiBgaW5wdXRNYXBwZXJgIHNlZWRpbmcgYVxuICogc3ViZmxvdywgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2luZyBpdCBiYWNrKTogYSBrZXkgdGhlIG1hcHBlciB3cml0ZXNcbiAqIGluaGVyaXRzIHRoZSByZWRhY3Rpb24gb2YgdGhlIFNFTEVDVEVEIHZhbHVlIGl0IGNvcGllZCDigJQgYSBtYXJrIChvclxuICogaW5oZXJpdGVkIGZpZWxkcyksIGJ5IG5hbWUsIGxpa2UgYSBwZXItY2FsbCBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIOKAlFxuICogc28gdGhlIHN1YmZsb3cncyBzZWVkLCBsb2csIG1pcnJvciwgcmVhZHMsIG5hcnJhdGl2ZSBhbmQgcmVzdWx0cywgYW5kIHRoZVxuICogcGFyZW50J3MgbWVyZ2UtYmFjaywgcmV0YWluIHRoZSBjb3B5IGFzIHRoZXkgcmV0YWluIGl0cyBzb3VyY2UuIERlY2lkZWQgYnlcbiAqIHdoaWNoIHZhbHVlcyB0aGUgbWFwcGVyIFJFQUQ6XG4gKlxuICogICAtIFNBTUUgTkFNRSDigJQgYSB2YWx1ZSBwYXNzZWQgb24gdW5kZXIgdGhlIG5hbWUgaXQgd2FzIHJlYWQgdW5kZXIga2VlcHNcbiAqICAgICB0aGF0IG5hbWUncyB2ZXJkaWN0IChgeyBjb3VudDogcC5jb3VudCB9YCwgYHsgLi4ucCB9YCk6IGEgY2xlYXIgdmFsdWVcbiAqICAgICBzdGF5cyBjbGVhciwgd2hlcmV2ZXIgZWxzZSB0aGUgbWFwcGVyIHJlYWQgYSBzZWNyZXQuXG4gKiAgIC0gRVhBQ1Qg4oCUIGFuIG91dHB1dCBPQkpFQ1QgdGhhdCBJUyAoYnkgcmVmZXJlbmNlKSBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZFxuICogICAgIGluaGVyaXRzIHRoYXQga2V5J3MgdmVyZGljdDogd2hvbGUgc3RheXMgd2hvbGUsIGBmaWVsZHNgIGhhbmQgdGhlaXIgcGF0aHNcbiAqICAgICB0byB0aGUgbmV3IGtleSwgY2xlYXIgc3RheXMgY2xlYXIuIFRoZSByZWNvcmQgdGhlIG1hcHBlciB3YXMgSEFOREVELFxuICogICAgIHBhc3NlZCBvbiB3aG9sZSAoYChwKSA9PiAoeyBjdHg6IHAgfSlgKSwgaGFuZHMgZXZlcnkgc2VsZWN0ZWQga2V5IG9mIGl0XG4gKiAgICAgdG8gdGhlIG5ldyBrZXkgYXMgYSBmaWVsZCAoYGN0eC50b2tlbmApLlxuICogICAtIENPTlNFUlZBVElWRSDigJQgYW55IG90aGVyIG91dHB1dCAoYSBwcmltaXRpdmUgdW5kZXIgYSBuZXcgbmFtZSwgb3IgYW5cbiAqICAgICBvYmplY3QgdGhlIG1hcHBlciBidWlsdCkgaXMgc2VsZWN0ZWQgV0hPTEUgd2hlbiB0aGUgbWFwcGVyIHJlYWQgYVxuICogICAgIHNlbGVjdGVkIHZhbHVlIOKAlCBhIHdob2xlLXNlbGVjdGVkIGtleSwgb3IgYSBzZWxlY3RlZCBGSUVMRCBvZiBhXG4gKiAgICAgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIOKAlCBvciB3aGVuIGl0IGVtYmVkcyBhIHNlbGVjdGVkIHJlY29yZCBieVxuICogICAgIHJlZmVyZW5jZTsgdGhlIGxpYnJhcnkgY2Fubm90IHRlbGwgd2hhdCBhIGNvbXB1dGVkIHZhbHVlIGNhcnJpZXMuXG4gKiAgICAgKFZhbHVlcyBhcmUgbmV2ZXIgbWF0Y2hlZCBieSBFUVVBTElUWSBhY3Jvc3MgbmFtZXM6IGFuIGVxdWFsIHByaW1pdGl2ZVxuICogICAgIHdvdWxkIG92ZXItbWF0Y2ggdW5yZWxhdGVkIGtleXMuKVxuICpcbiAqIEhPVyBGQVIgQSBNQVJLIFJFQUNIRVM6IGEgTkFNRSwgcnVuLXdpZGUsIGZyb20gdGhlIG1vbWVudCBpdCBpcyBtYWRlIOKAlCBldmVyeVxuICoga2V5IG9mIHRoYXQgbmFtZSBpbiB0aGUgc3ViZmxvdywgdGhlIHBhcmVudCwgYSBzaWJsaW5nIGFuZCBldmVyeSBsYXRlciBzdGFnZVxuICogaXMgc2VsZWN0ZWQgaW4gd2hhdGV2ZXIgaXMgc2VydmVkLCB1bnRpbCB0aGUga2V5IGlzIGRlbGV0ZWQ7IGEgcGF1c2UgY2Fycmllc1xuICogaXQgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICpcbiAqIEEgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIHRoYXQgaG9sZHMgYSBzZWxlY3RlZCBmaWVsZCBpcyBoYW5kZWQgdG8gdGhlXG4gKiBtYXBwZXIgYXMgYSB2aWV3IG9mIGl0cyBvd24sIHNvIHJlYWRpbmcgdGhlIHJlY29yZCAodG8gcGFzcyBpdCBvbiwgb3IgdG9cbiAqIHRlc3QgaXRzIHR5cGUpIGlzIG5vdCByZWFkaW5nIHRoZSBmaWVsZC4gUmVhZGluZyBgcnVuc2AgKHRoZSBuYW1lc3BhY2Ugcm9vdFxuICogZm9yayBjaGlsZHJlbiB3cml0ZSB1bmRlcikgcmVhZHMgZXZlcnkgbmFtZXNwYWNlZCBrZXkuIFJlY29yZGluZyBzdG9wcyB3aGVuXG4gKiB0aGUgbWFwcGVyIHJldHVybnM7IHtAbGluayBpbmhlcml0fSBoYW5kcyBiYWNrIHRoZSBvdXRwdXQgd2l0aCBldmVyeSB2aWV3IGl0XG4gKiByZXR1cm5lZCBzd2FwcGVkIGZvciB0aGUgcmVjb3JkIGJlaGluZCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcHBlclRhaW50IHtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZlcmRpY3Qgb2YgdGhlIGtleSBpdCByZWFkIGl0IHVuZGVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZXMgPSBuZXcgTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD4oKTtcbiAgLyoqIEVhY2gga2V5IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZhbHVlcyBpdCByZWFkIHVuZGVyIHRoYXQgbmFtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBieU5hbWUgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bltdPigpO1xuICAvKiogRWFjaCBgZmllbGRzYCB2aWV3IGhhbmRlZCBvdXQg4oaSIHRoZSByZWNvcmQgYmVoaW5kIGl0IGFuZCBpdHMgdmVyZGljdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cyA9IG5ldyBNYXA8b2JqZWN0LCB7IHJhdzogb2JqZWN0OyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0IH0+KCk7XG4gIC8qKiBFYWNoIHJlY29yZCB0aGUgbWFwcGVyIHdhcyBoYW5kZWQg4oaSIGFzIGEgdmlldyAocGFzc2VkIG9uIHdob2xlLCBpdCBoYW5kcyBvbiBpdHMgc2VsZWN0ZWQga2V5cykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb3JkcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgLyoqIFRoZSBzZWxlY3RlZCB2YWx1ZXMgdGhlIG1hcHBlciByZWFkICh3aG9sZSBrZXlzLCBzZWxlY3RlZCBmaWVsZHMpIOKAlCB3aGF0IGl0IGNvdWxkIHBsYW50IGJ5IHJlZmVyZW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRSZWFkczogdW5rbm93bltdID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRSZWFkID0gZmFsc2U7XG4gIHByaXZhdGUgb3BlbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJ1bGU6IFJlZGFjdGlvblJ1bGUpIHt9XG5cbiAgLyoqIGB1bmRlZmluZWRgIHdoaWxlIHRoZSBydW4ncyBydWxlIGlzIGluZXJ0IOKAlCBub3RoaW5nIGEgbWFwcGVyIHJlYWRzIGNhbiBiZSBzZWxlY3RlZC4gKi9cbiAgc3RhdGljIG9mKHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQpOiBNYXBwZXJUYWludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBuZXcgTWFwcGVyVGFpbnQocnVsZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBhIG1hcHBlciBpcyBoYW5kZWQ6IHRoZSBzYW1lIG93biBrZXlzIGFuZCB2YWx1ZXMsIGVhY2ggcmVhZFxuICAgKiByZWNvcmRlZC4gQW4gYWNjZXNzb3IgcGVyIGtleSwgbm90IGEgUHJveHkg4oCUIGEgbWFwcGVyIG1heSBzcHJlYWQsIGNsb25lIG9yXG4gICAqIHNlcmlhbGl6ZSB3aGF0IGl0IGlzIGhhbmRlZC4gQW4gYXNzaWdubWVudCBsYW5kcyBvbiB0aGUgdmlldywgbmV2ZXIgb24gdGhlXG4gICAqIGxpdmUgcmVjb3JkIGJlaGluZCBpdC4gQW55dGhpbmcgYnV0IGEgcGxhaW4gcmVjb3JkIGlzIGhhbmRlZCBvdmVyIGFzIGl0IGlzLlxuICAgKi9cbiAgd2F0Y2g8VD4ocmVjb3JkOiBUKTogVCB7XG4gICAgaWYgKCFpc1BsYWluUmVjb3JkKHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlld09mKHJlY29yZCwgKGtleSkgPT4gdGhpcy5zZXJ2ZWQoa2V5LCByZWNvcmRba2V5XSkpO1xuICAgIHRoaXMucmVjb3Jkcy5zZXQodmlldywgcmVjb3JkKTtcbiAgICByZXR1cm4gdmlldyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXBwZXIgcmV0dXJuZWQgYG91dHB1dGA6IGV2ZXJ5IGtleSBpdCB3cm90ZSBpbmhlcml0cyB3aGF0IGl0IGNvcGllZFxuICAgKiAoc2VlIHRoZSBjbGFzcykuIFJldHVybnMgdGhlIG91dHB1dCB0byB1c2Ug4oCUIHRoZSBzYW1lIG9iamVjdCB1bmxlc3MgYSB2aWV3XG4gICAqIGhhZCB0byBiZSBzd2FwcGVkIGJhY2sgZm9yIHRoZSByZWNvcmQgYmVoaW5kIGl0LlxuICAgKi9cbiAgaW5oZXJpdDxUPihvdXRwdXQ6IFQpOiBUIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAob3V0cHV0ID09PSBudWxsIHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnKSByZXR1cm4gb3V0cHV0O1xuICAgIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3RhcmdldCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dCkpIHtcbiAgICAgIGNvbnN0IGNvcGllZCA9IHRoaXMuY29waWVkVmVyZGljdCh0YXJnZXQsIHZhbHVlKTtcbiAgICAgIGlmIChjb3BpZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJlYWQgfHwgdGhpcy5lbWJlZHNTZWxlY3RlZCh2YWx1ZSwgbmV3IFdlYWtTZXQoKSkpIHRoaXMucnVsZS5tYXJrKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGNvcGllZC5raW5kID09PSAnd2hvbGUnKSB0aGlzLnJ1bGUubWFyayh0YXJnZXQpO1xuICAgICAgZWxzZSBpZiAoY29waWVkLmtpbmQgPT09ICdmaWVsZHMnKSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyh0YXJnZXQsIGNvcGllZC5wYXRocyk7XG4gICAgICBjb25zdCByYXcgPSB0aGlzLmJlaGluZCh2YWx1ZSk7XG4gICAgICAvLyBBbiBvYmplY3QgcGFzc2VkIG9uIEJZIFJFRkVSRU5DRSBtYXkgY2Fycnkgd2hhdCB0aGUgbWFwcGVyIHBsYW50ZWQgaW4gaXRcbiAgICAgIC8vIChgT2JqZWN0LmFzc2lnbihwLnJlcXVlc3QsIHsgYXV0aDogcC50b2tlbiB9KWAsIGBwLmxpc3QucHVzaChwLnRva2VuKWApOlxuICAgICAgLy8gZWFjaCBwbGFjZSBpdCBob2xkcyBhIHNlbGVjdGVkIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBpcyBhIGZpZWxkIG9mIHRoZSBuZXcga2V5LlxuICAgICAgaWYgKGNvcGllZCAhPT0gdW5kZWZpbmVkICYmIGNvcGllZC5raW5kICE9PSAnd2hvbGUnICYmIHJhdyAhPT0gbnVsbCAmJiB0eXBlb2YgcmF3ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBwbGFudGVkID0gdGhpcy5wbGFudGVkUGF0aHMocmF3KTtcbiAgICAgICAgaWYgKHBsYW50ZWQubGVuZ3RoID4gMCkgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHModGFyZ2V0LCBwbGFudGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcgIT09IHZhbHVlKSB7XG4gICAgICAgIG91dCA/Pz0gKEFycmF5LmlzQXJyYXkob3V0cHV0KSA/IFsuLi5vdXRwdXRdIDogeyAuLi5vdXRwdXQgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG91dFt0YXJnZXRdID0gcmF3O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyBvdXRwdXQpIGFzIFQ7XG4gIH1cblxuICAvKiogV2hhdCBvbmUgcmVjb3JkZWQgcmVhZCBoYW5kcyB0aGUgbWFwcGVyIChzZWUgdGhlIGNsYXNzKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKCF0aGlzLm9wZW4pIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KGtleSk7XG4gICAgaWYgKHJlYWQgPT09IHVuZGVmaW5lZCkgdGhpcy5ieU5hbWUuc2V0KGtleSwgW3ZhbHVlXSk7XG4gICAgZWxzZSByZWFkLnB1c2godmFsdWUpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZChrZXksIHZhbHVlKTtcbiAgICAvLyBBbiBhYnNlbnQga2V5IGNhcnJpZXMgbm8gc2VjcmV0OyBuZWl0aGVyIGRvZXMgYSB2YWx1ZSB3aXRoIG5vIGZpZWxkcyAoYSBzY2FsYXIpIG9yIG5vbmUgb2ZcbiAgICAvLyBpdHMgc2VsZWN0ZWQgb25lcyDigJQgc3RhdGUgcmV0YWlucyB0aG9zZSBhcyB0aGV5IGFyZSB0b28uXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIVJlZGFjdGlvblJ1bGUuaG9sZHNQYXRocyh2YWx1ZSwgdmVyZGljdC5wYXRocykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGxhaW5SZWNvcmQodmFsdWUpKSByZXR1cm4gdGhpcy5maWVsZHNWaWV3KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJykge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlYWQgPSB0cnVlO1xuICAgICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlcih2YWx1ZTogdW5rbm93biwgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCk6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnNvdXJjZXMuc2V0KHZhbHVlLCBzdHJpY3Rlcih0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKSwgdmVyZGljdCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKiogQSBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQ6IHJlYWRpbmcgb25lIG9mIGl0cyBzZWxlY3RlZCBmaWVsZHMgKG9yIGEgcGF0aCdzIGZpcnN0IHNlZ21lbnQpIGlzIGEgc2VsZWN0ZWQgcmVhZC4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNWaWV3KHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgJiB7IGtpbmQ6ICdmaWVsZHMnIH0pOiBvYmplY3Qge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHZlcmRpY3QucGF0aHMpIHNlbGVjdGVkLmFkZChwYXRoKS5hZGQocGF0aC5zcGxpdCgnLicpWzBdKTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3T2YocmVjb3JkLCAoa2V5KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcGVuICYmIHNlbGVjdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSZWFkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHJlY29yZFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmRba2V5XTtcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdzLnNldCh2aWV3LCB7IHJhdzogcmVjb3JkLCB2ZXJkaWN0IH0pO1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgcHJpdmF0ZSB2aWV3T2YocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHZpZXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXcsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcmVhZChrZXkpLFxuICAgICAgICBzZXQ6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3LCBrZXksIHsgdmFsdWUsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICAvKiogVGhlIHJlY29yZCBiZWhpbmQgYSB2aWV3IHRoZSBtYXBwZXIgcmV0dXJuZWQ7IGFueSBvdGhlciB2YWx1ZSBhcyBpdCBpcy4gKi9cbiAgcHJpdmF0ZSBiZWhpbmQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiB0aGlzLnZpZXdzLmdldCh2YWx1ZSk/LnJhdyA/PyB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKSA/PyB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBgdGFyZ2V0YCBpbmhlcml0cyBmcm9tIGB2YWx1ZWAg4oCUIGB1bmRlZmluZWRgIHdoZW4gaXQgaXNcbiAgICogbmVpdGhlciBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBub3Igb25lIHBhc3NlZCB1bmRlciBpdHMgb3duIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGNvcGllZFZlcmRpY3QodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAodmlldykgcmV0dXJuIHZpZXcudmVyZGljdDtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQpO1xuICAgICAgY29uc3Qga25vd24gPSB0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChrbm93bikgcmV0dXJuIGtub3duO1xuICAgIH1cbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KHRhcmdldCk7XG4gICAgcmV0dXJuIHJlYWQ/LnNvbWUoKHYpID0+IE9iamVjdC5pcyh2LCB2YWx1ZSkpID8gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQodGFyZ2V0LCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQSB3aG9sZSByZWNvcmQncyBzZWxlY3RlZCBrZXlzLCBhcyBmaWVsZHMgb2Ygd2hhdGV2ZXIga2V5IGl0IGlzIHBhc3NlZCBvbiB1bmRlci4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZEZpZWxkc09mKHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmQpKSB7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQoa2V5LCByZWNvcmRba2V5XSk7XG4gICAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSBwYXRocy5wdXNoKGtleSk7XG4gICAgICBlbHNlIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSBmb3IgKGNvbnN0IHBhdGggb2YgdmVyZGljdC5wYXRocykgcGF0aHMucHVzaChgJHtrZXl9LiR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzLmxlbmd0aCA9PT0gMCA/IENMRUFSIDogeyBraW5kOiAnZmllbGRzJywga2V5OiAnJywgcGF0aHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSBgcm9vdGAgKGFuIG9iamVjdCB0aGUgbWFwcGVyIHBhc3NlZCBvbiBieSByZWZlcmVuY2UpIGhvbGRzIG9uZSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgUFJJTUlUSVZFUyBpdCByZWFkIOKAlCBtYXRjaGVkIGJ5IHZhbHVlLCBvbmx5IGFnYWluc3Qgd2hhdCB0aGlzXG4gICAqIG1hcHBlciByZWFkIGFuZCBvbmx5IGluc2lkZSB3aGF0IGl0IHBhc3NlZCBvbiwgc28gb3Zlci1tYXRjaGluZyBhbiBlcXVhbFxuICAgKiB2YWx1ZSBpcyB0aGUgc2FmZSBzaWRlLiBPbmUgcmVsYXRpdmUgcGF0aCBwZXIgcGxhY2UsIGEgc2hhcmVkIG9iamVjdCBhdFxuICAgKiBlYWNoIG9mIGl0cyBwYXRoczsgYSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZC5cbiAgICovXG4gIHByaXZhdGUgcGxhbnRlZFBhdGhzKHJvb3Q6IG9iamVjdCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWNyZXRzID0gbmV3IFNldDx1bmtub3duPigpO1xuICAgIGNvbnN0IGNvbGxlY3QgPSAodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+KTogdm9pZCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHNlY3JldHMuYWRkKHZhbHVlKTtcbiAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGNvbGxlY3QoY2hpbGQsIHNlZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnNlY3JldFJlYWRzKSBjb2xsZWN0KHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIGlmIChzZWNyZXRzLnNpemUgPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBtZW1vID0gbmV3IE1hcDxvYmplY3QsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IG9uUGF0aCA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IGluc2lkZSA9IChub2RlOiBvYmplY3QpOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IG1lbW8uZ2V0KG5vZGUpO1xuICAgICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcbiAgICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gW107XG4gICAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgICAgY29uc3QgZm91bmQ6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JykgZm9yIChjb25zdCBzdWIgb2YgaW5zaWRlKGNoaWxkKSkgZm91bmQucHVzaChgJHtrZXl9LiR7c3VifWApO1xuICAgICAgICBlbHNlIGlmIChzZWNyZXRzLmhhcyhjaGlsZCkpIGZvdW5kLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgICBtZW1vLnNldChub2RlLCBmb3VuZCk7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfTtcbiAgICByZXR1cm4gaW5zaWRlKHJvb3QpO1xuICB9XG5cbiAgLyoqIERvZXMgYSB2YWx1ZSB0aGUgbWFwcGVyIEJVSUxUIGVtYmVkLCBieSByZWZlcmVuY2UsIGEgc2VsZWN0ZWQgcmVjb3JkIGl0IHJlYWQgb3Igd2FzIGhhbmRlZD8gKi9cbiAgcHJpdmF0ZSBlbWJlZHNTZWxlY3RlZCh2YWx1ZTogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmICh0aGlzLnZpZXdzLmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGRzT2YocmVjb3JkKS5raW5kICE9PSAnY2xlYXInO1xuICAgIGNvbnN0IGtub3duID0gdGhpcy5zb3VyY2VzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQgJiYga25vd24ua2luZCAhPT0gJ2NsZWFyJykgcmV0dXJuIHRydWU7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgaWYgKHRoaXMuZW1iZWRzU2VsZWN0ZWQoY2hpbGQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY29tbWl0IGxvZydzIHNjcnViOiBgcGF0Y2hgIHdpdGgge0BsaW5rIExPR19QTEFDRUhPTERFUn0gYXQgZXZlcnkgcGF0aCBpbiBgcmVkYWN0ZWRQYXRoc2AgdGhhdFxuICogaG9sZHMgYSBkZWZpbmVkIHZhbHVlIOKAlCB0aGUgY29weSBgU3RhZ2VDb250ZXh0IMK3IGNvbW1pdGAgcmVjb3JkcyBhbmQgZmVlZHMgdGhlIHJlZGFjdGVkIG1pcnJvci5cbiAqXG4gKiBDTE9ORS1GUkVFICg5LjMzLjApLiBUaGUgcGF0Y2ggaXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGNvbW1pdC10aW1lIHBheWxvYWQsIGFscmVhZHkgdGhlIHJlY29yZCdzXG4gKiBvd24gY29weSAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGNvbW1pdGAgY2xvbmVzIGVhY2ggc3Vydml2aW5nIHBhdGggb25jZTsgdGhlIGJ1ZmZlciBpcyBkcm9wcGVkIGF0XG4gKiBjb21taXQpLCBzbyB0aGUgc2NydWIgY29waWVzIG9ubHkgd2hhdCBpdCBtdXN0IG5vdCBlZGl0IGluIHBsYWNlOlxuICogICAtIG5vIHBhdGggdG8gc2NydWIgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyayDigJQgdGhlIGNvbW1vbiBjYXNlKSDihpIgYHBhdGNoYCBJVFNFTEYsIG5vIGNvcHkgYXQgYWxsO1xuICogICAtIG90aGVyd2lzZSDihpIgYSBuZXcgcm9vdCBhbmQgYSBzaGFsbG93IGNvcHkgb2YgZWFjaCBjb250YWluZXIgb24gYSBzY3J1YmJlZCBwYXRoIChgcGF0aE9wcyDCt1xuICogICAgIG93blNwaW5lYCksIGV2ZXJ5IG90aGVyIHN1YnRyZWUgc2hhcmVkIHdpdGggYHBhdGNoYC4gYHBhdGNoYCBpcyBuZXZlciBlZGl0ZWQuXG4gKiBUaGUgZW5naW5lIGNhbGxlZCB0aGUgcHVibGljIHtAbGluayByZWRhY3RQYXRjaH0gKGEgd2hvbGUgYHN0cnVjdHVyZWRDbG9uZWApIHR3aWNlIHBlciBjb21taXQgYmVmb3JlXG4gKiA5LjMzLjAuIFRoZSBieXRlcyBhcmUgdGhlIHNhbWU6IGEgc2NydWJiZWQgcGF0aCBob2xkcyB0aGUgcGxhY2Vob2xkZXIsIGV2ZXJ5IG90aGVyIHBhdGggdGhlIHZhbHVlIHRoZVxuICogYnVmZmVyIGNsb25lZCAocGlubmVkIGJ5IHRoZSA5LjE4LjEgLyA5LjE5LjEgcmVkYWN0aW9uIGJ5dGUgdGVzdHMpLlxuICpcbiAqIFBhdGhzIGFyZSBzY3J1YmJlZCBpbiB0aGUgc2V0J3Mgb3JkZXIsIGFnYWluc3QgdGhlIHRyZWUgYXMgc2NydWJiZWQgc28gZmFyOiBhIHBhdGggdW5kZXIgb25lIGFscmVhZHlcbiAqIHNjcnViYmVkIGZpbmRzIGEgc3RyaW5nLCBub3QgYSBjb250YWluZXIsIGFuZCBpcyBsZWZ0IGFsb25lIChhcyBiZWZvcmUpLlxuICpcbiAqIElOVEVSTkFMIOKAlCB0aGUgcmVzdWx0IHNoYXJlcyBzdHJ1Y3R1cmUgd2l0aCBgcGF0Y2hgLiBBIGNhbGxlciBvdXRzaWRlIHRoZSBjb21taXQgcGF0aCB3YW50c1xuICoge0BsaW5rIHJlZGFjdFBhdGNofS5cbiAqXG4gKiBAcGFyYW0gcmVkYWN0ZWRQYXRocyBERUxJTS1qb2luZWQgcGF0aHMgKGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBgcmVkYWN0ZWRQYXRoc2A7IGEgYnVuZGxlJ3NcbiAqICAgYHJlZGFjdGVkUGF0aHNgIGFycmF5IHdvcmtzIHRvbykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J1YlBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRQYXRoczogSXRlcmFibGU8c3RyaW5nPik6IE1lbW9yeVBhdGNoIHtcbiAgbGV0IG91dDogTWVtb3J5UGF0Y2ggfCB1bmRlZmluZWQ7XG4gIGxldCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGZsYXQgb2YgcmVkYWN0ZWRQYXRocykge1xuICAgIGNvbnN0IHNlZ3MgPSBmbGF0LnNwbGl0KERFTElNKTtcbiAgICBjb25zdCBjdXJyZW50ID0gb3V0ID8/IHBhdGNoO1xuICAgIGlmICghbmF0aXZlSGFzKGN1cnJlbnQsIHNlZ3MpIHx8IG5hdGl2ZUdldChjdXJyZW50LCBzZWdzKSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgICAgb3V0ID0gb3duZWRSb290T2YocGF0Y2gsIG93bmVkKSBhcyBNZW1vcnlQYXRjaDtcbiAgICB9XG4gICAgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCEpO1xuICAgIG5hdGl2ZVNldChvdXQsIHNlZ3MsIExPR19QTEFDRUhPTERFUik7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBwYXRjaDtcbn1cblxuLyoqXG4gKiBSZWRhY3RzIHNlbnNpdGl2ZSB2YWx1ZXMgaW4gYSBwYXRjaCBmb3IgbG9nZ2luZy9kZWJ1Z2dpbmcg4oCUIHRoZSBQVUJMSUMgc2NydWIgKGBmb290cHJpbnRqcy9hZHZhbmNlZGApLFxuICogaXRzIGNvbnRyYWN0IHVuY2hhbmdlZCBzaW5jZSA0Lng6IGEgZnJlc2ggZGVlcCBjb3B5IG9mIGBwYXRjaGAgKGBzdHJ1Y3R1cmVkQ2xvbmVgKSB3aXRoXG4gKiB7QGxpbmsgTE9HX1BMQUNFSE9MREVSfSBhdCBldmVyeSBsaXN0ZWQgcGF0aCB0aGF0IGhvbGRzIGEgZGVmaW5lZCB2YWx1ZS4gU2hhcmVzIG5vdGhpbmcgd2l0aCBgcGF0Y2hgXG4gKiBhbmQgbmV2ZXIgZWRpdHMgaXQuIChNb3ZlZCBoZXJlIGZyb20gYG1lbW9yeS91dGlscy50c2AgaW4gOS4zMy4wOyB0aGUgZW5naW5lJ3Mgb3duIGNvbW1pdCBwYXRoIHVzZXMgdGhlXG4gKiBjbG9uZS1mcmVlIHtAbGluayBzY3J1YlBhdGNofS4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWRhY3RQYXRjaChwYXRjaDogTWVtb3J5UGF0Y2gsIHJlZGFjdGVkU2V0OiBTZXQ8c3RyaW5nPik6IE1lbW9yeVBhdGNoIHtcbiAgcmV0dXJuIHNjcnViUGF0Y2goc3RydWN0dXJlZENsb25lKHBhdGNoKSwgcmVkYWN0ZWRTZXQpO1xufVxuIl19
|