payload-auth 1.9.2 → 1.9.3
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/adapter/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EAEnB,KAAK,KAAK,IAAI,YAAY,EAC3B,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAO9D,eAAO,MAAM,eAAe,GAC1B,SAAS,iBAAiB,EAC1B,iBAAiB,OAAO;0BAmIK,QAAQ,SAAS,MAAM,KAAG,MAAM;+BA/F3B,QAAQ,KAAG,cAAc;2BAoK7B,YAAY;iEAuKvC;QACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,KAAK,EAAE,QAAQ,CAAC;QAChB,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;QAC1B,OAAO,EAAE,WAAW,CAAC;KACtB,KAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;sBAqGE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,qCAI1D;QACD,GAAG,EAAE,CAAC,CAAC;QACP,KAAK,EAAE,QAAQ,CAAC;QAChB,OAAO,EAAE,WAAW,CAAC;KACtB,KAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/adapter/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EAEnB,KAAK,KAAK,IAAI,YAAY,EAC3B,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAO9D,eAAO,MAAM,eAAe,GAC1B,SAAS,iBAAiB,EAC1B,iBAAiB,OAAO;0BAmIK,QAAQ,SAAS,MAAM,KAAG,MAAM;+BA/F3B,QAAQ,KAAG,cAAc;2BAoK7B,YAAY;iEAuKvC;QACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,KAAK,EAAE,QAAQ,CAAC;QAChB,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;QAC1B,OAAO,EAAE,WAAW,CAAC;KACtB,KAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;sBAqGE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,qCAI1D;QACD,GAAG,EAAE,CAAC,CAAC;QACP,KAAK,EAAE,QAAQ,CAAC;QAChB,OAAO,EAAE,WAAW,CAAC;KACtB,KAAG,CAAC;sEAuWF;QACD,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;QAC1B,KAAK,EAAE,QAAQ,CAAC;QAChB,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,WAAW,CAAC;KACtB,KAAG,YAAY;8BA2GJ,QAAQ,WACT,MAAM,EAAE,YACP,WAAW;4BAuCX,QAAQ,WACT;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,YAC3C,WAAW,KACpB,MAAM,GAAG,SAAS;CAyBtB,CAAC"}
|
|
@@ -437,7 +437,9 @@ export const createTransform = (options, enableDebugLogs)=>{
|
|
|
437
437
|
if ((targetFieldKey === "role" || targetFieldKey === "roles") && Array.isArray(value)) {
|
|
438
438
|
result[targetFieldKey] = value.join(",");
|
|
439
439
|
}
|
|
440
|
-
// Flatten join results from { docs: [...] } to plain arrays
|
|
440
|
+
// Flatten join results from { docs: [...] } to plain arrays,
|
|
441
|
+
// then transform each nested document so relationship fields
|
|
442
|
+
// (e.g. member.userId) are normalized to string IDs for BetterAuth.
|
|
441
443
|
if (isJoinResult(value)) {
|
|
442
444
|
debugLog([
|
|
443
445
|
"transformOutput: flattening join result",
|
|
@@ -447,7 +449,27 @@ export const createTransform = (options, enableDebugLogs)=>{
|
|
|
447
449
|
isArray: Array.isArray(value.docs)
|
|
448
450
|
}
|
|
449
451
|
]);
|
|
450
|
-
|
|
452
|
+
const flatDocs = flattenJoinResult(value);
|
|
453
|
+
// Determine the BA model key for the joined collection.
|
|
454
|
+
// The join field on the parent collection points to a target collection;
|
|
455
|
+
// resolve that slug back to a BA model key so we can transform nested docs.
|
|
456
|
+
const parentCollectionSlug = getCollectionSlug(model);
|
|
457
|
+
const parentCollection = payload.collections[parentCollectionSlug];
|
|
458
|
+
if (parentCollection) {
|
|
459
|
+
const joinField = flattenAllFields({
|
|
460
|
+
fields: parentCollection.config.fields
|
|
461
|
+
}).find((f)=>f.type === "join" && f.name === key);
|
|
462
|
+
if (joinField && "collection" in joinField) {
|
|
463
|
+
const joinedModelKey = resolveModelKey(joinField.collection);
|
|
464
|
+
result[targetFieldKey] = flatDocs.map((d)=>transformOutput({
|
|
465
|
+
doc: d,
|
|
466
|
+
model: joinedModelKey,
|
|
467
|
+
payload
|
|
468
|
+
}));
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
result[targetFieldKey] = flatDocs;
|
|
451
473
|
return;
|
|
452
474
|
}
|
|
453
475
|
// Handle relationship fields (both renamed and non-renamed)
|
|
@@ -834,4 +856,4 @@ export const createTransform = (options, enableDebugLogs)=>{
|
|
|
834
856
|
};
|
|
835
857
|
};
|
|
836
858
|
|
|
837
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IHR5cGUgeyBEQkZpZWxkQXR0cmlidXRlIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQgeyBnZXRBdXRoVGFibGVzIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQge1xuICB0eXBlIEJhc2VQYXlsb2FkLFxuICB0eXBlIENvbGxlY3Rpb25TbHVnLFxuICBmbGF0dGVuQWxsRmllbGRzLFxuICB0eXBlIFdoZXJlIGFzIFBheWxvYWRXaGVyZVxufSBmcm9tIFwicGF5bG9hZFwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEtleSB9IGZyb20gXCJAL2JldHRlci1hdXRoL2dlbmVyYXRlZC10eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXksXG4gIGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZCxcbiAgZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWVcbn0gZnJvbSBcIkAvYmV0dGVyLWF1dGgvcGx1Z2luL2hlbHBlcnMvZ2V0LWNvbGxlY3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChcbiAgb3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsXG4gIGVuYWJsZURlYnVnTG9nczogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIEJldHRlckF1dGggc2NoZW1hIG1vZGVsIG5hbWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uIHNsdWcgYnk6XG4gICAqIDEuIExvb2tpbmcgdXAgdGhlIG1vZGVsIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIG1vZGVsTmFtZVxuICAgKiAyLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQ29sbGVjdGlvbiBzbHVnIHJlc29sdXRpb24gZm9sbG93cyB0aGVzZSBydWxlczpcbiAgICogLSBGb3IgYmFzZSBjb2xsZWN0aW9uczogVGhlIHNhbml0aXplQmV0dGVyQXV0aE9wdGlvbnMgZnVuY3Rpb24gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBzbHVnXG4gICAqICAgZnJvbSBwbHVnaW4gb3B0aW9ucyBpcyBzZXQgYXMgdGhlIG1vZGVsIG5hbWUgaW4gdGhlIHNjaGVtYVxuICAgKiAtIEZvciBwbHVnaW5zOiBUaGUgYmV0dGVyQXV0aFBsdWdpblNsdWdzIGNvbnN0YW50IGlzIHVzZWQgYXMgdGhlIG1vZGVsTmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgQmV0dGVyQXV0aCBtb2RlbCBuYW1lIHRvIHJlc29sdmVcbiAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYVsndXNlciddLm1vZGVsTmFtZSBpcyAndXNlcnMnXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCd1c2VyJykgLy8gUmV0dXJucyAndXNlcnMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIG1vZGVsIGRvZXNuJ3QgZXhpc3QgaW4gc2NoZW1hXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgY29sbGVjdGlvbiBpcyBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb2xsZWN0aW9uT3ZlcnJpZGUgb3B0aW9uXG4gICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHNjaGVtYSBtYXBwaW5nLCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IHNsdWdzXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbDogTW9kZWxLZXkpOiBDb2xsZWN0aW9uU2x1ZyB7XG4gICAgLy8gRmlyc3QgdHJ5IHRvIGdldCB0aGUgbW9kZWxOYW1lIGZyb20gc2NoZW1hLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHNjaGVtYT8uW21vZGVsXT8ubW9kZWxOYW1lIHx8IG1vZGVsO1xuICAgIGRlYnVnTG9nKFtcImdldENvbGxlY3Rpb25TbHVnOlwiLCB7IG1vZGVsLCByZXNvbHZlZFNsdWc6IGNvbGxlY3Rpb24gfV0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25TbHVnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgbW9kZWwgaWRlbnRpZmllciB0byBpdHMgQkEgc2NoZW1hIG1vZGVsIGtleS5cbiAgICpcbiAgICogQWNjZXB0cyBlaXRoZXIgYSBCQSBtb2RlbCBrZXkgKFwidXNlclwiKSBvciBhIFBheWxvYWQgY29sbGVjdGlvbiBzbHVnIChcInVzZXJzXCIvXCJtZW1iZXJzXCIpXG4gICAqIGFuZCByZXR1cm5zIHRoZSBjYW5vbmljYWwgQkEgbW9kZWwga2V5IHVzZWQgdG8gaW5kZXggdGhlIHNjaGVtYS5cbiAgICpcbiAgICogVGhpcyBlbmFibGVzIGFkYXB0ZXIgZnVuY3Rpb25zICh0cmFuc2Zvcm1JbnB1dCwgdHJhbnNmb3JtT3V0cHV0LCBjb252ZXJ0V2hlcmVDbGF1c2UpXG4gICAqIHRvIHdvcmsgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBjYWxsZXJzIHBhc3MgYSBCQSBtb2RlbCBrZXkgb3IgYSBQYXlsb2FkIHNsdWcuXG4gICAqL1xuICBjb25zdCBtb2RlbEtleUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsS2V5PigpO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVNb2RlbEtleShtb2RlbDogc3RyaW5nKTogTW9kZWxLZXkge1xuICAgIGNvbnN0IGNhY2hlZCA9IG1vZGVsS2V5Q2FjaGUuZ2V0KG1vZGVsKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgLy8gRGlyZWN0IG1hdGNoIOKAlCBhbHJlYWR5IGEgQkEgbW9kZWwga2V5XG4gICAgaWYgKHNjaGVtYT8uW21vZGVsXSkge1xuICAgICAgbW9kZWxLZXlDYWNoZS5zZXQobW9kZWwsIG1vZGVsIGFzIE1vZGVsS2V5KTtcbiAgICAgIHJldHVybiBtb2RlbCBhcyBNb2RlbEtleTtcbiAgICB9XG5cbiAgICAvLyBSZXZlcnNlIGxvb2t1cCDigJQgZmluZCB0aGUgQkEgbW9kZWwga2V5IHdob3NlIG1vZGVsTmFtZSBtYXRjaGVzIHRoaXMgUGF5bG9hZCBzbHVnXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgaWYgKHZhbHVlLm1vZGVsTmFtZSA9PT0gbW9kZWwpIHtcbiAgICAgICAgbW9kZWxLZXlDYWNoZS5zZXQobW9kZWwsIGtleSBhcyBNb2RlbEtleSk7XG4gICAgICAgIHJldHVybiBrZXkgYXMgTW9kZWxLZXk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gbWF0Y2ggZm91bmQg4oCUIHJldHVybiBhcy1pcyAoY3VzdG9tIGNvbGxlY3Rpb25zIG5vdCBpbiB0aGUgQkEgc2NoZW1hKVxuICAgIHJldHVybiBtb2RlbCBhcyBNb2RlbEtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBmaWVsZCBpbiB0aGUgUGF5bG9hZCBjb2xsZWN0aW9uIGlzIGEgcmVsYXRpb25zaGlwIG9yIHVwbG9hZCBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgUGF5bG9hZCBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25TbHVnIC0gVGhlIHNsdWcgb2YgdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBvciB1cGxvYWQgZmllbGQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgY29uc3QgZmxhdHRlbmVkRmllbGRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgZmxhdHRlbkFsbEZpZWxkcz4+KCk7XG5cbiAgZnVuY3Rpb24gaXNQYXlsb2FkUmVsYXRpb25zaGlwKFxuICAgIHBheWxvYWQ6IEJhc2VQYXlsb2FkLFxuICAgIGNvbGxlY3Rpb25TbHVnOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHBheWxvYWQuY29sbGVjdGlvbnNbY29sbGVjdGlvblNsdWddO1xuICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGZpZWxkcyA9IGZsYXR0ZW5lZEZpZWxkc0NhY2hlLmdldChjb2xsZWN0aW9uU2x1Zyk7XG4gICAgaWYgKCFmaWVsZHMpIHtcbiAgICAgIGZpZWxkcyA9IGZsYXR0ZW5BbGxGaWVsZHMoeyBmaWVsZHM6IGNvbGxlY3Rpb24uY29uZmlnLmZpZWxkcyB9KTtcbiAgICAgIGZsYXR0ZW5lZEZpZWxkc0NhY2hlLnNldChjb2xsZWN0aW9uU2x1ZywgZmllbGRzKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuXG4gICAgcmV0dXJuIGZpZWxkPy50eXBlID09PSBcInJlbGF0aW9uc2hpcFwiIHx8IGZpZWxkPy50eXBlID09PSBcInVwbG9hZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBmaWVsZCB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBuYW1lIGJ5OlxuICAgKiAxLiBQcmVzZXJ2aW5nICdpZCcgb3IgJ19pZCcgZmllbGRzIGFzLWlzIChzcGVjaWFsIGNhc2UgaGFuZGxpbmcpXG4gICAqIDIuIExvb2tpbmcgdXAgdGhlIGZpZWxkIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIGZpZWxkTmFtZVxuICAgKiAzLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgb3JpZ2luYWwgZmllbGQgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10uZmllbGRzWydlbWFpbCddLmZpZWxkTmFtZSBpcyAnZW1haWxBZGRyZXNzJ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnZW1haWwnKSAvLyBSZXR1cm5zICdlbWFpbEFkZHJlc3MnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNwZWNpYWwgY2FzZSBmb3IgSUQgZmllbGRzXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdpZCcpIC8vIEFsd2F5cyByZXR1cm5zICdpZCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgZmllbGQgZG9lc24ndCBleGlzdCBpbiBzY2hlbWEgb3IgaGFzIG5vIGZpZWxkTmFtZSBtYXBwaW5nXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgZmllbGROYW1lIGlzIG92ZXJyaWRkZW4gaW4gdGhlIHBheWxvYWQgY29sbGVjdGlvbiBjb25maWcgdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgZmllbGQgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdldEZpZWxkTmFtZShtb2RlbDogTW9kZWxLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogJ2lkJyBvciAnX2lkJyBpcyBhbHdheXMgcHJlc2VydmVkIGFzLWlzXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdO1xuXG4gICAgLy8gVXNlIHRoZSBjb25maWd1cmVkIGZpZWxkTmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gb3JpZ2luYWxcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZERlZmluaXRpb24/LmZpZWxkTmFtZSB8fCBmaWVsZDtcblxuICAgIC8vIExvZyB0aGUgZmllbGQgcmVzb2x1dGlvbiBmb3IgZGVidWdnaW5nXG4gICAgZGVidWdMb2coW1wiZ2V0RmllbGQ6IFwiLCB7IG1vZGVsLCBvcmlnaW5hbEZpZWxkOiBmaWVsZCwgZmllbGROYW1lIH1dKTtcblxuICAgIHJldHVybiBmaWVsZE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChcbiAgICBmaWVsZEtleTogc3RyaW5nLFxuICAgIHNjaGVtYUZpZWxkczogUmVjb3JkPHN0cmluZywgREJGaWVsZEF0dHJpYnV0ZT5cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGEgc2luZ2xlIElEIHZhbHVlIGZyb20gYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSBpZiBpdCByZXByZXNlbnRzIGEgc2ltcGxlIElEIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSBzaW1wbGUgcXVlcnkgZm9yIGFcbiAgICogc2luZ2xlIGRvY3VtZW50IGJ5IElELiBJdCBzdXBwb3J0cyBib3RoICdpZCcgYW5kICdfaWQnIGZpZWxkcyB3aXRoICdlcXVhbHMnIG9yICdjb250YWlucydcbiAgICogb3BlcmF0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGZldGNoIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgLSBUaGUgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyBUaGUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpIGlmIHRoZSB3aGVyZSBjbGF1c2UgaXMgYSBzaW1wbGUgSUQgcXVlcnksIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzEyMycgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH0pIC8vICcxMjMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgNDU2IGZvciBhIHNpbXBsZSBlcXVhbHMgcXVlcnkgd2l0aCBudW1iZXIgSURcbiAgICogc2luZ2xlSWRRdWVyeSh7IF9pZDogeyBlcXVhbHM6IDQ1NiB9IH0pIC8vIDQ1NlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zICc3ODknIGZvciBhIGNvbnRhaW5zIHF1ZXJ5IHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICogc2luZ2xlSWRRdWVyeSh7IGlkOiB7IGNvbnRhaW5zOiBbJzc4OSddIH0gfSkgLy8gJzc4OSdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBudWxsIGZvciBjb21wbGV4IHF1ZXJpZXNcbiAgICogc2luZ2xlSWRRdWVyeSh7IGFuZDogW3sgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH1dIH0pIC8vIG51bGxcbiAgICovXG4gIGZ1bmN0aW9uIHNpbmdsZUlkUXVlcnkod2hlcmU6IFBheWxvYWRXaGVyZSkge1xuICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSB3aGVyZSBjbGF1c2VzIG9yIGNvbXBsZXggcXVlcmllcyB3aXRoICdhbmQnLydvcicgb3BlcmF0b3JzXG4gICAgaWYgKCF3aGVyZSB8fCBcImFuZFwiIGluIHdoZXJlIHx8IFwib3JcIiBpbiB3aGVyZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLnNvbWUoKGZpZWxkKSA9PiBmaWVsZCBpbiB3aGVyZSkpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBJRCBmaWVsZCBpcyBiZWluZyB1c2VkIChzdXBwb3J0IGJvdGggJ2lkJyBhbmQgJ19pZCcpXG4gICAgICBjb25zdCBpZEZpZWxkID0gXCJpZFwiIGluIHdoZXJlID8gXCJpZFwiIDogXCJfaWRcIjtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHdoZXJlW2lkRmllbGRdO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmXG4gICAgICAgIFwiZXF1YWxzXCIgaW4gY29uZGl0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uZXF1YWxzO1xuICAgICAgICAvLyBPbmx5IHJldHVybiBzdHJpbmcgb3IgbnVtYmVyIElEIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjb250YWlucyBvcGVyYXRvciBjYXNlIHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgY29uZGl0aW9uICYmXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICBcImNvbnRhaW5zXCIgaW4gY29uZGl0aW9uICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLmNvbnRhaW5zKSAmJlxuICAgICAgICBjb25kaXRpb24uY29udGFpbnMubGVuZ3RoID09PSAxXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY29udGFpbnNbMF07XG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gdmFsaWQgSUQgcXVlcnkgd2FzIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnk7XG4gICAgaXNSZWxhdGVkRmllbGQ6IGJvb2xlYW47XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gIH0pIHtcbiAgICAvLyBTa2lwIHByb2Nlc3NpbmcgZm9yIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgaWRUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCxcbiAgICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XG4gICAgICAgICAgXSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBpZFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCxcbiAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gc3RyaW5nSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGlkVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICBgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsXG4gICAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBwYXJzZWQgfVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIGlkVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nSWQgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLFxuICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHN0cmluZ0lkIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBzdHJpbmdJZDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGFycmF5IG9mIElEcyAtIG1hcCBlYWNoIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKChpZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgbnVsbC91bmRlZmluZWQgdmFsdWVzIGluIGFycmF5c1xuICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gaWQ7XG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGlkKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VkKSA/IHBhcnNlZCA6IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSBcInRleHRcIiAmJiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSByb2xlIGZpZWxkcyAoQ29taW5nIGZyb20gYmV0dGVyIGF1dGgsIHdpbGwgYmUgYSBzaW5nbGUgc3RyaW5nIHNlcGFyYXRlZCBieSBjb21tYXMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHJvbGVzKVxuICAgIGlmIChrZXkgPT09IFwicm9sZVwiIHx8IGtleSA9PT0gXCJyb2xlc1wiKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgocm9sZTogc3RyaW5nKSA9PlxuICAgICAgICAgIHR5cGVvZiByb2xlID09PSBcInN0cmluZ1wiID8gcm9sZS50cmltKCkudG9Mb3dlckNhc2UoKSA6IHJvbGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KFwiLFwiKS5tYXAoKHJvbGU6IHN0cmluZykgPT4gcm9sZS50cmltKCkudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG9yaWdpbmFsIHZhbHVlIGlmIG5vIGNvbnZlcnNpb24gd2FzIG5lZWRlZCBvciBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoIHRvIFBheWxvYWQgQ01TIGZvcm1hdFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXM6XG4gICAqIDEuIEZpZWxkIG5hbWUgbWFwcGluZyBhY2NvcmRpbmcgdG8gc2NoZW1hIGRlZmluaXRpb25zXG4gICAqIDIuIElEIHR5cGUgY29udmVyc2lvbiBmb3IgcmVsYXRpb25zaGlwIGZpZWxkc1xuICAgKiAzLiBQcm9wZXIgZGF0YSBub3JtYWxpemF0aW9uIGJhc2VkIG9uIGZpZWxkIHR5cGVzXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGlucHV0IGRhdGEgZnJvbSBiZXR0ZXItYXV0aFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSBpbiB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcmV0dXJucyBUcmFuc2Zvcm1lZCBkYXRhIGNvbXBhdGlibGUgd2l0aCBQYXlsb2FkIENNU1xuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtSW5wdXQoe1xuICAgIGRhdGEsXG4gICAgbW9kZWw6IHJhd01vZGVsLFxuICAgIGlkVHlwZSxcbiAgICBwYXlsb2FkXG4gIH06IHtcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG1vZGVsOiBNb2RlbEtleTtcbiAgICBpZFR5cGU6IFwibnVtYmVyXCIgfCBcInRleHRcIjtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcmVzb2x2ZU1vZGVsS2V5KHJhd01vZGVsKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgZGF0YVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gU2tpcCB1bmRlZmluZWQgdmFsdWVzIChidXQgYWxsb3cgbnVsbCB0aHJvdWdoIHRvIGNsZWFyIGZpZWxkcylcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBtYXBwZWQgZmllbGQgbmFtZSBmcm9tIHNjaGVtYSAoaWYgYW55KVxuICAgICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZTtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkTmFtZSB8fCBrZXk7XG5cbiAgICAgIC8vIENoZWNrIFBheWxvYWQgc2NoZW1hIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgIGNvbnN0IGlzUGF5bG9hZFJlbCA9IGlzUGF5bG9hZFJlbGF0aW9uc2hpcChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICAgIGNvbnN0IGlzUmVsYXRlZEZpZWxkID1cbiAgICAgICAgaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykgfHwgaXNQYXlsb2FkUmVsO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdGhlIGRhdGEgdmFsdWUgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgSUQgdHlwZVxuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVEYXRhKHtcbiAgICAgICAgaWRUeXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpc1JlbGF0ZWRGaWVsZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcbiAgICAgIHRyYW5zZm9ybWVkRGF0YVt0YXJnZXRGaWVsZEtleV0gPSBub3JtYWxpemVkRGF0YTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBQYXlsb2FkIGpvaW4gcmVzdWx0IChoYXMgZG9jcyBhcnJheSBzdHJ1Y3R1cmUpXG4gICAqL1xuICBmdW5jdGlvbiBpc0pvaW5SZXN1bHQoXG4gICAgdmFsdWU6IGFueVxuICApOiB2YWx1ZSBpcyB7IGRvY3M6IGFueVtdOyBoYXNOZXh0UGFnZT86IGJvb2xlYW47IHRvdGFsRG9jcz86IG51bWJlciB9IHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJkb2NzXCIgaW4gdmFsdWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUuZG9jcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGEgUGF5bG9hZCBqb2luIHJlc3VsdCB0byBqdXN0IHRoZSBhcnJheSBvZiBkb2N1bWVudHMuXG4gICAqIEhhbmRsZXMgYm90aCBkaXJlY3QgZG9jdW1lbnRzIGFuZCBwb2x5bW9ycGhpYyB7IHJlbGF0aW9uVG8sIHZhbHVlIH0gZm9ybWF0LlxuICAgKi9cbiAgZnVuY3Rpb24gZmxhdHRlbkpvaW5SZXN1bHQoam9pblJlc3VsdDogeyBkb2NzOiBhbnlbXSB9KTogYW55W10ge1xuICAgIHJldHVybiBqb2luUmVzdWx0LmRvY3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgcG9seW1vcnBoaWMgam9pbiBmb3JtYXQ6IHsgcmVsYXRpb25Ubzogc3RyaW5nLCB2YWx1ZTogZG9jIH1cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSAmJlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInZhbHVlXCIgaW4gaXRlbSAmJlxuICAgICAgICBcInJlbGF0aW9uVG9cIiBpbiBpdGVtXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiA0LiBKb2luIFJlc3VsdCBGbGF0dGVuaW5nOiBDb252ZXJ0cyBQYXlsb2FkJ3MgeyBkb2NzOiBbLi4uXSB9IGpvaW4gZm9ybWF0IHRvIHBsYWluIGFycmF5c1xuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oe1xuICAgIGRvYyxcbiAgICBtb2RlbDogcmF3TW9kZWwsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgZG9jOiBUO1xuICAgIG1vZGVsOiBNb2RlbEtleTtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFQge1xuICAgIGlmICghZG9jIHx8IHR5cGVvZiBkb2MgIT09IFwib2JqZWN0XCIpIHJldHVybiBkb2M7XG5cbiAgICBjb25zdCBtb2RlbCA9IHJlc29sdmVNb2RlbEtleShyYXdNb2RlbCk7XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5kb2MgfTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIElkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCBjdXN0b20gZmllbGQgbmFtZSBtYXBwaW5nc1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcEZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYUZpZWxkcykuZmlsdGVyKChba2V5XSkgPT4ge1xuICAgICAgICBpZiAoaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIEFsc28gY2hlY2sgcGF5bG9hZCBzY2hlbWFcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZSB8fCBrZXk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpO1xuICAgICAgICByZXR1cm4gaXNQYXlsb2FkUmVsYXRpb25zaGlwKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBmaWVsZE5hbWUpO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGRhdGVGaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFGaWVsZHMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUudHlwZSA9PT0gXCJkYXRlXCIpXG4gICAgKTtcblxuICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSBhbGwgdGhlIGZpZWxkcyBrZXlzIGFyZSBjb3JyZWN0XG4gICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWUoXG4gICAgICAgIGdldENvbGxlY3Rpb25CeU1vZGVsS2V5KHBheWxvYWQuY29sbGVjdGlvbnMsIG1vZGVsKSxcbiAgICAgICAga2V5XG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldEZpZWxkS2V5ICE9PSBrZXkpIHtcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IHJlc3VsdFtrZXldO1xuICAgICAgICBkZWxldGUgcmVzdWx0W2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZW50cmllcyhkb2MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdGFyZ2V0RmllbGRLZXkgPSBnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZShcbiAgICAgICAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkocGF5bG9hZC5jb2xsZWN0aW9ucywgbW9kZWwpLFxuICAgICAgICBrZXlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbnZlcnQgSUQgZmllbGRzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggY29tcGF0aWJpbGl0eVxuICAgICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblx0ICAgIFxuICAgICAgLy8gQ29udmVydCByb2xlIGFycmF5IHRvIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdcbiAgICAgIGlmICgodGFyZ2V0RmllbGRLZXkgPT09IFwicm9sZVwiIHx8IHRhcmdldEZpZWxkS2V5ID09PSBcInJvbGVzXCIpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSB2YWx1ZS5qb2luKFwiLFwiKVxuXHRcdFx0fVxuICAgICAgXG4gICAgICAvLyBGbGF0dGVuIGpvaW4gcmVzdWx0cyBmcm9tIHsgZG9jczogWy4uLl0gfSB0byBwbGFpbiBhcnJheXNcbiAgICAgIGlmIChpc0pvaW5SZXN1bHQodmFsdWUpKSB7XG4gICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICBcInRyYW5zZm9ybU91dHB1dDogZmxhdHRlbmluZyBqb2luIHJlc3VsdFwiLFxuICAgICAgICAgIHsga2V5LCB0YXJnZXRGaWVsZEtleSwgaXNBcnJheTogQXJyYXkuaXNBcnJheSh2YWx1ZS5kb2NzKSB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXN1bHRbdGFyZ2V0RmllbGRLZXldID0gZmxhdHRlbkpvaW5SZXN1bHQodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSByZWxhdGlvbnNoaXAgZmllbGRzIChib3RoIHJlbmFtZWQgYW5kIG5vbi1yZW5hbWVkKVxuICAgICAgY29uc3Qgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXkgPSBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBGaWVsZHMpLmZpbmQoXG4gICAgICAgIChrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWFwcGVkTmFtZSA9IHJlbGF0aW9uc2hpcEZpZWxkc1trXS5maWVsZE5hbWUgfHwgaztcbiAgICAgICAgICByZXR1cm4gbWFwcGVkTmFtZSA9PT0ga2V5O1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5KSB7XG4gICAgICAgIG5vcm1hbGl6ZURvY3VtZW50SWRzKHJlc3VsdCwgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXksIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBkYXRlIGZpZWxkcyAoYm90aCByZW5hbWVkIGFuZCBub24tcmVuYW1lZClcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGF0ZUZpZWxkS2V5ID0gT2JqZWN0LmtleXMoZGF0ZUZpZWxkcykuZmluZCgoaykgPT4ge1xuICAgICAgICBjb25zdCBtYXBwZWROYW1lID0gZGF0ZUZpZWxkc1trXS5maWVsZE5hbWUgfHwgaztcbiAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWUgPT09IGtleTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG9yaWdpbmFsRGF0ZUZpZWxkS2V5KSB7XG4gICAgICAgIC8vIENvbnZlcnQgSVNPIGRhdGUgc3RyaW5ncyB0byBEYXRlIG9iamVjdHMgZm9yIEJldHRlckF1dGhcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RyaXAgUGF5bG9hZC1pbnRlcm5hbCBmaWVsZHMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgc2NoZW1hLlxuICAgIC8vIFBheWxvYWQgaW5qZWN0cyBmaWVsZHMgbGlrZSBgY29sbGVjdGlvbmAgYW5kIGludGVybmFsIG1ldGFkYXRhXG4gICAgLy8gdGhhdCBjYWxsZXJzIGRvbid0IGV4cGVjdC4gV2UgYWxsb3cgYm90aCBCQSBzY2hlbWEgZmllbGRzIEFORFxuICAgIC8vIFBheWxvYWQgY29sbGVjdGlvbiBmaWVsZHMg4oCUIHRoaXMgZW5zdXJlcyBwbHVnaW4tYWRkZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gcm9sZS90b2tlbi91cmwgb24gYWRtaW4taW52aXRhdGlvbnMpIHN1cnZpdmUgZXZlbiB3aGVuXG4gICAgLy8gdGhlIEJBIHNjaGVtYSBkb2Vzbid0IGRlY2xhcmUgdGhlbS5cbiAgICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hRmllbGRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgIGxldCBwYXlsb2FkRmllbGROYW1lcyA9IGZsYXR0ZW5lZEZpZWxkc0NhY2hlLmdldChjb2xsZWN0aW9uU2x1Zyk7XG4gICAgICBpZiAoIXBheWxvYWRGaWVsZE5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBwYXlsb2FkLmNvbGxlY3Rpb25zW2NvbGxlY3Rpb25TbHVnXTtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBwYXlsb2FkRmllbGROYW1lcyA9IGZsYXR0ZW5BbGxGaWVsZHMoeyBmaWVsZHM6IGNvbGxlY3Rpb24uY29uZmlnLmZpZWxkcyB9KTtcbiAgICAgICAgICBmbGF0dGVuZWRGaWVsZHNDYWNoZS5zZXQoY29sbGVjdGlvblNsdWcsIHBheWxvYWRGaWVsZE5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcGF5bG9hZE5hbWVzID0gbmV3IFNldChwYXlsb2FkRmllbGROYW1lcz8ubWFwKChmKSA9PiBmLm5hbWUpID8/IFtdKTtcbiAgICAgIGNvbnN0IGFsbG93ZWRLZXlzID0gbmV3IFNldChbXCJpZFwiLCBcIl9pZFwiLCAuLi5PYmplY3Qua2V5cyhzY2hlbWFGaWVsZHMpLCAuLi5wYXlsb2FkTmFtZXNdKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdCkpIHtcbiAgICAgICAgaWYgKCFhbGxvd2VkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIGRlbGV0ZSByZXN1bHRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIElEIGZpZWxkcyBmb3IgYm90aCBwcmltYXJ5IGFuZCByZWxhdGlvbnNoaXAgZG9jdW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgY29uc2lzdGVudCBJRCBoYW5kbGluZyBiZXR3ZWVuIEJldHRlckF1dGggYW5kIFBheWxvYWQgQ01TIGJ5OlxuICAgKiAxLiBDb252ZXJ0aW5nIGFsbCBJRHMgdG8gc3RyaW5ncyBmb3IgQmV0dGVyQXV0aCAoc3RvcmVkIGluIG9yaWdpbmFsS2V5KVxuICAgKiAyLiBQcmVzZXJ2aW5nIG9yaWdpbmFsIElEIHR5cGVzIGZvciBQYXlsb2FkIENNUyAoc3RvcmVkIGluIGZpZWxkTmFtZSlcbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIGhhbmRsZXMgdmFyaW91cyBJRCBmb3JtYXRzOlxuICAgKiAtIFByaW1pdGl2ZSB2YWx1ZXMgKHN0cmluZy9udW1iZXIgSURzKVxuICAgKiAtIE9iamVjdCByZWZlcmVuY2VzIHdpdGggSUQgcHJvcGVydGllc1xuICAgKiAtIEFycmF5cyBvZiBlaXRoZXIgcHJpbWl0aXZlIElEcyBvciBvYmplY3QgcmVmZXJlbmNlc1xuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJlc3VsdCBvYmplY3QgYmVpbmcgdHJhbnNmb3JtZWRcbiAgICogQHBhcmFtIG9yaWdpbmFsS2V5IC0gVGhlIG9yaWdpbmFsIGZpZWxkIGtleSBmcm9tIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgcmVuYW1lZCBmaWVsZCBhcyB1c2VkIGluIFBheWxvYWQgQ01TXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBJRCB2YWx1ZSB0byBub3JtYWxpemUgKHByaW1pdGl2ZSwgb2JqZWN0LCBvciBhcnJheSlcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURvY3VtZW50SWRzKFxuICAgIHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBvcmlnaW5hbEtleTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2FzZSAxOiBQcmltaXRpdmUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIC8vIEZvciBCZXR0ZXJBdXRoOiBBbHdheXMgdXNlIHN0cmluZyBJRHNcbiAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgLy8gRm9yIFBheWxvYWQ6IEtlZXAgb3JpZ2luYWwgdHlwZVxuICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYXNlIDI6IE9iamVjdCB3aXRoIElEIHByb3BlcnR5XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICBcImlkXCIgaW4gdmFsdWVcbiAgICApIHtcbiAgICAgIC8vIEZvciBCZXR0ZXJBdXRoOiBFeHRyYWN0IGFuZCBzdHJpbmdpZnkgdGhlIElEXG4gICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gU3RyaW5nKHZhbHVlLmlkKTtcbiAgICAgIC8vIFByZXNlcnZlIHRoZSBwb3B1bGF0ZWQgcmVsYXRpb25zaGlwIG9iamVjdCBzbyBqb2lucyByZXR1cm4gZnVsbCBkb2N1bWVudHNcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0ge1xuICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgaWQ6IFN0cmluZyh2YWx1ZS5pZClcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAzOiBBcnJheSBvZiBJRHMgb3IgcmVmZXJlbmNlc1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDaGVjayBpZiBhcnJheSBjb250YWlucyBvYmplY3RzIHdpdGggSUQgcHJvcGVydGllc1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZS5ldmVyeShcbiAgICAgICAgICAoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiYgaXRlbSAhPT0gbnVsbCAmJiBcImlkXCIgaW4gaXRlbVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgLy8gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIElEc1xuICAgICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gdmFsdWUubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbS5pZCkpO1xuICAgICAgICAvLyBLZWVwIGpvaW5lZCBkb2N1bWVudHMgaW50YWN0IHdoaWxlIG5vcm1hbGl6aW5nIElEIHR5cGVcbiAgICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBpZDogU3RyaW5nKGl0ZW0uaWQpXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHByaW1pdGl2ZSBJRHNcbiAgICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IGl0ZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IElmIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggYW55IGV4cGVjdGVkIGZvcm1hdCwgbm8gY2hhbmdlcyBhcmUgbWFkZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgQmV0dGVyQXV0aCBvcGVyYXRvciB0byB0aGUgZXF1aXZhbGVudCBQYXlsb2FkIENNUyBxdWVyeSBvcGVyYXRvclxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIG1hcHMgc3RhbmRhcmQgcXVlcnkgb3BlcmF0b3JzIGZyb20gQmV0dGVyQXV0aCdzIGZvcm1hdCB0b1xuICAgKiB0aGUgc3BlY2lmaWMgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0b3IgLSBUaGUgQmV0dGVyQXV0aCBvcGVyYXRvciBzdHJpbmcgKGUuZy4sICdlcScsICdndCcsICdjb250YWlucycpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB1c2VkIHdpdGggdGhlIG9wZXJhdG9yXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBQYXlsb2FkLWNvbXBhdGlibGUgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBlcXVhbHM6ICd0ZXN0QGV4YW1wbGUuY29tJyB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdlcScsICd0ZXN0QGV4YW1wbGUuY29tJylcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyB7IGdyZWF0ZXJfdGhhbjogMTAwIH1cbiAgICogb3BlcmF0b3JUb1BheWxvYWQoJ2d0JywgMTAwKVxuICAgKi9cbiAgZnVuY3Rpb24gb3BlcmF0b3JUb1BheWxvYWQoXG4gICAgb3BlcmF0b3I6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICByZXR1cm4geyBlcXVhbHM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwibmVcIjpcbiAgICAgICAgcmV0dXJuIHsgbm90X2VxdWFsczogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW46IHZhbHVlIH07XG4gICAgICBjYXNlIFwiZ3RlXCI6XG4gICAgICAgIHJldHVybiB7IGdyZWF0ZXJfdGhhbl9lcXVhbDogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW46IHZhbHVlIH07XG4gICAgICBjYXNlIFwibHRlXCI6XG4gICAgICAgIHJldHVybiB7IGxlc3NfdGhhbl9lcXVhbDogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJjb250YWluc1wiOlxuICAgICAgICByZXR1cm4geyBjb250YWluczogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICByZXR1cm4geyBpbjogdmFsdWUgfTtcbiAgICAgIGNhc2UgXCJzdGFydHNfd2l0aFwiOlxuICAgICAgICByZXR1cm4geyBsaWtlOiBgJHt2YWx1ZX0lYCB9O1xuICAgICAgY2FzZSBcImVuZHNfd2l0aFwiOlxuICAgICAgICByZXR1cm4geyBsaWtlOiBgJSR7dmFsdWV9YCB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGVxdWFscyBmb3IgdW5yZWNvZ25pemVkIG9wZXJhdG9yc1xuICAgICAgICByZXR1cm4geyBlcXVhbHM6IHZhbHVlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgd2hlcmUgY2xhdXNlIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGJhc2VkIG9uIGZpZWxkIG5hbWUgYW5kIElEIHR5cGUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhyZWUgbWFpbiBzY2VuYXJpb3M6XG4gICAqIDEuIElEIGZpZWxkIGNvbnZlcnNpb24gLSBlbnN1cmVzIElEcyBtYXRjaCB0aGUgZGF0YWJhc2UncyBleHBlY3RlZCB0eXBlIChudW1iZXIgb3Igc3RyaW5nKVxuICAgKiAyLiBSZWxhdGlvbnNoaXAgZmllbGQgY29udmVyc2lvbiAtIGVuc3VyZXMgZm9yZWlnbiBrZXkgdmFsdWVzIG1hdGNoIHRoZSBleHBlY3RlZCBJRCB0eXBlXG4gICAqIDMuIE9iamVjdCB3aXRoIGVtYmVkZGVkIElEIC0gZXh0cmFjdHMgYW5kIGNvbnZlcnRzIHRoZSBJRCBwcm9wZXJ0eSBmcm9tIG9iamVjdHNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKGNhbiBiZSBwcmltaXRpdmUsIG9iamVjdCB3aXRoIElELCBvciBhcnJheSlcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBxdWVyaWVkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgZm9yIHNjaGVtYSBsb29rdXBzXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGRhdGFiYXNlIHF1ZXJ5XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgdmFsdWUsXG4gICAgZmllbGROYW1lLFxuICAgIG9yaWdpbmFsRmllbGRLZXksXG4gICAgbW9kZWwsXG4gICAgaWRUeXBlXG4gIH06IHtcbiAgICB2YWx1ZTogYW55O1xuICAgIGZpZWxkTmFtZTogc3RyaW5nO1xuICAgIG9yaWdpbmFsRmllbGRLZXk/OiBzdHJpbmc7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIGlkVHlwZTogXCJudW1iZXJcIiB8IFwidGV4dFwiO1xuICB9KTogYW55IHtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcbiAgICBjb25zdCBsb29rdXBLZXkgPSBvcmlnaW5hbEZpZWxkS2V5ID8/IGZpZWxkTmFtZTtcbiAgICBjb25zdCBuZWVkc0lkQ29udmVyc2lvbiA9XG4gICAgICBbXCJpZFwiLCBcIl9pZFwiXS5pbmNsdWRlcyhmaWVsZE5hbWUpIHx8XG4gICAgICBpc1JlbGF0aW9uc2hpcEZpZWxkKGxvb2t1cEtleSwgc2NoZW1hRmllbGRzKTtcblxuICAgIGlmICghbmVlZHNJZENvbnZlcnNpb24pIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBDYXNlIDA6IFZhbHVlIGlzIGFuIGFycmF5IChlLmcuIGZvciB0aGUgYGluYCBvcGVyYXRvcikg4oCUIGNvbnZlcnQgZWFjaCBlbGVtZW50XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PlxuICAgICAgICBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgIG9yaWdpbmFsRmllbGRLZXksXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgaWRUeXBlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENhc2UgMTogVmFsdWUgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gSUQgcHJvcGVydHlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwiaWRcIiBpbiB2YWx1ZSkge1xuICAgICAgY29uc3QgaWQgPSB2YWx1ZS5pZDtcbiAgICAgIGlmIChpZFR5cGUgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IG51bUlkID0gTnVtYmVyKGlkKTtcbiAgICAgICAgcmV0dXJuICFpc05hTihudW1JZCkgPyBudW1JZCA6IGlkO1xuICAgICAgfVxuICAgICAgaWYgKGlkVHlwZSA9PT0gXCJ0ZXh0XCIgJiYgdHlwZW9mIGlkID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIC8vIENhc2UgMjogVmFsdWUgaXMgYSBzdGFuZGFsb25lIElEIHRoYXQgbmVlZHMgdHlwZSBjb252ZXJzaW9uXG4gICAgaWYgKFxuICAgICAgaWRUeXBlID09PSBcIm51bWJlclwiICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICFpc05hTihOdW1iZXIodmFsdWUpKVxuICAgICkge1xuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpZFR5cGUgPT09IFwidGV4dFwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIEJldHRlciBBdXRoIHdoZXJlIGNsYXVzZXMgdG8gUGF5bG9hZCBDTVMgY29tcGF0aWJsZSB3aGVyZSBjb25kaXRpb25zXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgQmV0dGVyIEF1dGggcXVlcnkgZm9ybWF0IGludG8gUGF5bG9hZCdzIHF1ZXJ5IGZvcm1hdCxcbiAgICogaGFuZGxpbmcgZmllbGQgbmFtZSBtYXBwaW5nLCB2YWx1ZSB0eXBlIGNvbnZlcnNpb24sIGFuZCBsb2dpY2FsIG9wZXJhdG9ycyAoQU5EL09SKS5cbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIGhhbmRsZXMgdGhyZWUgbWFpbiBjYXNlczpcbiAgICogMS4gRW1wdHkgb3IgdW5kZWZpbmVkIHdoZXJlIGNsYXVzZSAtIHJldHVybnMgZW1wdHkgb2JqZWN0XG4gICAqIDIuIFNpbmdsZSBjb25kaXRpb24gLSBjb252ZXJ0cyB0byBhIHNpbXBsZSBmaWVsZC12YWx1ZSBwYWlyXG4gICAqIDMuIE11bHRpcGxlIGNvbmRpdGlvbnMgLSBncm91cHMgYnkgQU5EL09SIGNvbm5lY3RvcnMgYW5kIGJ1aWxkcyBhIGNvbXBsZXggcXVlcnlcbiAgICpcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBkYXRhYmFzZSBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gcXVlcnlcbiAgICogQHBhcmFtIHdoZXJlIC0gQXJyYXkgb2YgQmV0dGVyIEF1dGggd2hlcmUgY29uZGl0aW9uc1xuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSB3aGVyZSBjbGF1c2Ugb2JqZWN0XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgIGlkVHlwZSxcbiAgICBtb2RlbDogcmF3TW9kZWwsXG4gICAgd2hlcmUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIHdoZXJlPzogV2hlcmVbXTtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFBheWxvYWRXaGVyZSB7XG4gICAgY29uc3QgbW9kZWwgPSByZXNvbHZlTW9kZWxLZXkocmF3TW9kZWwpO1xuICAgIC8vIEhhbmRsZSBlbXB0eSB3aGVyZSBjbGF1c2VcbiAgICBpZiAoIXdoZXJlKSByZXR1cm4ge307XG5cbiAgICBmdW5jdGlvbiBnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZChcbiAgICAgICAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkocGF5bG9hZC5jb2xsZWN0aW9ucywgbW9kZWwpLFxuICAgICAgICBmaWVsZEtleVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2luZ2xlIGNvbmRpdGlvbiBjYXNlIGZvciBvcHRpbWl6YXRpb25cbiAgICBpZiAod2hlcmUubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCB3ID0gd2hlcmVbMF07XG4gICAgICBpZiAoIXcpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuXG4gICAgICAvLyBNYXAgZmllbGQgbmFtZSBhY2NvcmRpbmcgdG8gc2NoZW1hIGFuZCBjb252ZXJ0IHZhbHVlIHRvIGFwcHJvcHJpYXRlIHR5cGVcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgb3JpZ2luYWxGaWVsZEtleTogdy5maWVsZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGlkVHlwZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgUGF5bG9hZCB3aGVyZSBjb25kaXRpb24gd2l0aCBwcm9wZXIgb3BlcmF0b3JcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgW2dldFBheWxvYWRGaWVsZE5hbWUoZmllbGROYW1lKV06IG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgICAgICAgIHcub3BlcmF0b3IgPz8gXCJcIixcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBjb25kaXRpb25zIGJ5IHNlcGFyYXRpbmcgQU5EL09SIGNsYXVzZXNcbiAgICAvLyBEZWZhdWx0IHRvIEFORCBpZiBubyBjb25uZWN0b3IgaXMgc3BlY2lmaWVkXG4gICAgY29uc3QgYW5kID0gd2hlcmUuZmlsdGVyKCh3KSA9PiB3LmNvbm5lY3RvciA9PT0gXCJBTkRcIiB8fCAhdy5jb25uZWN0b3IpO1xuICAgIGNvbnN0IG9yID0gd2hlcmUuZmlsdGVyKCh3KSA9PiB3LmNvbm5lY3RvciA9PT0gXCJPUlwiKTtcblxuICAgIC8vIFByb2Nlc3MgQU5EIGNvbmRpdGlvbnNcbiAgICBjb25zdCBhbmRDbGF1c2UgPSBhbmQubWFwKCh3KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpO1xuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgIHZhbHVlOiB3LnZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIG9yaWdpbmFsRmllbGRLZXk6IHcuZmllbGQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2dldFBheWxvYWRGaWVsZE5hbWUoZmllbGROYW1lKV06IG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgICAgICAgIHcub3BlcmF0b3IgPz8gXCJcIixcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBPUiBjb25kaXRpb25zXG4gICAgY29uc3Qgb3JDbGF1c2UgPSBvci5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgb3JpZ2luYWxGaWVsZEtleTogdy5maWVsZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGlkVHlwZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbZ2V0UGF5bG9hZEZpZWxkTmFtZShmaWVsZE5hbWUpXTogb3BlcmF0b3JUb1BheWxvYWQoXG4gICAgICAgICAgdy5vcGVyYXRvciA/PyBcIlwiLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBDb21iaW5lIEFORCBhbmQgT1IgY2xhdXNlcyBpbnRvIGZpbmFsIFBheWxvYWQgd2hlcmUgb2JqZWN0XG4gICAgLy8gT25seSBpbmNsdWRlIG5vbi1lbXB0eSBjbGF1c2UgYXJyYXlzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihhbmRDbGF1c2UubGVuZ3RoID8geyBBTkQ6IGFuZENsYXVzZSB9IDoge30pLFxuICAgICAgLi4uKG9yQ2xhdXNlLmxlbmd0aCA/IHsgT1I6IG9yQ2xhdXNlIH0gOiB7fSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmV0dGVyLWF1dGggc2VsZWN0IGFycmF5IHRvIGEgUGF5bG9hZCBzZWxlY3Qgb2JqZWN0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgYmV0dGVyLWF1dGggc2VsZWN0IGFycmF5ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lcylcbiAgICogaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgQVBJIChhbiBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lcyBhcyBrZXlzXG4gICAqIGFuZCBib29sZWFuIHRydWUgYXMgdmFsdWVzKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzZWxlY3QgLSBPcHRpb25hbCBhcnJheSBvZiBmaWVsZCBuYW1lcyB0byBzZWxlY3RcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgc2VsZWN0IG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm8gZmllbGRzIHRvIHNlbGVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJbnB1dDogWydlbWFpbCcsICduYW1lJ11cbiAgICogLy8gT3V0cHV0OiB7IGVtYWlsOiB0cnVlLCBuYW1lOiB0cnVlIH1cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRTZWxlY3QoXG4gICAgcmF3TW9kZWw6IE1vZGVsS2V5LFxuICAgIHNlbGVjdD86IHN0cmluZ1tdLFxuICAgIHBheWxvYWQ/OiBCYXNlUGF5bG9hZFxuICApIHtcbiAgICBjb25zdCBtb2RlbCA9IHJlc29sdmVNb2RlbEtleShyYXdNb2RlbCk7XG4gICAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBzZWxlY3QgaXMgZW1wdHkgb3Igbm90IHByb3ZpZGVkXG4gICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMgaW50byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgIC8vIGFwcGx5aW5nIGJvdGggc2NoZW1hLWxldmVsIGFuZCBjb2xsZWN0aW9uLWxldmVsIGZpZWxkIG5hbWUgbWFwcGluZ1xuICAgIHJldHVybiBzZWxlY3QucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBjb25zdCBzY2hlbWFGaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIGZpZWxkKTtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHBheWxvYWRcbiAgICAgICAgPyBnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQoXG4gICAgICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgICAgICBzY2hlbWFGaWVsZE5hbWVcbiAgICAgICAgICApXG4gICAgICAgIDogc2NoZW1hRmllbGROYW1lO1xuICAgICAgcmV0dXJuIHsgLi4uYWNjLCBbZmllbGROYW1lXTogdHJ1ZSB9O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0IHRvIGEgUGF5bG9hZCBzb3J0IHN0cmluZ1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lIGFuZCBkaXJlY3Rpb24pXG4gICAqIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IEFQSSAoYSBzdHJpbmcgd2l0aCBvcHRpb25hbCAnLScgcHJlZml4IGZvciBkZXNjZW5kaW5nIG9yZGVyKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzb3J0QnkgLSBPcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBmaWVsZCBuYW1lIGFuZCBzb3J0IGRpcmVjdGlvblxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzb3J0IHN0cmluZyBvciB1bmRlZmluZWQgaWYgbm8gc29ydCBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5wdXQ6IHsgZmllbGQ6ICdlbWFpbCcsIGRpcmVjdGlvbjogJ2Rlc2MnIH1cbiAgICogLy8gT3V0cHV0OiAnLWVtYWlsJ1xuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2FzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICdjcmVhdGVkQXQnXG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U29ydChcbiAgICByYXdNb2RlbDogTW9kZWxLZXksXG4gICAgc29ydEJ5PzogeyBmaWVsZDogc3RyaW5nOyBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiB9LFxuICAgIHBheWxvYWQ/OiBCYXNlUGF5bG9hZFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVsID0gcmVzb2x2ZU1vZGVsS2V5KHJhd01vZGVsKTtcbiAgICBpZiAoIXNvcnRCeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzY2hlbWFGaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHNvcnRCeS5maWVsZCk7XG4gICAgLy8gQXBwbHkgY29sbGVjdGlvbi1sZXZlbCBmaWVsZCBuYW1lIG1hcHBpbmcgaWYgcGF5bG9hZCBpcyBhdmFpbGFibGVcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBwYXlsb2FkXG4gICAgICA/IGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZChcbiAgICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgICAgc2NoZW1hRmllbGROYW1lXG4gICAgICAgIClcbiAgICAgIDogc2NoZW1hRmllbGROYW1lO1xuICAgIGNvbnN0IHByZWZpeCA9IHNvcnRCeS5kaXJlY3Rpb24gPT09IFwiZGVzY1wiID8gXCItXCIgOiBcIlwiO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtmaWVsZE5hbWV9YDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0RmllbGROYW1lLFxuICAgIGdldENvbGxlY3Rpb25TbHVnLFxuICAgIHNpbmdsZUlkUXVlcnksXG4gICAgdHJhbnNmb3JtSW5wdXQsXG4gICAgdHJhbnNmb3JtT3V0cHV0LFxuICAgIGNvbnZlcnRXaGVyZUNsYXVzZSxcbiAgICBjb252ZXJ0U2VsZWN0LFxuICAgIGNvbnZlcnRTb3J0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdldEF1dGhUYWJsZXMiLCJmbGF0dGVuQWxsRmllbGRzIiwiZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkiLCJnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQiLCJnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZSIsImNyZWF0ZVRyYW5zZm9ybSIsIm9wdGlvbnMiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJzY2hlbWEiLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZ2V0Q29sbGVjdGlvblNsdWciLCJtb2RlbCIsImNvbGxlY3Rpb24iLCJtb2RlbE5hbWUiLCJyZXNvbHZlZFNsdWciLCJtb2RlbEtleUNhY2hlIiwiTWFwIiwicmVzb2x2ZU1vZGVsS2V5IiwiY2FjaGVkIiwiZ2V0Iiwic2V0Iiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmxhdHRlbmVkRmllbGRzQ2FjaGUiLCJpc1BheWxvYWRSZWxhdGlvbnNoaXAiLCJwYXlsb2FkIiwiY29sbGVjdGlvblNsdWciLCJmaWVsZE5hbWUiLCJjb2xsZWN0aW9ucyIsImZpZWxkcyIsImNvbmZpZyIsImZpZWxkIiwiZmluZCIsImYiLCJuYW1lIiwidHlwZSIsImdldEZpZWxkTmFtZSIsImluY2x1ZGVzIiwiZmllbGREZWZpbml0aW9uIiwib3JpZ2luYWxGaWVsZCIsImlzUmVsYXRpb25zaGlwRmllbGQiLCJmaWVsZEtleSIsInNjaGVtYUZpZWxkcyIsInJlZmVyZW5jZXMiLCJ1bmRlZmluZWQiLCJzaW5nbGVJZFF1ZXJ5Iiwid2hlcmUiLCJzb21lIiwiaWRGaWVsZCIsImNvbmRpdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsImVxdWFscyIsImNvbnRhaW5zIiwibGVuZ3RoIiwibm9ybWFsaXplRGF0YSIsImlzUmVsYXRlZEZpZWxkIiwiaWRUeXBlIiwicGFyc2VkIiwiTnVtYmVyIiwiaXNOYU4iLCJvcmlnaW5hbCIsImNvbnZlcnRlZCIsInN0cmluZ0lkIiwiU3RyaW5nIiwibWFwIiwiaWQiLCJyb2xlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJ0cmFuc2Zvcm1JbnB1dCIsImRhdGEiLCJyYXdNb2RlbCIsInRyYW5zZm9ybWVkRGF0YSIsImZvckVhY2giLCJzY2hlbWFGaWVsZE5hbWUiLCJ0YXJnZXRGaWVsZE5hbWUiLCJpc1BheWxvYWRSZWwiLCJub3JtYWxpemVkRGF0YSIsInRhcmdldEZpZWxkS2V5IiwiaXNKb2luUmVzdWx0IiwiZG9jcyIsImZsYXR0ZW5Kb2luUmVzdWx0Iiwiam9pblJlc3VsdCIsIml0ZW0iLCJ0cmFuc2Zvcm1PdXRwdXQiLCJkb2MiLCJyZXN1bHQiLCJyZWxhdGlvbnNoaXBGaWVsZHMiLCJmcm9tRW50cmllcyIsImZpbHRlciIsImRhdGVGaWVsZHMiLCJfIiwia2V5cyIsImpvaW4iLCJvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSIsImsiLCJtYXBwZWROYW1lIiwibm9ybWFsaXplRG9jdW1lbnRJZHMiLCJvcmlnaW5hbERhdGVGaWVsZEtleSIsIkRhdGUiLCJwYXlsb2FkRmllbGROYW1lcyIsInBheWxvYWROYW1lcyIsIlNldCIsImFsbG93ZWRLZXlzIiwiaGFzIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIm9wZXJhdG9yVG9QYXlsb2FkIiwib3BlcmF0b3IiLCJub3RfZXF1YWxzIiwiZ3JlYXRlcl90aGFuIiwiZ3JlYXRlcl90aGFuX2VxdWFsIiwibGVzc190aGFuIiwibGVzc190aGFuX2VxdWFsIiwiaW4iLCJsaWtlIiwiY29udmVydFdoZXJlVmFsdWUiLCJvcmlnaW5hbEZpZWxkS2V5IiwibG9va3VwS2V5IiwibmVlZHNJZENvbnZlcnNpb24iLCJ2IiwibnVtSWQiLCJjb252ZXJ0V2hlcmVDbGF1c2UiLCJnZXRQYXlsb2FkRmllbGROYW1lIiwidyIsInJlcyIsImFuZCIsImNvbm5lY3RvciIsIm9yIiwiYW5kQ2xhdXNlIiwib3JDbGF1c2UiLCJBTkQiLCJPUiIsImNvbnZlcnRTZWxlY3QiLCJzZWxlY3QiLCJyZWR1Y2UiLCJhY2MiLCJjb252ZXJ0U29ydCIsInNvcnRCeSIsInByZWZpeCIsImRpcmVjdGlvbiJdLCJtYXBwaW5ncyI6IkFBRUEsU0FBU0EsYUFBYSxRQUFRLGlCQUFpQjtBQUMvQyxTQUdFQyxnQkFBZ0IsUUFFWCxVQUFVO0FBRWpCLFNBQ0VDLHVCQUF1QixFQUN2QkMsdUNBQXVDLEVBQ3ZDQyxnQ0FBZ0MsUUFDM0Isc0NBQThDO0FBRXJELE9BQU8sTUFBTUMsa0JBQWtCLENBQzdCQyxTQUNBQztJQUVBLE1BQU1DLFNBQVNSLGNBQWNNO0lBRTdCLFNBQVNHLFNBQVNDLE9BQWM7UUFDOUIsSUFBSUgsaUJBQWlCO1lBQ25CSSxRQUFRQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLRjtRQUN6QztJQUNGO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5QkMsR0FDRCxTQUFTRyxrQkFBa0JDLEtBQWU7UUFDeEMsNkZBQTZGO1FBQzdGLE1BQU1DLGFBQWFQLFFBQVEsQ0FBQ00sTUFBTSxFQUFFRSxhQUFhRjtRQUNqREwsU0FBUztZQUFDO1lBQXNCO2dCQUFFSztnQkFBT0csY0FBY0Y7WUFBVztTQUFFO1FBQ3BFLE9BQU9BO0lBQ1Q7SUFFQTs7Ozs7Ozs7R0FRQyxHQUNELE1BQU1HLGdCQUFnQixJQUFJQztJQUUxQixTQUFTQyxnQkFBZ0JOLEtBQWE7UUFDcEMsTUFBTU8sU0FBU0gsY0FBY0ksR0FBRyxDQUFDUjtRQUNqQyxJQUFJTyxRQUFRLE9BQU9BO1FBRW5CLHdDQUF3QztRQUN4QyxJQUFJYixRQUFRLENBQUNNLE1BQU0sRUFBRTtZQUNuQkksY0FBY0ssR0FBRyxDQUFDVCxPQUFPQTtZQUN6QixPQUFPQTtRQUNUO1FBRUEsbUZBQW1GO1FBQ25GLEtBQUssTUFBTSxDQUFDVSxLQUFLQyxNQUFNLElBQUlDLE9BQU9DLE9BQU8sQ0FB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
|
|
859
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IHR5cGUgeyBEQkZpZWxkQXR0cmlidXRlIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQgeyBnZXRBdXRoVGFibGVzIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQge1xuICB0eXBlIEJhc2VQYXlsb2FkLFxuICB0eXBlIENvbGxlY3Rpb25TbHVnLFxuICBmbGF0dGVuQWxsRmllbGRzLFxuICB0eXBlIFdoZXJlIGFzIFBheWxvYWRXaGVyZVxufSBmcm9tIFwicGF5bG9hZFwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEtleSB9IGZyb20gXCJAL2JldHRlci1hdXRoL2dlbmVyYXRlZC10eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXksXG4gIGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZCxcbiAgZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWVcbn0gZnJvbSBcIkAvYmV0dGVyLWF1dGgvcGx1Z2luL2hlbHBlcnMvZ2V0LWNvbGxlY3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChcbiAgb3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsXG4gIGVuYWJsZURlYnVnTG9nczogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIEJldHRlckF1dGggc2NoZW1hIG1vZGVsIG5hbWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uIHNsdWcgYnk6XG4gICAqIDEuIExvb2tpbmcgdXAgdGhlIG1vZGVsIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIG1vZGVsTmFtZVxuICAgKiAyLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQ29sbGVjdGlvbiBzbHVnIHJlc29sdXRpb24gZm9sbG93cyB0aGVzZSBydWxlczpcbiAgICogLSBGb3IgYmFzZSBjb2xsZWN0aW9uczogVGhlIHNhbml0aXplQmV0dGVyQXV0aE9wdGlvbnMgZnVuY3Rpb24gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBzbHVnXG4gICAqICAgZnJvbSBwbHVnaW4gb3B0aW9ucyBpcyBzZXQgYXMgdGhlIG1vZGVsIG5hbWUgaW4gdGhlIHNjaGVtYVxuICAgKiAtIEZvciBwbHVnaW5zOiBUaGUgYmV0dGVyQXV0aFBsdWdpblNsdWdzIGNvbnN0YW50IGlzIHVzZWQgYXMgdGhlIG1vZGVsTmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgQmV0dGVyQXV0aCBtb2RlbCBuYW1lIHRvIHJlc29sdmVcbiAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYVsndXNlciddLm1vZGVsTmFtZSBpcyAndXNlcnMnXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCd1c2VyJykgLy8gUmV0dXJucyAndXNlcnMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIG1vZGVsIGRvZXNuJ3QgZXhpc3QgaW4gc2NoZW1hXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgY29sbGVjdGlvbiBpcyBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb2xsZWN0aW9uT3ZlcnJpZGUgb3B0aW9uXG4gICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHNjaGVtYSBtYXBwaW5nLCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IHNsdWdzXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbDogTW9kZWxLZXkpOiBDb2xsZWN0aW9uU2x1ZyB7XG4gICAgLy8gRmlyc3QgdHJ5IHRvIGdldCB0aGUgbW9kZWxOYW1lIGZyb20gc2NoZW1hLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHNjaGVtYT8uW21vZGVsXT8ubW9kZWxOYW1lIHx8IG1vZGVsO1xuICAgIGRlYnVnTG9nKFtcImdldENvbGxlY3Rpb25TbHVnOlwiLCB7IG1vZGVsLCByZXNvbHZlZFNsdWc6IGNvbGxlY3Rpb24gfV0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25TbHVnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgbW9kZWwgaWRlbnRpZmllciB0byBpdHMgQkEgc2NoZW1hIG1vZGVsIGtleS5cbiAgICpcbiAgICogQWNjZXB0cyBlaXRoZXIgYSBCQSBtb2RlbCBrZXkgKFwidXNlclwiKSBvciBhIFBheWxvYWQgY29sbGVjdGlvbiBzbHVnIChcInVzZXJzXCIvXCJtZW1iZXJzXCIpXG4gICAqIGFuZCByZXR1cm5zIHRoZSBjYW5vbmljYWwgQkEgbW9kZWwga2V5IHVzZWQgdG8gaW5kZXggdGhlIHNjaGVtYS5cbiAgICpcbiAgICogVGhpcyBlbmFibGVzIGFkYXB0ZXIgZnVuY3Rpb25zICh0cmFuc2Zvcm1JbnB1dCwgdHJhbnNmb3JtT3V0cHV0LCBjb252ZXJ0V2hlcmVDbGF1c2UpXG4gICAqIHRvIHdvcmsgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBjYWxsZXJzIHBhc3MgYSBCQSBtb2RlbCBrZXkgb3IgYSBQYXlsb2FkIHNsdWcuXG4gICAqL1xuICBjb25zdCBtb2RlbEtleUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsS2V5PigpO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVNb2RlbEtleShtb2RlbDogc3RyaW5nKTogTW9kZWxLZXkge1xuICAgIGNvbnN0IGNhY2hlZCA9IG1vZGVsS2V5Q2FjaGUuZ2V0KG1vZGVsKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgLy8gRGlyZWN0IG1hdGNoIOKAlCBhbHJlYWR5IGEgQkEgbW9kZWwga2V5XG4gICAgaWYgKHNjaGVtYT8uW21vZGVsXSkge1xuICAgICAgbW9kZWxLZXlDYWNoZS5zZXQobW9kZWwsIG1vZGVsIGFzIE1vZGVsS2V5KTtcbiAgICAgIHJldHVybiBtb2RlbCBhcyBNb2RlbEtleTtcbiAgICB9XG5cbiAgICAvLyBSZXZlcnNlIGxvb2t1cCDigJQgZmluZCB0aGUgQkEgbW9kZWwga2V5IHdob3NlIG1vZGVsTmFtZSBtYXRjaGVzIHRoaXMgUGF5bG9hZCBzbHVnXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgaWYgKHZhbHVlLm1vZGVsTmFtZSA9PT0gbW9kZWwpIHtcbiAgICAgICAgbW9kZWxLZXlDYWNoZS5zZXQobW9kZWwsIGtleSBhcyBNb2RlbEtleSk7XG4gICAgICAgIHJldHVybiBrZXkgYXMgTW9kZWxLZXk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gbWF0Y2ggZm91bmQg4oCUIHJldHVybiBhcy1pcyAoY3VzdG9tIGNvbGxlY3Rpb25zIG5vdCBpbiB0aGUgQkEgc2NoZW1hKVxuICAgIHJldHVybiBtb2RlbCBhcyBNb2RlbEtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBmaWVsZCBpbiB0aGUgUGF5bG9hZCBjb2xsZWN0aW9uIGlzIGEgcmVsYXRpb25zaGlwIG9yIHVwbG9hZCBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgUGF5bG9hZCBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25TbHVnIC0gVGhlIHNsdWcgb2YgdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBvciB1cGxvYWQgZmllbGQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgY29uc3QgZmxhdHRlbmVkRmllbGRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgZmxhdHRlbkFsbEZpZWxkcz4+KCk7XG5cbiAgZnVuY3Rpb24gaXNQYXlsb2FkUmVsYXRpb25zaGlwKFxuICAgIHBheWxvYWQ6IEJhc2VQYXlsb2FkLFxuICAgIGNvbGxlY3Rpb25TbHVnOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHBheWxvYWQuY29sbGVjdGlvbnNbY29sbGVjdGlvblNsdWddO1xuICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGZpZWxkcyA9IGZsYXR0ZW5lZEZpZWxkc0NhY2hlLmdldChjb2xsZWN0aW9uU2x1Zyk7XG4gICAgaWYgKCFmaWVsZHMpIHtcbiAgICAgIGZpZWxkcyA9IGZsYXR0ZW5BbGxGaWVsZHMoeyBmaWVsZHM6IGNvbGxlY3Rpb24uY29uZmlnLmZpZWxkcyB9KTtcbiAgICAgIGZsYXR0ZW5lZEZpZWxkc0NhY2hlLnNldChjb2xsZWN0aW9uU2x1ZywgZmllbGRzKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuXG4gICAgcmV0dXJuIGZpZWxkPy50eXBlID09PSBcInJlbGF0aW9uc2hpcFwiIHx8IGZpZWxkPy50eXBlID09PSBcInVwbG9hZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBmaWVsZCB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBuYW1lIGJ5OlxuICAgKiAxLiBQcmVzZXJ2aW5nICdpZCcgb3IgJ19pZCcgZmllbGRzIGFzLWlzIChzcGVjaWFsIGNhc2UgaGFuZGxpbmcpXG4gICAqIDIuIExvb2tpbmcgdXAgdGhlIGZpZWxkIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIGZpZWxkTmFtZVxuICAgKiAzLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgb3JpZ2luYWwgZmllbGQgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10uZmllbGRzWydlbWFpbCddLmZpZWxkTmFtZSBpcyAnZW1haWxBZGRyZXNzJ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnZW1haWwnKSAvLyBSZXR1cm5zICdlbWFpbEFkZHJlc3MnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNwZWNpYWwgY2FzZSBmb3IgSUQgZmllbGRzXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdpZCcpIC8vIEFsd2F5cyByZXR1cm5zICdpZCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgZmllbGQgZG9lc24ndCBleGlzdCBpbiBzY2hlbWEgb3IgaGFzIG5vIGZpZWxkTmFtZSBtYXBwaW5nXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgZmllbGROYW1lIGlzIG92ZXJyaWRkZW4gaW4gdGhlIHBheWxvYWQgY29sbGVjdGlvbiBjb25maWcgdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgZmllbGQgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdldEZpZWxkTmFtZShtb2RlbDogTW9kZWxLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogJ2lkJyBvciAnX2lkJyBpcyBhbHdheXMgcHJlc2VydmVkIGFzLWlzXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdO1xuXG4gICAgLy8gVXNlIHRoZSBjb25maWd1cmVkIGZpZWxkTmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gb3JpZ2luYWxcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZERlZmluaXRpb24/LmZpZWxkTmFtZSB8fCBmaWVsZDtcblxuICAgIC8vIExvZyB0aGUgZmllbGQgcmVzb2x1dGlvbiBmb3IgZGVidWdnaW5nXG4gICAgZGVidWdMb2coW1wiZ2V0RmllbGQ6IFwiLCB7IG1vZGVsLCBvcmlnaW5hbEZpZWxkOiBmaWVsZCwgZmllbGROYW1lIH1dKTtcblxuICAgIHJldHVybiBmaWVsZE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChcbiAgICBmaWVsZEtleTogc3RyaW5nLFxuICAgIHNjaGVtYUZpZWxkczogUmVjb3JkPHN0cmluZywgREJGaWVsZEF0dHJpYnV0ZT5cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGEgc2luZ2xlIElEIHZhbHVlIGZyb20gYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSBpZiBpdCByZXByZXNlbnRzIGEgc2ltcGxlIElEIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSBzaW1wbGUgcXVlcnkgZm9yIGFcbiAgICogc2luZ2xlIGRvY3VtZW50IGJ5IElELiBJdCBzdXBwb3J0cyBib3RoICdpZCcgYW5kICdfaWQnIGZpZWxkcyB3aXRoICdlcXVhbHMnIG9yICdjb250YWlucydcbiAgICogb3BlcmF0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGZldGNoIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgLSBUaGUgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyBUaGUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpIGlmIHRoZSB3aGVyZSBjbGF1c2UgaXMgYSBzaW1wbGUgSUQgcXVlcnksIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzEyMycgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH0pIC8vICcxMjMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgNDU2IGZvciBhIHNpbXBsZSBlcXVhbHMgcXVlcnkgd2l0aCBudW1iZXIgSURcbiAgICogc2luZ2xlSWRRdWVyeSh7IF9pZDogeyBlcXVhbHM6IDQ1NiB9IH0pIC8vIDQ1NlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zICc3ODknIGZvciBhIGNvbnRhaW5zIHF1ZXJ5IHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICogc2luZ2xlSWRRdWVyeSh7IGlkOiB7IGNvbnRhaW5zOiBbJzc4OSddIH0gfSkgLy8gJzc4OSdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBudWxsIGZvciBjb21wbGV4IHF1ZXJpZXNcbiAgICogc2luZ2xlSWRRdWVyeSh7IGFuZDogW3sgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH1dIH0pIC8vIG51bGxcbiAgICovXG4gIGZ1bmN0aW9uIHNpbmdsZUlkUXVlcnkod2hlcmU6IFBheWxvYWRXaGVyZSkge1xuICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSB3aGVyZSBjbGF1c2VzIG9yIGNvbXBsZXggcXVlcmllcyB3aXRoICdhbmQnLydvcicgb3BlcmF0b3JzXG4gICAgaWYgKCF3aGVyZSB8fCBcImFuZFwiIGluIHdoZXJlIHx8IFwib3JcIiBpbiB3aGVyZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLnNvbWUoKGZpZWxkKSA9PiBmaWVsZCBpbiB3aGVyZSkpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBJRCBmaWVsZCBpcyBiZWluZyB1c2VkIChzdXBwb3J0IGJvdGggJ2lkJyBhbmQgJ19pZCcpXG4gICAgICBjb25zdCBpZEZpZWxkID0gXCJpZFwiIGluIHdoZXJlID8gXCJpZFwiIDogXCJfaWRcIjtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHdoZXJlW2lkRmllbGRdO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmXG4gICAgICAgIFwiZXF1YWxzXCIgaW4gY29uZGl0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uZXF1YWxzO1xuICAgICAgICAvLyBPbmx5IHJldHVybiBzdHJpbmcgb3IgbnVtYmVyIElEIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjb250YWlucyBvcGVyYXRvciBjYXNlIHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgY29uZGl0aW9uICYmXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICBcImNvbnRhaW5zXCIgaW4gY29uZGl0aW9uICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLmNvbnRhaW5zKSAmJlxuICAgICAgICBjb25kaXRpb24uY29udGFpbnMubGVuZ3RoID09PSAxXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY29udGFpbnNbMF07XG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gdmFsaWQgSUQgcXVlcnkgd2FzIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnk7XG4gICAgaXNSZWxhdGVkRmllbGQ6IGJvb2xlYW47XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gIH0pIHtcbiAgICAvLyBTa2lwIHByb2Nlc3NpbmcgZm9yIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgaWRUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCxcbiAgICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XG4gICAgICAgICAgXSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBpZFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCxcbiAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gc3RyaW5nSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGlkVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICBgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsXG4gICAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBwYXJzZWQgfVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIGlkVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nSWQgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLFxuICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHN0cmluZ0lkIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBzdHJpbmdJZDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGFycmF5IG9mIElEcyAtIG1hcCBlYWNoIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKChpZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgbnVsbC91bmRlZmluZWQgdmFsdWVzIGluIGFycmF5c1xuICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gaWQ7XG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGlkKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VkKSA/IHBhcnNlZCA6IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSBcInRleHRcIiAmJiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSByb2xlIGZpZWxkcyAoQ29taW5nIGZyb20gYmV0dGVyIGF1dGgsIHdpbGwgYmUgYSBzaW5nbGUgc3RyaW5nIHNlcGFyYXRlZCBieSBjb21tYXMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHJvbGVzKVxuICAgIGlmIChrZXkgPT09IFwicm9sZVwiIHx8IGtleSA9PT0gXCJyb2xlc1wiKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgocm9sZTogc3RyaW5nKSA9PlxuICAgICAgICAgIHR5cGVvZiByb2xlID09PSBcInN0cmluZ1wiID8gcm9sZS50cmltKCkudG9Mb3dlckNhc2UoKSA6IHJvbGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KFwiLFwiKS5tYXAoKHJvbGU6IHN0cmluZykgPT4gcm9sZS50cmltKCkudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG9yaWdpbmFsIHZhbHVlIGlmIG5vIGNvbnZlcnNpb24gd2FzIG5lZWRlZCBvciBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoIHRvIFBheWxvYWQgQ01TIGZvcm1hdFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXM6XG4gICAqIDEuIEZpZWxkIG5hbWUgbWFwcGluZyBhY2NvcmRpbmcgdG8gc2NoZW1hIGRlZmluaXRpb25zXG4gICAqIDIuIElEIHR5cGUgY29udmVyc2lvbiBmb3IgcmVsYXRpb25zaGlwIGZpZWxkc1xuICAgKiAzLiBQcm9wZXIgZGF0YSBub3JtYWxpemF0aW9uIGJhc2VkIG9uIGZpZWxkIHR5cGVzXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGlucHV0IGRhdGEgZnJvbSBiZXR0ZXItYXV0aFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSBpbiB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcmV0dXJucyBUcmFuc2Zvcm1lZCBkYXRhIGNvbXBhdGlibGUgd2l0aCBQYXlsb2FkIENNU1xuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtSW5wdXQoe1xuICAgIGRhdGEsXG4gICAgbW9kZWw6IHJhd01vZGVsLFxuICAgIGlkVHlwZSxcbiAgICBwYXlsb2FkXG4gIH06IHtcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG1vZGVsOiBNb2RlbEtleTtcbiAgICBpZFR5cGU6IFwibnVtYmVyXCIgfCBcInRleHRcIjtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcmVzb2x2ZU1vZGVsS2V5KHJhd01vZGVsKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgZGF0YVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gU2tpcCB1bmRlZmluZWQgdmFsdWVzIChidXQgYWxsb3cgbnVsbCB0aHJvdWdoIHRvIGNsZWFyIGZpZWxkcylcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBtYXBwZWQgZmllbGQgbmFtZSBmcm9tIHNjaGVtYSAoaWYgYW55KVxuICAgICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZTtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkTmFtZSB8fCBrZXk7XG5cbiAgICAgIC8vIENoZWNrIFBheWxvYWQgc2NoZW1hIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgIGNvbnN0IGlzUGF5bG9hZFJlbCA9IGlzUGF5bG9hZFJlbGF0aW9uc2hpcChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICAgIGNvbnN0IGlzUmVsYXRlZEZpZWxkID1cbiAgICAgICAgaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykgfHwgaXNQYXlsb2FkUmVsO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdGhlIGRhdGEgdmFsdWUgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgSUQgdHlwZVxuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVEYXRhKHtcbiAgICAgICAgaWRUeXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpc1JlbGF0ZWRGaWVsZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcbiAgICAgIHRyYW5zZm9ybWVkRGF0YVt0YXJnZXRGaWVsZEtleV0gPSBub3JtYWxpemVkRGF0YTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBQYXlsb2FkIGpvaW4gcmVzdWx0IChoYXMgZG9jcyBhcnJheSBzdHJ1Y3R1cmUpXG4gICAqL1xuICBmdW5jdGlvbiBpc0pvaW5SZXN1bHQoXG4gICAgdmFsdWU6IGFueVxuICApOiB2YWx1ZSBpcyB7IGRvY3M6IGFueVtdOyBoYXNOZXh0UGFnZT86IGJvb2xlYW47IHRvdGFsRG9jcz86IG51bWJlciB9IHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJkb2NzXCIgaW4gdmFsdWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUuZG9jcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGEgUGF5bG9hZCBqb2luIHJlc3VsdCB0byBqdXN0IHRoZSBhcnJheSBvZiBkb2N1bWVudHMuXG4gICAqIEhhbmRsZXMgYm90aCBkaXJlY3QgZG9jdW1lbnRzIGFuZCBwb2x5bW9ycGhpYyB7IHJlbGF0aW9uVG8sIHZhbHVlIH0gZm9ybWF0LlxuICAgKi9cbiAgZnVuY3Rpb24gZmxhdHRlbkpvaW5SZXN1bHQoam9pblJlc3VsdDogeyBkb2NzOiBhbnlbXSB9KTogYW55W10ge1xuICAgIHJldHVybiBqb2luUmVzdWx0LmRvY3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgcG9seW1vcnBoaWMgam9pbiBmb3JtYXQ6IHsgcmVsYXRpb25Ubzogc3RyaW5nLCB2YWx1ZTogZG9jIH1cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSAmJlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInZhbHVlXCIgaW4gaXRlbSAmJlxuICAgICAgICBcInJlbGF0aW9uVG9cIiBpbiBpdGVtXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiA0LiBKb2luIFJlc3VsdCBGbGF0dGVuaW5nOiBDb252ZXJ0cyBQYXlsb2FkJ3MgeyBkb2NzOiBbLi4uXSB9IGpvaW4gZm9ybWF0IHRvIHBsYWluIGFycmF5c1xuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oe1xuICAgIGRvYyxcbiAgICBtb2RlbDogcmF3TW9kZWwsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgZG9jOiBUO1xuICAgIG1vZGVsOiBNb2RlbEtleTtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFQge1xuICAgIGlmICghZG9jIHx8IHR5cGVvZiBkb2MgIT09IFwib2JqZWN0XCIpIHJldHVybiBkb2M7XG5cbiAgICBjb25zdCBtb2RlbCA9IHJlc29sdmVNb2RlbEtleShyYXdNb2RlbCk7XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5kb2MgfTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIElkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCBjdXN0b20gZmllbGQgbmFtZSBtYXBwaW5nc1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcEZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYUZpZWxkcykuZmlsdGVyKChba2V5XSkgPT4ge1xuICAgICAgICBpZiAoaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIEFsc28gY2hlY2sgcGF5bG9hZCBzY2hlbWFcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZSB8fCBrZXk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpO1xuICAgICAgICByZXR1cm4gaXNQYXlsb2FkUmVsYXRpb25zaGlwKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBmaWVsZE5hbWUpO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGRhdGVGaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFGaWVsZHMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUudHlwZSA9PT0gXCJkYXRlXCIpXG4gICAgKTtcblxuICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSBhbGwgdGhlIGZpZWxkcyBrZXlzIGFyZSBjb3JyZWN0XG4gICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWUoXG4gICAgICAgIGdldENvbGxlY3Rpb25CeU1vZGVsS2V5KHBheWxvYWQuY29sbGVjdGlvbnMsIG1vZGVsKSxcbiAgICAgICAga2V5XG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldEZpZWxkS2V5ICE9PSBrZXkpIHtcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IHJlc3VsdFtrZXldO1xuICAgICAgICBkZWxldGUgcmVzdWx0W2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZW50cmllcyhkb2MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdGFyZ2V0RmllbGRLZXkgPSBnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZShcbiAgICAgICAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkocGF5bG9hZC5jb2xsZWN0aW9ucywgbW9kZWwpLFxuICAgICAgICBrZXlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbnZlcnQgSUQgZmllbGRzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggY29tcGF0aWJpbGl0eVxuICAgICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblx0ICAgIFxuICAgICAgLy8gQ29udmVydCByb2xlIGFycmF5IHRvIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdcbiAgICAgIGlmICgodGFyZ2V0RmllbGRLZXkgPT09IFwicm9sZVwiIHx8IHRhcmdldEZpZWxkS2V5ID09PSBcInJvbGVzXCIpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSB2YWx1ZS5qb2luKFwiLFwiKVxuXHRcdFx0fVxuICAgICAgXG4gICAgICAvLyBGbGF0dGVuIGpvaW4gcmVzdWx0cyBmcm9tIHsgZG9jczogWy4uLl0gfSB0byBwbGFpbiBhcnJheXMsXG4gICAgICAvLyB0aGVuIHRyYW5zZm9ybSBlYWNoIG5lc3RlZCBkb2N1bWVudCBzbyByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAgICAvLyAoZS5nLiBtZW1iZXIudXNlcklkKSBhcmUgbm9ybWFsaXplZCB0byBzdHJpbmcgSURzIGZvciBCZXR0ZXJBdXRoLlxuICAgICAgaWYgKGlzSm9pblJlc3VsdCh2YWx1ZSkpIHtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIFwidHJhbnNmb3JtT3V0cHV0OiBmbGF0dGVuaW5nIGpvaW4gcmVzdWx0XCIsXG4gICAgICAgICAgeyBrZXksIHRhcmdldEZpZWxkS2V5LCBpc0FycmF5OiBBcnJheS5pc0FycmF5KHZhbHVlLmRvY3MpIH1cbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IGZsYXREb2NzID0gZmxhdHRlbkpvaW5SZXN1bHQodmFsdWUpO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgQkEgbW9kZWwga2V5IGZvciB0aGUgam9pbmVkIGNvbGxlY3Rpb24uXG4gICAgICAgIC8vIFRoZSBqb2luIGZpZWxkIG9uIHRoZSBwYXJlbnQgY29sbGVjdGlvbiBwb2ludHMgdG8gYSB0YXJnZXQgY29sbGVjdGlvbjtcbiAgICAgICAgLy8gcmVzb2x2ZSB0aGF0IHNsdWcgYmFjayB0byBhIEJBIG1vZGVsIGtleSBzbyB3ZSBjYW4gdHJhbnNmb3JtIG5lc3RlZCBkb2NzLlxuICAgICAgICBjb25zdCBwYXJlbnRDb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgICAgY29uc3QgcGFyZW50Q29sbGVjdGlvbiA9IHBheWxvYWQuY29sbGVjdGlvbnNbcGFyZW50Q29sbGVjdGlvblNsdWddO1xuICAgICAgICBpZiAocGFyZW50Q29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IGpvaW5GaWVsZCA9IGZsYXR0ZW5BbGxGaWVsZHMoeyBmaWVsZHM6IHBhcmVudENvbGxlY3Rpb24uY29uZmlnLmZpZWxkcyB9KVxuICAgICAgICAgICAgLmZpbmQoKGY6IGFueSkgPT4gZi50eXBlID09PSBcImpvaW5cIiAmJiBmLm5hbWUgPT09IGtleSk7XG4gICAgICAgICAgaWYgKGpvaW5GaWVsZCAmJiBcImNvbGxlY3Rpb25cIiBpbiBqb2luRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGpvaW5lZE1vZGVsS2V5ID0gcmVzb2x2ZU1vZGVsS2V5KGpvaW5GaWVsZC5jb2xsZWN0aW9uIGFzIHN0cmluZyk7XG4gICAgICAgICAgICByZXN1bHRbdGFyZ2V0RmllbGRLZXldID0gZmxhdERvY3MubWFwKChkOiBhbnkpID0+XG4gICAgICAgICAgICAgIHRyYW5zZm9ybU91dHB1dCh7IGRvYzogZCwgbW9kZWw6IGpvaW5lZE1vZGVsS2V5LCBwYXlsb2FkIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBmbGF0RG9jcztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgcmVsYXRpb25zaGlwIGZpZWxkcyAoYm90aCByZW5hbWVkIGFuZCBub24tcmVuYW1lZClcbiAgICAgIGNvbnN0IG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5ID0gT2JqZWN0LmtleXMocmVsYXRpb25zaGlwRmllbGRzKS5maW5kKFxuICAgICAgICAoaykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hcHBlZE5hbWUgPSByZWxhdGlvbnNoaXBGaWVsZHNba10uZmllbGROYW1lIHx8IGs7XG4gICAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWUgPT09IGtleTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSkge1xuICAgICAgICBub3JtYWxpemVEb2N1bWVudElkcyhyZXN1bHQsIG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5LCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZGF0ZSBmaWVsZHMgKGJvdGggcmVuYW1lZCBhbmQgbm9uLXJlbmFtZWQpXG4gICAgICBjb25zdCBvcmlnaW5hbERhdGVGaWVsZEtleSA9IE9iamVjdC5rZXlzKGRhdGVGaWVsZHMpLmZpbmQoKGspID0+IHtcbiAgICAgICAgY29uc3QgbWFwcGVkTmFtZSA9IGRhdGVGaWVsZHNba10uZmllbGROYW1lIHx8IGs7XG4gICAgICAgIHJldHVybiBtYXBwZWROYW1lID09PSBrZXk7XG4gICAgICB9KTtcbiAgICAgIGlmIChvcmlnaW5hbERhdGVGaWVsZEtleSkge1xuICAgICAgICAvLyBDb252ZXJ0IElTTyBkYXRlIHN0cmluZ3MgdG8gRGF0ZSBvYmplY3RzIGZvciBCZXR0ZXJBdXRoXG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN0cmlwIFBheWxvYWQtaW50ZXJuYWwgZmllbGRzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIHNjaGVtYS5cbiAgICAvLyBQYXlsb2FkIGluamVjdHMgZmllbGRzIGxpa2UgYGNvbGxlY3Rpb25gIGFuZCBpbnRlcm5hbCBtZXRhZGF0YVxuICAgIC8vIHRoYXQgY2FsbGVycyBkb24ndCBleHBlY3QuIFdlIGFsbG93IGJvdGggQkEgc2NoZW1hIGZpZWxkcyBBTkRcbiAgICAvLyBQYXlsb2FkIGNvbGxlY3Rpb24gZmllbGRzIOKAlCB0aGlzIGVuc3VyZXMgcGx1Z2luLWFkZGVkIGZpZWxkc1xuICAgIC8vIChlLmcuIHJvbGUvdG9rZW4vdXJsIG9uIGFkbWluLWludml0YXRpb25zKSBzdXJ2aXZlIGV2ZW4gd2hlblxuICAgIC8vIHRoZSBCQSBzY2hlbWEgZG9lc24ndCBkZWNsYXJlIHRoZW0uXG4gICAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYUZpZWxkcykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbCk7XG4gICAgICBsZXQgcGF5bG9hZEZpZWxkTmFtZXMgPSBmbGF0dGVuZWRGaWVsZHNDYWNoZS5nZXQoY29sbGVjdGlvblNsdWcpO1xuICAgICAgaWYgKCFwYXlsb2FkRmllbGROYW1lcykge1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gcGF5bG9hZC5jb2xsZWN0aW9uc1tjb2xsZWN0aW9uU2x1Z107XG4gICAgICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgcGF5bG9hZEZpZWxkTmFtZXMgPSBmbGF0dGVuQWxsRmllbGRzKHsgZmllbGRzOiBjb2xsZWN0aW9uLmNvbmZpZy5maWVsZHMgfSk7XG4gICAgICAgICAgZmxhdHRlbmVkRmllbGRzQ2FjaGUuc2V0KGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkRmllbGROYW1lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHBheWxvYWROYW1lcyA9IG5ldyBTZXQocGF5bG9hZEZpZWxkTmFtZXM/Lm1hcCgoZikgPT4gZi5uYW1lKSA/PyBbXSk7XG4gICAgICBjb25zdCBhbGxvd2VkS2V5cyA9IG5ldyBTZXQoW1wiaWRcIiwgXCJfaWRcIiwgLi4uT2JqZWN0LmtleXMoc2NoZW1hRmllbGRzKSwgLi4ucGF5bG9hZE5hbWVzXSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZXN1bHQpKSB7XG4gICAgICAgIGlmICghYWxsb3dlZEtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBkZWxldGUgcmVzdWx0W2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBJRCBmaWVsZHMgZm9yIGJvdGggcHJpbWFyeSBhbmQgcmVsYXRpb25zaGlwIGRvY3VtZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIGNvbnNpc3RlbnQgSUQgaGFuZGxpbmcgYmV0d2VlbiBCZXR0ZXJBdXRoIGFuZCBQYXlsb2FkIENNUyBieTpcbiAgICogMS4gQ29udmVydGluZyBhbGwgSURzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggKHN0b3JlZCBpbiBvcmlnaW5hbEtleSlcbiAgICogMi4gUHJlc2VydmluZyBvcmlnaW5hbCBJRCB0eXBlcyBmb3IgUGF5bG9hZCBDTVMgKHN0b3JlZCBpbiBmaWVsZE5hbWUpXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHZhcmlvdXMgSUQgZm9ybWF0czpcbiAgICogLSBQcmltaXRpdmUgdmFsdWVzIChzdHJpbmcvbnVtYmVyIElEcylcbiAgICogLSBPYmplY3QgcmVmZXJlbmNlcyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICogLSBBcnJheXMgb2YgZWl0aGVyIHByaW1pdGl2ZSBJRHMgb3Igb2JqZWN0IHJlZmVyZW5jZXNcbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgb2JqZWN0IGJlaW5nIHRyYW5zZm9ybWVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbEtleSAtIFRoZSBvcmlnaW5hbCBmaWVsZCBrZXkgZnJvbSBCZXR0ZXJBdXRoIHNjaGVtYVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIHJlbmFtZWQgZmllbGQgYXMgdXNlZCBpbiBQYXlsb2FkIENNU1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgSUQgdmFsdWUgdG8gbm9ybWFsaXplIChwcmltaXRpdmUsIG9iamVjdCwgb3IgYXJyYXkpXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEb2N1bWVudElkcyhcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgb3JpZ2luYWxLZXk6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IHZvaWQge1xuICAgIC8vIENhc2UgMTogUHJpbWl0aXZlIElEIHZhbHVlIChzdHJpbmcgb3IgbnVtYmVyKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogQWx3YXlzIHVzZSBzdHJpbmcgSURzXG4gICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBLZWVwIG9yaWdpbmFsIHR5cGVcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAyOiBPYmplY3Qgd2l0aCBJRCBwcm9wZXJ0eVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgXCJpZFwiIGluIHZhbHVlXG4gICAgKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogRXh0cmFjdCBhbmQgc3RyaW5naWZ5IHRoZSBJRFxuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZS5pZCk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcG9wdWxhdGVkIHJlbGF0aW9uc2hpcCBvYmplY3Qgc28gam9pbnMgcmV0dXJuIGZ1bGwgZG9jdW1lbnRzXG4gICAgICByZXN1bHRbZmllbGROYW1lXSA9IHtcbiAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIGlkOiBTdHJpbmcodmFsdWUuaWQpXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhc2UgMzogQXJyYXkgb2YgSURzIG9yIHJlZmVyZW5jZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgaWYgYXJyYXkgY29udGFpbnMgb2JqZWN0cyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuZXZlcnkoXG4gICAgICAgICAgKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmIGl0ZW0gIT09IG51bGwgJiYgXCJpZFwiIGluIGl0ZW1cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIG9iamVjdHMgd2l0aCBJRHNcbiAgICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0uaWQpKTtcbiAgICAgICAgLy8gS2VlcCBqb2luZWQgZG9jdW1lbnRzIGludGFjdCB3aGlsZSBub3JtYWxpemluZyBJRCB0eXBlXG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmlkKVxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBcnJheSBvZiBwcmltaXRpdmUgSURzXG4gICAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiBpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBJZiB2YWx1ZSBkb2Vzbid0IG1hdGNoIGFueSBleHBlY3RlZCBmb3JtYXQsIG5vIGNoYW5nZXMgYXJlIG1hZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEJldHRlckF1dGggb3BlcmF0b3IgdG8gdGhlIGVxdWl2YWxlbnQgUGF5bG9hZCBDTVMgcXVlcnkgb3BlcmF0b3JcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBtYXBzIHN0YW5kYXJkIHF1ZXJ5IG9wZXJhdG9ycyBmcm9tIEJldHRlckF1dGgncyBmb3JtYXQgdG9cbiAgICogdGhlIHNwZWNpZmljIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdG9yIC0gVGhlIEJldHRlckF1dGggb3BlcmF0b3Igc3RyaW5nIChlLmcuLCAnZXEnLCAnZ3QnLCAnY29udGFpbnMnKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgdXNlZCB3aXRoIHRoZSBvcGVyYXRvclxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgUGF5bG9hZC1jb21wYXRpYmxlIG9wZXJhdG9yIGFuZCB2YWx1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIHsgZXF1YWxzOiAndGVzdEBleGFtcGxlLmNvbScgfVxuICAgKiBvcGVyYXRvclRvUGF5bG9hZCgnZXEnLCAndGVzdEBleGFtcGxlLmNvbScpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBncmVhdGVyX3RoYW46IDEwMCB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdndCcsIDEwMClcbiAgICovXG4gIGZ1bmN0aW9uIG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcIm5lXCI6XG4gICAgICAgIHJldHVybiB7IG5vdF9lcXVhbHM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiZ3RcIjpcbiAgICAgICAgcmV0dXJuIHsgZ3JlYXRlcl90aGFuOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW5fZXF1YWw6IHZhbHVlIH07XG4gICAgICBjYXNlIFwibHRcIjpcbiAgICAgICAgcmV0dXJuIHsgbGVzc190aGFuOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW5fZXF1YWw6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiY29udGFpbnNcIjpcbiAgICAgICAgcmV0dXJuIHsgY29udGFpbnM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiaW5cIjpcbiAgICAgICAgcmV0dXJuIHsgaW46IHZhbHVlIH07XG4gICAgICBjYXNlIFwic3RhcnRzX3dpdGhcIjpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCR7dmFsdWV9JWAgfTtcbiAgICAgIGNhc2UgXCJlbmRzX3dpdGhcIjpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCUke3ZhbHVlfWAgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBlcXVhbHMgZm9yIHVucmVjb2duaXplZCBvcGVyYXRvcnNcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHdoZXJlIGNsYXVzZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBiYXNlZCBvbiBmaWVsZCBuYW1lIGFuZCBJRCB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRocmVlIG1haW4gc2NlbmFyaW9zOlxuICAgKiAxLiBJRCBmaWVsZCBjb252ZXJzaW9uIC0gZW5zdXJlcyBJRHMgbWF0Y2ggdGhlIGRhdGFiYXNlJ3MgZXhwZWN0ZWQgdHlwZSAobnVtYmVyIG9yIHN0cmluZylcbiAgICogMi4gUmVsYXRpb25zaGlwIGZpZWxkIGNvbnZlcnNpb24gLSBlbnN1cmVzIGZvcmVpZ24ga2V5IHZhbHVlcyBtYXRjaCB0aGUgZXhwZWN0ZWQgSUQgdHlwZVxuICAgKiAzLiBPYmplY3Qgd2l0aCBlbWJlZGRlZCBJRCAtIGV4dHJhY3RzIGFuZCBjb252ZXJ0cyB0aGUgSUQgcHJvcGVydHkgZnJvbSBvYmplY3RzXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0IChjYW4gYmUgcHJpbWl0aXZlLCBvYmplY3Qgd2l0aCBJRCwgb3IgYXJyYXkpXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgcXVlcmllZFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIGZvciBzY2hlbWEgbG9va3Vwc1xuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgdmFsdWUgYXBwcm9wcmlhdGUgZm9yIHRoZSBkYXRhYmFzZSBxdWVyeVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFdoZXJlVmFsdWUoe1xuICAgIHZhbHVlLFxuICAgIGZpZWxkTmFtZSxcbiAgICBvcmlnaW5hbEZpZWxkS2V5LFxuICAgIG1vZGVsLFxuICAgIGlkVHlwZVxuICB9OiB7XG4gICAgdmFsdWU6IGFueTtcbiAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICBvcmlnaW5hbEZpZWxkS2V5Pzogc3RyaW5nO1xuICAgIG1vZGVsOiBNb2RlbEtleTtcbiAgICBpZFR5cGU6IFwibnVtYmVyXCIgfCBcInRleHRcIjtcbiAgfSk6IGFueSB7XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gc2NoZW1hPy5bbW9kZWxdPy5maWVsZHMgPz8ge307XG4gICAgY29uc3QgbG9va3VwS2V5ID0gb3JpZ2luYWxGaWVsZEtleSA/PyBmaWVsZE5hbWU7XG4gICAgY29uc3QgbmVlZHNJZENvbnZlcnNpb24gPVxuICAgICAgW1wiaWRcIiwgXCJfaWRcIl0uaW5jbHVkZXMoZmllbGROYW1lKSB8fFxuICAgICAgaXNSZWxhdGlvbnNoaXBGaWVsZChsb29rdXBLZXksIHNjaGVtYUZpZWxkcyk7XG5cbiAgICBpZiAoIW5lZWRzSWRDb252ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAwOiBWYWx1ZSBpcyBhbiBhcnJheSAoZS5nLiBmb3IgdGhlIGBpbmAgb3BlcmF0b3IpIOKAlCBjb252ZXJ0IGVhY2ggZWxlbWVudFxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcCgodikgPT5cbiAgICAgICAgY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICAgIHZhbHVlOiB2LFxuICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICBvcmlnaW5hbEZpZWxkS2V5LFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIGlkVHlwZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDYXNlIDE6IFZhbHVlIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFuIElEIHByb3BlcnR5XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcImlkXCIgaW4gdmFsdWUpIHtcbiAgICAgIGNvbnN0IGlkID0gdmFsdWUuaWQ7XG4gICAgICBpZiAoaWRUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBudW1JZCA9IE51bWJlcihpZCk7XG4gICAgICAgIHJldHVybiAhaXNOYU4obnVtSWQpID8gbnVtSWQgOiBpZDtcbiAgICAgIH1cbiAgICAgIGlmIChpZFR5cGUgPT09IFwidGV4dFwiICYmIHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGlkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyBDYXNlIDI6IFZhbHVlIGlzIGEgc3RhbmRhbG9uZSBJRCB0aGF0IG5lZWRzIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChcbiAgICAgIGlkVHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAhaXNOYU4oTnVtYmVyKHZhbHVlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaWRUeXBlID09PSBcInRleHRcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBCZXR0ZXIgQXV0aCB3aGVyZSBjbGF1c2VzIHRvIFBheWxvYWQgQ01TIGNvbXBhdGlibGUgd2hlcmUgY29uZGl0aW9uc1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIEJldHRlciBBdXRoIHF1ZXJ5IGZvcm1hdCBpbnRvIFBheWxvYWQncyBxdWVyeSBmb3JtYXQsXG4gICAqIGhhbmRsaW5nIGZpZWxkIG5hbWUgbWFwcGluZywgdmFsdWUgdHlwZSBjb252ZXJzaW9uLCBhbmQgbG9naWNhbCBvcGVyYXRvcnMgKEFORC9PUikuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHRocmVlIG1haW4gY2FzZXM6XG4gICAqIDEuIEVtcHR5IG9yIHVuZGVmaW5lZCB3aGVyZSBjbGF1c2UgLSByZXR1cm5zIGVtcHR5IG9iamVjdFxuICAgKiAyLiBTaW5nbGUgY29uZGl0aW9uIC0gY29udmVydHMgdG8gYSBzaW1wbGUgZmllbGQtdmFsdWUgcGFpclxuICAgKiAzLiBNdWx0aXBsZSBjb25kaXRpb25zIC0gZ3JvdXBzIGJ5IEFORC9PUiBjb25uZWN0b3JzIGFuZCBidWlsZHMgYSBjb21wbGV4IHF1ZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZGF0YWJhc2UgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSB3aGVyZSAtIEFycmF5IG9mIEJldHRlciBBdXRoIHdoZXJlIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgd2hlcmUgY2xhdXNlIG9iamVjdFxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICBpZFR5cGUsXG4gICAgbW9kZWw6IHJhd01vZGVsLFxuICAgIHdoZXJlLFxuICAgIHBheWxvYWRcbiAgfToge1xuICAgIGlkVHlwZTogXCJudW1iZXJcIiB8IFwidGV4dFwiO1xuICAgIG1vZGVsOiBNb2RlbEtleTtcbiAgICB3aGVyZT86IFdoZXJlW107XG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWQ7XG4gIH0pOiBQYXlsb2FkV2hlcmUge1xuICAgIGNvbnN0IG1vZGVsID0gcmVzb2x2ZU1vZGVsS2V5KHJhd01vZGVsKTtcbiAgICAvLyBIYW5kbGUgZW1wdHkgd2hlcmUgY2xhdXNlXG4gICAgaWYgKCF3aGVyZSkgcmV0dXJuIHt9O1xuXG4gICAgZnVuY3Rpb24gZ2V0UGF5bG9hZEZpZWxkTmFtZShmaWVsZEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQoXG4gICAgICAgIGdldENvbGxlY3Rpb25CeU1vZGVsS2V5KHBheWxvYWQuY29sbGVjdGlvbnMsIG1vZGVsKSxcbiAgICAgICAgZmllbGRLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNpbmdsZSBjb25kaXRpb24gY2FzZSBmb3Igb3B0aW1pemF0aW9uXG4gICAgaWYgKHdoZXJlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdyA9IHdoZXJlWzBdO1xuICAgICAgaWYgKCF3KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFwIGZpZWxkIG5hbWUgYWNjb3JkaW5nIHRvIHNjaGVtYSBhbmQgY29udmVydCB2YWx1ZSB0byBhcHByb3ByaWF0ZSB0eXBlXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpO1xuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgIHZhbHVlOiB3LnZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIG9yaWdpbmFsRmllbGRLZXk6IHcuZmllbGQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIFBheWxvYWQgd2hlcmUgY29uZGl0aW9uIHdpdGggcHJvcGVyIG9wZXJhdG9yXG4gICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZChcbiAgICAgICAgICB3Lm9wZXJhdG9yID8/IFwiXCIsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgY29uZGl0aW9ucyBieSBzZXBhcmF0aW5nIEFORC9PUiBjbGF1c2VzXG4gICAgLy8gRGVmYXVsdCB0byBBTkQgaWYgbm8gY29ubmVjdG9yIGlzIHNwZWNpZmllZFxuICAgIGNvbnN0IGFuZCA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09IFwiQU5EXCIgfHwgIXcuY29ubmVjdG9yKTtcbiAgICBjb25zdCBvciA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09IFwiT1JcIik7XG5cbiAgICAvLyBQcm9jZXNzIEFORCBjb25kaXRpb25zXG4gICAgY29uc3QgYW5kQ2xhdXNlID0gYW5kLm1hcCgodykgPT4ge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBvcmlnaW5hbEZpZWxkS2V5OiB3LmZpZWxkLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZChcbiAgICAgICAgICB3Lm9wZXJhdG9yID8/IFwiXCIsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFByb2Nlc3MgT1IgY29uZGl0aW9uc1xuICAgIGNvbnN0IG9yQ2xhdXNlID0gb3IubWFwKCh3KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpO1xuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgIHZhbHVlOiB3LnZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIG9yaWdpbmFsRmllbGRLZXk6IHcuZmllbGQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2dldFBheWxvYWRGaWVsZE5hbWUoZmllbGROYW1lKV06IG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgICAgICAgIHcub3BlcmF0b3IgPz8gXCJcIixcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQ29tYmluZSBBTkQgYW5kIE9SIGNsYXVzZXMgaW50byBmaW5hbCBQYXlsb2FkIHdoZXJlIG9iamVjdFxuICAgIC8vIE9ubHkgaW5jbHVkZSBub24tZW1wdHkgY2xhdXNlIGFycmF5c1xuICAgIHJldHVybiB7XG4gICAgICAuLi4oYW5kQ2xhdXNlLmxlbmd0aCA/IHsgQU5EOiBhbmRDbGF1c2UgfSA6IHt9KSxcbiAgICAgIC4uLihvckNsYXVzZS5sZW5ndGggPyB7IE9SOiBvckNsYXVzZSB9IDoge30pXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJldHRlci1hdXRoIHNlbGVjdCBhcnJheSB0byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIGJldHRlci1hdXRoIHNlbGVjdCBhcnJheSAod2hpY2ggY29udGFpbnMgZmllbGQgbmFtZXMpXG4gICAqIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IEFQSSAoYW4gb2JqZWN0IHdpdGggZmllbGQgbmFtZXMgYXMga2V5c1xuICAgKiBhbmQgYm9vbGVhbiB0cnVlIGFzIHZhbHVlcykuXG4gICAqXG4gICAqIEl0IGFsc28gaGFuZGxlcyBmaWVsZCBuYW1lIG1hcHBpbmcgYmV0d2VlbiBiZXR0ZXItYXV0aCBzY2hlbWEgYW5kIFBheWxvYWQgY29sbGVjdGlvbnNcbiAgICogYnkgdXNpbmcgdGhlIGdldEZpZWxkTmFtZSBoZWxwZXIgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCBmaWVsZCBuYW1lcy5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsL2NvbGxlY3Rpb24gbmFtZSB0byBnZXQgZmllbGQgbWFwcGluZ3MgZnJvbVxuICAgKiBAcGFyYW0gc2VsZWN0IC0gT3B0aW9uYWwgYXJyYXkgb2YgZmllbGQgbmFtZXMgdG8gc2VsZWN0XG4gICAqIEByZXR1cm5zIEEgUGF5bG9hZC1jb21wYXRpYmxlIHNlbGVjdCBvYmplY3Qgb3IgdW5kZWZpbmVkIGlmIG5vIGZpZWxkcyB0byBzZWxlY3RcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5wdXQ6IFsnZW1haWwnLCAnbmFtZSddXG4gICAqIC8vIE91dHB1dDogeyBlbWFpbDogdHJ1ZSwgbmFtZTogdHJ1ZSB9XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U2VsZWN0KFxuICAgIHJhd01vZGVsOiBNb2RlbEtleSxcbiAgICBzZWxlY3Q/OiBzdHJpbmdbXSxcbiAgICBwYXlsb2FkPzogQmFzZVBheWxvYWRcbiAgKSB7XG4gICAgY29uc3QgbW9kZWwgPSByZXNvbHZlTW9kZWxLZXkocmF3TW9kZWwpO1xuICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgc2VsZWN0IGlzIGVtcHR5IG9yIG5vdCBwcm92aWRlZFxuICAgIGlmICghc2VsZWN0IHx8IHNlbGVjdC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBUcmFuc2Zvcm0gdGhlIGFycmF5IG9mIGZpZWxkIG5hbWVzIGludG8gYSBQYXlsb2FkIHNlbGVjdCBvYmplY3RcbiAgICAvLyBhcHBseWluZyBib3RoIHNjaGVtYS1sZXZlbCBhbmQgY29sbGVjdGlvbi1sZXZlbCBmaWVsZCBuYW1lIG1hcHBpbmdcbiAgICByZXR1cm4gc2VsZWN0LnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCBmaWVsZCk7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBwYXlsb2FkXG4gICAgICAgID8gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICAgICAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkocGF5bG9hZC5jb2xsZWN0aW9ucywgbW9kZWwpLFxuICAgICAgICAgICAgc2NoZW1hRmllbGROYW1lXG4gICAgICAgICAgKVxuICAgICAgICA6IHNjaGVtYUZpZWxkTmFtZTtcbiAgICAgIHJldHVybiB7IC4uLmFjYywgW2ZpZWxkTmFtZV06IHRydWUgfTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiZXR0ZXItYXV0aCBzb3J0IG9iamVjdCB0byBhIFBheWxvYWQgc29ydCBzdHJpbmdcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBiZXR0ZXItYXV0aCBzb3J0IG9iamVjdCAod2hpY2ggY29udGFpbnMgZmllbGQgbmFtZSBhbmQgZGlyZWN0aW9uKVxuICAgKiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBBUEkgKGEgc3RyaW5nIHdpdGggb3B0aW9uYWwgJy0nIHByZWZpeCBmb3IgZGVzY2VuZGluZyBvcmRlcikuXG4gICAqXG4gICAqIEl0IGFsc28gaGFuZGxlcyBmaWVsZCBuYW1lIG1hcHBpbmcgYmV0d2VlbiBiZXR0ZXItYXV0aCBzY2hlbWEgYW5kIFBheWxvYWQgY29sbGVjdGlvbnNcbiAgICogYnkgdXNpbmcgdGhlIGdldEZpZWxkTmFtZSBoZWxwZXIgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCBmaWVsZCBuYW1lcy5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsL2NvbGxlY3Rpb24gbmFtZSB0byBnZXQgZmllbGQgbWFwcGluZ3MgZnJvbVxuICAgKiBAcGFyYW0gc29ydEJ5IC0gT3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgZmllbGQgbmFtZSBhbmQgc29ydCBkaXJlY3Rpb25cbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgc29ydCBzdHJpbmcgb3IgdW5kZWZpbmVkIGlmIG5vIHNvcnQgc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElucHV0OiB7IGZpZWxkOiAnZW1haWwnLCBkaXJlY3Rpb246ICdkZXNjJyB9XG4gICAqIC8vIE91dHB1dDogJy1lbWFpbCdcbiAgICogLy8gSW5wdXQ6IHsgZmllbGQ6ICdjcmVhdGVkQXQnLCBkaXJlY3Rpb246ICdhc2MnIH1cbiAgICogLy8gT3V0cHV0OiAnY3JlYXRlZEF0J1xuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFNvcnQoXG4gICAgcmF3TW9kZWw6IE1vZGVsS2V5LFxuICAgIHNvcnRCeT86IHsgZmllbGQ6IHN0cmluZzsgZGlyZWN0aW9uOiBcImFzY1wiIHwgXCJkZXNjXCIgfSxcbiAgICBwYXlsb2FkPzogQmFzZVBheWxvYWRcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtb2RlbCA9IHJlc29sdmVNb2RlbEtleShyYXdNb2RlbCk7XG4gICAgaWYgKCFzb3J0QnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCBzb3J0QnkuZmllbGQpO1xuICAgIC8vIEFwcGx5IGNvbGxlY3Rpb24tbGV2ZWwgZmllbGQgbmFtZSBtYXBwaW5nIGlmIHBheWxvYWQgaXMgYXZhaWxhYmxlXG4gICAgY29uc3QgZmllbGROYW1lID0gcGF5bG9hZFxuICAgICAgPyBnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQoXG4gICAgICAgICAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkocGF5bG9hZC5jb2xsZWN0aW9ucywgbW9kZWwpLFxuICAgICAgICAgIHNjaGVtYUZpZWxkTmFtZVxuICAgICAgICApXG4gICAgICA6IHNjaGVtYUZpZWxkTmFtZTtcbiAgICBjb25zdCBwcmVmaXggPSBzb3J0QnkuZGlyZWN0aW9uID09PSBcImRlc2NcIiA/IFwiLVwiIDogXCJcIjtcbiAgICByZXR1cm4gYCR7cHJlZml4fSR7ZmllbGROYW1lfWA7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldEZpZWxkTmFtZSxcbiAgICBnZXRDb2xsZWN0aW9uU2x1ZyxcbiAgICBzaW5nbGVJZFF1ZXJ5LFxuICAgIHRyYW5zZm9ybUlucHV0LFxuICAgIHRyYW5zZm9ybU91dHB1dCxcbiAgICBjb252ZXJ0V2hlcmVDbGF1c2UsXG4gICAgY29udmVydFNlbGVjdCxcbiAgICBjb252ZXJ0U29ydFxuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJnZXRBdXRoVGFibGVzIiwiZmxhdHRlbkFsbEZpZWxkcyIsImdldENvbGxlY3Rpb25CeU1vZGVsS2V5IiwiZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkIiwiZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWUiLCJjcmVhdGVUcmFuc2Zvcm0iLCJvcHRpb25zIiwiZW5hYmxlRGVidWdMb2dzIiwic2NoZW1hIiwiZGVidWdMb2ciLCJtZXNzYWdlIiwiY29uc29sZSIsImxvZyIsImdldENvbGxlY3Rpb25TbHVnIiwibW9kZWwiLCJjb2xsZWN0aW9uIiwibW9kZWxOYW1lIiwicmVzb2x2ZWRTbHVnIiwibW9kZWxLZXlDYWNoZSIsIk1hcCIsInJlc29sdmVNb2RlbEtleSIsImNhY2hlZCIsImdldCIsInNldCIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsImZsYXR0ZW5lZEZpZWxkc0NhY2hlIiwiaXNQYXlsb2FkUmVsYXRpb25zaGlwIiwicGF5bG9hZCIsImNvbGxlY3Rpb25TbHVnIiwiZmllbGROYW1lIiwiY29sbGVjdGlvbnMiLCJmaWVsZHMiLCJjb25maWciLCJmaWVsZCIsImZpbmQiLCJmIiwibmFtZSIsInR5cGUiLCJnZXRGaWVsZE5hbWUiLCJpbmNsdWRlcyIsImZpZWxkRGVmaW5pdGlvbiIsIm9yaWdpbmFsRmllbGQiLCJpc1JlbGF0aW9uc2hpcEZpZWxkIiwiZmllbGRLZXkiLCJzY2hlbWFGaWVsZHMiLCJyZWZlcmVuY2VzIiwidW5kZWZpbmVkIiwic2luZ2xlSWRRdWVyeSIsIndoZXJlIiwic29tZSIsImlkRmllbGQiLCJjb25kaXRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJlcXVhbHMiLCJjb250YWlucyIsImxlbmd0aCIsIm5vcm1hbGl6ZURhdGEiLCJpc1JlbGF0ZWRGaWVsZCIsImlkVHlwZSIsInBhcnNlZCIsIk51bWJlciIsImlzTmFOIiwib3JpZ2luYWwiLCJjb252ZXJ0ZWQiLCJzdHJpbmdJZCIsIlN0cmluZyIsIm1hcCIsImlkIiwicm9sZSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInNwbGl0IiwidHJhbnNmb3JtSW5wdXQiLCJkYXRhIiwicmF3TW9kZWwiLCJ0cmFuc2Zvcm1lZERhdGEiLCJmb3JFYWNoIiwic2NoZW1hRmllbGROYW1lIiwidGFyZ2V0RmllbGROYW1lIiwiaXNQYXlsb2FkUmVsIiwibm9ybWFsaXplZERhdGEiLCJ0YXJnZXRGaWVsZEtleSIsImlzSm9pblJlc3VsdCIsImRvY3MiLCJmbGF0dGVuSm9pblJlc3VsdCIsImpvaW5SZXN1bHQiLCJpdGVtIiwidHJhbnNmb3JtT3V0cHV0IiwiZG9jIiwicmVzdWx0IiwicmVsYXRpb25zaGlwRmllbGRzIiwiZnJvbUVudHJpZXMiLCJmaWx0ZXIiLCJkYXRlRmllbGRzIiwiXyIsImtleXMiLCJqb2luIiwiZmxhdERvY3MiLCJwYXJlbnRDb2xsZWN0aW9uU2x1ZyIsInBhcmVudENvbGxlY3Rpb24iLCJqb2luRmllbGQiLCJqb2luZWRNb2RlbEtleSIsImQiLCJvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSIsImsiLCJtYXBwZWROYW1lIiwibm9ybWFsaXplRG9jdW1lbnRJZHMiLCJvcmlnaW5hbERhdGVGaWVsZEtleSIsIkRhdGUiLCJwYXlsb2FkRmllbGROYW1lcyIsInBheWxvYWROYW1lcyIsIlNldCIsImFsbG93ZWRLZXlzIiwiaGFzIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIm9wZXJhdG9yVG9QYXlsb2FkIiwib3BlcmF0b3IiLCJub3RfZXF1YWxzIiwiZ3JlYXRlcl90aGFuIiwiZ3JlYXRlcl90aGFuX2VxdWFsIiwibGVzc190aGFuIiwibGVzc190aGFuX2VxdWFsIiwiaW4iLCJsaWtlIiwiY29udmVydFdoZXJlVmFsdWUiLCJvcmlnaW5hbEZpZWxkS2V5IiwibG9va3VwS2V5IiwibmVlZHNJZENvbnZlcnNpb24iLCJ2IiwibnVtSWQiLCJjb252ZXJ0V2hlcmVDbGF1c2UiLCJnZXRQYXlsb2FkRmllbGROYW1lIiwidyIsInJlcyIsImFuZCIsImNvbm5lY3RvciIsIm9yIiwiYW5kQ2xhdXNlIiwib3JDbGF1c2UiLCJBTkQiLCJPUiIsImNvbnZlcnRTZWxlY3QiLCJzZWxlY3QiLCJyZWR1Y2UiLCJhY2MiLCJjb252ZXJ0U29ydCIsInNvcnRCeSIsInByZWZpeCIsImRpcmVjdGlvbiJdLCJtYXBwaW5ncyI6IkFBRUEsU0FBU0EsYUFBYSxRQUFRLGlCQUFpQjtBQUMvQyxTQUdFQyxnQkFBZ0IsUUFFWCxVQUFVO0FBRWpCLFNBQ0VDLHVCQUF1QixFQUN2QkMsdUNBQXVDLEVBQ3ZDQyxnQ0FBZ0MsUUFDM0Isc0NBQThDO0FBRXJELE9BQU8sTUFBTUMsa0JBQWtCLENBQzdCQyxTQUNBQztJQUVBLE1BQU1DLFNBQVNSLGNBQWNNO0lBRTdCLFNBQVNHLFNBQVNDLE9BQWM7UUFDOUIsSUFBSUgsaUJBQWlCO1lBQ25CSSxRQUFRQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLRjtRQUN6QztJQUNGO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5QkMsR0FDRCxTQUFTRyxrQkFBa0JDLEtBQWU7UUFDeEMsNkZBQTZGO1FBQzdGLE1BQU1DLGFBQWFQLFFBQVEsQ0FBQ00sTUFBTSxFQUFFRSxhQUFhRjtRQUNqREwsU0FBUztZQUFDO1lBQXNCO2dCQUFFSztnQkFBT0csY0FBY0Y7WUFBVztTQUFFO1FBQ3BFLE9BQU9BO0lB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
|