footprintjs 9.44.0 → 9.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -61,6 +61,17 @@ export const CLEAR = Object.freeze({ kind: 'clear' });
|
|
|
61
61
|
* realistic scope-state key name.
|
|
62
62
|
*/
|
|
63
63
|
const MAX_PATTERN_KEY_LEN = 256;
|
|
64
|
+
/**
|
|
65
|
+
* The fields a policy declares under `key` — only when `fields` OWNS `key`.
|
|
66
|
+
* The key is a name from data (a state key, a nested key of a record handed
|
|
67
|
+
* out whole), and a plain-object lookup reads the prototype chain:
|
|
68
|
+
* `fields['constructor']` is `Object`, `fields['__proto__']` is
|
|
69
|
+
* `Object.prototype`. The walk then iterated them, so any `fields` policy
|
|
70
|
+
* failed the run with a TypeError on data holding such a key.
|
|
71
|
+
*/
|
|
72
|
+
function declaredFields(fields, key) {
|
|
73
|
+
return fields !== undefined && Object.prototype.hasOwnProperty.call(fields, key) ? fields[key] : undefined;
|
|
74
|
+
}
|
|
64
75
|
/** Policy patterns are predicates, not cursors over successive keys/events. */
|
|
65
76
|
function matchesPattern(value, patterns) {
|
|
66
77
|
if (!patterns)
|
|
@@ -425,7 +436,7 @@ export class RedactionRule {
|
|
|
425
436
|
}
|
|
426
437
|
/** The secret fields of a top key: the policy's, plus any a mapper handed it ({@link MapperTaint}). */
|
|
427
438
|
fieldsOf(key) {
|
|
428
|
-
const declared = this.policy?.fields
|
|
439
|
+
const declared = declaredFields(this.policy?.fields, key);
|
|
429
440
|
const inherited = this.inherited?.get(key);
|
|
430
441
|
if (inherited === undefined)
|
|
431
442
|
return declared;
|
|
@@ -688,17 +699,20 @@ export class RedactionRule {
|
|
|
688
699
|
return servedByPath(copy, undefined, targetsOf(paths), { rootDecided: false, memo: new WeakMap(), budget: walkLimit }, placeholder);
|
|
689
700
|
}
|
|
690
701
|
report() {
|
|
691
|
-
|
|
702
|
+
// Keyed by a Map, then made own data keys by `fromEntries`: a key a mapper
|
|
703
|
+
// wrote is a name from data, and on a plain object `toString` would read
|
|
704
|
+
// the inherited method and `__proto__` would call the prototype setter.
|
|
705
|
+
const fieldRedactions = new Map();
|
|
692
706
|
for (const [key, fields] of Object.entries(this.policy?.fields ?? {})) {
|
|
693
|
-
fieldRedactions
|
|
707
|
+
fieldRedactions.set(key, [...fields]);
|
|
694
708
|
}
|
|
695
709
|
// Fields a mapper handed to a new key are scrubbed under that key too.
|
|
696
710
|
for (const [key, fields] of this.inherited ?? []) {
|
|
697
|
-
fieldRedactions
|
|
711
|
+
fieldRedactions.set(key, [...new Set([...(fieldRedactions.get(key) ?? []), ...fields])]);
|
|
698
712
|
}
|
|
699
713
|
return {
|
|
700
714
|
redactedKeys: [...this.marked],
|
|
701
|
-
fieldRedactions,
|
|
715
|
+
fieldRedactions: Object.fromEntries(fieldRedactions),
|
|
702
716
|
patterns: (this.policy?.patterns ?? []).map((p) => p.source),
|
|
703
717
|
};
|
|
704
718
|
}
|
|
@@ -732,12 +746,15 @@ export function useWalkLimit(limit) {
|
|
|
732
746
|
* inside one segment — and an ancestor whose NAME matches is masked whole
|
|
733
747
|
* before the walk goes below it, so the name decides. Conservative: `true`
|
|
734
748
|
* whenever in doubt.
|
|
749
|
+
*
|
|
750
|
+
* Linear in the length of `pattern.source`: every scan here is one forward
|
|
751
|
+
* pass ({@link classBodies}) or a regex that does constant work per position.
|
|
735
752
|
*/
|
|
736
753
|
export function needsPath(pattern) {
|
|
737
754
|
const source = pattern.source;
|
|
738
755
|
if (/\.|\\[WSDBpPuxc0-9]|\[\^|\(\?[=!<]/.test(source))
|
|
739
756
|
return true;
|
|
740
|
-
for (const
|
|
757
|
+
for (const body of classBodies(source)) {
|
|
741
758
|
for (const [, low, high] of body.matchAll(/(\\?[\s\S])-(\\?[\s\S])/g)) {
|
|
742
759
|
if (low.length > 1 || high.length > 1 || (low <= '.' && high >= '.'))
|
|
743
760
|
return true;
|
|
@@ -745,6 +762,46 @@ export function needsPath(pattern) {
|
|
|
745
762
|
}
|
|
746
763
|
return false;
|
|
747
764
|
}
|
|
765
|
+
/**
|
|
766
|
+
* The body of each character class in `source`, left to right: the text
|
|
767
|
+
* between a `[` and the first `]` after it that no `\` escapes (a `\` takes
|
|
768
|
+
* the character after it along). ONE forward pass.
|
|
769
|
+
*
|
|
770
|
+
* It replaces `source.matchAll(/\[((?:\\[\s\S]|[^\]\\])*)\]/g)` and gives the
|
|
771
|
+
* same bodies for every string (pinned against that regex as the control,
|
|
772
|
+
* test/lib/memory/security/needs-path-linear.security.test.ts). The regex was
|
|
773
|
+
* quadratic: after a `[` that never closed it retried at every later `[`,
|
|
774
|
+
* each retry rescanning to the end — `\[` repeated 32,000 times took 0.7 s,
|
|
775
|
+
* and `setPolicy` runs once per stage's scope (CodeQL js/polynomial-redos).
|
|
776
|
+
* The pass stops at the first `[` that never closes instead: a later `[`
|
|
777
|
+
* starts its body where the failed scan was also between two tokens, so it
|
|
778
|
+
* reads the same tail the same way and closes nowhere either.
|
|
779
|
+
*
|
|
780
|
+
* @internal Exported for that test only — not on any public door.
|
|
781
|
+
*/
|
|
782
|
+
export function classBodies(source) {
|
|
783
|
+
const bodies = [];
|
|
784
|
+
let open = source.indexOf('[');
|
|
785
|
+
while (open !== -1) {
|
|
786
|
+
const close = closingBracket(source, open + 1);
|
|
787
|
+
if (close === -1)
|
|
788
|
+
break;
|
|
789
|
+
bodies.push(source.slice(open + 1, close));
|
|
790
|
+
open = source.indexOf('[', close + 1);
|
|
791
|
+
}
|
|
792
|
+
return bodies;
|
|
793
|
+
}
|
|
794
|
+
/** The index of the first `]` at or after `from` that no `\` escapes, else -1 (a trailing lone `\` escapes nothing and closes nothing). */
|
|
795
|
+
function closingBracket(source, from) {
|
|
796
|
+
let at = from;
|
|
797
|
+
while (at < source.length) {
|
|
798
|
+
const char = source[at];
|
|
799
|
+
if (char === ']')
|
|
800
|
+
return at;
|
|
801
|
+
at += char === '\\' ? 2 : 1;
|
|
802
|
+
}
|
|
803
|
+
return -1;
|
|
804
|
+
}
|
|
748
805
|
/** `servedLeaf`'s answer for a value it leaves as it is. */
|
|
749
806
|
const KEEP = Symbol('kept as it is');
|
|
750
807
|
/** Each field path as one literal key and, when dotted, as its segments. */
|
|
@@ -1275,4 +1332,4 @@ export function scrubPatch(patch, redactedPaths) {
|
|
|
1275
1332
|
export function redactPatch(patch, redactedSet) {
|
|
1276
1333
|
return scrubPatch(structuredClone(patch), redactedSet);
|
|
1277
1334
|
}
|
|
1278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQTRFdkUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFxQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBVyxDQUFDLENBQUM7QUFFakY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEMsK0VBQStFO0FBQy9FLFNBQVMsY0FBYyxDQUFDLEtBQWEsRUFBRSxRQUF1QztJQUM1RSxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0Isa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkMs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Q2xGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1lBQzlCLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBZ0IsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBTSxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFrQixFQUFFLFdBQXdCO0lBQ3RFLE9BQU8sVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWRhY3Rpb24udHMg4oCUIFRoZSBPTkUgb3duZXIgb2Ygd2hhdCBhIHJlZGFjdGlvbiBwb2xpY3kgc2F5cyBhYm91dCBhIHZhbHVlLlxuICpcbiAqIFRIRSBMQVcgKG93bmVyIHJ1bGluZyAoYSkpLiBBIHJlZGFjdGlvbiBwb2xpY3kgY292ZXJzIEVWRVJZVEhJTkcgdGhlIGxpYnJhcnlcbiAqIHJldGFpbnMgb3Igc2VydmVzIOKAlCB0aGUgY29tbWl0IGxvZyAoYm90aCBlbmNvZGluZ3MpLCB0aGUgcmVkYWN0ZWQgbWlycm9yLFxuICogdHJhY2tlZCByZWFkcy93cml0ZXMsIGV2ZXJ5IHJlY29yZGVyIGV2ZW50IChpbmxpbmUgYW5kIGRlZmVycmVkKSBhbmQgdGhlXG4gKiByZWNvcmRlciByb3dzIGJ1aWx0IGZyb20gdGhlbSwgdGhlIG5hcnJhdGl2ZSwgc25hcHNob3RzLCBkaWFnbm9zdGljcywgcGF1c2VcbiAqIHBheWxvYWRzLCBib3VuZGFyeSByZWNvcmRzIGFuZCBsb2cgbGluZXMg4oCUIGFuZCBORVZFUiB0aGUgbGl2ZSBoZWFwIG9yIHRoZVxuICogcmVzdW1lIGNoZWNrcG9pbnQuIFR3byB2YWx1ZXMgYXJlIHRoZSBjYWxsZXIncyBvd24gYW5kIHN0YXkgcmVhbDogdGhlXG4gKiBgcnVuKClgIHJlamVjdGlvbiAodGhlIHRocm93biB2YWx1ZSBpdHNlbGYpIGFuZCB0aGUgbGl2ZSBmb3JrIHJlc3VsdC5cbiAqXG4gKiBBIHBvbGljeSBzZWxlY3RzIGJ5IE5BTUUg4oCUIGEga2V5LCBhIGRvdHRlZCBwYXRoLCBhIGZpZWxkIOKAlCBuZXZlciBieVxuICogc2Nhbm5pbmcgY29udGVudC4gV2hhdCBjYXJyaWVzIGEgbmFtZTpcbiAqICAgLSBzdGF0ZSDigJQgaXRzIHVzZXItbGV2ZWwgcGF0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUudmVyZGljdH0pO1xuICogICAtIGEgcmVjb3JkIGhhbmRlZCBvdXQgd2hvbGUg4oCUIHJvb3QgaW5wdXQvb3V0cHV0LCBhIHN1YmZsb3cncyBtYXBwZWQgc2VlZFxuICogICAgIGFuZCBleGl0IHN0YXRlLCBhIHBhdXNlIHBheWxvYWQsIGEgdGhyb3duIHZhbHVlIOKAlCBpdHMga2V5cyBhdCBldmVyeVxuICogICAgIGRlcHRoICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeX0pO1xuICogICAtIGEgZGlhZ25vc3RpYyBlbnRyeSDigJQgYCRkZWJ1Z2AvYCRlcnJvcmAvYCRtZXRyaWNgL2AkZXZhbGAvYCRsb2dgIGFuZCB0aGVcbiAqICAgICBlbmdpbmUncyBvd24g4oCUIHRoZSByZWNvcmQgYHsgW25hbWVdOiB2YWx1ZSB9YDogaXRzIG5hbWUgSVMgYSBzdGF0ZSBrZXlcbiAqICAgICAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluRGlhZ25vc3RpY30pLiBgcG9saWN5LmRpYWdub3N0aWNzYCBhZGRzXG4gKiAgICAgZGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycyBvbiB0b3A7IGZsb3ctbWVzc2FnZSB0ZXh0IGhhcyBubyBuYW1lIG9mIGl0c1xuICogICAgIG93biwgc28gb25seSB0aGV5IHNlbGVjdCBpdDtcbiAqICAgLSBhIHN1YmZsb3cgbWFwcGVyJ3MgY29weSDigJQgYSBrZXkgYW4gYGlucHV0TWFwcGVyYC9gb3V0cHV0TWFwcGVyYCAob3IgYVxuICogICAgIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zIHNlbGVjdG9yKSB3cm90ZSBpbmhlcml0cyB0aGUgcmVkYWN0aW9uIG9mIHRoZVxuICogICAgIHNlbGVjdGVkIHZhbHVlIGl0IGNvcGllZCAoe0BsaW5rIE1hcHBlclRhaW50fSkuXG4gKiBBIG1hcmsgaXMgYSBOQU1FLCBydW4td2lkZSwgdW50aWwgdGhlIGtleSBpcyBkZWxldGVkOyBhIHBhdXNlIGNhcnJpZXMgdGhlXG4gKiBtYXJrcyDigJQgbmFtZXMgb25seSDigJQgdG8gdGhlIHJlc3VtZWQgcnVuICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5tYXJrc0ZvckNoZWNrcG9pbnR9KS5cbiAqIEEgdmFsdWUgd2l0aCBubyBuYW1lIOKAlCBhIHNjYWxhciByb290IGlucHV0L291dHB1dCBvciBwYXVzZSBwYXlsb2FkLCBmcmVlXG4gKiBlcnJvciB0ZXh0IOKAlCBpcyBzZWxlY3RlZCBieSBub3RoaW5nLiBgZW1pdFBhdHRlcm5zYCBpcyB0aGUgb25lIHNlcGFyYXRlXG4gKiBzY3J1YjogYSBgJGVtaXRgIHBheWxvYWQgaXMgc2VsZWN0ZWQgYnkgaXRzIGV2ZW50IG5hbWUuXG4gKlxuICogSE9XIE9ORSBPV05FUiBLRUVQUyBJVC4gRXZlcnkgc3RhZ2VkIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgcGFzc2VzXG4gKiB0aHJvdWdoIGBTdGFnZUNvbnRleHRgLCBzbyBgU3RhZ2VDb250ZXh0YCBhc2tzIFRISVMgcnVsZSDigJQgbm90IHRoZSBjYWxsZXIg4oCUXG4gKiB3aGF0IHRoZSBwb2xpY3kgc2F5cyBhYm91dCB0aGUgcGF0aCBpdCBpcyBhYm91dCB0byByZXRhaW4uIEEgYFNjb3BlRmFjYWRlYFxuICogd3JpdGUsIGEgc3ViZmxvdyBgaW5wdXRNYXBwZXJgIHNlZWQsIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2sgYW5kIGFcbiAqIHJlc3VtZSByZS1zZWVkIGFyZSB0aGVuIGFsbCB0aGUgc2FtZSBjYXNlOiB0aGUgZnVubmVsIGRlY2lkZXMsIHRoZSBjYWxsZXJcbiAqIGNhbm5vdCBmb3JnZXQgdG8uIFRoZSBmYWNhZGUgdXNlcyB0aGUgc2FtZSBydWxlIGZvciB0aGUgdmFsdWVzIGl0IGhhbmRzIHRvXG4gKiByZWNvcmRlcnM7IGBTdWJmbG93RXhlY3V0b3JgIHVzZXMgaXQgZm9yIHRoZSBuYXJyYXRlZCBzZWVkIGFuZFxuICogYEZsb3djaGFydFRyYXZlcnNlci5leGVjdXRlYCBmb3Igcm9vdCBpbnB1dC9vdXRwdXQgYmVmb3JlIGRpc3BhdGNoLiBCZWZvcmUgOS4xOS4wXG4gKiB0aGUgZmFjYWRlIGhlbGQgdGhlIHZlcmRpY3QgYWxvbmUsIGFuZCBldmVyeSBwYXRoIHRoYXQgd3JvdGUgb3IgcmVhZCBwYXN0XG4gKiB0aGUgZmFjYWRlIOKAlCBmaXZlIG9mIHRoZW0g4oCUIHJldGFpbmVkIHBsYWludGV4dCB1bmRlciBhIHBvbGljeS5cbiAqXG4gKiBUV08gUExBQ0VIT0xERVJTLCBCT1RIIEhJU1RPUklDQUw6IHRoZSBjb21taXQgbG9nIGFuZCB0aGUgbWlycm9yIGNhcnJ5XG4gKiBgJ1JFREFDVEVEJ2AgKGBzY3J1YlBhdGNoYCAvIGByZWRhY3RQYXRjaGAsIGJlbG93IOKAlCB0aGUgc3RyaW5ncyB1bmNoYW5nZWQgc2luY2UgNC54KTsgZXZlcnkgc2NvcGUtdGllciB2aWV3IOKAlFxuICogc2NvcGUgcmVjb3JkZXIgZXZlbnRzLCBgc3RhZ2VSZWFkc2AvYHN0YWdlV3JpdGVzYCwgbmFycmF0aXZlIOKAlCBjYXJyaWVzXG4gKiBgJ1tSRURBQ1RFRF0nYC4gTmVpdGhlciBzdHJpbmcgY2hhbmdlZCBpbiA5LjE5LjAuIFRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgYXJlXG4gKiBvd25lZCBieSBgbWVtb3J5L3BsYWNlaG9sZGVycy50c2AgKGBMT0dfUExBQ0VIT0xERVJgIC8gYFNDT1BFX1BMQUNFSE9MREVSYClcbiAqIGFuZCBzcGVsbGVkIG5vd2hlcmUgZWxzZSBpbiBgc3JjL2Ag4oCUIHRoaXMgcnVsZSBhc2tzIGZvciB0aGUgc2NvcGUgb25lIGJ5IG5hbWUuXG4gKi9cblxuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uTWFya3MgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBuYXRpdmVHZXQsIG5hdGl2ZUhhcywgbmF0aXZlU2V0LCBvd25lZFJvb3RPZiwgb3duU3BpbmUgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiwgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuL3BsYWNlaG9sZGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogRGVjbGFyYXRpdmUga2V5L3BhdGggcmVkYWN0aW9uIGZvciByZWNvcmRlZCBzdGF0ZSBhbmQgYm91bmRhcnkgcmVjb3Jkcy5cbiAqXG4gKiBDb25maWd1cmUgYXQgdGhlIHNjb3BlIGNsYXNzIGxldmVsIChzdGF0aWMgcHJvcGVydHkpIG9yIHBhc3MgdG9cbiAqIEZsb3dDaGFydEV4ZWN1dG9yIHRvIGFwcGx5IGFjcm9zcyBhbGwgc3RhZ2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblBvbGljeSB7XG4gIC8qKiBFeGFjdCBrZXkgbmFtZXMgdG8gYWx3YXlzIHJlZGFjdCAoZS5nLiBbJ3NzbicsICdjcmVkaXRDYXJkJ10pLiAqL1xuICBrZXlzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBSZWdleCBwYXR0ZXJucyDigJQgYW55IGtleSBtYXRjaGluZyBhIHBhdHRlcm4gaXMgYXV0by1yZWRhY3RlZC5cbiAgICpcbiAgICogUGF0dGVybiBtYXRjaGluZyBpcyBza2lwcGVkIGZvciBrZXlzIHRoYXQgZXhjZWVkIGFuIGludGVybmFsIGxlbmd0aCBjYXBcbiAgICogKGRlc2lnbmVkIHRvIHByZXZlbnQgUmVEb1Mgb24gcGF0aG9sb2dpY2FsIHBhdHRlcm5zKS4gRm9yIHZlcnkgbG9uZyBrZXlcbiAgICogbmFtZXMsIHVzZSBga2V5c2AgKGV4YWN0IG1hdGNoKSBpbnN0ZWFkIG9mIHBhdHRlcm5zLlxuICAgKi9cbiAgcGF0dGVybnM/OiBSZWdFeHBbXTtcbiAgLyoqIEZpZWxkLWxldmVsIHJlZGFjdGlvbiB3aXRoaW4gb2JqZWN0cyDigJQga2V5IOKGkiBhcnJheSBvZiBmaWVsZHMgdG8gc2NydWIuXG4gICAqICBTdXBwb3J0cyBkb3Qtbm90YXRpb24gZm9yIG5lc3RlZCBwYXRocyAoZS5nLiAnYWRkcmVzcy56aXAnKS4gKi9cbiAgZmllbGRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAvKipcbiAgICogRGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycywgSU4gQURESVRJT04gdG8gdGhlIHN0YXRlIHNlbGVjdG9ycyBhYm92ZSAod2hpY2hcbiAgICogYWxyZWFkeSBjb3ZlciBhIGRpYWdub3N0aWMgZW50cnkgYnkgaXRzIG5hbWU6IGBrZXlzOiBbJ3Rva2VuJ11gIG1hc2tzXG4gICAqIGAkZGVidWcoJ3Rva2VuJywg4oCmKWApLiBVc2UgdGhlc2UgZm9yIG5hbWVzIHlvdSBtYXNrIGluIGRpYWdub3N0aWNzIGJ1dFxuICAgKiBub3QgaW4gc3RhdGUuIFBhdGhzIHN0YXJ0IHdpdGggbG9ncy9lcnJvcnMvbWV0cmljcy9ldmFscywgZS5nLlxuICAgKiBgbG9ncy5wcm9maWxlLnRva2VuYC4gT25seSBmbG93TWVzc2FnZXMuZGVzY3JpcHRpb24gYW5kXG4gICAqIGZsb3dNZXNzYWdlcy5yYXRpb25hbGUgYXJlIHBheWxvYWRzOyBmbG93IHRvcG9sb2d5L3RpbWluZyBtZXRhZGF0YSBzdGF5c1xuICAgKiBpbnRhY3QuIEFwcGxpZWQgYmVmb3JlIHJldGVudGlvbiwgbm90IHJldHJvYWN0aXZlbHkgdG8gZXhpc3RpbmcgYmFncy5cbiAgICovXG4gIGRpYWdub3N0aWNzPzogUGljazxSZWRhY3Rpb25Qb2xpY3ksICdrZXlzJyB8ICdwYXR0ZXJucycgfCAnZmllbGRzJz47XG4gIC8qKlxuICAgKiBSZWdleCBwYXR0ZXJucyBtYXRjaGVkIGFnYWluc3QgYEVtaXRFdmVudC5uYW1lYCBmb3IgYHNjb3BlLiRlbWl0KC4uLilgXG4gICAqIGNhbGxzLiBBbnkgZW1pdCBldmVudCB3aG9zZSBuYW1lIG1hdGNoZXMgaGFzIGl0cyBwYXlsb2FkIHJlcGxhY2VkIHdpdGhcbiAgICogdGhlIHN0cmluZyBgJ1tSRURBQ1RFRF0nYCBiZWZvcmUgZGlzcGF0Y2ggdG8gcmVjb3JkZXJzLlxuICAgKiBHbG9iYWwvc3RpY2t5IHBhdHRlcm5zIHN0YXJ0IGF0IGluZGV4IHplcm8gb24gZXZlcnkgdGVzdDsgdGhlaXIgZmxhZ3NcbiAgICogcmV0YWluIHRoZWlyIHVzdWFsIG1lYW5pbmcuIFRoaXMgZG9lcyBub3Qgc2NydWIgZGlhZ25vc3RpYyBzaWRlIGJhZ3MuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIGBgYHRzXG4gICAqIHsgZW1pdFBhdHRlcm5zOiBbL1xcLmF1dGhcXC4vLCAvXFwuYmlsbGluZ1xcLi9dIH1cbiAgICogLy8gSGlkZXMgcGF5bG9hZHMgb2YgZXZlbnRzIGxpa2UgJ215YXBwLmF1dGguY2hlY2snIGFuZCAnbXlhcHAuYmlsbGluZy5zcGVuZCdcbiAgICogYGBgXG4gICAqL1xuICBlbWl0UGF0dGVybnM/OiBSZWdFeHBbXTtcbn1cblxuLyoqXG4gKiBTdGF0ZSByZWRhY3Rpb24gcmVwb3J0LiBOZXZlciBpbmNsdWRlcyB2YWx1ZXM7IGVtaXQgYW5kIGRpYWdub3N0aWNcbiAqIHNlbGVjdG9ycy9hY3Rpdml0eSBhcmUgbm90IHJlcHJlc2VudGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkYWN0aW9uUmVwb3J0IHtcbiAgLyoqIEtleXMgZnVsbHkgcmVkYWN0ZWQgKGV4YWN0IG1hdGNoIG9yIHBhdHRlcm4gbWF0Y2gpLiAqL1xuICByZWRhY3RlZEtleXM6IHN0cmluZ1tdO1xuICAvKiogS2V5cyB3aXRoIGZpZWxkLWxldmVsIHJlZGFjdGlvbiDihpIgd2hpY2ggZmllbGRzIHdlcmUgc2NydWJiZWQuICovXG4gIGZpZWxkUmVkYWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAvKiogUGF0dGVybiBzb3VyY2VzIHRoYXQgd2VyZSBhY3RpdmUgKGUuZy4gWydwYXNzd29yZHxzZWNyZXQnXSkuICovXG4gIHBhdHRlcm5zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBwb2xpY3kgc2F5cyBhYm91dCB0aGUgdmFsdWUgYXQgb25lIHVzZXItbGV2ZWwgcGF0aC5cbiAqXG4gKiAtIGAnY2xlYXInYCAg4oCUIG5vdGhpbmcgdG8gc2NydWI7IHJldGFpbiBhbmQgc2VydmUgdGhlIHZhbHVlIGFzIGl0IGlzLlxuICogLSBgJ3dob2xlJ2AgIOKAlCB0aGUgZW50aXJlIHZhbHVlIGlzIHNlY3JldC4gYGtleWAgaXMgdGhlIHBvbGljeSBvciBtYXJrZWRcbiAqICAga2V5IHRoYXQgZGVjaWRlZCBpdCAodGhlIHBhdGggaXRzZWxmIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzKS5cbiAqIC0gYCdmaWVsZHMnYCDigJQgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCB3aG9zZSBgcGF0aHNgIChkb3QtcGF0aHMgSU5TSURFIHRoZVxuICogICB2YWx1ZSwgcmVsYXRpdmUgdG8gaXQpIGFyZSBzZWNyZXQ7IGV2ZXJ5dGhpbmcgZWxzZSBpbiBpdCBpcyBub3QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZGFjdGlvblZlcmRpY3QgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2NsZWFyJyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnd2hvbGUnOyByZWFkb25seSBrZXk6IHN0cmluZyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZmllbGRzJzsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB9O1xuXG5leHBvcnQgY29uc3QgQ0xFQVI6IFJlZGFjdGlvblZlcmRpY3QgPSBPYmplY3QuZnJlZXplKHsga2luZDogJ2NsZWFyJyB9IGFzIGNvbnN0KTtcblxuLyoqXG4gKiBNYXhpbXVtIGtleSBsZW5ndGggKGNoYXJhY3RlcnMpIHRoYXQgd2lsbCBiZSB0ZXN0ZWQgYWdhaW5zdCByZWdleCByZWRhY3Rpb25cbiAqIHBhdHRlcm5zLiBLZXlzIGxvbmdlciB0aGFuIHRoaXMgYXJlIHNraXBwZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgdG8gcHJldmVudFxuICogUmVEb1M6IGEgcGF0aG9sb2dpY2FsIHJlZ2V4IHRlc3RlZCBhZ2FpbnN0IGFuIHVuYm91bmRlZGx5IGxvbmcga2V5IHN0cmluZ1xuICogY2FuIGNhdXNlIGNhdGFzdHJvcGhpYyBiYWNrdHJhY2tpbmcuIDI1NiBjaGFyYWN0ZXJzIGNvbWZvcnRhYmx5IGV4Y2VlZHMgYW55XG4gKiByZWFsaXN0aWMgc2NvcGUtc3RhdGUga2V5IG5hbWUuXG4gKi9cbmNvbnN0IE1BWF9QQVRURVJOX0tFWV9MRU4gPSAyNTY7XG5cbi8qKiBQb2xpY3kgcGF0dGVybnMgYXJlIHByZWRpY2F0ZXMsIG5vdCBjdXJzb3JzIG92ZXIgc3VjY2Vzc2l2ZSBrZXlzL2V2ZW50cy4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNQYXR0ZXJuKHZhbHVlOiBzdHJpbmcsIHBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXBhdHRlcm5zKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIC8vIE9ubHkgdGhlc2UgZmxhZ3MgY29uc3VtZSBsYXN0SW5kZXguIE9yZGluYXJ5IChpbmNsdWRpbmcgZnJvemVuKVxuICAgIC8vIHJlZ2V4ZXMgbmVlZCBubyB3cml0YWJsZSBjdXJzb3IgdG8gbWF0Y2guIEtlZXAgYWxsIG9yaWdpbmFsIGZsYWdzLlxuICAgIGlmIChwYXR0ZXJuLmdsb2JhbCB8fCBwYXR0ZXJuLnN0aWNreSkgcGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgIGlmIChwYXR0ZXJuLnRlc3QodmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWRhY3Rpb25SdWxlIHtcbiAgcHJpdmF0ZSBwb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkaWFnbm9zdGljUnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZDtcbiAgLyoqIFdoZXRoZXIgYHBvbGljeWAgbmFtZXMgYW55dGhpbmcgYSBzdGF0ZSB2ZXJkaWN0IGNhbiBhY3Qgb24g4oCUIGNvbXB1dGVkXG4gICAqICBvbmNlIHBlciBgc2V0UG9saWN5YCBzbyB7QGxpbmsgaXNJbmVydH0gaXMgYSB0d28tZmllbGQgY2hlY2suICovXG4gIHByaXZhdGUgcG9saWN5QWN0aXZlID0gZmFsc2U7XG4gIC8qKiBUaGUgcG9saWN5J3MgcGF0dGVybnMgdGhhdCBjYW4gZGVwZW5kIG9uIGEgd2hvbGUgZG90dGVkIHBhdGggKHtAbGluayBuZWVkc1BhdGh9KSDigJQgcGVyIGBzZXRQb2xpY3lgLiAqL1xuICBwcml2YXRlIHBhdGhQYXR0ZXJuczogcmVhZG9ubHkgUmVnRXhwW10gPSBbXTtcbiAgcHJpdmF0ZSB3YWxrTGltaXRXYXJuZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEtleXMgbWFya2VkIHNlY3JldCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biDigJQgYnkgYSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgLCBvciBieSBhbnkgd3JpdGUgdGhlIHBvbGljeSByZWRhY3RlZCB3aG9sZS5cbiAgICogT05FIHNldCBwZXIgcnVuLCBzaGFyZWQgYnkgZXZlcnkgc2NvcGUgYW5kIGNvbnRleHQgKHRoZSBleGVjdXRvciBidWlsZHNcbiAgICogdGhlIHJ1bGUgb25jZSBwZXIgcnVuIGFuZCBpbnN0YWxscyBpdCBvbiB0aGUgcnVudGltZSByb290KS5cbiAgICovXG4gIHByaXZhdGUgbWFya2VkOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIEZpZWxkcyBhIHN1YmZsb3cgbWFwcGVyIGhhbmRlZCB0byBhIE5FVyBrZXkgYWxvbmcgd2l0aCB0aGUgdmFsdWUgdGhleVxuICAgKiBiZWxvbmcgdG8g4oCUIHRhcmdldCBrZXkg4oaSIHRoZSBzb3VyY2Uga2V5J3MgZmllbGQgcGF0aHMgKGFuIG9iamVjdCBjb3BpZWRcbiAgICogYnkgcmVmZXJlbmNlIGZyb20gYSBgZmllbGRzYC1zZWxlY3RlZCBrZXk7IHtAbGluayBNYXBwZXJUYWludH0pLlxuICAgKiBSdW4td2lkZSwgYnkgbmFtZSwgbGlrZSB7QGxpbmsgbWFya2VkfS5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdGVkOiBNYXA8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGlzIHJ1bidzIHRocm93biB2YWx1ZXMgc2VydmVkIG1hc2tlZCAodGhlaXIgdGV4dCBzZWxlY3RlZCwgb3IgYSBzZWxlY3RlZCBrZXkgaW5zaWRlIHRoZW0pIOKGkiB0aGVpciBzZXJ2ZWQgZm9ybS4gKi9cbiAgcHJpdmF0ZSBtYXNrZWRFcnJvcnM6IE1hcDx1bmtub3duLCBTdHJ1Y3R1cmVkRXJyb3JJbmZvPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwb2xpY3k/OiBSZWRhY3Rpb25Qb2xpY3ksIG1hcmtlZD86IFNldDxzdHJpbmc+KSB7XG4gICAgdGhpcy5tYXJrZWQgPSBtYXJrZWQgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5zZXRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIGdldFBvbGljeSgpOiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIHNldFBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIGNvbnN0IGRpYWdub3N0aWNzID0gcG9saWN5Py5kaWFnbm9zdGljcztcbiAgICB0aGlzLmRpYWdub3N0aWNSdWxlID0gZGlhZ25vc3RpY3NcbiAgICAgID8gbmV3IFJlZGFjdGlvblJ1bGUoeyBrZXlzOiBkaWFnbm9zdGljcy5rZXlzLCBwYXR0ZXJuczogZGlhZ25vc3RpY3MucGF0dGVybnMsIGZpZWxkczogZGlhZ25vc3RpY3MuZmllbGRzIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhdGhQYXR0ZXJucyA9IChwb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5maWx0ZXIobmVlZHNQYXRoKTtcbiAgICB0aGlzLnBvbGljeUFjdGl2ZSA9XG4gICAgICBwb2xpY3kgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKChwb2xpY3kua2V5cz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgICAocG9saWN5LnBhdHRlcm5zPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKHBvbGljeS5maWVsZHMgPz8ge30pLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGlzIHJ1bGUgaGFzIG5vdGhpbmcgdG8gc2F5IGFib3V0IEFOWSBwYXRoIOKAlCBubyBrZXksIHBhdHRlcm5cbiAgICogb3IgZmllbGQgaW4gdGhlIHBvbGljeSBhbmQgbm8ga2V5IG1hcmtlZCBzbyBmYXIuIFRoZSBuby1wb2xpY3kgZmFzdFxuICAgKiBwYXRoOiBgU3RhZ2VDb250ZXh0YCBza2lwcyB0aGUgdmVyZGljdCAoYW5kIGl0cyBwYXRoIGFsbG9jYXRpb24pIG9uXG4gICAqIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhbmQgc3RhZ2VkIHdyaXRlIHdoaWxlIHRoaXMgaG9sZHMuIEEgcGVyLWNhbGxcbiAgICogYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCBtYXJrcyBhIGtleSBhbmQgZW5kcyBpdC5cbiAgICovXG4gIGlzSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFya2VkLnNpemUgPT09IDAgJiYgIXRoaXMucG9saWN5QWN0aXZlICYmIHRoaXMuaW5oZXJpdGVkID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIHNoYXJlZCBtYXJrZWQta2V5cyBzZXQg4oCUIGZvciB0aGUgYEBpbnRlcm5hbGAgc2hhcmluZyBwcm90b2NvbCBhbmQgYGRlY2lkZSgpYC4gKi9cbiAgbWFya2VkS2V5cygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFya2VkO1xuICB9XG5cbiAgdXNlTWFya2VkS2V5cyhzaGFyZWQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQgPSBzaGFyZWQ7XG4gIH1cblxuICBtYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuYWRkKGtleSk7XG4gIH1cblxuICAvKiogRGVsZXRpbmcgYSBrZXkgY2xlYXJzIGl0cyBwZXItY2FsbCBtYXJrIGFuZCBhbnkgZmllbGRzIGEgbWFwcGVyIGdhdmUgaXQ7IGEgcG9saWN5IHZlcmRpY3Qgc3Vydml2ZXMgaXQuICovXG4gIHVubWFyayhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFya2VkLmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLmluaGVyaXRlZD8uZGVsZXRlKGtleSkgJiYgdGhpcy5pbmhlcml0ZWQuc2l6ZSA9PT0gMCkgdGhpcy5pbmhlcml0ZWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogS2V5LWxldmVsIHZlcmRpY3Q6IG1hcmtlZCwgbGlzdGVkIGluIGBwb2xpY3kua2V5c2AsIG9yIG1hdGNoaW5nIGEgcGF0dGVybi4gKi9cbiAgaXNLZXlSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1hcmtlZC5oYXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLnBvbGljeSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnBvbGljeS5rZXlzPy5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucG9saWN5LnBhdHRlcm5zO1xuICAgIGlmICghcGF0dGVybnMgfHwgcGF0dGVybnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGtleS5sZW5ndGggPiBNQVhfUEFUVEVSTl9LRVlfTEVOKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGtleSAnJHtrZXkuc2xpY2UoMCwgNDApfS4uLicgKCR7a2V5Lmxlbmd0aH0gY2hhcnMpIGV4Y2VlZHMgYCArXG4gICAgICAgICAgICAndGhlIHBhdHRlcm4tbWF0Y2hpbmcgbGVuZ3RoIGNhcCBhbmQgd2FzIHNraXBwZWQuICcgK1xuICAgICAgICAgICAgJ1VzZSBwb2xpY3kua2V5cyBmb3IgZXhhY3QgbWF0Y2hpbmcgb2YgbG9uZyBrZXkgbmFtZXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKGtleSwgcGF0dGVybnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhbiBlbWl0dGVkIHBheWxvYWQgQkVGT1JFIGRpc3BhdGNoL2NhcHR1cmUuIEVtaXQgbmFtZXMgYXJlIG5vdFxuICAgKiBzdGF0ZSBwYXRoczogbm8ga2V5LWxlbmd0aCBjYXAsIG1hcmtzIG9yIGZpZWxkIHNjcnViIGFwcGxpZXMgaGVyZS5cbiAgICogQSBjbGVhciBwYXlsb2FkIGtlZXBzIGl0cyBpZGVudGl0eTsgZGlhZ25vc3RpYyBiYWdzIGFyZSB1bnRvdWNoZWQuXG4gICAqL1xuICByZXRhaW5FbWl0KG5hbWU6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IHVua25vd24ge1xuICAgIHJldHVybiBtYXRjaGVzUGF0dGVybihuYW1lLCB0aGlzLnBvbGljeT8uZW1pdFBhdHRlcm5zKSA/IFNDT1BFX1BMQUNFSE9MREVSIDogcGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gYSBOQU1FRCBkaWFnbm9zdGljIGVudHJ5IOKAlCBgYWRkcmVzc2AgaXMgYFtjaGFubmVsLCAuLi5wYXRoLCBuYW1lXWBcbiAgICogKGAkZGVidWcoJ3Rva2VuJywgdilgIOKGkiBgWydsb2dzJywgJ3Rva2VuJ11gOyBgJGxvZyh2KWAg4oaSIGBbJ2xvZ3MnLFxuICAgKiAnbWVzc2FnZXMnXWApLiBUSEUgTUFQUElORzogdGhlIGVudHJ5IGlzIHRoZSByZWNvcmQgYHsgW25hbWVdOiB2YWx1ZSB9YFxuICAgKiBoYW5kZWQgb3V0IHdob2xlLCBzbyBpdCBpcyByZXRhaW5lZCBhcyBhIGJvdW5kYXJ5IHJlY29yZCBob2xkaW5nIHRoZVxuICAgKiBzdGF0ZSBrZXkgYG5hbWVgIHdvdWxkIGJlIOKAlCB0aGUgc3RhdGUgdmVyZGljdCBhdCBgWy4uLnBhdGgsIG5hbWVdYCAoa2V5cyxcbiAgICogcGF0dGVybnMgYW5kIG1hcmtzIGF0IGV2ZXJ5IGRvdHRlZCBwcmVmaXggYW5kIGF0IHRoZSBuYW1lIGl0c2VsZjsgdGhlIHRvcFxuICAgKiBrZXkncyBgZmllbGRzYCksIHRoZW4gZXZlcnkgbmVzdGVkIG93biBrZXkgd2hvc2UgbmFtZSBvciBkb3R0ZWQgcGF0aCBpc1xuICAgKiBzZWxlY3RlZCAoe0BsaW5rIHJldGFpbkJvdW5kYXJ5fSdzIHdhbGspLiBUaGUgY2hhbm5lbCB0YWtlcyBubyBwYXJ0OlxuICAgKiBgbG9ncy50b2tlbmAsIGBlcnJvcnMudG9rZW5gIGFuZCBgbWV0cmljcy50b2tlbmAgYXJlIGFsbCB0aGUgc3RhdGUga2V5XG4gICAqIGB0b2tlbmAuIGBwb2xpY3kuZGlhZ25vc3RpY3NgIChkaWFnbm9zdGljLW9ubHkgc2VsZWN0b3JzLCByb290ZWQgYXQgdGhlXG4gICAqIGNoYW5uZWwpIGFwcGxpZXMgb24gdG9wLiBDbGVhciB2YWx1ZXMga2VlcCB0aGVpciBpZGVudGl0eS5cbiAgICovXG4gIHJldGFpbkRpYWdub3N0aWMoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuaXNJbmVydCgpID8gdmFsdWUgOiB0aGlzLnJldGFpbk5hbWVkKGFkZHJlc3Muc2xpY2UoMSksIHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5kaWFnbm9zdGljUnVsZSA/IHRoaXMuZGlhZ25vc3RpY1J1bGUucmV0YWluKGFkZHJlc3MsIGtlcHQpIDoga2VwdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gZmxvdy1tZXNzYWdlIHRleHQgKGBmbG93TWVzc2FnZXMuZGVzY3JpcHRpb25gIC8gYC5yYXRpb25hbGVgKTogdGV4dFxuICAgKiB0aGUgZW5naW5lIGNvbXBvc2VzIGhhcyBubyBuYW1lIG9mIGl0cyBvd24sIHNvIG5vIHN0YXRlIHNlbGVjdG9yIHJlYWNoZXNcbiAgICogaXQg4oCUIG9ubHkgYHBvbGljeS5kaWFnbm9zdGljc2Agc2VsZWN0cyBpdC5cbiAgICovXG4gIHJldGFpbkZsb3dUZXh0KGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCB0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gKHRoaXMuZGlhZ25vc3RpY1J1bGUucmV0YWluKGFkZHJlc3MsIHRleHQpIGFzIHN0cmluZykgOiB0ZXh0O1xuICB9XG5cbiAgLyoqIHtAbGluayByZXRhaW5EaWFnbm9zdGljfSdzIHN0YXRlIGhhbGY6IHRoZSB2YWx1ZSBuYW1lZCBieSBgcGF0aGAgKGl0cyBsYXN0IHNlZ21lbnQpLCBzZXJ2ZWQgd2hvbGUuICovXG4gIHByaXZhdGUgcmV0YWluTmFtZWQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgICAgIHBhdGgubGVuZ3RoID4gMSAmJiB0aGlzLmlzS2V5UmVkYWN0ZWQobmFtZSkgPyB7IGtpbmQ6ICd3aG9sZScsIGtleTogbmFtZSB9IDogdGhpcy52ZXJkaWN0KHBhdGgpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBrZXB0ID0gUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSk7XG4gICAgaWYgKGtlcHQgPT09IG51bGwgfHwgdHlwZW9mIGtlcHQgIT09ICdvYmplY3QnKSByZXR1cm4ga2VwdDtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5qb2luKCcuJyk7XG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aChrZXB0LCBiYXNlLCB0aGlzLmRvdHRlZFRhcmdldHMoYmFzZSksIHRoaXMubmFtZXNXYWxrKGZhbHNlKSwgU0NPUEVfUExBQ0VIT0xERVIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBhIHRocm93biB2YWx1ZSwgZGVjaWRlZCBPTkNFIGF0IGl0cyBlcnJvciBzaXRlIGZyb20gdGhlXG4gICAqIHRleHQgdGhlIGRpYWdub3N0aWMgY29sbGVjdG9yIHJldGFpbmVkIGZvciBgZXJyb3JzLnN0YWdlRXhlY3V0aW9uRXJyb3JgXG4gICAqIChga2VwdGApIGFuZCBmcm9tIHRoZSB2YWx1ZSBpdHNlbGYg4oCUIGEgcmVjb3JkIGhhbmRlZCBvdXQgd2hvbGUsIG1hc2tlZFxuICAgKiB3aGVuIG9uZSBvZiBpdHMgb3duIGtleXMsIGF0IGFueSBkZXB0aCwgY2FycmllcyBhIHNlbGVjdGVkIG5hbWUuXG4gICAqIFVubWFza2VkOiB0b2RheSdzIHN0cnVjdHVyZWQgaW5mby4gTWFza2VkOiB0aGUgZXJyb3IncyBgbmFtZWAvYGNvZGVgIGtlcHQsXG4gICAqIG5vIGBpc3N1ZXNgICh0aGV5IHF1b3RlIHRoZSBpbnB1dCkgYW5kIG5vIGByYXdgIGVycm9yIChpdCBob2xkcyB0aGUgdGV4dFxuICAgKiBhbmQgdGhlIGtleXMpOyB0aGUgbWVzc2FnZSBpcyB0aGUgcGxhY2Vob2xkZXIgd2hlbiB0aGUgdGV4dCB3YXMgc2VsZWN0ZWQsXG4gICAqIHRoZSB0ZXh0IGl0c2VsZiB3aGVuIG9ubHkgYSBrZXkgd2FzIOKAlCByZW1lbWJlcmVkIHNvIGBvblJ1bkZhaWxlZGAsIHRoZVxuICAgKiBsb2dnZXIgYW5kIGEgZm9yayBlbnZlbG9wZSBzZXJ2ZSB0aGUgc2FtZSBmb3JtICh7QGxpbmsgc2VydmVkRXJyb3J9KS4gVGhlXG4gICAqIHRocm93biB2YWx1ZSBpdHNlbGYgc3RheXMgcmVhbC5cbiAgICovXG4gIHJldGFpblN0YWdlRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtlcHQ6IHVua25vd24sXG4gICk6IHsgbWVzc2FnZTogc3RyaW5nOyBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfSB7XG4gICAgY29uc3QgaW5mbyA9IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpO1xuICAgIGNvbnN0IHRleHRTZWxlY3RlZCA9IGtlcHQgIT09IHRleHQ7XG4gICAgaWYgKCF0ZXh0U2VsZWN0ZWQgJiYgIXRoaXMuY2Fycmllc1NlbGVjdGVkS2V5KGVycm9yKSkgcmV0dXJuIHsgbWVzc2FnZTogdGV4dCwgc3RydWN0dXJlZEVycm9yOiBpbmZvIH07XG4gICAgY29uc3QgbWVzc2FnZSA9IHRleHRTZWxlY3RlZCA/IFN0cmluZyhrZXB0KSA6IHRleHQ7XG4gICAgY29uc3QgbWFza2VkOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvID0ge1xuICAgICAgbWVzc2FnZTogdGV4dFNlbGVjdGVkID8gbWVzc2FnZSA6IGluZm8ubWVzc2FnZSxcbiAgICAgIC4uLihpbmZvLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWU6IGluZm8ubmFtZSB9KSxcbiAgICAgIC4uLihpbmZvLmNvZGUgIT09IHVuZGVmaW5lZCAmJiB7IGNvZGU6IGluZm8uY29kZSB9KSxcbiAgICAgIHJhdzogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgKHRoaXMubWFza2VkRXJyb3JzID8/PSBuZXcgTWFwKCkpLnNldChlcnJvciwgbWFza2VkKTtcbiAgICByZXR1cm4geyBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3I6IG1hc2tlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgYSB0aHJvd24gdmFsdWUgY2FycnkgYSBzZWxlY3RlZCBuYW1lIOKAlCBhbiBvd24ga2V5LCBhdCBhbnkgZGVwdGgsIHRoYXRcbiAgICogdGhlIHBvbGljeSBvciBhIG1hcmsgc2VsZWN0cz8gVG90YWw6IGEgdmFsdWUgd2hvc2Uga2V5cyBjYW5ub3QgYmUgcmVhZCBpc1xuICAgKiBzZXJ2ZWQgbWFza2VkICh0aGUgc2FmZSBzaWRlKSwgbmV2ZXIgYSBzZWNvbmQgdGhyb3cgZnJvbSBhbiBlcnJvciBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXJyaWVzU2VsZWN0ZWRLZXkodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy50aHJvd25DYXJyaWVzKHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gS2V5cyB0aGF0IGNhbm5vdCBiZSByZWFkIChhIHRocm93aW5nIGdldHRlciwgYSByZXZva2VkIFByb3h5KSBvciBhIHdhbGsgcGFzdCBpdHNcbiAgICAgIC8vIGxpbWl0OiBzZXJ2ZWQgaW4gdGhlIG1hc2tlZCBmb3JtIOKAlCBpdHMgdGV4dCBrZXB0LCBubyBgcmF3YC5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgdGhyb3duIHZhbHVlIGFuZCB3aGF0IGEgbG9nZ2VyIG9yIGEgc2VyaWFsaXplciBwcmludHMgd2l0aCBpdDogaXRzIG93blxuICAgKiBrZXlzIGF0IGV2ZXJ5IGRlcHRoLCBhbmQgaXRzIGBjYXVzZWAgLyBhbiBgQWdncmVnYXRlRXJyb3JgJ3MgYGVycm9yc2Ag4oCUIG93blxuICAgKiBOT04tZW51bWVyYWJsZSBrZXlzIG5vIGtleSB3YWxrIHNlZXMg4oCUIGVhY2ggd2Fsa2VkIHRoZSBzYW1lIHdheSAoYSBjeWNsZVxuICAgKiBhbW9uZyB0aGVtIGlzIGZvbGxvd2VkIG9uY2UpLlxuICAgKi9cbiAgcHJpdmF0ZSB0aHJvd25DYXJyaWVzKHZhbHVlOiBvYmplY3QsIHNlZW46IFNldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICBpZiAoc2VsZWN0c0J5UGF0aCh2YWx1ZSwgdW5kZWZpbmVkLCB0aGlzLmRvdHRlZFRhcmdldHModW5kZWZpbmVkKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBuZXcgTWFwKCksIDApLnNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgb3duID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpID8gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVycm9ycyA9IG93bignZXJyb3JzJyk7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIFtvd24oJ2NhdXNlJyksIC4uLihBcnJheS5pc0FycmF5KGVycm9ycykgPyBlcnJvcnMgOiBbXSldKSB7XG4gICAgICBpZiAocGFydCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFydCA9PT0gJ29iamVjdCcgJiYgdGhpcy50aHJvd25DYXJyaWVzKHBhcnQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBrZXktbGV2ZWwgcnVsZXMgYXMgdGhlIHBhdGggd2FsayBhc2tzIHRoZW0gKHtAbGluayBzZXJ2ZWRCeVBhdGh9KTogYVxuICAgKiBuZXN0ZWQga2V5IGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gTkFNRSAobWFya3MsIGtleXMsIHBhdHRlcm5zKSwgYW5kIOKAlCB1bmRlclxuICAgKiBwYXR0ZXJucyBvbmx5IOKAlCBieSBpdHMgZG90dGVkIHBhdGg7IGEgZGVjbGFyZWQgKG9yIGluaGVyaXRlZCkgZmllbGQgYmVsb3cgYVxuICAgKiBrZXkgb2YgaXRzIG5hbWUgaXMgYSB0YXJnZXQuIERvdHRlZCBrZXlzIGFuZCBtYXJrcyBhcmUgVEFSR0VUUyBmcm9tIHRoZVxuICAgKiB3YWxrJ3Mgcm9vdCAoe0BsaW5rIGRvdHRlZFRhcmdldHN9KSwgc28gd2l0aG91dCBwYXR0ZXJucyBubyBkZWNpc2lvblxuICAgKiBkZXBlbmRzIG9uIHRoZSBwYXRoIGFuZCB0aGUgd2FsayBzaGFyZXMgdGhlbSBwZXIgb2JqZWN0IChsaW5lYXIgb24gYSBEQUcpLlxuICAgKiBgcm9vdERlY2lkZWRgOiB0aGUgcm9vdCdzIG93biBrZXlzIHdlcmUgYWxyZWFkeSBkZWNpZGVkIChgcmV0YWluUmVjb3JkYCkuXG4gICAqL1xuICBwcml2YXRlIG5hbWVzV2Fsayhyb290RGVjaWRlZDogYm9vbGVhbik6IFdhbGsge1xuICAgIGNvbnN0IGJ5UGF0aCA9IHRoaXMucGF0aFBhdHRlcm5zO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lczoge1xuICAgICAgICBtYXNrczogKG5hbWUpID0+IHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSxcbiAgICAgICAgLi4uKGJ5UGF0aC5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICBwYXRoTWFza3M6IChwYXRoOiBzdHJpbmcpID0+IHBhdGgubGVuZ3RoIDw9IE1BWF9QQVRURVJOX0tFWV9MRU4gJiYgbWF0Y2hlc1BhdHRlcm4ocGF0aCwgYnlQYXRoKSxcbiAgICAgICAgfSksXG4gICAgICAgIGZpZWxkczogKG5hbWUpID0+IHRoaXMuZmllbGRzT2YobmFtZSksXG4gICAgICB9LFxuICAgICAgcm9vdERlY2lkZWQsXG4gICAgICAuLi4oYnlQYXRoLmxlbmd0aCA9PT0gMCAmJiB7IG1lbW86IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+KCkgfSksXG4gICAgICBidWRnZXQ6IHdhbGtMaW1pdCxcbiAgICAgIG9uTGltaXQ6ICgpID0+IHRoaXMud2FybldhbGtMaW1pdChieVBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKiogT25jZSBwZXIgcnVsZSwgaW4gZGV2IG1vZGU6IGEgcGF0aCB3YWxrIHBhc3NlZCBpdHMgbGltaXQgYW5kIHNlcnZlZCBpdHMgcmVtYWluZGVyIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgcHJpdmF0ZSB3YXJuV2Fsa0xpbWl0KHBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLndhbGtMaW1pdFdhcm5lZCB8fCAhaXNEZXZNb2RlKCkpIHJldHVybjtcbiAgICB0aGlzLndhbGtMaW1pdFdhcm5lZCA9IHRydWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2Zvb3RwcmludF0gUmVkYWN0aW9uUG9saWN5OiBhIHZhbHVlIHdpdGggbW9yZSB0aGFuICR7d2Fsa0xpbWl0fSBwYXRocyB1bmRlciB0aGUgcGF0aCBwYXR0ZXJuKHMpIGAgK1xuICAgICAgICBgJHtwYXR0ZXJucy5tYXAoU3RyaW5nKS5qb2luKCcsICcpfSDigJQgdGhlIHBhdGhzIHBhc3QgdGhhdCB3ZXJlIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuIGAgK1xuICAgICAgICAnQSBwYXR0ZXJuIHRoYXQgbmFtZXMgYSBLRVkgKG5vIGRvdCwgbm8gbG9va2Fyb3VuZCkgaXMgZGVjaWRlZCBwZXIgb2JqZWN0OyBwcmVmZXIgb25lLCBvciBrZXlzL2ZpZWxkcy4nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRvdHRlZCBrZXlzIGFuZCBtYXJrcyB0aGF0IG5hbWUgYSBwYXRoIHVuZGVyIGBiYXNlYCAodGhlIHdhbGsncyByb290OlxuICAgKiBgdW5kZWZpbmVkYCBmb3IgYSByZWNvcmQncyBvd24ga2V5cywgYW4gZW50cnkncyBuYW1lIGZvciBhIGRpYWdub3N0aWMpLFxuICAgKiBhcyB0YXJnZXRzIHJlbGF0aXZlIHRvIGl0IOKAlCBhIGRvdHRlZCBydWxlIGlzIGV4YWN0IHRvIGl0cyBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBkb3R0ZWRUYXJnZXRzKGJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgICBjb25zdCBwcmVmaXggPSBiYXNlID09PSB1bmRlZmluZWQgPyAnJyA6IGAke2Jhc2V9LmA7XG4gICAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICAgIGNvbnN0IGFkZCA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnLicpIHx8ICFuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBuYW1lLmxlbmd0aCA9PT0gcHJlZml4Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgb3V0LnB1c2gobmFtZS5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdCgnLicpKTtcbiAgICB9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLm1hcmtlZCkgYWRkKG5hbWUpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLnBvbGljeT8ua2V5cyA/PyBbXSkgYWRkKG5hbWUpO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhbnkgb2JzZXJ2ZXIgaXMgc2VydmVkIGZvciBhIHRocm93biB2YWx1ZSDigJQgcmV0cnksIHRocm90dGxlLCBydW5cbiAgICogZmFpbHVyZSwgYSBmb3JrIGVudmVsb3BlLCB0aGUgbG9nZ2VyOiBpdHMgcmVtZW1iZXJlZCBzdGFnZSBmb3JtLCBlbHNlIHRoZVxuICAgKiBzYW1lIGRlY2lzaW9uIG1hZGUgbm93IChhbmQgcmVtZW1iZXJlZCksIGVsc2UgaXRzIHN0cnVjdHVyZWQgaW5mby5cbiAgICovXG4gIHNlcnZlZEVycm9yKGVycm9yOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgLy8gRWFjaCBldmVudCBnZXRzIGl0cyBvd24gb2JqZWN0LCBhcyBleHRyYWN0RXJyb3JJbmZvIGdpdmVzIGl0IG9uZS5cbiAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGxvZ2dlciBpcyBoYW5kZWQ6IHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmIHVubGVzcyB0aGUgcG9saWN5IG1hc2tlZCBpdHMgdGV4dC4gKi9cbiAgbG9nZ2FibGVFcnJvcihlcnJvcjogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIG1hc2tlZEVycm9yKGVycm9yOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga25vd24gPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KGVycm9yKTtcbiAgICBpZiAoa25vd24gfHwgdGhpcy5pc0RpYWdub3N0aWNJbmVydCgpKSByZXR1cm4ga25vd247XG4gICAgY29uc3QgdGV4dCA9IHRocm93blRleHQoZXJyb3IpO1xuICAgIHRoaXMucmV0YWluU3RhZ2VFcnJvcihlcnJvciwgdGV4dCwgdGhpcy5yZXRhaW5EaWFnbm9zdGljKFsnZXJyb3JzJywgJ3N0YWdlRXhlY3V0aW9uRXJyb3InXSwgdGV4dCkpO1xuICAgIHJldHVybiB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KGVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RoaW5nIGNhbiBtYXNrIGEgZGlhZ25vc3RpYyBlbnRyeSBvciBhIHRocm93biB2YWx1ZSDigJQgbm8gc3RhdGUgc2VsZWN0b3IsXG4gICAqIG5vIG1hcmssIG5vIGRpYWdub3N0aWMgc2VsZWN0b3I6IHRoZSBjb2xsZWN0b3JzJyBhbmQgdGhlIGVycm9yIHBhdGhzJyBmYXN0XG4gICAqIHBhdGggKGEgbm8tcG9saWN5IHJ1biBuZXZlciByZWFkcyBhIHBheWxvYWQsIGluY2x1ZGluZyBib3Jyb3dlZCBnZXR0ZXJzKS5cbiAgICovXG4gIGlzRGlhZ25vc3RpY0luZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSW5lcnQoKSAmJiB0aGlzLmlzRmxvd1RleHRJbmVydCgpO1xuICB9XG5cbiAgLyoqIE5vdGhpbmcgY2FuIG1hc2sgZmxvdy1tZXNzYWdlIHRleHQg4oCUIG9ubHkgYHBvbGljeS5kaWFnbm9zdGljc2Agc2VsZWN0cyBpdCAoe0BsaW5rIHJldGFpbkZsb3dUZXh0fSkuICovXG4gIGlzRmxvd1RleHRJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZGlhZ25vc3RpY1J1bGUgfHwgdGhpcy5kaWFnbm9zdGljUnVsZS5pc0luZXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGEgdXNlci1sZXZlbCBwYXRoIOKAlCBgWydwcm9maWxlJ11gIGZvciBhIHNjb3BlIGtleSxcbiAgICogYFsncHJvZmlsZScsICdhdXRoJ11gIGZvciBhIG5lc3RlZCB3cml0ZSBzdWNoIGFzIGEgc3ViZmxvdyBzZWVkLlxuICAgKlxuICAgKiBFdmVyeSBkb3R0ZWQgcHJlZml4IGlzIHRlc3RlZCBhdCBrZXkgbGV2ZWwgKGBwcm9maWxlYCwgdGhlblxuICAgKiBgcHJvZmlsZS5hdXRoYCksIHNvIGEgcG9saWN5IHRoYXQgbmFtZXMgYSBrZXkgY292ZXJzIGV2ZXJ5dGhpbmcgd3JpdHRlblxuICAgKiBiZW5lYXRoIGl0LiBgZmllbGRzYCBhcmUgZGVjbGFyZWQgcmVsYXRpdmUgdG8gdGhlIFRPUCBrZXk7IGZvciBhIG5lc3RlZFxuICAgKiBwYXRoIHRoZXkgYXJlIHJlLWJhc2VkIG9udG8gdGhlIHZhbHVlIGJlaW5nIHdyaXR0ZW4sIGFuZCBhIGZpZWxkIHRoYXRcbiAgICogbmFtZXMgdGhlIHdyaXR0ZW4gcGF0aCBleGFjdGx5IG1ha2VzIHRoZSB3aG9sZSB2YWx1ZSBzZWNyZXQuXG4gICAqL1xuICB2ZXJkaWN0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gQ0xFQVI7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy52ZXJkaWN0T2ZLZXkocGF0aFswXSk7XG4gICAgbGV0IGRvdHRlZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgZG90dGVkID0gaSA9PT0gMCA/IHBhdGhbMF0gOiBgJHtkb3R0ZWR9LiR7cGF0aFtpXX1gO1xuICAgICAgaWYgKHRoaXMuaXNLZXlSZWRhY3RlZChkb3R0ZWQpKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXk6IGRvdHRlZCB9O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkc09mKHBhdGhbMF0pO1xuICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IHBhdGhbMF0sIHBhdGhzOiBmaWVsZHMgfTtcbiAgICBjb25zdCByZWwgPSBwYXRoLnNsaWNlKDEpLmpvaW4oJy4nKTtcbiAgICBjb25zdCBpbnNpZGU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIC8vIFRoZSB3cml0dGVuIHBhdGggSVMgYSBzZWNyZXQgZmllbGQ6IHRoZSB3aG9sZSB2YWx1ZSBpcyBzZWNyZXQsIGFuZFxuICAgICAgLy8gdGhlIGtleSB0aGF0IGRlY2lkZWQgaXQgaXMgdGhhdCBkb3R0ZWQgcGF0aCDigJQgbmV2ZXIgdGhlIHRvcCBrZXksXG4gICAgICAvLyB3aG9zZSBzaWJsaW5ncyBzdGF5IGNsZWFyLlxuICAgICAgaWYgKGZpZWxkID09PSByZWwpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgICBpZiAoZmllbGQuc3RhcnRzV2l0aChgJHtyZWx9LmApKSBpbnNpZGUucHVzaChmaWVsZC5zbGljZShyZWwubGVuZ3RoICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zaWRlLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IHBhdGhbMF0sIHBhdGhzOiBpbnNpZGUgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJkaWN0IGZvciBga2V5YCB3cml0dGVuIG9yIHJlYWQgdW5kZXIgYHBhdGhgIOKAlCB0aGUgY29tbW9uXG4gICAqIHNpbmdsZS1zZWdtZW50IGNhc2UgKGBwYXRoYCBlbXB0eTogZXZlcnkgZmFjYWRlIHdyaXRlIGFuZCByZWFkKSBkZWNpZGVzXG4gICAqIG9uIHRoZSBrZXkgc3RyaW5nIGFsb25lLCBubyBhcnJheSBhbGxvY2F0ZWQuXG4gICAqL1xuICB2ZXJkaWN0QXQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIGtleTogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHBhdGgubGVuZ3RoID09PSAwID8gdGhpcy52ZXJkaWN0T2ZLZXkoa2V5KSA6IHRoaXMudmVyZGljdChbLi4ucGF0aCwga2V5XSk7XG4gIH1cblxuICAvKiogVGhlIHNpbmdsZS1zZWdtZW50IHZlcmRpY3Q6IGtleS1sZXZlbCBoaXQg4oaSIHdob2xlOyBkZWNsYXJlZCBvciBpbmhlcml0ZWQgZmllbGRzIOKGkiBmaWVsZHMuICovXG4gIHByaXZhdGUgdmVyZGljdE9mS2V5KGtleTogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKHRoaXMuaXNLZXlSZWRhY3RlZChrZXkpKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXkgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkc09mKGtleSk7XG4gICAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIGZpZWxkcy5sZW5ndGggPiAwID8geyBraW5kOiAnZmllbGRzJywga2V5LCBwYXRoczogZmllbGRzIH0gOiBDTEVBUjtcbiAgfVxuXG4gIC8qKiBUaGUgc2VjcmV0IGZpZWxkcyBvZiBhIHRvcCBrZXk6IHRoZSBwb2xpY3kncywgcGx1cyBhbnkgYSBtYXBwZXIgaGFuZGVkIGl0ICh7QGxpbmsgTWFwcGVyVGFpbnR9KS4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNPZihrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWNsYXJlZCA9IHRoaXMucG9saWN5Py5maWVsZHM/LltrZXldO1xuICAgIGNvbnN0IGluaGVyaXRlZCA9IHRoaXMuaW5oZXJpdGVkPy5nZXQoa2V5KTtcbiAgICBpZiAoaW5oZXJpdGVkID09PSB1bmRlZmluZWQpIHJldHVybiBkZWNsYXJlZDtcbiAgICByZXR1cm4gZGVjbGFyZWQgPT09IHVuZGVmaW5lZCA/IGluaGVyaXRlZCA6IFsuLi5uZXcgU2V0KFsuLi5kZWNsYXJlZCwgLi4uaW5oZXJpdGVkXSldO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydW4ncyBtYXJrcyBhbmQgdGhlIGZpZWxkcyBtYXBwZXJzIGhhbmRlZCB0byBuZXcga2V5cywgYXMgTkFNRVMg4oCUIHdoYXRcbiAgICogYSBwYXVzZSBjYXJyaWVzIHRvIHRoZSByZXN1bWVkIHJ1biAoYEZsb3djaGFydENoZWNrcG9pbnQucmVkYWN0aW9uTWFya3NgKS5cbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAobm8gcG9saWN5LCBubyBwZXItY2FsbCBtYXJrKS5cbiAgICovXG4gIG1hcmtzRm9yQ2hlY2twb2ludCgpOiBSZWRhY3Rpb25NYXJrcyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMubWFya2VkLnNpemUgPT09IDAgJiYgdGhpcy5pbmhlcml0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAga2V5czogWy4uLnRoaXMubWFya2VkXSxcbiAgICAgIC4uLih0aGlzLmluaGVyaXRlZCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgZmllbGRzOiBPYmplY3QuZnJvbUVudHJpZXMoWy4uLnRoaXMuaW5oZXJpdGVkXS5tYXAoKFtrZXksIHBhdGhzXSkgPT4gW2tleSwgWy4uLnBhdGhzXV0pKSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogU2VlZCBhIHJlc3VtZWQgcnVuJ3MgcnVsZSB3aXRoIHRoZSBtYXJrcyBpdHMgcGF1c2UgY2FycmllZCAoe0BsaW5rIG1hcmtzRm9yQ2hlY2twb2ludH0pLiAqL1xuICByZXN0b3JlTWFya3MobWFya3M6IFJlZGFjdGlvbk1hcmtzKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbWFya3Mua2V5cykgdGhpcy5tYXJrZWQuYWRkKGtleSk7XG4gICAgZm9yIChjb25zdCBba2V5LCBwYXRoc10gb2YgT2JqZWN0LmVudHJpZXMobWFya3MuZmllbGRzID8/IHt9KSkgdGhpcy5pbmhlcml0RmllbGRzKGtleSwgcGF0aHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3ViZmxvdyBtYXBwZXIncyBjb3B5IGluaGVyaXRzIHRoZSBmaWVsZHMgb2YgdGhlIHZhbHVlIGl0IGNvcGllZDpcbiAgICogYHRhcmdldGAgaXMgYSBrZXkgdGhlIG1hcHBlciB3cm90ZTsgYHBhdGhzYCB0aGUgc291cmNlIGtleSdzIGZpZWxkIHBhdGhzXG4gICAqIChkZWNsYXJlZCBvciB0aGVtc2VsdmVzIGluaGVyaXRlZCkuIFJ1bi13aWRlLCBieSBuYW1lLCBsaWtlIGEgbWFyay5cbiAgICovXG4gIGluaGVyaXRGaWVsZHModGFyZ2V0OiBzdHJpbmcsIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHByaW9yID0gdGhpcy5pbmhlcml0ZWQ/LmdldCh0YXJnZXQpID8/IFtdO1xuICAgICh0aGlzLmluaGVyaXRlZCA/Pz0gbmV3IE1hcCgpKS5zZXQodGFyZ2V0LCBbLi4ubmV3IFNldChbLi4ucHJpb3IsIC4uLnBhdGhzXSldKTtcbiAgfVxuXG4gIC8qKiBUaGUgdmVyZGljdCBvZiBhIGtleSBhIG1hcHBlciByZWFkIOKAlCBgcnVuc2AgKHRoZSBydW4gbmFtZXNwYWNlcykgaXMgc2VsZWN0ZWQgd2hlbiBhbnkgbmFtZXNwYWNlZCBrZXkgaXMuICovXG4gIHZlcmRpY3RPZlJlYWQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMudmVyZGljdE9mS2V5KGtleSk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCBrZXkgIT09ICdydW5zJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmVyZGljdDtcbiAgICBmb3IgKGNvbnN0IHNwYWNlIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICBpZiAoc3BhY2UgPT09IG51bGwgfHwgdHlwZW9mIHNwYWNlICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGlubmVyIG9mIE9iamVjdC5rZXlzKHNwYWNlKSkge1xuICAgICAgICBpZiAodGhpcy52ZXJkaWN0T2ZLZXkoaW5uZXIpLmtpbmQgIT09ICdjbGVhcicpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgLyBzZXJ2ZWQgZm9ybSBvZiBhIHZhbHVlIGF0IGEgcGF0aDogdGhlIHBsYWNlaG9sZGVyLCBhXG4gICAqIHNjcnViYmVkIENMT05FLCBvciB0aGUgdmFsdWUgaXRzZWxmIChzYW1lIHJlZmVyZW5jZSDigJQgcmVjb3JkZXJzIHJlY2VpdmVcbiAgICogYm9ycm93ZWQgbGl2ZSByZWZlcmVuY2VzIGZvciBjbGVhciB2YWx1ZXMsIGFzIHRoZXkgYWx3YXlzIGhhdmUpLlxuICAgKiBgcGxhY2Vob2xkZXJgIGRlZmF1bHRzIHRvIHRoZSBzY29wZS10aWVyIGAnW1JFREFDVEVEXSdgOyB0aGUgbWlycm9yIHNlZWRcbiAgICogcGFzc2VzIHRoZSBsb2cncyBgJ1JFREFDVEVEJ2AuXG4gICAqL1xuICByZXRhaW4ocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duLCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiB1bmtub3duIHtcbiAgICByZXR1cm4gUmVkYWN0aW9uUnVsZS5hcHBseSh0aGlzLnZlcmRpY3QocGF0aCksIHZhbHVlLCBwbGFjZWhvbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSBTVEFURSByZWNvcmQgKHN0YXRlIHJlYWQsIG1pcnJvciBzZWVkKTogZWFjaCBvd25cbiAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5IHRocm91Z2gge0BsaW5rIHJldGFpbn0uIEZpZWxkcyBhcmUgcGF0aHMgaW5zaWRlIHRoYXRcbiAgICoga2V5ZWQgdmFsdWUuIFNjYWxhcnMgYW5kIHJvb3QgYXJyYXlzIHBhc3MgdGhyb3VnaC4gQm91bmRhcnkgcmVjb3JkcyBhZGRcbiAgICogdGhlIG5lc3RlZC1rZXkgd2Fsazoge0BsaW5rIHJldGFpbkJvdW5kYXJ5fS5cbiAgICogUmV0dXJucyB0aGUgU0FNRSBvYmplY3Qgd2hlbiB1bmNoYW5nZWQuIEFuIGluZXJ0IHJ1bGUgZG9lcyBub3QgZW51bWVyYXRlXG4gICAqIHRoZSB2YWx1ZSwgc28gZXZlbiBhbiBhY2Nlc3NvciBpcyB1bnRvdWNoZWQgb24gdGhlIG5vLXBvbGljeSBmYXN0IHBhdGguXG4gICAqL1xuICByZXRhaW5SZWNvcmQ8VD4ocmVjb3JkOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgcmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVjb3JkKSkgcmV0dXJuIHJlY29yZDtcbiAgICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICBjb25zdCBrZXB0ID0gdGhpcy5yZXRhaW4oW2tleV0sIHZhbHVlLCBwbGFjZWhvbGRlcik7XG4gICAgICBpZiAoa2VwdCA9PT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgb3V0ID8/PSB7IC4uLihyZWNvcmQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgICBvdXRba2V5XSA9IGtlcHQ7XG4gICAgfVxuICAgIHJldHVybiAob3V0ID8/IHJlY29yZCkgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIEJPVU5EQVJZIHJlY29yZCDigJQgcm9vdCBpbnB1dC9vdXRwdXQgYW5kIGEgc3ViZmxvdydzXG4gICAqIG1hcHBlZCBzZWVkLCBiZWZvcmUgYW55IG9ic2VydmVyIHNlZXMgaXQuIHtAbGluayByZXRhaW5SZWNvcmR9IGRlY2lkZXMgZWFjaFxuICAgKiB0b3Aga2V5OyB0aGVuIGV2ZXJ5IE5FU1RFRCBvd24ga2V5IGlzIGEga2V5IHRvbzogc2VjcmV0IHdoZW4gaXRzIG93biBuYW1lXG4gICAqIG9yIGl0cyBkb3R0ZWQgcGF0aCBpcyByZWRhY3RlZCBhdCBrZXkgbGV2ZWwgKGBrZXlzOiBbJ3NlY3JldCddYCBjb3ZlcnNcbiAgICogYHsgd3JhcHBlcjogeyBzZWNyZXQgfSB9YDsgYSByb290IGFycmF5J3MgZWxlbWVudHMgYXJlIHdhbGtlZCB0aGUgc2FtZVxuICAgKiB3YXkpLCBhbmQgaXRzIGRlY2xhcmVkIGBmaWVsZHNgIHNjcnViYmVkIGluc2lkZSBpdCAoYGZpZWxkczogeyBwcm9maWxlOlxuICAgKiBbJ3Rva2VuJ10gfWAgY292ZXJzIGB7IHdyYXBwZXI6IHsgcHJvZmlsZTogeyB0b2tlbiB9IH0gfWApLiBEZWNpZGVkIHBlclxuICAgKiBQQVRILCBjb3B5LW9uLXdyaXRlIHBlciBwYXRoICh7QGxpbmsgc2VydmVkQnlQYXRofSk6IGFuIG9iamVjdCBzaGFyZWQgYnlcbiAgICogdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgb25lIGEgcGF0aCBydWxlIG5hbWVzIGFuZCBzZXJ2ZWQgYXMgaXQgaXMgYXRcbiAgICogdGhlIG90aGVyOyBhIGN5Y2xlIGVkZ2UgbGFuZHMgb24gdGhlIHNlcnZlZCBjb3B5LCBuZXZlciBvbiBhbiB1bnNjcnViYmVkXG4gICAqIG9yaWdpbmFsOyB0aGUgbGl2ZSB2YWx1ZSBpcyBuZXZlciB0b3VjaGVkLiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCB3aGVuXG4gICAqIG5vdGhpbmcgbmVzdGVkIGlzIHNlY3JldCwgYW5kIGFuIGluZXJ0IHJ1bGUgZW51bWVyYXRlcyBub3RoaW5nLiBTdGF0ZVxuICAgKiBrZWVwcyBpdHMgb3duIHBhdGggdmVyZGljdHMgKHtAbGluayB2ZXJkaWN0fSk7IHRoaXMgd2FsayBpcyBmb3IgcmVjb3Jkc1xuICAgKiBoYW5kZWQgb3V0IHdob2xlLlxuICAgKi9cbiAgcmV0YWluQm91bmRhcnk8VD4ocmVjb3JkOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICAvLyBBIG1hc2tlZCBzdGFnZSBlcnJvciBpbnNpZGUgdGhlIHJlY29yZCAoYSBmb3JrIGVudmVsb3BlJ3MgYHJlc3VsdGApIGlzXG4gICAgLy8gc2VydmVkIGluIGl0cyBtYXNrZWQgZm9ybTogYW4gRXJyb3IncyBtZXNzYWdlIGlzIG5vbi1lbnVtZXJhYmxlIGFuZCBhXG4gICAgLy8gdGhyb3duIHN0cmluZyBpcyBhIHBsYWluIHZhbHVlLCBzbyBubyBrZXkgd2FsayBzZWVzIGVpdGhlci5cbiAgICBjb25zdCBzZXJ2ZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uc2l6ZSA/ICh0aGlzLndpdGhTZXJ2ZWRFcnJvcnMocmVjb3JkKSBhcyBUKSA6IHJlY29yZDtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgc2VydmVkID09PSBudWxsIHx8IHR5cGVvZiBzZXJ2ZWQgIT09ICdvYmplY3QnKSByZXR1cm4gc2VydmVkO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMucmV0YWluUmVjb3JkKHNlcnZlZCwgcGxhY2Vob2xkZXIpIGFzIHVua25vd24gYXMgb2JqZWN0O1xuICAgIC8vIEJlbG93IHRoZSB0b3Aga2V5cywgb25lIGRlY2lzaW9uIHBlciBQQVRIICh0aGUgd2hvbGUgcmVjb3JkIGlzIHRoZSB3YWxrJ3Mgcm9vdCwgc28gYSBjeWNsZVxuICAgIC8vIGJhY2sgdG8gaXQgbGFuZHMgb24gdGhlIHNlcnZlZCBjb3B5KS5cbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKHRvcCwgdW5kZWZpbmVkLCB0aGlzLmRvdHRlZFRhcmdldHModW5kZWZpbmVkKSwgdGhpcy5uYW1lc1dhbGsodHJ1ZSksIHBsYWNlaG9sZGVyKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHktb24td3JpdGUgb3ZlciBjb250YWluZXJzOiBldmVyeSByZW1lbWJlcmVkIG1hc2tlZCBlcnJvciBiZWNvbWVzIGl0c1xuICAgKiBzZXJ2ZWQgZm9ybSDigJQgYW4gb2JqZWN0IGVycm9yIGl0cyBtYXNrZWQgc3RydWN0dXJlZCBpbmZvLCBhIHRocm93blxuICAgKiBzdHJpbmcvbnVtYmVyIGl0cyBtYXNrZWQgdGV4dCAodGhlIHZhbHVlIGtlZXBzIGJlaW5nIGEgc2NhbGFyKS4gQSBzY2FsYXIgaXNcbiAgICogbWF0Y2hlZCBieSBWQUxVRSwgc28gYW4gdW5yZWxhdGVkIGZpZWxkIHRoYXQgaGFwcGVucyB0byBlcXVhbCBhIG1hc2tlZFxuICAgKiB0aHJvd24gc3RyaW5nIGlzIG1hc2tlZCB0b286IG92ZXItbWFza2luZyBpcyB0aGUgc2FmZSBkaXJlY3Rpb24uXG4gICAqIGB1bmRlZmluZWRgL2BudWxsYC9ib29sZWFucyBhcmUgbmV2ZXIgc3dhcHBlZCDigJQgdGhleSBjYXJyeSBubyB0ZXh0LCBhbmRcbiAgICogc3dhcHBpbmcgdGhlbSB3b3VsZCByZXdyaXRlIG9yZGluYXJ5IGRhdGEgc2hhcGVzLlxuICAgKlxuICAgKiBDWUNMRS1TQUZFIChyZXZpZXcgZmluZGluZyAyKS4gVGhlIGNvbnRhaW5lcnMgdGhhdCBjYW4gUkVBQ0ggYSBtYXNrZWRcbiAgICogZXJyb3IgYXJlIGZvdW5kIGZpcnN0ICh7QGxpbmsgcmVhY2hpbmdNYXNrZWRFcnJvcnN9IOKAlCB0aGUgd2hvbGUgcmVhY2hhYmxlXG4gICAqIGdyYXBoLCBjeWNsZXMgaW5jbHVkZWQpOyBlYWNoIG9mIHRoZW0gaXMgY29waWVkLCBpdHMgY29weSBhbGxvY2F0ZWQgYW5kXG4gICAqIHJlbWVtYmVyZWQgQkVGT1JFIGl0cyBjaGlsZHJlbiBhcmUgZmlsbGVkLCBzbyBhbiBlZGdlIGJhY2sgdG8gaXQg4oCUIGEgY3ljbGVcbiAgICog4oCUIGxhbmRzIG9uIHRoZSBjb3B5LCBuZXZlciBvbiB0aGUgb3JpZ2luYWwgdGhhdCBzdGlsbCBob2xkcyB0aGUgcmF3IGVycm9yLlxuICAgKiBFdmVyeSBvdGhlciBjb250YWluZXIga2VlcHMgaXRzIGlkZW50aXR5LlxuICAgKi9cbiAgcHJpdmF0ZSB3aXRoU2VydmVkRXJyb3JzKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgbGVhZiA9IHRoaXMuc2VydmVkTGVhZih2YWx1ZSk7XG4gICAgaWYgKGxlYWYgIT09IEtFRVAgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGxlYWYgPT09IEtFRVAgPyB2YWx1ZSA6IGxlYWY7XG4gICAgY29uc3QgcmVhY2hpbmcgPSB0aGlzLnJlYWNoaW5nTWFza2VkRXJyb3JzKHZhbHVlKTtcbiAgICBpZiAoIXJlYWNoaW5nLmhhcyh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBjb3BpZXMgPSBuZXcgTWFwPG9iamVjdCwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gICAgY29uc3QgY29weU9mID0gKG5vZGU6IG9iamVjdCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IGtub3duID0gY29waWVzLmdldChub2RlKTtcbiAgICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4ga25vd247XG4gICAgICBjb25zdCBjb3B5ID0gKEFycmF5LmlzQXJyYXkobm9kZSkgPyBub2RlLnNsaWNlKCkgOiB7IC4uLm5vZGUgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb3BpZXMuc2V0KG5vZGUsIGNvcHkpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gdGhpcy5zZXJ2ZWRMZWFmKGNoaWxkKTtcbiAgICAgICAgaWYgKHNlcnZlZCAhPT0gS0VFUCkgY29weVtrZXldID0gc2VydmVkO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmIHJlYWNoaW5nLmhhcyhjaGlsZCkpIGNvcHlba2V5XSA9IGNvcHlPZihjaGlsZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29weTtcbiAgICB9O1xuICAgIHJldHVybiBjb3B5T2YodmFsdWUpO1xuICB9XG5cbiAgLyoqIEEgbWFza2VkIGVycm9yJ3Mgc2VydmVkIGZvcm0g4oCUIGBLRUVQYCBmb3IgYW55dGhpbmcgZWxzZSAoYSBzY2FsYXIgbmV2ZXIgc3dhcHBlZCwgYSBjb250YWluZXIpLiAqL1xuICBwcml2YXRlIHNlcnZlZExlYWYodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIEtFRVA7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3JzPy5nZXQodmFsdWUpO1xuICAgICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBLRUVQO1xuICAgIH1cbiAgICBjb25zdCBzd2FwcGFibGUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JztcbiAgICBjb25zdCBtYXNrZWQgPSBzd2FwcGFibGUgPyB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWFza2VkID8gbWFza2VkLm1lc3NhZ2UgOiBLRUVQO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbnRhaW5lciB1bmRlciBgcm9vdGAgKGl0c2VsZiBpbmNsdWRlZCkgZnJvbSB3aGljaCBzb21lIHBhdGggcmVhY2hlcyBhIG1hc2tlZCBlcnJvci4gKi9cbiAgcHJpdmF0ZSByZWFjaGluZ01hc2tlZEVycm9ycyhyb290OiBvYmplY3QpOiBTZXQ8b2JqZWN0PiB7XG4gICAgY29uc3QgcGFyZW50cyA9IG5ldyBNYXA8b2JqZWN0LCBvYmplY3RbXT4oKTtcbiAgICBjb25zdCBob2xkZXJzOiBvYmplY3RbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG9iamVjdD4oW3Jvb3RdKTtcbiAgICBjb25zdCBzdGFjazogb2JqZWN0W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXMobm9kZSkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VydmVkTGVhZihjaGlsZCkgIT09IEtFRVApIHtcbiAgICAgICAgICBob2xkZXJzLnB1c2gobm9kZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvZiA9IHBhcmVudHMuZ2V0KGNoaWxkKTtcbiAgICAgICAgaWYgKG9mID09PSB1bmRlZmluZWQpIHBhcmVudHMuc2V0KGNoaWxkLCBbbm9kZV0pO1xuICAgICAgICBlbHNlIG9mLnB1c2gobm9kZSk7XG4gICAgICAgIGlmICghc2Vlbi5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgc2Vlbi5hZGQoY2hpbGQpO1xuICAgICAgICAgIHN0YWNrLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlYWNoaW5nID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gICAgd2hpbGUgKGhvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IGhvbGRlcnMucG9wKCkhO1xuICAgICAgaWYgKHJlYWNoaW5nLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICByZWFjaGluZy5hZGQobm9kZSk7XG4gICAgICBob2xkZXJzLnB1c2goLi4uKHBhcmVudHMuZ2V0KG5vZGUpID8/IFtdKSk7XG4gICAgfVxuICAgIHJldHVybiByZWFjaGluZztcbiAgfVxuXG4gIC8qKiBEb2VzIGB2YWx1ZWAgaG9sZCBvbmUgb2YgYHBhdGhzYCDigJQgYW4gb3duIGtleSBvZiB0aGF0IG5hbWUsIG9yIGEgZG90dGVkIHBhdGggaW5zaWRlIGl0PyAqL1xuICBzdGF0aWMgaG9sZHNQYXRocyh2YWx1ZTogb2JqZWN0LCBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAocGF0aHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgcGF0aCkgfHwgKHBhdGguaW5jbHVkZXMoJy4nKSAmJiBuYXRpdmVIYXModmFsdWUsIHBhdGgpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgd2hvbGUgU1RBVEUg4oCUIHtAbGluayByZXRhaW5SZWNvcmR9IG92ZXIgdGhlIHJvb3RcbiAgICoga2V5cyBBTkQgb3ZlciBldmVyeSBydW4gbmFtZXNwYWNlIHVuZGVyIGBydW5zYCAoZm9yayBjaGlsZHJlbiB3cml0ZVxuICAgKiB0aGVyZTsgYSBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYCBjYXJyaWVzIGl0IGJhY2sgYXMgYSBzZWVkKS4gVGhpcyBpc1xuICAgKiB3aGF0IHNlZWRzIHRoZSByZWRhY3RlZCBtaXJyb3I6IHRoZSBzdG9yZSdzIHN0YXJ0aW5nIHN0YXRlLCBzY3J1YmJlZFxuICAgKiB3aXRoIHRoZSBsb2cncyBwbGFjZWhvbGRlciwgc28gYSBwb2xpY3kga2V5IHRoYXQgYXJyaXZlcyBieSBzZWVkIGFuZCBpc1xuICAgKiBuZXZlciByZS13cml0dGVuIGlzIHN0aWxsIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gICAqL1xuICByZXRhaW5TdGF0ZTxUPihzdGF0ZTogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMucmV0YWluUmVjb3JkKHN0YXRlLCBwbGFjZWhvbGRlcik7XG4gICAgaWYgKGtlcHQgPT09IG51bGwgfHwgdHlwZW9mIGtlcHQgIT09ICdvYmplY3QnKSByZXR1cm4ga2VwdDtcbiAgICBjb25zdCBydW5zID0gKGtlcHQgYXMgeyBydW5zPzogdW5rbm93biB9KS5ydW5zO1xuICAgIGlmIChydW5zID09PSBudWxsIHx8IHR5cGVvZiBydW5zICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJ1bnMpKSByZXR1cm4ga2VwdDtcbiAgICBsZXQgc2NydWJiZWRSdW5zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtydW5JZCwgcmVjb3JkXSBvZiBPYmplY3QuZW50cmllcyhydW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3Qga2VwdFJ1biA9IHRoaXMucmV0YWluUmVjb3JkKHJlY29yZCwgcGxhY2Vob2xkZXIpO1xuICAgICAgaWYgKGtlcHRSdW4gPT09IHJlY29yZCkgY29udGludWU7XG4gICAgICBzY3J1YmJlZFJ1bnMgPz89IHsgLi4uKHJ1bnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgICBzY3J1YmJlZFJ1bnNbcnVuSWRdID0ga2VwdFJ1bjtcbiAgICB9XG4gICAgcmV0dXJuIHNjcnViYmVkUnVucyA9PT0gdW5kZWZpbmVkID8ga2VwdCA6ICh7IC4uLihrZXB0IGFzIG9iamVjdCksIHJ1bnM6IHNjcnViYmVkUnVucyB9IGFzIFQpO1xuICB9XG5cbiAgLyoqIEFwcGx5IGEgdmVyZGljdCB0byBhIHZhbHVlIOKAlCBzZWUge0BsaW5rIHJldGFpbn0uICovXG4gIHN0YXRpYyBhcHBseSh2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LCB2YWx1ZTogdW5rbm93biwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSByZXR1cm4gUmVkYWN0aW9uUnVsZS5zY3J1YkZpZWxkcyh2YWx1ZSwgdmVyZGljdC5wYXRocywgcGxhY2Vob2xkZXIpID8/IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGRlZXAgY2xvbmUgb2YgYHZhbHVlYCB3aXRoIHRoZSBnaXZlbiBkb3QtcGF0aHMgcmVwbGFjZWQgYnkgdGhlXG4gICAqIHBsYWNlaG9sZGVyIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGB2YWx1ZWAgaXMgbm90IGFuIG9iamVjdCAodGhlcmUgaXMgbm90aGluZ1xuICAgKiB0byBzY3J1YiBpbiBhIHNjYWxhcjsgdGhlIGNhbGxlciBrZWVwcyB0aGUgdmFsdWUpLiBUaGUgY2xvbmUgcmVmdXNlcyBhblxuICAgKiB1bmNsb25lYWJsZSB2YWx1ZS4gQSBwYXRoIG5hbWVzIGEgbGl0ZXJhbCBrZXkgKGAnYS5iJ2AgYXMgb25lIHByb3BlcnR5KVxuICAgKiBhbmQsIHdoZW4gZG90dGVkLCB0aGUgbmVzdGVkIHBhdGg7IGVhY2ggaXMgc2NydWJiZWQgd2hlcmUgaXQgZXhpc3RzLCBwZXJcbiAgICogUEFUSCDigJQgYSBub2RlIHRoZSBjbG9uZSBzaGFyZXMgYmV0d2VlbiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBuYW1lZFxuICAgKiBvbmUgb25seSAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pLiBQYXRocyB0aGF0IGRvIG5vdCBleGlzdCBhcmUgaWdub3JlZCDigJRcbiAgICogc2NydWJiaW5nIG5ldmVyIGludmVudHMgYSBmaWVsZC5cbiAgICovXG4gIHN0YXRpYyBzY3J1YkZpZWxkcyhcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIGNsb25lIGRldGFjaGVzIHRoZSByZXRhaW5lZCB2YWx1ZSAoYW5kIHJlZnVzZXMgYW4gdW5jbG9uZWFibGUgb25lKTsgdGhlIHNjcnViIG9uIGl0IGlzXG4gICAgLy8gZGVjaWRlZCBwZXIgUEFUSCwgc28gYSBub2RlIHRoZSBjbG9uZSBzaGFyZXMgYmV0d2VlbiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBuYW1lZCBvbmUgb25seS5cbiAgICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKHZhbHVlKSBhcyBvYmplY3Q7XG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aChcbiAgICAgIGNvcHksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YXJnZXRzT2YocGF0aHMpLFxuICAgICAgeyByb290RGVjaWRlZDogZmFsc2UsIG1lbW86IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+KCksIGJ1ZGdldDogd2Fsa0xpbWl0IH0sXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICApIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgcmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb2xpY3k/LmZpZWxkcyA/PyB7fSkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9uc1trZXldID0gWy4uLmZpZWxkc107XG4gICAgfVxuICAgIC8vIEZpZWxkcyBhIG1hcHBlciBoYW5kZWQgdG8gYSBuZXcga2V5IGFyZSBzY3J1YmJlZCB1bmRlciB0aGF0IGtleSB0b28uXG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIHRoaXMuaW5oZXJpdGVkID8/IFtdKSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnNba2V5XSA9IFsuLi5uZXcgU2V0KFsuLi4oZmllbGRSZWRhY3Rpb25zW2tleV0gPz8gW10pLCAuLi5maWVsZHNdKV07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLm1hcmtlZF0sXG4gICAgICBmaWVsZFJlZGFjdGlvbnMsXG4gICAgICBwYXR0ZXJuczogKHRoaXMucG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgVGhlIHBhdGggd2FsayDigJQgb25lIGRlY2lzaW9uIHBlciBQQVRIIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIEEgcnVsZSB0aGF0IG5hbWVzIGEgUEFUSCAoYSBkb3R0ZWQga2V5LCBhIHBhdHRlcm4sIGEgZmllbGQpIG11c3QgYmUgZXhhY3Rcbi8vIGV2ZW4gd2hlbiBvbmUgb2JqZWN0IGlzIHJlYWNoYWJsZSBhdCB0d28gcGF0aHM6IHRoZSBkZWNpc2lvbiBpcyBtYWRlIHBlclxuLy8gcGF0aCwgbmV2ZXIgcGVyIG9iamVjdCwgYW5kIGEgY29weSBpcyBtYWRlIHBlciBwYXRoIChjb3B5LW9uLXdyaXRlKSDigJQgbmV2ZXJcbi8vIGEgc2NydWIgaW4gcGxhY2Ugb24gYSBub2RlIGFub3RoZXIgcGF0aCBzdGlsbCBzaG93cy4gQSBrZXktTkFNRSBydWxlIGlzIHRoZVxuLy8gc2FtZSBhdCBldmVyeSBwYXRoLCBzbyBhIHNoYXJlZCBub2RlIGl0IG1hc2tzIGlzIG1hc2tlZCBldmVyeXdoZXJlIOKAlCB0aGVcbi8vIHNhZmUgc2lkZS4gQSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZDogaXQgaXMgcG9pbnRlZCBhdCB0aGUgYW5jZXN0b3Inc1xuLy8gc2VydmVkIGNvcHkuXG4vL1xuLy8gTElORUFSIE9OIEEgREFHLiBEb3R0ZWQga2V5cyBhbmQgbWFya3MgYXJlIHdhbGtlZCBhcyBUQVJHRVRTIChwYXRoLXJlbGF0aXZlXG4vLyBzdGF0ZSwgbGlrZSBmaWVsZHMpLCBhbmQgYSBwYXR0ZXJuIHRoYXQgY2FuIG9ubHkgbWF0Y2ggd2l0aGluIGEga2V5IE5BTUVcbi8vICh7QGxpbmsgbmVlZHNQYXRofSDigJQgdGhlIGNvbW1vbiBjYXNlLCBgL3Bhc3N3b3JkL2lgKSBpcyBkZWNpZGVkIGJ5IHRoZSBuYW1lLFxuLy8gc28gYSBkZWNpc2lvbiBkZXBlbmRzIG9ubHkgb24gdGhlIG9iamVjdCBhbmQgdGhlIHRhcmdldHMgc3RpbGwgbGl2ZSBhdCBpdCDigJRcbi8vIG1lbW9pemVkIHBlciAob2JqZWN0LCB0YXJnZXRzKTogYW4gb2JqZWN0IHNoYXJlZCBieSBtYW55IHBhdGhzIChhbiBhZ2VudCdzXG4vLyBsaW5rZWQgaGlzdG9yeSkgaXMgZGVjaWRlZCBvbmNlLCBhbmQgaXRzIHNlcnZlZCBjb3B5IGlzIHNoYXJlZCB0b28uIE9ubHkgYVxuLy8gZ2VudWluZWx5IFBBVEgtZGVwZW5kZW50IHBhdHRlcm4gKGAvXmFcXC5iJC9gKSB3YWxrcyBwYXRoczsgcGFzdFxuLy8ge0BsaW5rIFdBTEtfTElNSVR9IHBhdGggdmlzaXRzIHN1Y2ggYSB3YWxrIHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhc1xuLy8gdGhlIHBsYWNlaG9sZGVyICh0aGUgc2FmZSBzaWRlKSwgd2FybnMgb25jZSBpbiBkZXYgbW9kZSwgYW5kIG5ldmVyIGZhaWxzLlxuXG4vKiogQSBmaWVsZCBzdGlsbCB0byByZWFjaCBiZWxvdyBhIG5vZGU6IHRoZSBwYXRoIHNlZ21lbnRzIGxlZnQgdG8gd2Fsay4gKi9cbnR5cGUgVGFyZ2V0ID0gcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKiBIb3cgYSB3YWxrIGRlY2lkZXMgYW4gZWRnZS4gKi9cbmludGVyZmFjZSBXYWxrIHtcbiAgLyoqIEtleS1sZXZlbCBydWxlcyBhdCBldmVyeSBuZXN0ZWQga2V5IOKAlCBhYnNlbnQgZm9yIGEgYmFyZSBmaWVsZCBzY3J1YiAodGFyZ2V0cyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbmFtZXM/OiB7XG4gICAgLyoqIFNlbGVjdGVkIHdob2xlIGF0IHRoaXMgbmVzdGVkIGtleSBieSBpdHMgb3duIE5BTUUgKG1hcmtzLCBrZXlzLCBwYXR0ZXJucykuICovXG4gICAgbWFza3MobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYnkgdGhlIGRvdHRlZCBQQVRIIOKAlCBwcmVzZW50IG9ubHkgdW5kZXIgcGF0dGVybnMgKGEgcGF0dGVybiBpcyB0ZXN0ZWQgb24gdGhlIHBhdGgpLiAqL1xuICAgIHBhdGhNYXNrcz8ocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogVGhlIGRlY2xhcmVkIGZpZWxkcyBiZWxvdyBhIGtleSBvZiB0aGlzIG5hbWUuICovXG4gICAgZmllbGRzKG5hbWU6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogVGhlIHJvb3QncyBvd24ga2V5cyB3ZXJlIGRlY2lkZWQgYnkgdGhlIGNhbGxlciAoYHJldGFpblJlY29yZGApOiB3YWxrIGJlbG93IHRoZW0gb25seS4gKi9cbiAgcmVhZG9ubHkgcm9vdERlY2lkZWQ6IGJvb2xlYW47XG4gIC8qKiBEZWNpc2lvbnMgc2hhcmVkIHBlciAob2JqZWN0LCB0YXJnZXRzKSDigJQgYWJzZW50IHdoZW4gYSBkZWNpc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXRoLiAqL1xuICByZWFkb25seSBtZW1vPzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFBhdGggdmlzaXRzIGxlZnQuICovXG4gIGJ1ZGdldDogbnVtYmVyO1xuICAvKiogVG9sZCBvbmNlIHdoZW4gdGhlIHdhbGsgcGFzc2VzIGl0cyBsaW1pdC4gKi9cbiAgcmVhZG9ubHkgb25MaW1pdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBUaGUgd2FsayBoYXMgcGFzc2VkIGl0cyBsaW1pdDogd2hhdCBpdCBoYXMgbm90IHZpc2l0ZWQgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgbGltaXRlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGF0aCB2aXNpdHMgb25lIHdhbGsgbWF5IG1ha2Ug4oCUIHJlYWNoYWJsZSBvbmx5IHVuZGVyIGEgUEFUSC1kZXBlbmRlbnRcbiAqIHBhdHRlcm4gb3ZlciBhIHZhbHVlIHdob3NlIHBhdGhzIG91dG51bWJlciBpdHMgb2JqZWN0cyAoYSBsaW5rZWQgaGlzdG9yeSwgYVxuICogREFHKTogZXZlcnkgb3RoZXIgd2FsayBzaGFyZXMgaXRzIGRlY2lzaW9ucyBwZXIgb2JqZWN0IGFuZCBzdGF5cyBsaW5lYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBXQUxLX0xJTUlUID0gMV8wMDBfMDAwO1xuXG4vKiogVGhlIGxpbWl0IHdhbGtzIHVzZToge0BsaW5rIFdBTEtfTElNSVR9LCB1bmxlc3MgYSB0ZXN0IGxvd2VyZWQgaXQgKHtAbGluayB1c2VXYWxrTGltaXR9KS4gKi9cbmxldCB3YWxrTGltaXQ6IG51bWJlciA9IFdBTEtfTElNSVQ7XG5cbi8qKlxuICogQGludGVybmFsIFRlc3RzIG9ubHkg4oCUIG5vdCBvbiBhbnkgcHVibGljIGRvb3I6IHdhbGtzIHVzZSBgbGltaXRgIHVudGlsIHRoZVxuICogcmV0dXJuZWQgcmVzdG9yZSBpcyBjYWxsZWQsIHNvIGEgdGVzdCByZWFjaGVzIHRoZSBvdmVyLWxpbWl0IHBhdGggaW4gYVxuICogdGhvdXNhbmQgdmlzaXRzIGluc3RlYWQgb2YgYSBtaWxsaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlV2Fsa0xpbWl0KGxpbWl0OiBudW1iZXIpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcHJpb3IgPSB3YWxrTGltaXQ7XG4gIHdhbGtMaW1pdCA9IGxpbWl0O1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHdhbGtMaW1pdCA9IHByaW9yO1xuICB9O1xufVxuXG4vKipcbiAqIENhbiBgcGF0dGVybmAgbWF0Y2ggYSBkb3R0ZWQgUEFUSCB3aGVyZSBpdCBtYXRjaGVzIG5vbmUgb2YgdGhlIHBhdGgnc1xuICogc2VnbWVudCBOQU1FUz8gT25seSB0aHJvdWdoIGEgY29uc3RydWN0IHRoYXQgY2FuIG1hdGNoIG9yIHRlc3QgdGhlIGAuYFxuICogYmV0d2VlbiBzZWdtZW50czogYC5gIGl0c2VsZiwgYW4gZXNjYXBlIHRoYXQgY2FuIHN0YW5kIGZvciBpdCAoYFxcVyBcXFMgXFxEXG4gKiBcXEIgXFxwIFxcUCBcXHUgXFx4IFxcY2AsIGEgZGlnaXQgZXNjYXBlKSwgYSBuZWdhdGVkIGNsYXNzLCBhIGNsYXNzIHJhbmdlIHRoYXRcbiAqIHNwYW5zIGAuYCwgYSBsb29rYXJvdW5kIG9yIGEgbmFtZWQgZ3JvdXAuIEFueXRoaW5nIGVsc2UgbWF0Y2hlcyBhIHBhdGggb25seVxuICogaW5zaWRlIG9uZSBzZWdtZW50IOKAlCBhbmQgYW4gYW5jZXN0b3Igd2hvc2UgTkFNRSBtYXRjaGVzIGlzIG1hc2tlZCB3aG9sZVxuICogYmVmb3JlIHRoZSB3YWxrIGdvZXMgYmVsb3cgaXQsIHNvIHRoZSBuYW1lIGRlY2lkZXMuIENvbnNlcnZhdGl2ZTogYHRydWVgXG4gKiB3aGVuZXZlciBpbiBkb3VidC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzUGF0aChwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlID0gcGF0dGVybi5zb3VyY2U7XG4gIGlmICgvXFwufFxcXFxbV1NEQnBQdXhjMC05XXxcXFtcXF58XFwoXFw/Wz0hPF0vLnRlc3Qoc291cmNlKSkgcmV0dXJuIHRydWU7XG4gIGZvciAoY29uc3QgWywgYm9keV0gb2Ygc291cmNlLm1hdGNoQWxsKC9cXFsoKD86XFxcXFtcXHNcXFNdfFteXFxdXFxcXF0pKilcXF0vZykpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxvdywgaGlnaF0gb2YgYm9keS5tYXRjaEFsbCgvKFxcXFw/W1xcc1xcU10pLShcXFxcP1tcXHNcXFNdKS9nKSkge1xuICAgICAgaWYgKGxvdy5sZW5ndGggPiAxIHx8IGhpZ2gubGVuZ3RoID4gMSB8fCAobG93IDw9ICcuJyAmJiBoaWdoID49ICcuJykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBgc2VydmVkTGVhZmAncyBhbnN3ZXIgZm9yIGEgdmFsdWUgaXQgbGVhdmVzIGFzIGl0IGlzLiAqL1xuY29uc3QgS0VFUDogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgna2VwdCBhcyBpdCBpcycpO1xuXG4vKiogRWFjaCBmaWVsZCBwYXRoIGFzIG9uZSBsaXRlcmFsIGtleSBhbmQsIHdoZW4gZG90dGVkLCBhcyBpdHMgc2VnbWVudHMuICovXG5mdW5jdGlvbiB0YXJnZXRzT2YocGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogVGFyZ2V0W10ge1xuICBjb25zdCBvdXQ6IFRhcmdldFtdID0gW107XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocyA/PyBbXSkge1xuICAgIG91dC5wdXNoKFtwYXRoXSk7XG4gICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkgb3V0LnB1c2gocGF0aC5zcGxpdCgnLicpKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogVGhlIG1lbW8ga2V5IG9mIGEgdGFyZ2V0IHN0YXRlIOKAlCBvcmRlci1mcmVlLiAqL1xuZnVuY3Rpb24gc2lnbmF0dXJlT2YodGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10pOiBzdHJpbmcge1xuICByZXR1cm4gdGFyZ2V0cy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiB0YXJnZXRzXG4gICAgICAgIC5tYXAoKHQpID0+IHQuam9pbignXFx1MDAxZicpKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5qb2luKCdcXHUwMDFlJyk7XG59XG5cbi8qKiBPbmUgZWRnZSdzIGRlY2lzaW9uOiB0aGUgdmFsdWUgdW5kZXIgYGtleWAgaXMgbWFza2VkIGhlcmUsIG9yIHRoZXNlIHRhcmdldHMgY29udGludWUgYmVsb3cgaXQuICovXG5mdW5jdGlvbiBkZWNpZGVFZGdlKFxuICBrZXk6IHN0cmluZyxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBkZXB0aDogbnVtYmVyLFxuKTogeyBtYXNrZWQ6IGJvb2xlYW47IGJlbG93OiBUYXJnZXRbXSB9IHtcbiAgY29uc3QgYmVsb3c6IFRhcmdldFtdID0gW107XG4gIGxldCBtYXNrZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgIGlmICh0YXJnZXRbMF0gIT09IGtleSkgY29udGludWU7XG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDEpIG1hc2tlZCA9IHRydWU7XG4gICAgZWxzZSBiZWxvdy5wdXNoKHRhcmdldC5zbGljZSgxKSk7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSB3YWxrLnJvb3REZWNpZGVkICYmIGRlcHRoID09PSAwID8gdW5kZWZpbmVkIDogd2Fsay5uYW1lcztcbiAgaWYgKG5hbWVzICE9PSB1bmRlZmluZWQgJiYgIW1hc2tlZCkge1xuICAgIG1hc2tlZCA9XG4gICAgICBuYW1lcy5tYXNrcyhrZXkpIHx8XG4gICAgICAobmFtZXMucGF0aE1hc2tzICE9PSB1bmRlZmluZWQgJiYgZG90dGVkICE9PSB1bmRlZmluZWQgJiYgbmFtZXMucGF0aE1hc2tzKGAke2RvdHRlZH0uJHtrZXl9YCkpO1xuICAgIGJlbG93LnB1c2goLi4udGFyZ2V0c09mKG5hbWVzLmZpZWxkcyhrZXkpKSk7XG4gIH1cbiAgcmV0dXJuIHsgbWFza2VkLCBiZWxvdyB9O1xufVxuXG4vKiogT25lIHN0ZXAgZG93biBhIHdhbGsncyBwYXRoOiBjb3VudCB0aGUgdmlzaXQg4oCUIGBmYWxzZWAgb25jZSB0aGUgd2FsayBpcyBwYXN0IGl0cyBsaW1pdC4gKi9cbmZ1bmN0aW9uIHZpc2l0KHdhbGs6IFdhbGspOiBib29sZWFuIHtcbiAgaWYgKC0td2Fsay5idWRnZXQgPj0gMCkgcmV0dXJuIHRydWU7XG4gIGlmICghd2Fsay5saW1pdGVkKSB7XG4gICAgd2Fsay5saW1pdGVkID0gdHJ1ZTtcbiAgICB3YWxrLm9uTGltaXQ/LigpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBJcyBhbnl0aGluZyBzZWxlY3RlZCBvbiBzb21lIFBBVEggdW5kZXIgYG5vZGVgPyBSZWFkLW9ubHk7IGEgY3ljbGUgZWRnZSBpc1xuICogbm90IGZvbGxvd2VkLiBgYmFja2AgaXMgdGhlIHNoYWxsb3dlc3QgYW5jZXN0b3IgYSBza2lwcGVkIGN5Y2xlIGVkZ2UgYmVsb3dcbiAqIHJlYWNoZWQg4oCUIGEgYGZhbHNlYCB0aGF0IHJlc3RzIG9uIG9uZSBpcyBub3Qgc2hhcmVkIChtZW1vKS5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0c0J5UGF0aChcbiAgbm9kZTogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIGFuY2VzdG9yczogTWFwPG9iamVjdCwgbnVtYmVyPixcbiAgZGVwdGg6IG51bWJlcixcbik6IHsgc2VsZWN0ZWQ6IGJvb2xlYW47IGJhY2s6IG51bWJlciB9IHtcbiAgLy8gUGFzdCB0aGUgbGltaXQ6IGFzc3VtZSBhIHNlbGVjdGlvbiDigJQgdGhlIGNvcHkgc2VydmVzIHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGFzIHRoZSBwbGFjZWhvbGRlci5cbiAgaWYgKCF2aXNpdCh3YWxrKSkgcmV0dXJuIHsgc2VsZWN0ZWQ6IHRydWUsIGJhY2s6IEluZmluaXR5IH07XG4gIGlmICh3YWxrLm5hbWVzID09PSB1bmRlZmluZWQgJiYgdGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybiB7IHNlbGVjdGVkOiBmYWxzZSwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3Qgc2lnID0gd2Fsay5tZW1vID8gc2lnbmF0dXJlT2YodGFyZ2V0cykgOiAnJztcbiAgY29uc3Qga25vd24gPSB3YWxrLm1lbW8/LmdldChub2RlKT8uZ2V0KGBzJHtzaWd9YCk7XG4gIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBzZWxlY3RlZDoga25vd24gYXMgYm9vbGVhbiwgYmFjazogSW5maW5pdHkgfTtcbiAgYW5jZXN0b3JzLnNldChub2RlLCBkZXB0aCk7XG4gIGxldCBiYWNrID0gSW5maW5pdHk7XG4gIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGNvbnN0IGVkZ2UgPSBkZWNpZGVFZGdlKGtleSwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBkZXB0aCk7XG4gICAgaWYgKGVkZ2UubWFza2VkKSB7XG4gICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGF0ID0gYW5jZXN0b3JzLmdldChjaGlsZCk7XG4gICAgaWYgKGF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBhdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRQYXRoID0gd2Fsay5uYW1lcz8ucGF0aE1hc2tzID8gKGRvdHRlZCA9PT0gdW5kZWZpbmVkID8ga2V5IDogYCR7ZG90dGVkfS4ke2tleX1gKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiZWxvdyA9IHNlbGVjdHNCeVBhdGgoY2hpbGQsIGNoaWxkUGF0aCA/PyBrZXksIGVkZ2UuYmVsb3csIHdhbGssIGFuY2VzdG9ycywgZGVwdGggKyAxKTtcbiAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYmVsb3cuYmFjayk7XG4gICAgaWYgKGJlbG93LnNlbGVjdGVkKSB7XG4gICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgYW5jZXN0b3JzLmRlbGV0ZShub2RlKTtcbiAgaWYgKHdhbGsubWVtbyAmJiAoc2VsZWN0ZWQgfHwgYmFjayA+PSBkZXB0aCkpIHJlbWVtYmVyKHdhbGsubWVtbywgbm9kZSwgYHMke3NpZ31gLCBzZWxlY3RlZCk7XG4gIHJldHVybiB7IHNlbGVjdGVkLCBiYWNrOiBiYWNrIDwgZGVwdGggPyBiYWNrIDogSW5maW5pdHkgfTtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXIobWVtbzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+Piwgbm9kZTogb2JqZWN0LCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgbGV0IGVudHJpZXMgPSBtZW1vLmdldChub2RlKTtcbiAgaWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkgbWVtby5zZXQobm9kZSwgKGVudHJpZXMgPSBuZXcgTWFwKCkpKTtcbiAgZW50cmllcy5zZXQoa2V5LCB2YWx1ZSk7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlZCBjb3B5IG9mIGBub2RlYCwgY29weS1vbi13cml0ZSBQRVIgUEFUSC4gRXZlcnkgY29udGFpbmVyIGVudGVyZWRcbiAqIGdldHMgaXRzIGNvcHkgQkVGT1JFIGl0cyBjaGlsZHJlbiBhcmUgd2Fsa2VkLCBzbyBhIGN5Y2xlIGVkZ2UgaXMgcG9pbnRlZCBhdFxuICogdGhlIGFuY2VzdG9yJ3MgY29weSDigJQgbmV2ZXIgYmFjayBhdCBhbiB1bnNjcnViYmVkIG9yaWdpbmFsOyBhIGNvbnRhaW5lciBpc1xuICogc2VydmVkIGFzIGl0c2VsZiB3aGVuIG5vdGhpbmcgdW5kZXIgaXQgY2hhbmdlZCBhbmQgbm8gY3ljbGUgcGFzc2VzIHRocm91Z2hcbiAqIGl0LiBBIHBydW5lZCBkZXNjZW50IChhIGJhcmUgZmllbGQgc2NydWIgb2YgYW4gYWN5Y2xpYyB2YWx1ZSkgc2tpcHMgc3VidHJlZXNcbiAqIG5vIHRhcmdldCByZWFjaGVzLiBgYmFja2AgaXMgdGhlIHNoYWxsb3dlc3QgYW5jZXN0b3IgYSBjeWNsZSBlZGdlIGJlbG93XG4gKiByZWFjaGVkIChgSW5maW5pdHlgOiBub25lKTsgYSBjb3B5IHRoYXQgcmVzdHMgb24gbm9uZSBpcyBzaGFyZWQgKG1lbW8pLlxuICovXG5mdW5jdGlvbiBjb3B5QnlQYXRoKFxuICBub2RlOiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgcGxhY2Vob2xkZXI6IHN0cmluZyxcbiAgYW5jZXN0b3JzOiBNYXA8b2JqZWN0LCB7IGNvcHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBkZXB0aDogbnVtYmVyIH0+LFxuICBkZXB0aDogbnVtYmVyLFxuICBwcnVuZTogYm9vbGVhbixcbik6IHsgb3V0OiB1bmtub3duOyBiYWNrOiBudW1iZXIgfSB7XG4gIC8vIFBhc3QgdGhlIGxpbWl0OiB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBpcyBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyIOKAlCBuZXZlciByYXcuXG4gIGlmICghdmlzaXQod2FsaykpIHJldHVybiB7IG91dDogcGxhY2Vob2xkZXIsIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IHNpZyA9IHdhbGsubWVtbyA/IGBjJHtzaWduYXR1cmVPZih0YXJnZXRzKX1gIDogJyc7XG4gIGNvbnN0IGtub3duID0gd2Fsay5tZW1vPy5nZXQobm9kZSk/LmdldChzaWcpO1xuICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgb3V0OiBrbm93biwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3QgZnJhbWUgPSB7XG4gICAgY29weTogKEFycmF5LmlzQXJyYXkobm9kZSkgPyBub2RlLnNsaWNlKCkgOiB7IC4uLm5vZGUgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZGVwdGgsXG4gIH07XG4gIGFuY2VzdG9ycy5zZXQobm9kZSwgZnJhbWUpO1xuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBsZXQgYmFjayA9IEluZmluaXR5O1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGNvbnN0IGVkZ2UgPSBkZWNpZGVFZGdlKGtleSwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBkZXB0aCk7XG4gICAgaWYgKGVkZ2UubWFza2VkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBwbGFjZWhvbGRlcjtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBhbmNlc3RvciA9IGFuY2VzdG9ycy5nZXQoY2hpbGQpO1xuICAgIGlmIChhbmNlc3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBhbmNlc3Rvci5jb3B5O1xuICAgICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGFuY2VzdG9yLmRlcHRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocHJ1bmUgJiYgZWRnZS5iZWxvdy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHdhbGsubmFtZXM/LnBhdGhNYXNrcyA/IChkb3R0ZWQgPT09IHVuZGVmaW5lZCA/IGtleSA6IGAke2RvdHRlZH0uJHtrZXl9YCkgOiBrZXk7XG4gICAgY29uc3QgYmVsb3cgPSBjb3B5QnlQYXRoKGNoaWxkLCBjaGlsZFBhdGgsIGVkZ2UuYmVsb3csIHdhbGssIHBsYWNlaG9sZGVyLCBhbmNlc3RvcnMsIGRlcHRoICsgMSwgcHJ1bmUpO1xuICAgIGlmIChiZWxvdy5vdXQgIT09IGNoaWxkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBiZWxvdy5vdXQ7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGJlbG93LmJhY2spO1xuICB9XG4gIGFuY2VzdG9ycy5kZWxldGUobm9kZSk7XG4gIGNvbnN0IG91dCA9IGNoYW5nZWQgfHwgYmFjayA8PSBkZXB0aCA/IGZyYW1lLmNvcHkgOiBub2RlO1xuICBpZiAod2Fsay5tZW1vICYmIGJhY2sgPj0gZGVwdGgpIHJlbWVtYmVyKHdhbGsubWVtbywgbm9kZSwgc2lnLCBvdXQpO1xuICByZXR1cm4geyBvdXQsIGJhY2s6IGJhY2sgPCBkZXB0aCA/IGJhY2sgOiBJbmZpbml0eSB9O1xufVxuXG4vKiogRG9lcyBhbnkgcGF0aCBmcm9tIGByb290YCBjb21lIGJhY2sgdG8gYW4gb2JqZWN0IG9uIGl0PyAqL1xuZnVuY3Rpb24gaGFzQ3ljbGUocm9vdDogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGRvbmUgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gIGNvbnN0IG9uUGF0aCA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICBjb25zdCB2aXNpdE5vZGUgPSAobm9kZTogb2JqZWN0KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKG9uUGF0aC5oYXMobm9kZSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChkb25lLmhhcyhub2RlKSkgcmV0dXJuIGZhbHNlO1xuICAgIG9uUGF0aC5hZGQobm9kZSk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG5vZGUpKSB7XG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiB2aXNpdE5vZGUoY2hpbGQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgb25QYXRoLmRlbGV0ZShub2RlKTtcbiAgICBkb25lLmFkZChub2RlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIHJldHVybiB2aXNpdE5vZGUocm9vdCk7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlZCBmb3JtIG9mIGByb290YCB1bmRlciBhIHdhbGs6IGByb290YCBpdHNlbGYgd2hlbiBubyBwYXRoIHNlbGVjdHNcbiAqIGFueXRoaW5nLCBlbHNlIGl0cyBjb3B5LW9uLXdyaXRlIGNvcHkgKHBhc3QgdGhlIHdhbGsgbGltaXQsIGl0cyB1bnZpc2l0ZWRcbiAqIHJlbWFpbmRlciBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyKS4gVGhyb3dzIOKAlCB0aGUgY2FsbGVyIHJlZnVzZXMgdG8gc2VydmVcbiAqIOKAlCBvbiBhbiBlbnVtZXJhYmxlIGdldHRlciB0aGF0IHRocm93cy5cbiAqL1xuZnVuY3Rpb24gc2VydmVkQnlQYXRoKFxuICByb290OiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgcGxhY2Vob2xkZXI6IHN0cmluZyxcbik6IHVua25vd24ge1xuICBpZiAoIXNlbGVjdHNCeVBhdGgocm9vdCwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBuZXcgTWFwKCksIDApLnNlbGVjdGVkKSByZXR1cm4gcm9vdDtcbiAgd2Fsay5idWRnZXQgPSB3YWxrTGltaXQ7XG4gIC8vIEEgYmFyZSBmaWVsZCBzY3J1YiBvZiBhbiBhY3ljbGljIHZhbHVlIHdhbGtzIGl0cyB0YXJnZXRzIG9ubHk6IG5vIGN5Y2xlIGNhbiBicmluZyBhblxuICAvLyB1bnNjcnViYmVkIG9yaWdpbmFsIGJhY2suIEV2ZXJ5IG90aGVyIHdhbGsgdmlzaXRzIGV2ZXJ5IHBhdGggKGEgY3ljbGUgZWRnZSBhbnl3aGVyZVxuICAvLyBtdXN0IGxhbmQgb24gYSBzZXJ2ZWQgY29weSkuXG4gIGNvbnN0IHBydW5lID0gd2Fsay5uYW1lcyA9PT0gdW5kZWZpbmVkICYmICFoYXNDeWNsZShyb290KTtcbiAgcmV0dXJuIGNvcHlCeVBhdGgocm9vdCwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBwbGFjZWhvbGRlciwgbmV3IE1hcCgpLCAwLCBwcnVuZSkub3V0O1xufVxuXG4vKiogQSBwbGFpbiByZWNvcmQg4oCUIHRoZSBvbmx5IHNoYXBlIGEgbWFwcGVyIGlzIGhhbmRlZCBhcyBhIHJlY29yZGluZyB2aWV3IChhIGNsYXNzIGluc3RhbmNlIGtlZXBzIGl0cyBwcm90b3R5cGUpLiAqL1xuZnVuY3Rpb24gaXNQbGFpblJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cbi8qKiBUaGUgc3RyaWN0ZXIgb2YgdHdvIHZlcmRpY3RzIG9uIHRoZSBzYW1lIHZhbHVlOiB3aG9sZSBvdmVyIGZpZWxkcyBvdmVyIGNsZWFyOyBmaWVsZHMgdW5pdGUuICovXG5mdW5jdGlvbiBzdHJpY3RlcihhOiBSZWRhY3Rpb25WZXJkaWN0IHwgdW5kZWZpbmVkLCBiOiBSZWRhY3Rpb25WZXJkaWN0KTogUmVkYWN0aW9uVmVyZGljdCB7XG4gIGlmIChhID09PSB1bmRlZmluZWQgfHwgYS5raW5kID09PSAnY2xlYXInIHx8IGIua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIGI7XG4gIGlmIChhLmtpbmQgPT09ICd3aG9sZScgfHwgYi5raW5kID09PSAnY2xlYXInKSByZXR1cm4gYTtcbiAgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogYS5rZXksIHBhdGhzOiBbLi4ubmV3IFNldChbLi4uYS5wYXRocywgLi4uYi5wYXRoc10pXSB9O1xufVxuXG4vKipcbiAqIFRIRSBUQUlOVCBSVUxFIGF0IGEgc3ViZmxvdyBtYXBwZXIgYm91bmRhcnkgKGFuIGBpbnB1dE1hcHBlcmAgc2VlZGluZyBhXG4gKiBzdWJmbG93LCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnaW5nIGl0IGJhY2spOiBhIGtleSB0aGUgbWFwcGVyIHdyaXRlc1xuICogaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGUgU0VMRUNURUQgdmFsdWUgaXQgY29waWVkIOKAlCBhIG1hcmsgKG9yXG4gKiBpbmhlcml0ZWQgZmllbGRzKSwgYnkgbmFtZSwgbGlrZSBhIHBlci1jYWxsIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAg4oCUXG4gKiBzbyB0aGUgc3ViZmxvdydzIHNlZWQsIGxvZywgbWlycm9yLCByZWFkcywgbmFycmF0aXZlIGFuZCByZXN1bHRzLCBhbmQgdGhlXG4gKiBwYXJlbnQncyBtZXJnZS1iYWNrLCByZXRhaW4gdGhlIGNvcHkgYXMgdGhleSByZXRhaW4gaXRzIHNvdXJjZS4gRGVjaWRlZCBieVxuICogd2hpY2ggdmFsdWVzIHRoZSBtYXBwZXIgUkVBRDpcbiAqXG4gKiAgIC0gU0FNRSBOQU1FIOKAlCBhIHZhbHVlIHBhc3NlZCBvbiB1bmRlciB0aGUgbmFtZSBpdCB3YXMgcmVhZCB1bmRlciBrZWVwc1xuICogICAgIHRoYXQgbmFtZSdzIHZlcmRpY3QgKGB7IGNvdW50OiBwLmNvdW50IH1gLCBgeyAuLi5wIH1gKTogYSBjbGVhciB2YWx1ZVxuICogICAgIHN0YXlzIGNsZWFyLCB3aGVyZXZlciBlbHNlIHRoZSBtYXBwZXIgcmVhZCBhIHNlY3JldC5cbiAqICAgLSBFWEFDVCDigJQgYW4gb3V0cHV0IE9CSkVDVCB0aGF0IElTIChieSByZWZlcmVuY2UpIGEgdmFsdWUgdGhlIG1hcHBlciByZWFkXG4gKiAgICAgaW5oZXJpdHMgdGhhdCBrZXkncyB2ZXJkaWN0OiB3aG9sZSBzdGF5cyB3aG9sZSwgYGZpZWxkc2AgaGFuZCB0aGVpciBwYXRoc1xuICogICAgIHRvIHRoZSBuZXcga2V5LCBjbGVhciBzdGF5cyBjbGVhci4gVGhlIHJlY29yZCB0aGUgbWFwcGVyIHdhcyBIQU5ERUQsXG4gKiAgICAgcGFzc2VkIG9uIHdob2xlIChgKHApID0+ICh7IGN0eDogcCB9KWApLCBoYW5kcyBldmVyeSBzZWxlY3RlZCBrZXkgb2YgaXRcbiAqICAgICB0byB0aGUgbmV3IGtleSBhcyBhIGZpZWxkIChgY3R4LnRva2VuYCkuXG4gKiAgIC0gQ09OU0VSVkFUSVZFIOKAlCBhbnkgb3RoZXIgb3V0cHV0IChhIHByaW1pdGl2ZSB1bmRlciBhIG5ldyBuYW1lLCBvciBhblxuICogICAgIG9iamVjdCB0aGUgbWFwcGVyIGJ1aWx0KSBpcyBzZWxlY3RlZCBXSE9MRSB3aGVuIHRoZSBtYXBwZXIgcmVhZCBhXG4gKiAgICAgc2VsZWN0ZWQgdmFsdWUg4oCUIGEgd2hvbGUtc2VsZWN0ZWQga2V5LCBvciBhIHNlbGVjdGVkIEZJRUxEIG9mIGFcbiAqICAgICBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQg4oCUIG9yIHdoZW4gaXQgZW1iZWRzIGEgc2VsZWN0ZWQgcmVjb3JkIGJ5XG4gKiAgICAgcmVmZXJlbmNlOyB0aGUgbGlicmFyeSBjYW5ub3QgdGVsbCB3aGF0IGEgY29tcHV0ZWQgdmFsdWUgY2Fycmllcy5cbiAqICAgICAoVmFsdWVzIGFyZSBuZXZlciBtYXRjaGVkIGJ5IEVRVUFMSVRZIGFjcm9zcyBuYW1lczogYW4gZXF1YWwgcHJpbWl0aXZlXG4gKiAgICAgd291bGQgb3Zlci1tYXRjaCB1bnJlbGF0ZWQga2V5cy4pXG4gKlxuICogSE9XIEZBUiBBIE1BUksgUkVBQ0hFUzogYSBOQU1FLCBydW4td2lkZSwgZnJvbSB0aGUgbW9tZW50IGl0IGlzIG1hZGUg4oCUIGV2ZXJ5XG4gKiBrZXkgb2YgdGhhdCBuYW1lIGluIHRoZSBzdWJmbG93LCB0aGUgcGFyZW50LCBhIHNpYmxpbmcgYW5kIGV2ZXJ5IGxhdGVyIHN0YWdlXG4gKiBpcyBzZWxlY3RlZCBpbiB3aGF0ZXZlciBpcyBzZXJ2ZWQsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzXG4gKiBpdCB0byB0aGUgcmVzdW1lZCBydW4gKGBGbG93Y2hhcnRDaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzYCkuXG4gKlxuICogQSBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQgdGhhdCBob2xkcyBhIHNlbGVjdGVkIGZpZWxkIGlzIGhhbmRlZCB0byB0aGVcbiAqIG1hcHBlciBhcyBhIHZpZXcgb2YgaXRzIG93biwgc28gcmVhZGluZyB0aGUgcmVjb3JkICh0byBwYXNzIGl0IG9uLCBvciB0b1xuICogdGVzdCBpdHMgdHlwZSkgaXMgbm90IHJlYWRpbmcgdGhlIGZpZWxkLiBSZWFkaW5nIGBydW5zYCAodGhlIG5hbWVzcGFjZSByb290XG4gKiBmb3JrIGNoaWxkcmVuIHdyaXRlIHVuZGVyKSByZWFkcyBldmVyeSBuYW1lc3BhY2VkIGtleS4gUmVjb3JkaW5nIHN0b3BzIHdoZW5cbiAqIHRoZSBtYXBwZXIgcmV0dXJuczsge0BsaW5rIGluaGVyaXR9IGhhbmRzIGJhY2sgdGhlIG91dHB1dCB3aXRoIGV2ZXJ5IHZpZXcgaXRcbiAqIHJldHVybmVkIHN3YXBwZWQgZm9yIHRoZSByZWNvcmQgYmVoaW5kIGl0LlxuICovXG5leHBvcnQgY2xhc3MgTWFwcGVyVGFpbnQge1xuICAvKiogRWFjaCBvYmplY3QgdGhlIG1hcHBlciByZWFkIOKGkiB0aGUgdmVyZGljdCBvZiB0aGUga2V5IGl0IHJlYWQgaXQgdW5kZXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PigpO1xuICAvKiogRWFjaCBrZXkgdGhlIG1hcHBlciByZWFkIOKGkiB0aGUgdmFsdWVzIGl0IHJlYWQgdW5kZXIgdGhhdCBuYW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duW10+KCk7XG4gIC8qKiBFYWNoIGBmaWVsZHNgIHZpZXcgaGFuZGVkIG91dCDihpIgdGhlIHJlY29yZCBiZWhpbmQgaXQgYW5kIGl0cyB2ZXJkaWN0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdzID0gbmV3IE1hcDxvYmplY3QsIHsgcmF3OiBvYmplY3Q7IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgfT4oKTtcbiAgLyoqIEVhY2ggcmVjb3JkIHRoZSBtYXBwZXIgd2FzIGhhbmRlZCDihpIgYXMgYSB2aWV3IChwYXNzZWQgb24gd2hvbGUsIGl0IGhhbmRzIG9uIGl0cyBzZWxlY3RlZCBrZXlzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWNvcmRzID0gbmV3IE1hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAvKiogVGhlIHNlbGVjdGVkIHZhbHVlcyB0aGUgbWFwcGVyIHJlYWQgKHdob2xlIGtleXMsIHNlbGVjdGVkIGZpZWxkcykg4oCUIHdoYXQgaXQgY291bGQgcGxhbnQgYnkgcmVmZXJlbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3JldFJlYWRzOiB1bmtub3duW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJlYWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvcGVuID0gdHJ1ZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcnVsZTogUmVkYWN0aW9uUnVsZSkge31cblxuICAvKiogYHVuZGVmaW5lZGAgd2hpbGUgdGhlIHJ1bidzIHJ1bGUgaXMgaW5lcnQg4oCUIG5vdGhpbmcgYSBtYXBwZXIgcmVhZHMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICBzdGF0aWMgb2YocnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IE1hcHBlclRhaW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IG5ldyBNYXBwZXJUYWludChydWxlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVjb3JkIGEgbWFwcGVyIGlzIGhhbmRlZDogdGhlIHNhbWUgb3duIGtleXMgYW5kIHZhbHVlcywgZWFjaCByZWFkXG4gICAqIHJlY29yZGVkLiBBbiBhY2Nlc3NvciBwZXIga2V5LCBub3QgYSBQcm94eSDigJQgYSBtYXBwZXIgbWF5IHNwcmVhZCwgY2xvbmUgb3JcbiAgICogc2VyaWFsaXplIHdoYXQgaXQgaXMgaGFuZGVkLiBBbiBhc3NpZ25tZW50IGxhbmRzIG9uIHRoZSB2aWV3LCBuZXZlciBvbiB0aGVcbiAgICogbGl2ZSByZWNvcmQgYmVoaW5kIGl0LiBBbnl0aGluZyBidXQgYSBwbGFpbiByZWNvcmQgaXMgaGFuZGVkIG92ZXIgYXMgaXQgaXMuXG4gICAqL1xuICB3YXRjaDxUPihyZWNvcmQ6IFQpOiBUIHtcbiAgICBpZiAoIWlzUGxhaW5SZWNvcmQocmVjb3JkKSkgcmV0dXJuIHJlY29yZDtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3T2YocmVjb3JkLCAoa2V5KSA9PiB0aGlzLnNlcnZlZChrZXksIHJlY29yZFtrZXldKSk7XG4gICAgdGhpcy5yZWNvcmRzLnNldCh2aWV3LCByZWNvcmQpO1xuICAgIHJldHVybiB2aWV3IGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1hcHBlciByZXR1cm5lZCBgb3V0cHV0YDogZXZlcnkga2V5IGl0IHdyb3RlIGluaGVyaXRzIHdoYXQgaXQgY29waWVkXG4gICAqIChzZWUgdGhlIGNsYXNzKS4gUmV0dXJucyB0aGUgb3V0cHV0IHRvIHVzZSDigJQgdGhlIHNhbWUgb2JqZWN0IHVubGVzcyBhIHZpZXdcbiAgICogaGFkIHRvIGJlIHN3YXBwZWQgYmFjayBmb3IgdGhlIHJlY29yZCBiZWhpbmQgaXQuXG4gICAqL1xuICBpbmhlcml0PFQ+KG91dHB1dDogVCk6IFQge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIGlmIChvdXRwdXQgPT09IG51bGwgfHwgdHlwZW9mIG91dHB1dCAhPT0gJ29iamVjdCcpIHJldHVybiBvdXRwdXQ7XG4gICAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBbdGFyZ2V0LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0KSkge1xuICAgICAgY29uc3QgY29waWVkID0gdGhpcy5jb3BpZWRWZXJkaWN0KHRhcmdldCwgdmFsdWUpO1xuICAgICAgaWYgKGNvcGllZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmVhZCB8fCB0aGlzLmVtYmVkc1NlbGVjdGVkKHZhbHVlLCBuZXcgV2Vha1NldCgpKSkgdGhpcy5ydWxlLm1hcmsodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSBpZiAoY29waWVkLmtpbmQgPT09ICd3aG9sZScpIHRoaXMucnVsZS5tYXJrKHRhcmdldCk7XG4gICAgICBlbHNlIGlmIChjb3BpZWQua2luZCA9PT0gJ2ZpZWxkcycpIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKHRhcmdldCwgY29waWVkLnBhdGhzKTtcbiAgICAgIGNvbnN0IHJhdyA9IHRoaXMuYmVoaW5kKHZhbHVlKTtcbiAgICAgIC8vIEFuIG9iamVjdCBwYXNzZWQgb24gQlkgUkVGRVJFTkNFIG1heSBjYXJyeSB3aGF0IHRoZSBtYXBwZXIgcGxhbnRlZCBpbiBpdFxuICAgICAgLy8gKGBPYmplY3QuYXNzaWduKHAucmVxdWVzdCwgeyBhdXRoOiBwLnRva2VuIH0pYCwgYHAubGlzdC5wdXNoKHAudG9rZW4pYCk6XG4gICAgICAvLyBlYWNoIHBsYWNlIGl0IGhvbGRzIGEgc2VsZWN0ZWQgdmFsdWUgdGhlIG1hcHBlciByZWFkIGlzIGEgZmllbGQgb2YgdGhlIG5ldyBrZXkuXG4gICAgICBpZiAoY29waWVkICE9PSB1bmRlZmluZWQgJiYgY29waWVkLmtpbmQgIT09ICd3aG9sZScgJiYgcmF3ICE9PSBudWxsICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHBsYW50ZWQgPSB0aGlzLnBsYW50ZWRQYXRocyhyYXcpO1xuICAgICAgICBpZiAocGxhbnRlZC5sZW5ndGggPiAwKSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyh0YXJnZXQsIHBsYW50ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHJhdyAhPT0gdmFsdWUpIHtcbiAgICAgICAgb3V0ID8/PSAoQXJyYXkuaXNBcnJheShvdXRwdXQpID8gWy4uLm91dHB1dF0gOiB7IC4uLm91dHB1dCB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgb3V0W3RhcmdldF0gPSByYXc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAob3V0ID8/IG91dHB1dCkgYXMgVDtcbiAgfVxuXG4gIC8qKiBXaGF0IG9uZSByZWNvcmRlZCByZWFkIGhhbmRzIHRoZSBtYXBwZXIgKHNlZSB0aGUgY2xhc3MpLiAqL1xuICBwcml2YXRlIHNlcnZlZChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMub3BlbikgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IHJlYWQgPSB0aGlzLmJ5TmFtZS5nZXQoa2V5KTtcbiAgICBpZiAocmVhZCA9PT0gdW5kZWZpbmVkKSB0aGlzLmJ5TmFtZS5zZXQoa2V5LCBbdmFsdWVdKTtcbiAgICBlbHNlIHJlYWQucHVzaCh2YWx1ZSk7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKGtleSwgdmFsdWUpO1xuICAgIC8vIEFuIGFic2VudCBrZXkgY2FycmllcyBubyBzZWNyZXQ7IG5laXRoZXIgZG9lcyBhIHZhbHVlIHdpdGggbm8gZmllbGRzIChhIHNjYWxhcikgb3Igbm9uZSBvZlxuICAgIC8vIGl0cyBzZWxlY3RlZCBvbmVzIOKAlCBzdGF0ZSByZXRhaW5zIHRob3NlIGFzIHRoZXkgYXJlIHRvby5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCAhUmVkYWN0aW9uUnVsZS5ob2xkc1BhdGhzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1lbWJlcih2YWx1ZSwgdmVyZGljdCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQbGFpblJlY29yZCh2YWx1ZSkpIHJldHVybiB0aGlzLmZpZWxkc1ZpZXcodmFsdWUsIHZlcmRpY3QpO1xuICAgIH1cbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVhZCA9IHRydWU7XG4gICAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSB0aGlzLnNlY3JldFJlYWRzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW1lbWJlcih2YWx1ZSwgdmVyZGljdCk7XG4gIH1cblxuICBwcml2YXRlIHJlbWVtYmVyKHZhbHVlOiB1bmtub3duLCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0KTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuc291cmNlcy5zZXQodmFsdWUsIHN0cmljdGVyKHRoaXMuc291cmNlcy5nZXQodmFsdWUpLCB2ZXJkaWN0KSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBBIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZDogcmVhZGluZyBvbmUgb2YgaXRzIHNlbGVjdGVkIGZpZWxkcyAob3IgYSBwYXRoJ3MgZmlyc3Qgc2VnbWVudCkgaXMgYSBzZWxlY3RlZCByZWFkLiAqL1xuICBwcml2YXRlIGZpZWxkc1ZpZXcocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCAmIHsga2luZDogJ2ZpZWxkcycgfSk6IG9iamVjdCB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdmVyZGljdC5wYXRocykgc2VsZWN0ZWQuYWRkKHBhdGgpLmFkZChwYXRoLnNwbGl0KCcuJylbMF0pO1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdPZihyZWNvcmQsIChrZXkpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wZW4gJiYgc2VsZWN0ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJlYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlY3JldFJlYWRzLnB1c2gocmVjb3JkW2tleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlY29yZFtrZXldO1xuICAgIH0pO1xuICAgIHRoaXMudmlld3Muc2V0KHZpZXcsIHsgcmF3OiByZWNvcmQsIHZlcmRpY3QgfSk7XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICBwcml2YXRlIHZpZXdPZihyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWFkOiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgdmlldzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmQpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmlldywga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiByZWFkKGtleSksXG4gICAgICAgIHNldDogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXcsIGtleSwgeyB2YWx1ZSwgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIC8qKiBUaGUgcmVjb3JkIGJlaGluZCBhIHZpZXcgdGhlIG1hcHBlciByZXR1cm5lZDsgYW55IG90aGVyIHZhbHVlIGFzIGl0IGlzLiAqL1xuICBwcml2YXRlIGJlaGluZCh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMudmlld3MuZ2V0KHZhbHVlKT8ucmF3ID8/IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpID8/IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJkaWN0IGB0YXJnZXRgIGluaGVyaXRzIGZyb20gYHZhbHVlYCDigJQgYHVuZGVmaW5lZGAgd2hlbiBpdCBpc1xuICAgKiBuZWl0aGVyIGEgdmFsdWUgdGhlIG1hcHBlciByZWFkIG5vciBvbmUgcGFzc2VkIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAgICovXG4gIHByaXZhdGUgY29waWVkVmVyZGljdCh0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBSZWRhY3Rpb25WZXJkaWN0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld3MuZ2V0KHZhbHVlKTtcbiAgICAgIGlmICh2aWV3KSByZXR1cm4gdmlldy52ZXJkaWN0O1xuICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkc09mKHJlY29yZCk7XG4gICAgICBjb25zdCBrbm93biA9IHRoaXMuc291cmNlcy5nZXQodmFsdWUpO1xuICAgICAgaWYgKGtub3duKSByZXR1cm4ga25vd247XG4gICAgfVxuICAgIGNvbnN0IHJlYWQgPSB0aGlzLmJ5TmFtZS5nZXQodGFyZ2V0KTtcbiAgICByZXR1cm4gcmVhZD8uc29tZSgodikgPT4gT2JqZWN0LmlzKHYsIHZhbHVlKSkgPyB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZCh0YXJnZXQsIHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBIHdob2xlIHJlY29yZCdzIHNlbGVjdGVkIGtleXMsIGFzIGZpZWxkcyBvZiB3aGF0ZXZlciBrZXkgaXQgaXMgcGFzc2VkIG9uIHVuZGVyLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkRmllbGRzT2YocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZChrZXksIHJlY29yZFtrZXldKTtcbiAgICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHBhdGhzLnB1c2goa2V5KTtcbiAgICAgIGVsc2UgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIGZvciAoY29uc3QgcGF0aCBvZiB2ZXJkaWN0LnBhdGhzKSBwYXRocy5wdXNoKGAke2tleX0uJHtwYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHMubGVuZ3RoID09PSAwID8gQ0xFQVIgOiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6ICcnLCBwYXRocyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIGByb290YCAoYW4gb2JqZWN0IHRoZSBtYXBwZXIgcGFzc2VkIG9uIGJ5IHJlZmVyZW5jZSkgaG9sZHMgb25lIG9mIHRoZVxuICAgKiBzZWxlY3RlZCBQUklNSVRJVkVTIGl0IHJlYWQg4oCUIG1hdGNoZWQgYnkgdmFsdWUsIG9ubHkgYWdhaW5zdCB3aGF0IHRoaXNcbiAgICogbWFwcGVyIHJlYWQgYW5kIG9ubHkgaW5zaWRlIHdoYXQgaXQgcGFzc2VkIG9uLCBzbyBvdmVyLW1hdGNoaW5nIGFuIGVxdWFsXG4gICAqIHZhbHVlIGlzIHRoZSBzYWZlIHNpZGUuIE9uZSByZWxhdGl2ZSBwYXRoIHBlciBwbGFjZSwgYSBzaGFyZWQgb2JqZWN0IGF0XG4gICAqIGVhY2ggb2YgaXRzIHBhdGhzOyBhIGN5Y2xlIGVkZ2UgaXMgbm90IGZvbGxvd2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBwbGFudGVkUGF0aHMocm9vdDogb2JqZWN0KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlY3JldHMgPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgY29uc3QgY29sbGVjdCA9ICh2YWx1ZTogdW5rbm93biwgc2VlbjogU2V0PG9iamVjdD4pOiB2b2lkID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykgc2VjcmV0cy5hZGQodmFsdWUpO1xuICAgICAgZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgY29sbGVjdChjaGlsZCwgc2Vlbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuc2VjcmV0UmVhZHMpIGNvbGxlY3QodmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgaWYgKHNlY3JldHMuc2l6ZSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG1lbW8gPSBuZXcgTWFwPG9iamVjdCwgc3RyaW5nW10+KCk7XG4gICAgY29uc3Qgb25QYXRoID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gICAgY29uc3QgaW5zaWRlID0gKG5vZGU6IG9iamVjdCk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGtub3duID0gbWVtby5nZXQobm9kZSk7XG4gICAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgICAgaWYgKG9uUGF0aC5oYXMobm9kZSkpIHJldHVybiBbXTtcbiAgICAgIG9uUGF0aC5hZGQobm9kZSk7XG4gICAgICBjb25zdCBmb3VuZDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnKSBmb3IgKGNvbnN0IHN1YiBvZiBpbnNpZGUoY2hpbGQpKSBmb3VuZC5wdXNoKGAke2tleX0uJHtzdWJ9YCk7XG4gICAgICAgIGVsc2UgaWYgKHNlY3JldHMuaGFzKGNoaWxkKSkgZm91bmQucHVzaChrZXkpO1xuICAgICAgfVxuICAgICAgb25QYXRoLmRlbGV0ZShub2RlKTtcbiAgICAgIG1lbW8uc2V0KG5vZGUsIGZvdW5kKTtcbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9O1xuICAgIHJldHVybiBpbnNpZGUocm9vdCk7XG4gIH1cblxuICAvKiogRG9lcyBhIHZhbHVlIHRoZSBtYXBwZXIgQlVJTFQgZW1iZWQsIGJ5IHJlZmVyZW5jZSwgYSBzZWxlY3RlZCByZWNvcmQgaXQgcmVhZCBvciB3YXMgaGFuZGVkPyAqL1xuICBwcml2YXRlIGVtYmVkc1NlbGVjdGVkKHZhbHVlOiB1bmtub3duLCBzZWVuOiBXZWFrU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMudmlld3MuaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSk7XG4gICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQpLmtpbmQgIT09ICdjbGVhcic7XG4gICAgY29uc3Qga25vd24gPSB0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKTtcbiAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCAmJiBrbm93bi5raW5kICE9PSAnY2xlYXInKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBpZiAodGhpcy5lbWJlZHNTZWxlY3RlZChjaGlsZCwgc2VlbikpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBjb21taXQgbG9nJ3Mgc2NydWI6IGBwYXRjaGAgd2l0aCB7QGxpbmsgTE9HX1BMQUNFSE9MREVSfSBhdCBldmVyeSBwYXRoIGluIGByZWRhY3RlZFBhdGhzYCB0aGF0XG4gKiBob2xkcyBhIGRlZmluZWQgdmFsdWUg4oCUIHRoZSBjb3B5IGBTdGFnZUNvbnRleHQgwrcgY29tbWl0YCByZWNvcmRzIGFuZCBmZWVkcyB0aGUgcmVkYWN0ZWQgbWlycm9yLlxuICpcbiAqIENMT05FLUZSRUUgKDkuMzMuMCkuIFRoZSBwYXRjaCBpcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3MgY29tbWl0LXRpbWUgcGF5bG9hZCwgYWxyZWFkeSB0aGUgcmVjb3JkJ3NcbiAqIG93biBjb3B5IChgVHJhbnNhY3Rpb25CdWZmZXIgwrcgY29tbWl0YCBjbG9uZXMgZWFjaCBzdXJ2aXZpbmcgcGF0aCBvbmNlOyB0aGUgYnVmZmVyIGlzIGRyb3BwZWQgYXRcbiAqIGNvbW1pdCksIHNvIHRoZSBzY3J1YiBjb3BpZXMgb25seSB3aGF0IGl0IG11c3Qgbm90IGVkaXQgaW4gcGxhY2U6XG4gKiAgIC0gbm8gcGF0aCB0byBzY3J1YiAobm8gcG9saWN5LCBubyBwZXItY2FsbCBtYXJrIOKAlCB0aGUgY29tbW9uIGNhc2UpIOKGkiBgcGF0Y2hgIElUU0VMRiwgbm8gY29weSBhdCBhbGw7XG4gKiAgIC0gb3RoZXJ3aXNlIOKGkiBhIG5ldyByb290IGFuZCBhIHNoYWxsb3cgY29weSBvZiBlYWNoIGNvbnRhaW5lciBvbiBhIHNjcnViYmVkIHBhdGggKGBwYXRoT3BzIMK3XG4gKiAgICAgb3duU3BpbmVgKSwgZXZlcnkgb3RoZXIgc3VidHJlZSBzaGFyZWQgd2l0aCBgcGF0Y2hgLiBgcGF0Y2hgIGlzIG5ldmVyIGVkaXRlZC5cbiAqIFRoZSBlbmdpbmUgY2FsbGVkIHRoZSBwdWJsaWMge0BsaW5rIHJlZGFjdFBhdGNofSAoYSB3aG9sZSBgc3RydWN0dXJlZENsb25lYCkgdHdpY2UgcGVyIGNvbW1pdCBiZWZvcmVcbiAqIDkuMzMuMC4gVGhlIGJ5dGVzIGFyZSB0aGUgc2FtZTogYSBzY3J1YmJlZCBwYXRoIGhvbGRzIHRoZSBwbGFjZWhvbGRlciwgZXZlcnkgb3RoZXIgcGF0aCB0aGUgdmFsdWUgdGhlXG4gKiBidWZmZXIgY2xvbmVkIChwaW5uZWQgYnkgdGhlIDkuMTguMSAvIDkuMTkuMSByZWRhY3Rpb24gYnl0ZSB0ZXN0cykuXG4gKlxuICogUGF0aHMgYXJlIHNjcnViYmVkIGluIHRoZSBzZXQncyBvcmRlciwgYWdhaW5zdCB0aGUgdHJlZSBhcyBzY3J1YmJlZCBzbyBmYXI6IGEgcGF0aCB1bmRlciBvbmUgYWxyZWFkeVxuICogc2NydWJiZWQgZmluZHMgYSBzdHJpbmcsIG5vdCBhIGNvbnRhaW5lciwgYW5kIGlzIGxlZnQgYWxvbmUgKGFzIGJlZm9yZSkuXG4gKlxuICogSU5URVJOQUwg4oCUIHRoZSByZXN1bHQgc2hhcmVzIHN0cnVjdHVyZSB3aXRoIGBwYXRjaGAuIEEgY2FsbGVyIG91dHNpZGUgdGhlIGNvbW1pdCBwYXRoIHdhbnRzXG4gKiB7QGxpbmsgcmVkYWN0UGF0Y2h9LlxuICpcbiAqIEBwYXJhbSByZWRhY3RlZFBhdGhzIERFTElNLWpvaW5lZCBwYXRocyAoYFRyYW5zYWN0aW9uQnVmZmVyYCdzIGByZWRhY3RlZFBhdGhzYDsgYSBidW5kbGUnc1xuICogICBgcmVkYWN0ZWRQYXRoc2AgYXJyYXkgd29ya3MgdG9vKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcnViUGF0Y2gocGF0Y2g6IE1lbW9yeVBhdGNoLCByZWRhY3RlZFBhdGhzOiBJdGVyYWJsZTxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICBsZXQgb3V0OiBNZW1vcnlQYXRjaCB8IHVuZGVmaW5lZDtcbiAgbGV0IG93bmVkOiBXZWFrU2V0PG9iamVjdD4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZmxhdCBvZiByZWRhY3RlZFBhdGhzKSB7XG4gICAgY29uc3Qgc2VncyA9IGZsYXQuc3BsaXQoREVMSU0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBvdXQgPz8gcGF0Y2g7XG4gICAgaWYgKCFuYXRpdmVIYXMoY3VycmVudCwgc2VncykgfHwgbmF0aXZlR2V0KGN1cnJlbnQsIHNlZ3MpID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgICBvdXQgPSBvd25lZFJvb3RPZihwYXRjaCwgb3duZWQpIGFzIE1lbW9yeVBhdGNoO1xuICAgIH1cbiAgICBvd25TcGluZShvdXQsIHNlZ3MsIG93bmVkISk7XG4gICAgbmF0aXZlU2V0KG91dCwgc2VncywgTE9HX1BMQUNFSE9MREVSKTtcbiAgfVxuICByZXR1cm4gb3V0ID8/IHBhdGNoO1xufVxuXG4vKipcbiAqIFJlZGFjdHMgc2Vuc2l0aXZlIHZhbHVlcyBpbiBhIHBhdGNoIGZvciBsb2dnaW5nL2RlYnVnZ2luZyDigJQgdGhlIFBVQkxJQyBzY3J1YiAoYGZvb3RwcmludGpzL2FkdmFuY2VkYCksXG4gKiBpdHMgY29udHJhY3QgdW5jaGFuZ2VkIHNpbmNlIDQueDogYSBmcmVzaCBkZWVwIGNvcHkgb2YgYHBhdGNoYCAoYHN0cnVjdHVyZWRDbG9uZWApIHdpdGhcbiAqIHtAbGluayBMT0dfUExBQ0VIT0xERVJ9IGF0IGV2ZXJ5IGxpc3RlZCBwYXRoIHRoYXQgaG9sZHMgYSBkZWZpbmVkIHZhbHVlLiBTaGFyZXMgbm90aGluZyB3aXRoIGBwYXRjaGBcbiAqIGFuZCBuZXZlciBlZGl0cyBpdC4gKE1vdmVkIGhlcmUgZnJvbSBgbWVtb3J5L3V0aWxzLnRzYCBpbiA5LjMzLjA7IHRoZSBlbmdpbmUncyBvd24gY29tbWl0IHBhdGggdXNlcyB0aGVcbiAqIGNsb25lLWZyZWUge0BsaW5rIHNjcnViUGF0Y2h9LilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRTZXQ6IFNldDxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICByZXR1cm4gc2NydWJQYXRjaChzdHJ1Y3R1cmVkQ2xvbmUocGF0Y2gpLCByZWRhY3RlZFNldCk7XG59XG4iXX0=
|
|
1335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQTRFdkUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFxQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBVyxDQUFDLENBQUM7QUFFakY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQTRDLEVBQUUsR0FBVztJQUMvRSxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0csQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBdUM7SUFDNUUsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJ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dkMsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxTQUFTO1lBQUUsU0FBUztRQUNsRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QixLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztZQUM5QixHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQWdCLENBQUM7UUFDakQsQ0FBQztRQUNELFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQU0sQ0FBQyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBa0IsRUFBRSxXQUF3QjtJQUN0RSxPQUFPLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVkYWN0aW9uLnRzIOKAlCBUaGUgT05FIG93bmVyIG9mIHdoYXQgYSByZWRhY3Rpb24gcG9saWN5IHNheXMgYWJvdXQgYSB2YWx1ZS5cbiAqXG4gKiBUSEUgTEFXIChvd25lciBydWxpbmcgKGEpKS4gQSByZWRhY3Rpb24gcG9saWN5IGNvdmVycyBFVkVSWVRISU5HIHRoZSBsaWJyYXJ5XG4gKiByZXRhaW5zIG9yIHNlcnZlcyDigJQgdGhlIGNvbW1pdCBsb2cgKGJvdGggZW5jb2RpbmdzKSwgdGhlIHJlZGFjdGVkIG1pcnJvcixcbiAqIHRyYWNrZWQgcmVhZHMvd3JpdGVzLCBldmVyeSByZWNvcmRlciBldmVudCAoaW5saW5lIGFuZCBkZWZlcnJlZCkgYW5kIHRoZVxuICogcmVjb3JkZXIgcm93cyBidWlsdCBmcm9tIHRoZW0sIHRoZSBuYXJyYXRpdmUsIHNuYXBzaG90cywgZGlhZ25vc3RpY3MsIHBhdXNlXG4gKiBwYXlsb2FkcywgYm91bmRhcnkgcmVjb3JkcyBhbmQgbG9nIGxpbmVzIOKAlCBhbmQgTkVWRVIgdGhlIGxpdmUgaGVhcCBvciB0aGVcbiAqIHJlc3VtZSBjaGVja3BvaW50LiBUd28gdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIGFuZCBzdGF5IHJlYWw6IHRoZVxuICogYHJ1bigpYCByZWplY3Rpb24gKHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmKSBhbmQgdGhlIGxpdmUgZm9yayByZXN1bHQuXG4gKlxuICogQSBwb2xpY3kgc2VsZWN0cyBieSBOQU1FIOKAlCBhIGtleSwgYSBkb3R0ZWQgcGF0aCwgYSBmaWVsZCDigJQgbmV2ZXIgYnlcbiAqIHNjYW5uaW5nIGNvbnRlbnQuIFdoYXQgY2FycmllcyBhIG5hbWU6XG4gKiAgIC0gc3RhdGUg4oCUIGl0cyB1c2VyLWxldmVsIHBhdGggKHtAbGluayBSZWRhY3Rpb25SdWxlLnZlcmRpY3R9KTtcbiAqICAgLSBhIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlIOKAlCByb290IGlucHV0L291dHB1dCwgYSBzdWJmbG93J3MgbWFwcGVkIHNlZWRcbiAqICAgICBhbmQgZXhpdCBzdGF0ZSwgYSBwYXVzZSBwYXlsb2FkLCBhIHRocm93biB2YWx1ZSDigJQgaXRzIGtleXMgYXQgZXZlcnlcbiAqICAgICBkZXB0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnl9KTtcbiAqICAgLSBhIGRpYWdub3N0aWMgZW50cnkg4oCUIGAkZGVidWdgL2AkZXJyb3JgL2AkbWV0cmljYC9gJGV2YWxgL2AkbG9nYCBhbmQgdGhlXG4gKiAgICAgZW5naW5lJ3Mgb3duIOKAlCB0aGUgcmVjb3JkIGB7IFtuYW1lXTogdmFsdWUgfWA6IGl0cyBuYW1lIElTIGEgc3RhdGUga2V5XG4gKiAgICAgKHtAbGluayBSZWRhY3Rpb25SdWxlLnJldGFpbkRpYWdub3N0aWN9KS4gYHBvbGljeS5kaWFnbm9zdGljc2AgYWRkc1xuICogICAgIGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMgb24gdG9wOyBmbG93LW1lc3NhZ2UgdGV4dCBoYXMgbm8gbmFtZSBvZiBpdHNcbiAqICAgICBvd24sIHNvIG9ubHkgdGhleSBzZWxlY3QgaXQ7XG4gKiAgIC0gYSBzdWJmbG93IG1hcHBlcidzIGNvcHkg4oCUIGEga2V5IGFuIGBpbnB1dE1hcHBlcmAvYG91dHB1dE1hcHBlcmAgKG9yIGFcbiAqICAgICBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtcyBzZWxlY3Rvcikgd3JvdGUgaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGVcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSBpdCBjb3BpZWQgKHtAbGluayBNYXBwZXJUYWludH0pLlxuICogQSBtYXJrIGlzIGEgTkFNRSwgcnVuLXdpZGUsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzIHRoZVxuICogbWFya3Mg4oCUIG5hbWVzIG9ubHkg4oCUIHRvIHRoZSByZXN1bWVkIHJ1biAoe0BsaW5rIFJlZGFjdGlvblJ1bGUubWFya3NGb3JDaGVja3BvaW50fSkuXG4gKiBBIHZhbHVlIHdpdGggbm8gbmFtZSDigJQgYSBzY2FsYXIgcm9vdCBpbnB1dC9vdXRwdXQgb3IgcGF1c2UgcGF5bG9hZCwgZnJlZVxuICogZXJyb3IgdGV4dCDigJQgaXMgc2VsZWN0ZWQgYnkgbm90aGluZy4gYGVtaXRQYXR0ZXJuc2AgaXMgdGhlIG9uZSBzZXBhcmF0ZVxuICogc2NydWI6IGEgYCRlbWl0YCBwYXlsb2FkIGlzIHNlbGVjdGVkIGJ5IGl0cyBldmVudCBuYW1lLlxuICpcbiAqIEhPVyBPTkUgT1dORVIgS0VFUFMgSVQuIEV2ZXJ5IHN0YWdlZCB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIHBhc3Nlc1xuICogdGhyb3VnaCBgU3RhZ2VDb250ZXh0YCwgc28gYFN0YWdlQ29udGV4dGAgYXNrcyBUSElTIHJ1bGUg4oCUIG5vdCB0aGUgY2FsbGVyIOKAlFxuICogd2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHBhdGggaXQgaXMgYWJvdXQgdG8gcmV0YWluLiBBIGBTY29wZUZhY2FkZWBcbiAqIHdyaXRlLCBhIHN1YmZsb3cgYGlucHV0TWFwcGVyYCBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrIGFuZCBhXG4gKiByZXN1bWUgcmUtc2VlZCBhcmUgdGhlbiBhbGwgdGhlIHNhbWUgY2FzZTogdGhlIGZ1bm5lbCBkZWNpZGVzLCB0aGUgY2FsbGVyXG4gKiBjYW5ub3QgZm9yZ2V0IHRvLiBUaGUgZmFjYWRlIHVzZXMgdGhlIHNhbWUgcnVsZSBmb3IgdGhlIHZhbHVlcyBpdCBoYW5kcyB0b1xuICogcmVjb3JkZXJzOyBgU3ViZmxvd0V4ZWN1dG9yYCB1c2VzIGl0IGZvciB0aGUgbmFycmF0ZWQgc2VlZCBhbmRcbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIuZXhlY3V0ZWAgZm9yIHJvb3QgaW5wdXQvb3V0cHV0IGJlZm9yZSBkaXNwYXRjaC4gQmVmb3JlIDkuMTkuMFxuICogdGhlIGZhY2FkZSBoZWxkIHRoZSB2ZXJkaWN0IGFsb25lLCBhbmQgZXZlcnkgcGF0aCB0aGF0IHdyb3RlIG9yIHJlYWQgcGFzdFxuICogdGhlIGZhY2FkZSDigJQgZml2ZSBvZiB0aGVtIOKAlCByZXRhaW5lZCBwbGFpbnRleHQgdW5kZXIgYSBwb2xpY3kuXG4gKlxuICogVFdPIFBMQUNFSE9MREVSUywgQk9USCBISVNUT1JJQ0FMOiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlIG1pcnJvciBjYXJyeVxuICogYCdSRURBQ1RFRCdgIChgc2NydWJQYXRjaGAgLyBgcmVkYWN0UGF0Y2hgLCBiZWxvdyDigJQgdGhlIHN0cmluZ3MgdW5jaGFuZ2VkIHNpbmNlIDQueCk7IGV2ZXJ5IHNjb3BlLXRpZXIgdmlldyDigJRcbiAqIHNjb3BlIHJlY29yZGVyIGV2ZW50cywgYHN0YWdlUmVhZHNgL2BzdGFnZVdyaXRlc2AsIG5hcnJhdGl2ZSDigJQgY2Fycmllc1xuICogYCdbUkVEQUNURURdJ2AuIE5laXRoZXIgc3RyaW5nIGNoYW5nZWQgaW4gOS4xOS4wLiBUaGUgc3RyaW5ncyB0aGVtc2VsdmVzIGFyZVxuICogb3duZWQgYnkgYG1lbW9yeS9wbGFjZWhvbGRlcnMudHNgIChgTE9HX1BMQUNFSE9MREVSYCAvIGBTQ09QRV9QTEFDRUhPTERFUmApXG4gKiBhbmQgc3BlbGxlZCBub3doZXJlIGVsc2UgaW4gYHNyYy9gIOKAlCB0aGlzIHJ1bGUgYXNrcyBmb3IgdGhlIHNjb3BlIG9uZSBieSBuYW1lLlxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5hdGl2ZVNldCwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIsIFNDT1BFX1BMQUNFSE9MREVSIH0gZnJvbSAnLi9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIERlY2xhcmF0aXZlIGtleS9wYXRoIHJlZGFjdGlvbiBmb3IgcmVjb3JkZWQgc3RhdGUgYW5kIGJvdW5kYXJ5IHJlY29yZHMuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIERpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIElOIEFERElUSU9OIHRvIHRoZSBzdGF0ZSBzZWxlY3RvcnMgYWJvdmUgKHdoaWNoXG4gICAqIGFscmVhZHkgY292ZXIgYSBkaWFnbm9zdGljIGVudHJ5IGJ5IGl0cyBuYW1lOiBga2V5czogWyd0b2tlbiddYCBtYXNrc1xuICAgKiBgJGRlYnVnKCd0b2tlbicsIOKApilgKS4gVXNlIHRoZXNlIGZvciBuYW1lcyB5b3UgbWFzayBpbiBkaWFnbm9zdGljcyBidXRcbiAgICogbm90IGluIHN0YXRlLiBQYXRocyBzdGFydCB3aXRoIGxvZ3MvZXJyb3JzL21ldHJpY3MvZXZhbHMsIGUuZy5cbiAgICogYGxvZ3MucHJvZmlsZS50b2tlbmAuIE9ubHkgZmxvd01lc3NhZ2VzLmRlc2NyaXB0aW9uIGFuZFxuICAgKiBmbG93TWVzc2FnZXMucmF0aW9uYWxlIGFyZSBwYXlsb2FkczsgZmxvdyB0b3BvbG9neS90aW1pbmcgbWV0YWRhdGEgc3RheXNcbiAgICogaW50YWN0LiBBcHBsaWVkIGJlZm9yZSByZXRlbnRpb24sIG5vdCByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nIGJhZ3MuXG4gICAqL1xuICBkaWFnbm9zdGljcz86IFBpY2s8UmVkYWN0aW9uUG9saWN5LCAna2V5cycgfCAncGF0dGVybnMnIHwgJ2ZpZWxkcyc+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
|