@decaf-ts/for-fabric 0.13.31-experimental.1 → 0.13.31-experimental.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/for-fabric.cjs +12 -13
- package/dist/for-fabric.js +13 -14
- package/lib/cjs/client/fabric-fs.cjs +22 -18
- package/lib/cjs/version.cjs +2 -2
- package/lib/esm/client/fabric-fs.js +21 -17
- package/lib/esm/version.js +2 -2
- package/lib/types/version.d.cts +2 -2
- package/lib/types/version.d.mts +2 -2
- package/package.json +1 -1
package/dist/for-fabric.cjs
CHANGED
|
@@ -2476,20 +2476,19 @@
|
|
|
2476
2476
|
return await promises.readFile(keyPath);
|
|
2477
2477
|
};
|
|
2478
2478
|
const privateKeyPem = await contentOfLoadFile(keyDirectoryPath, signerFileReader);
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2479
|
+
let k;
|
|
2480
|
+
if (logging.isBrowser()) {
|
|
2481
|
+
const privateKey = await extractPrivateKey(privateKeyPem);
|
|
2482
|
+
const keys = Object.getOwnPropertySymbols(privateKey);
|
|
2483
|
+
k = privateKey[keys[0]];
|
|
2484
|
+
} else {
|
|
2485
|
+
k = crypto$1.createPrivateKey(privateKeyPem);
|
|
2486
|
+
}
|
|
2482
2487
|
return fabricGateway.signers.newPrivateKeySigner(k);
|
|
2483
2488
|
}
|
|
2484
2489
|
async function extractPrivateKey(pem) {
|
|
2485
|
-
const libName = "node:crypto";
|
|
2486
2490
|
let subtle;
|
|
2487
|
-
|
|
2488
|
-
subtle = globalThis.crypto.subtle;
|
|
2489
|
-
} else {
|
|
2490
|
-
const lib = await core.normalizeImport(import(libName));
|
|
2491
|
-
subtle = lib.subtle || lib.webcrypto.subtle;
|
|
2492
|
-
}
|
|
2491
|
+
subtle = globalThis.crypto.subtle;
|
|
2493
2492
|
if (!subtle) throw new Error("Could not load SubtleCrypto module");
|
|
2494
2493
|
function str2ab(str) {
|
|
2495
2494
|
const buf = new ArrayBuffer(str.length);
|
|
@@ -3898,9 +3897,9 @@
|
|
|
3898
3897
|
}
|
|
3899
3898
|
}
|
|
3900
3899
|
if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
|
|
3901
|
-
const VERSION = "0.13.31-experimental.
|
|
3900
|
+
const VERSION = "0.13.31-experimental.1";
|
|
3902
3901
|
const COMMIT = "b1b62a8";
|
|
3903
|
-
const FULL_VERSION = "0.13.31-experimental.
|
|
3902
|
+
const FULL_VERSION = "0.13.31-experimental.1-b1b62a8";
|
|
3904
3903
|
const PACKAGE_NAME = "@decaf-ts/for-fabric";
|
|
3905
3904
|
decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
3906
3905
|
exports.AllowanceError = AllowanceError;
|
|
@@ -3998,4 +3997,4 @@
|
|
|
3998
3997
|
exports.writeDesignDocs = writeDesignDocs;
|
|
3999
3998
|
exports.writeIndexes = writeIndexes;
|
|
4000
3999
|
});
|
|
4001
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvc2hhcmVkL2Vycm9ycy50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvbW9kZWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9lcmMyMC9GYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY2xpZW50L2lkcy9pZC1leHRyYWN0aW9uLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eUNyZWRlbnRpYWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5LnRzIiwiLi4vc3JjL2NsaWVudC91dGlscy50cyIsIi4uL3NyYy9jbGllbnQvY3J5cHRvLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRDb250ZXh0LnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEluZGV4ID0gQ3JlYXRlSW5kZXhSZXF1ZXN0O1xuXG5mdW5jdGlvbiByZXNvbHZlUHJpbWFyeUtleUZpZWxkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBsb2c6IExvZ2dlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gU3RyaW5nKE1vZGVsLnBrKG0pKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBTa2lwcGluZyAke20ubmFtZX0gd2hpbGUgZXh0cmFjdGluZyBpbmRleGVzOiBubyBwcmltYXJ5IGtleSBpcyBkZWZpbmVkYDtcbiAgICBsb2cudmVyYm9zZShtZXNzYWdlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0UXVlcnlQa1RpZUJyZWFrZXIoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHBrRmllbGQ6IHN0cmluZ1xuKTogSW5kZXhbXSB7XG4gIGlmICghcGtGaWVsZCkge1xuICAgIHJldHVybiBpbmRleGVzO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXMubWFwKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IChpbmRleCBhcyBhbnkpPy5pbmRleD8uZmllbGRzO1xuICAgIGlmIChcbiAgICAgICFpbmRleD8ubmFtZSB8fFxuICAgICAgdHlwZW9mIGluZGV4Lm5hbWUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICFpbmRleC5uYW1lLmluY2x1ZGVzKFwiZGVmYXVsdFF1ZXJ5XCIpIHx8XG4gICAgICAhQXJyYXkuaXNBcnJheShmaWVsZHMpIHx8XG4gICAgICBmaWVsZHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkRmllbGRzID0gZmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZDogYW55KSA9PiB0eXBlb2YgZmllbGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZmllbGQpXG4gICAgKTtcbiAgICBpZiAoc29ydGVkRmllbGRzLmxlbmd0aCAhPT0gZmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1BrID0gZmllbGRzLnNvbWUoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGQsIHBrRmllbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGhhc1BrKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEZpZWxkID0gZmllbGRzW2ZpZWxkcy5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGxhc3REaXJlY3Rpb24gPSBTdHJpbmcoXG4gICAgICBPYmplY3QudmFsdWVzKGxhc3RGaWVsZCB8fCB7fSlbMF0gfHwgXCJhc2NcIlxuICAgICkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBsYXN0RGlyZWN0aW9uID09PSBcImRlc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbmRleCwge1xuICAgICAgaW5kZXg6IE9iamVjdC5hc3NpZ24oe30sIChpbmRleCBhcyBhbnkpLmluZGV4LCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBbcGtGaWVsZF06IGRpcmVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbEluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGxvZzogTG9nZ2VyXG4pOiBJbmRleFtdIHtcbiAgY29uc3QgaW5kZXhlcyA9IGdlbmVyYXRlSW5kZXhlcyhbbV0pO1xuICBjb25zdCBwa0ZpZWxkID0gcmVzb2x2ZVByaW1hcnlLZXlGaWVsZChtLCBsb2cpO1xuICByZXR1cm4gd2l0aERlZmF1bHRRdWVyeVBrVGllQnJlYWtlcihpbmRleGVzLCBwa0ZpZWxkIHx8IFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3M8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGFjY3VtPzogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz5cbik6IENvdWNoREJEZXNpZ25Eb2NbXSB7XG4gIGNvbnN0IHZpZXdzID0gZ2VuZXJhdGVWaWV3cyhbbV0pO1xuICBjb25zdCBzdG9yYWdlOiBSZWNvcmQ8c3RyaW5nLCBDb3VjaERCRGVzaWduRG9jPiA9IGFjY3VtIHx8IHt9O1xuICB2aWV3cy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBzdG9yYWdlW2RvYy5faWRdID0gZG9jO1xuICB9KTtcbiAgcmV0dXJuIHZpZXdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsRmlsZShmaWxlOiBhbnkpIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlLnBhcmVudFBhdGgsIGZpbGUubmFtZSk7XG4gIGNvbnN0IGV4cG9ydHMgPSByZXF1aXJlKGZpbGVQYXRoKTtcblxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbHRlcigoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gbmV3IChlIGFzIENvbnN0cnVjdG9yKSgpO1xuICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNb2RlbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PltdO1xuICByZXR1cm4gdmFsdWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZGVsRm9sZGVycyhcbiAgLi4uZm9sZGVyczogc3RyaW5nW11cbik6IFByb21pc2U8TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10+IHtcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IHJlc29sdmVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKGZvbGRlcik7XG4gICAgY29uc3QgZmlsZXMgPSBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHJlc29sdmVkRm9sZGVyLCB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmOiBhbnkpID0+IGYuaXNGaWxlKCkgJiYgZi5uYW1lLmVuZHNXaXRoKFwianNcIikpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ucmVhZE1vZGVsRmlsZShmaWxlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUluZGV4ZXMoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9aW5kZXhlcy8ke2luZGV4Lm5hbWV9Lmpzb25gXG4gICAgICApXG4gICAgKTtcbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShpbmRleCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZXNpZ25Eb2NzKFxuICBkZXNpZ25Eb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRlc2lnbkRvY3MubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZGVzaWduRG9jcy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBkb2NJZCA9IGRvYy5faWQucmVwbGFjZSgvXl9kZXNpZ25cXC8vLCBcIlwiKTtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9ZGVzaWduX2RvY3MvJHtkb2NJZH0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBjb25zdCBwYXlsb2FkID0geyAuLi5kb2MgfTtcbiAgICBkZWxldGUgcGF5bG9hZC5fcmV2O1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJEZXNpZ25Eb2MgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvbHZlciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IHdyaXRlRGVzaWduRG9jcyB9IGZyb20gXCIuLi9pbmRleGVzL2dlbmVyYXRpb25cIjtcblxuLy9cbi8vIGV4cG9ydCB0eXBlIEZhYnJpY0NvbGxlY3Rpb24gPSB7XG4vLyAgIG5hbWU6IFwiY29sbGVjdGlvbk1hcmJsZXNcIjtcbi8vICAgcG9saWN5OiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIHJlcXVpcmVkUGVlckNvdW50OiAwO1xuLy8gICBtYXhQZWVyQ291bnQ6IDM7XG4vLyAgIGJsb2NrVG9MaXZlOiAwO1xuLy8gICBtZW1iZXJPbmx5UmVhZDogdHJ1ZTtcbi8vICAgbWVtYmVyT25seVdyaXRlOiB0cnVlO1xuLy8gICBlbmRvcnNlbWVudFBvbGljeToge1xuLy8gICAgIGlkZW50aXRpZXM6IFtcbi8vICAgICAgIHsgcm9sZTogeyBuYW1lOiBcIm1lbWJlclwiOyBtc3BJZDogXCJPcmcxTVNQXCIgfSB9LFxuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzJNU1BcIiB9IH0sXG4vLyAgICAgXTtcbi8vICAgICBydWxlOiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIH07XG4vLyB9O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNQb2xpY3lJZGVudGl0eSA9IHtcbiAgcm9sZToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtc3BJZDogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5OiB7XG4gICAgaWRlbnRpdGllczogRmFicmljUG9saWN5SWRlbnRpdHlbXTtcbiAgICBydWxlOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcml2YXRlQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5Pzoge1xuICAgIHNpZ25hdHVyZVBvbGljeTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3Rpb25Gb3IoXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHBvbGljeTogc3RyaW5nLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlcixcbiAgYmxvY2tUb0xpdmU6IG51bWJlcixcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4sXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhblxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNvbGxlY3Rpb25OYW1lLFxuICAgIHBvbGljeTogcG9saWN5LFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IGAke21zcElkfVByaXZhdGVgLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyID0gMCxcbiAgbWF4UGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyID0gMCxcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIGNvbnN0IGMgPSBjb2xsZWN0aW9uRm9yKFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIGBPUignJHttc3BJZH0ubWVtYmVyJylgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcblxuICBjLmVuZG9yc2VtZW50UG9saWN5ID0ge1xuICAgIHNpZ25hdHVyZVBvbGljeTogYE9SKCcke21zcElkfS5wZWVyJylgLFxuICB9O1xuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gIG1zcElkczogc3RyaW5nW10sXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAxLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDIsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219Lm1lbWJlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlXG4gICk7XG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgQU5EKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219LnBlZXInYCkuam9pbihcIixcIil9KWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdENvbGxlY3Rpb25zPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZHM6IHN0cmluZ1tdLFxuICBvdmVycmlkZXM6IHtcbiAgICBwcml2YXRlQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICAgIHNoYXJlZENvbHM/OiBQYXJ0aWFsPFByaXZhdGVDb2xsZWN0aW9uPjtcbiAgfSA9IHt9LFxuICBtaXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIGxldCB7IHByaXZhdGVDb2xzLCBzaGFyZWRDb2xzIH0gPSBNb2RlbC5jb2xsZWN0aW9uc0ZvcihtKTtcblxuICBmdW5jdGlvbiByZXNvbHZlQ29sbGVjdGlvbihhcmc6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJnO1xuICAgICAgcmV0dXJuIGFyZyhtLCBtc3BJZHNbMF0pIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlQ29scyA9IHByaXZhdGVDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG4gIHNoYXJlZENvbHMgPSBzaGFyZWRDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG5cbiAgY29uc3QgcHJpdmF0ZURlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMCxcbiAgICAgIG1heFBlZXJDb3VudDogMCxcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnByaXZhdGVDb2xzIHx8IHt9XG4gICk7XG4gIGNvbnN0IHNoYXJlZERlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMSxcbiAgICAgIG1heFBlZXJDb3VudDogMixcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnNoYXJlZENvbHMgfHwge31cbiAgKTtcblxuICBjb25zdCBtaXJyb3JNZXRhID0gbWlycm9yID8gTW9kZWwubWlycm9yZWRBdChtKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBwcml2YXRlcyA9IG1zcElkc1xuICAgIC5tYXAoKG1zcElkKSA9PlxuICAgICAgKHByaXZhdGVDb2xzIGFzIHN0cmluZ1tdKS5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgICByZXR1cm4gcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbXNwSWQsXG4gICAgICAgICAgcCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKVxuICAgIC5mbGF0KCk7XG5cbiAgaWYgKG1pcnJvck1ldGEgJiYgbWlycm9yTWV0YS5tc3BJZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgIHR5cGVvZiBtaXJyb3JNZXRhLnJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWlycm9yTWV0YS5yZXNvbHZlclxuICAgICAgICA6IG1pcnJvck1ldGEucmVzb2x2ZXIobSwgbWlycm9yTWV0YS5tc3BJZCk7XG4gICAgaWYgKFxuICAgICAgcmVzb2x2ZWQgJiZcbiAgICAgICFwcml2YXRlcy5zb21lKFxuICAgICAgICAocCkgPT4gcC5uYW1lID09PSByZXNvbHZlZCAmJiBwLnBvbGljeS5pbmNsdWRlcyhtaXJyb3JNZXRhLm1zcElkKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgIHByaXZhdGVEZWZhdWx0cztcbiAgICAgIHByaXZhdGVzLnB1c2goXG4gICAgICAgIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICAgICAgICAgIG1pcnJvck1ldGEubXNwSWQsXG4gICAgICAgICAgcmVzb2x2ZWQsXG4gICAgICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2hhcmVkID0gKHNoYXJlZENvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgICB9ID0gc2hhcmVkRGVmYXVsdHM7XG4gICAgcmV0dXJuIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gICAgICBtc3BJZHMsXG4gICAgICBwLFxuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlcyxcbiAgICBzaGFyZWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25zKFxuICBjb2xzOiBQcml2YXRlQ29sbGVjdGlvbltdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBmaWxlTmFtZSA9IFwiY29sbGVjdGlvbnNfY29uZmlnXCJcbikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlybmFtZTogc3RyaW5nID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSBhcyBzdHJpbmc7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlybmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZGlybmFtZSk7XG4gICAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4ocCwgYC4vTUVUQS1JTkYvJHtmaWxlTmFtZX0uanNvbmApKTtcbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGNvbHMsIHVuZGVmaW5lZCwgMikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyhcbiAgZG9jczogQ291Y2hEQkRlc2lnbkRvY1tdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFkb2NzPy5sZW5ndGgpIHJldHVybjtcbiAgd3JpdGVEZXNpZ25Eb2NzKGRvY3MsIHAsIGNvbGxlY3Rpb24pO1xufVxuIiwiaW1wb3J0IHtcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQYWdpbmF0b3IsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBTZXJpYWxpemVkUGFnZSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBNW10sXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBib29rbWFyaz86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5IHwgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFJhdyBxdWVyeSBhY2Nlc3MgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLiBvbmx5IHByZXBhcmVkIHN0YXRlbWVudHMgYXJlIG5hdGl2ZWx5IGF2YWlsYWJsZWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFnZShcbiAgICBwYWdlOiBudW1iZXIgPSAxLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHN1cGVyLnBhZ2UocGFnZSwgLi4uYXJncyk7IC8vIHRoaXMgd2lsbCBmYWlsIGZvciBub24tcHJlcGFyZWQgc3RhdGVtZW50c1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGlzU2VyaWFsaXplZFBhZ2Uob2JqOiBTZXJpYWxpemVkUGFnZTxhbnk+IHwgYW55KSB7XG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciBleHRlbmRzIFRyYW5zYWN0aW9uTGltaXRzRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvci5uYW1lLCA1OTMpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dE9mLFxuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgRmxhZ3NPZixcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6ZWRQYWdlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciB9IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjbGllbnQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgZ2VuZXJpYyBSZXBvc2l0b3J5IHRvIHByZXBhcmUgY29udGV4dCBhbmQgYXJndW1lbnRzIGZvciBDUlVEIG9wZXJhdGlvbnMgZXhlY3V0ZWQgdmlhIGEgRmFicmljIGNsaWVudCBBZGFwdGVyLCB3aXJpbmcgUmVwb3NpdG9yeUZsYWdzIGFuZCBGYWJyaWMtc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyByZXBvc2l0b3J5XG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBNYW5nb1F1ZXJ5LCBGYWJyaWNGbGFncywgQ29udGV4dDxGYWJyaWNGbGFncz4+fSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIHVzZWQgdG8gZXhlY3V0ZSBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgbW9kZWwgY29uc3RydWN0b3IgdXNlZCBieSB0aGUgcmVwb3NpdG9yeVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuICogaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWZhYnJpY1wiO1xuICpcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBNb2RlbCB7IGlkITogc3RyaW5nOyBuYW1lITogc3RyaW5nOyB9XG4gKiBjb25zdCByZXBvID0gbmV3IEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8VXNlcj4oKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHJlcG8ucmVhZChcIjFcIik7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+UmVwbzogY3JlYXRlUHJlZml4KG1vZGVsLCAuLi5hcmdzKVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIGZsYWdzKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHJlc3VsdFxuICogICBSZXBvLS0+PkFwcDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQSBleHRlbmRzIEZhYnJpY0NsaWVudEFkYXB0ZXIgPSBGYWJyaWNDbGllbnRBZGFwdGVyLFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgQT4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX292ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHN1cGVyW1wiX292ZXJyaWRlc1wiXSwge1xuICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgYWxsb3dSYXdTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzOiB0cnVlLFxuICAgIGZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzOiB0cnVlLFxuICAgIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiBmYWxzZSxcbiAgICByZWJ1aWxkV2l0aFRyYW5zaWVudDogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenosIGZvcmNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q29udGV4dE9mPEE+Pj4pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5vdmVycmlkZShPYmplY3QuYXNzaWduKHt9LCBmbGFncywgdGhpcy5fb3ZlcnJpZGVzKSlcbiAgICAgIC5mb3IoZmxhZ3MgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gc3VwZXIuT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmF0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIHBhZ2Ugc2l6ZSAke3JlZi5saW1pdH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2luYXRlQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgeyBsaW1pdDogcmVmLmxpbWl0LCBvZmZzZXQ6IHJlZi5vZmZzZXQsIGJvb2ttYXJrOiByZWYuYm9va21hcmsgfSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5saXN0QnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGxpc3RpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ30gJHtvcmRlcn1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgICAgdGhpcy5saXN0QnkubmFtZSxcbiAgICAgICAga2V5LFxuICAgICAgICBvcmRlcixcbiAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgKSkgYXMgYW55O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yKSB7XG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgIGBsaXN0QnkgcmVzdWx0IHNldCB0b28gbGFyZ2UgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBrZXk9JHtTdHJpbmcoa2V5KX0gb3JkZXI9JHtvcmRlcn0uIFJldHVybmluZyBlbXB0eSBsaXN0LiBVc2UgcGFnaW5hdGVCeSBmb3IgbGFyZ2UgZGF0YXNldHMuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW10gYXMgTVtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgYWxsICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZE9uZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIE9uZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZE9uZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZC5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2UpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnZS5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICByZWYsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGxvZy52ZXJib3NlKGBFeGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50ICR7bmFtZX1gKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmFkYXB0ZXIuZGVjb2RlKFxuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCxcbiAgICAgICAgICBbbmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FsbEFyZ3MpXSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFJlcG9zaXRvcnk8TSwgQT4sIGFueT4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGN0eCxcbiAgICAgICAgdmFsdWUgYXMgTSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IHRoaXMuYXBwbHlBZnRlclJlYWQoZW50cnksIGN0eCkpKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEZhYnJpY0NsaWVudFBhZ2luYXRvci5pc1NlcmlhbGl6ZWRQYWdlKHZhbHVlKSkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUFmdGVyUmVhZCh2YWx1ZS5kYXRhLCBjdHgpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY291bnRPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY291bnRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9JHtrZXkgPyBgIGJ5ICR7a2V5IGFzIHN0cmluZ31gIDogXCJcIn1gXG4gICAgKTtcbiAgICBjb25zdCBzdG10QXJncyA9IGtleSA/IFtrZXksIC4uLmN0eEFyZ3NdIDogY3R4QXJncztcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCAuLi5zdG10QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtYXhPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWF4T2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWF4IG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtaW5PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWluT2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWluIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBhdmdPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5hdmdPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgYXZnIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdW1PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdW1PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgc3VtIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkaXN0aW5jdE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZGlzdGluY3RPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBkaXN0aW5jdCB2YWx1ZXMgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZ3JvdXBPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTVtdPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5ncm91cE9mKTtcbiAgICBsb2cudmVyYm9zZShgZ3JvdXBpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ31gKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoY2hlY2soLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aGNoZWNrKHRoaXMuY2xhc3MsIC4uLmN0eEFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHByZXBhcmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWQsXG4gICAgICByZWNvcmQsXG4gICAgICB0cmFuc2llbnQsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZXN1bHQsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnQsIGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBjdHhBcmdzLCBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCBjdHgpO1xuICAgIGNvbnN0IHsgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgbGV0IHJlY29yZCA9IHByZXBhcmVkLnJlY29yZDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgdXBkYXRpbmcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIGlkICR7aWR9YFxuICAgICk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxbTVtdLCAuLi5hbnlbXSwgQ29udGV4dE9mPEE+XT4ge1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgaWdub3JlSGFuZGxlcnMgPSBjdHguZ2V0KFwiaWdub3JlSGFuZGxlcnNcIik7XG4gICAgY29uc3QgaWdub3JlVmFsaWRhdGUgPSBjdHguZ2V0KFwiaWdub3JlVmFsaWRhdGlvblwiKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhhbmRsZXJzKVxuICAgICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkUHJvcHMgPSBjdHguZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IHJlZHVjZUVycm9yc1RvUHJpbnQoZXJyb3JzKTtcblxuICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHBheWxvYWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgY29uc3QgdHJhbnNpZW50cyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC50cmFuc2llbnQpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcGF5bG9hZHMsXG4gICAgICB0cmFuc2llbnRzLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgY3JlYXRlZC5tYXAoYXN5bmMgKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHIsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnRzW2ldLCBjdHgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJlYWRpbmcgJHtrZXlzLmxlbmd0aH0gJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLmNsYXNzLCBrZXlzLCAuLi5jdHhBcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIGtleXNbaV0sIHt9LCBjdHgpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgJHttb2RlbHMubGVuZ3RofSBuZXcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCkpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgY3R4KSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZHMgYXMgUHJpbWFyeUtleVR5cGVbXSxcbiAgICAgIHByZXBhcmVkLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnRyYW5zaWVudCksXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB1cGRhdGVkLm1hcChhc3luYyAodSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICAgICAgdSxcbiAgICAgICAgICB0aGlzLmNsYXNzLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHByZXBhcmVkW2ldLnRyYW5zaWVudCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHg6IENvbnRleHRPZjxBPiwgbW9kZWw6IE0pOiB2b2lkIHtcbiAgICBpZiAoTW9kZWwubWlycm9yZWRBdChtb2RlbCkpIHtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHsgbGVnYWN5OiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHVuaXF1ZSBuYW1lXG4gICAqIEBzdW1tYXJ5IFNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBFUkMyMCB0b2tlbiBkZWZpbml0aW9uOyB0eXBpY2FsbHkgYSBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmluZyBpZGVudGl0eSBvZiB0aGUgdG9rZW5cbiAgICogQHN1bW1hcnkgWC41MDkgc3ViamVjdCBvciBNU1AgaWRlbnRpdHkgc3RyaW5nIHRoYXQgZGVub3RlcyB3aG8gb3ducy9jb250cm9scyB0aGUgdG9rZW4gZGVmaW5pdGlvblxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBTaG9ydCB0aWNrZXItbGlrZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIChlLmcuLCBNVEspXG4gICAqL1xuICBzeW1ib2whOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY2ltYWwgcHJlY2lzaW9uIGZvciB0b2tlbiBhbW91bnRzXG4gICAqIEBzdW1tYXJ5IE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRva2VuIGJhbGFuY2VzXG4gICAqL1xuICBkZWNpbWFscyE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgd2FsbGV0IG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgaG9sZGVyIGFjY291bnQgZm9yIGFuIEVSQzIwIHRva2VuIHdpdGhpbiB0aGUgRmFicmljIG5ldHdvcmssIHRyYWNraW5nIGJhbGFuY2UgYW5kIHRva2VuIGFzc29jaWF0aW9uLlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFdhbGxldD59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEVSQzIwV2FsbGV0XG4gKiBAZXhhbXBsZVxuICogY29uc3Qgd2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHsgaWQ6IFwiYWNjdDFcIiwgdG9rZW46IFwiTXlUb2tlblwiLCBiYWxhbmNlOiAxMDAwIH0pO1xuICogLy8gVXBkYXRlIGJhbGFuY2UgdmlhIHJlcG9zaXRvcnk6IGF3YWl0IHJlcG8udXBkYXRlKHdhbGxldCwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBBcHAtPj5SZXBvOiByZWFkKFwiYWNjdDFcIiwgY3R4KVxuICogICBSZXBvLS0+PkFwcDogRVJDMjBXYWxsZXRcbiAqL1xuQHRhYmxlKFwiZXJjMjBfd2FsbGV0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFdhbGxldCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdhbGxldCB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIHdhbGxldDsgY29tbW9ubHkgcmVmZXJlbmNlcyBhbiBhY2NvdW50IG9yIGlkZW50aXR5XG4gICAqL1xuICBpZCE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVkIHRva2VuIG5hbWVcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgRVJDMjBUb2tlbiB0aGlzIHdhbGxldCBob2xkczsgbWFpbnRhaW5lZCBhcyBhIHJlbGF0aW9uc2hpcCBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMvZGVsZXRlc1xuICAgKi9cbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gYmFsYW5jZSBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHN1bW1hcnkgQ3VycmVudCBhbW91bnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gaGVsZCBieSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSE6IG51bWJlcjtcblxuICBAY29sdW1uKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYXB0aXZlIGZsYWcgb3IgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBPcHRpb25hbCBmaWVsZCB1c2VkIGJ5IHNvbWUgZmxvd3MgdG8gbWFyayBub24tdHJhbnNmZXJhYmxlIGZ1bmRzIG9yIG1hbmFnZWQgY3VzdG9keVxuICAgKi9cbiAgY2FwdGl2ZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgYWxsb3dhbmNlIG1vZGVsXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBhbiBhcHByb3ZhbCByZWxhdGlvbnNoaXAgd2hlcmUgYW4gb3duZXIgYWxsb3dzIGEgc3BlbmRlciB0byB0cmFuc2ZlciB1cCB0byBhIGNlcnRhaW4gdmFsdWUgZnJvbSB0aGUgb3duZXIncyB3YWxsZXQuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEFsbG93YW5jZT59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEFsbG93YW5jZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbG93YW5jZSA9IG5ldyBBbGxvd2FuY2UoeyBvd25lcjogXCJhY2N0MVwiLCBzcGVuZGVyOiBcImFjY3QyXCIsIHZhbHVlOiA1MCB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIEFwcC0+PkFwcDogbmV3IEFsbG93YW5jZSh7IG93bmVyLCBzcGVuZGVyLCB2YWx1ZSB9KVxuICovXG5AdGFibGUoXCJlcmMyMF9hbGxvd2FuY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEFsbG93YW5jZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGllbnQtc2lkZSBKU09OIHNlcmlhbGl6ZXIgZm9yIERlY2FmIG1vZGVscyB0YXJnZXRpbmcgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIEpTT05TZXJpYWxpemVyIHRvIGVtYmVkIG1vZGVsIG1ldGFkYXRhIChhbmNob3IpIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IGluc3RhbmNlcyBvbiB0aGUgY2xpZW50LCBhbmQgdG8gc2FmZWx5IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBGYWJyaWMtYm91bmQgbW9kZWxzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBEZWNhZiBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyBzZXJpYWxpemVyXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50czsgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gY29tcGxldGVuZXNzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENsaWVudFNlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXI8VXNlcj4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHVzZXIgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VyaWFsaXplciBhcyBDbGllbnRTZXJpYWxpemVyXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0tPj5BcHA6IEpTT04gc3RyaW5nXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IGRlc2VyaWFsaXplKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5TZXJpYWxpemVyOiBKU09OLnBhcnNlKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5Nb2RlbDogTW9kZWwuYnVpbGQocGFyc2VkLCBhbmNob3IpXG4gKiAgIE1vZGVsLS0+PkFwcDogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudFNlcmlhbGl6ZXI8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYSBtb2RlbCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIGVtYmVkZGluZyBjbGFzcyBhbmNob3JcbiAgICogQHN1bW1hcnkgQ2xvbmVzIHRoZSBtb2RlbCBhbmQgaW5qZWN0cyB0aGUgY2xhc3MgbWV0YWRhdGEgYW5jaG9yIHNvIGl0IGNhbiBiZSByZWNvbnN0cnVjdGVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIEZhbGxzIGJhY2sgdG8gcHJvdmlkZWQgdGFibGUgbmFtZSBpZiBtZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byB1c2Ugd2hlbiBtZXRhZGF0YSBjYW5ub3QgYmUgZGVyaXZlZFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBIHBsYWluIG9iamVjdCByZWFkeSB0byBiZSBKU09OLnN0cmluZ2lmeSdkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICBpZiAoIW1ldGFkYXRhIHx8IG1ldGFkYXRhID09PSBcIk9iamVjdFwiKVxuICAgICAgaWYgKG1vZGVsTmFtZSkgbWV0YWRhdGEgPSBtb2RlbE5hbWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICApO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gaXRzIEpTT04gc2VyaWFsaXphdGlvblxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIEpTT04gc3RyaW5nLCByZXRyaWV2ZXMgdGhlIGVtYmVkZGVkIG1vZGVsIGFuY2hvciwgYW5kIHVzZXMgTW9kZWwuYnVpbGQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgSlNPTiBzdHJpbmcgcHJldmlvdXNseSBwcm9kdWNlZCBieSBzZXJpYWxpemVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZXMgYSBtb2RlbCB0byBhIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB2aWEgcHJlU2VyaWFsaXplLCBlbWJlZGRpbmcgbWV0YWRhdGEgbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlXSAtIE9wdGlvbmFsIHRhYmxlIG5hbWUgdG8gaW5jbHVkZSBhcyBhbmNob3Igd2hlbiBtZXRhZGF0YSBpcyB1bmF2YWlsYWJsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBtb2RlbCB3aXRoIGFuY2hvciBtZXRhZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgbW9kZWxOYW1lKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL2VyYzIwL21vZGVsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRPZixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIEV2ZW50SWRzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFNlcXVlbmNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuLyoqXG4gKiBSZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIEVSQzIwIGNvbnRyYWN0cyBvbiBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrLlxuICogRXh0ZW5kcyB0aGUgYmFzZSBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGNsYXNzIGFuZCB1dGlsaXplcyB0aGUgQ2xpZW50U2VyaWFsaXplciBmb3IgZGF0YSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5PFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PEVSQzIwV2FsbGV0LCBBPiB7XG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS5zZXJpYWxpemVyO1xuXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnM8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgKTtcblxuICAgIHRhYmxlID0gKFxuICAgICAgdHlwZW9mIHRhYmxlID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHRhYmxlKSA6IHRhYmxlXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBsZXQgcGFyc2VkSWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlZElkID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgIHBhcnNlZElkID0gaWQubWFwKFxuICAgICAgICAoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZShNb2RlbC5zZXF1ZW5jZUZvcih0YWJsZSkudHlwZSwgaSkgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRJZCA9IFNlcXVlbmNlLnBhcnNlVmFsdWUoXG4gICAgICAgIE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJzZWRJZCEsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgVWludDhBcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBUZXh0RGVjb2Rlci5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgVWludDhBcnJheSB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBFUkMyMFdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlRva2VuTmFtZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b2tlbk5hbWUoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b2tlbk5hbWVcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudG9rZW5OYW1lXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIlRva2VuTmFtZVwiKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlN5bWJvbFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHN5bWJvbCguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInN5bWJvbFwiLCB0cnVlKSkuZm9yKHRoaXMuc3ltYm9sKTtcbiAgICBjb25zdCBzeW1ib2wgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiU3ltYm9sXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShzeW1ib2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIkRlY2ltYWxzXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGRlY2ltYWxzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZGVjaW1hbHNcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZGVjaW1hbHNcbiAgICApO1xuICAgIGNvbnN0IGRlY2ltYWxzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkRlY2ltYWxzXCIpO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoZGVjaW1hbHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG90YWxTdXBwbHlcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b3RhbFN1cHBseShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b3RhbFN1cHBseVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b3RhbFN1cHBseVxuICAgICk7XG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG90YWxTdXBwbHlcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZSh0b3RhbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIGEgc3BlY2lmaWVkIG93bmVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBnaXZlbiBvd25lci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQmFsYW5jZU9mXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIG93bmVyJ3MgYWRkcmVzcyBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBFUkMyMCB0b2tlbiBvd25lci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBiYWxhbmNlT2YoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJiYWxhbmNlXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmJhbGFuY2VPZlxuICAgICk7XG4gICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJCYWxhbmNlT2ZcIiwgW1xuICAgICAgb3duZXIsXG4gICAgXSk7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShiYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYSByZWNpcGllbnQuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcmVjaXBpZW50J3MgYWRkcmVzcyBhbmQgdGhlIHRyYW5zZmVyIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyKFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwidHJhbnNmZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudHJhbnNmZXJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZmVycmVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJUcmFuc2ZlclwiLCBbXG4gICAgICB0byxcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHRyYW5zZmVycmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKiBGb3IgdGhpcyB0cmFuc2ZlciB0byB3b3JrIHRoZSBzcGVuZGVyICggYWNjb3VudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGlzIGZ1bmN0aW9uICkgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZSBhcHByb3ZlZCBhcyBhbiBhbGxvd2FuY2UgYnkgdGhlIHNlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJGcm9tXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlbmRlcidzIGFkZHJlc3MsIHJlY2lwaWVudCdzIGFkZHJlc3MsIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIHRyYW5zZmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckZyb20oXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwidHJhbnNmZXJGcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLnRyYW5zZmVyRnJvbSk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIlRyYW5zZmVyRnJvbVwiLFxuICAgICAgW2Zyb20sIHRvLCB2YWx1ZS50b1N0cmluZygpXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJlIHNwZW50IGJ5IGEgc3BlY2lmaWVkIHNwZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBhcHByb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQXBwcm92ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhbmQgdGhlIGFwcHJvdmFsIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYXBwcm92ZSBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgYXBwcm92YWwgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoc3BlbmRlcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFwcHJvdmVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYXBwcm92ZSk7XG4gICAgY29uc3QgYXBwcm92ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkFwcHJvdmVcIiwgW1xuICAgICAgc3BlbmRlcixcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGFwcHJvdmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgYWxsb3dhbmNlIG9mIEVSQzIwIHRva2VucyB0aGF0IHRoZSBzcGVjaWZpZWQgb3duZXIgaGFzIGFwcHJvdmVkIGZvciBhIHNwZW5kZXIuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkFsbG93YW5jZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBvd25lcidzIGFkZHJlc3MgYW5kIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYWxsb3dhbmNlKG93bmVyOiBzdHJpbmcsIHNwZW5kZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFsbG93YW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hbGxvd2FuY2UpO1xuICAgIGNvbnN0IGFsbG93YW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQWxsb3dhbmNlXCIsIFtcbiAgICAgIG93bmVyLFxuICAgICAgc3BlbmRlcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGFsbG93YW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBwcm92aWRlZCB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBpbml0aWFsaXplIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBnaXZlbiB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiSW5pdGlhbGl6ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzZXJpYWxpemVkIHRva2VuIGRhdGEgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgRVJDMjAgdG9rZW4gaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJhY3Qgd2l0aC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh0b2tlbjogRVJDMjBUb2tlbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJpbml0aWFsaXplXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGluaXRpbGlhemVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJJbml0aWFsaXplXCIsXG4gICAgICBbRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHRva2VuKV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGluaXRpbGlhemVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHZlcmlmeSBpZiB0aGUgRVJDMjAgY29udHJhY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNoZWNrSW5pdGlhbGl6ZWRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBjaGVjayBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBjaGVja0luaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJjaGVja0luaXRpYWxpemVkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJDaGVja0luaXRpYWxpemVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnRzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gbWludCBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJNaW50XCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG1pbnRpbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IHVwZGF0ZXMgdGhlIG1pbnRlcidzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBtaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWludGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIG1pbnQoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwibWludFwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5taW50KTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIk1pbnRcIiwgW2Ftb3VudC50b1N0cmluZygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQnVybnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIHRoZSBtaW50ZXIncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIGJ1cm5pbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJ1cm4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidXJuaW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYnVybihhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJidXJuXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm4pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVyblwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGJ1cm4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQnVybkZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYWNjb3VudCdzIGFkZHJlc3MgYW5kIHRoZSBidXJuaW5nIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgc3BlY2lmaWVkIGFjY291bnQncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdG8gYnVybiB0aGUgRVJDMjAgdG9rZW5zLlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuRnJvbShhY2NvdW50OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5Gcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkJ1cm5Gcm9tXCIsIFtcbiAgICAgIGFjY291bnQsXG4gICAgICBhbW91bnQudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRCYWxhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0LCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgY2xpZW50QWNjb3VudEJhbGFuY2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudEJhbGFuY2VcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudEJhbGFuY2UpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJDbGllbnRBY2NvdW50QmFsYW5jZVwiXG4gICAgKTtcblxuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoc2VyaWFsaXplZEFjY291bnRCYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjbGllbnQncyBhY2NvdW50IElEIGZyb20gdGhlIGJsb2NrY2hhaW4gbmV0d29yay5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBjbGllbnQncyBhY2NvdW50IElELlxuICAgKiBJdCBjYWxscyB0aGUgXCJDbGllbnRBY2NvdW50SURcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgcmV0dXJuZWQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50SUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudElkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNsaWVudEFjY291bnRJRCk7XG4gICAgY29uc3QgY2xpZW50QWNjb3VudElEID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRJRFwiXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZShjbGllbnRBY2NvdW50SUQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFByaW1hcnlLZXlUeXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBjb21wb3NlQXR0cmlidXRlVmFsdWUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZHM8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtb2RlbHM6IE0gfCBNW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICBpZHM6IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXVxuKSB7XG4gIGxldCBwazoga2V5b2YgTTtcbiAgbGV0IGNvbXBvc2VkOiBhbnk7XG4gIGxldCBwa1Byb3BzOiBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgZnVuY3Rpb24gZXh0cmFjdElkKG06IE0gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZHM6IFByaW1hcnlLZXlUeXBlKSB7XG4gICAgcGsgPSBwayB8fCBNb2RlbC5wayhjbGF6eik7XG4gICAgcGtQcm9wcyA9IHBrUHJvcHMgfHwgTW9kZWwuc2VxdWVuY2VGb3IoY2xhenopO1xuICAgIGNvbXBvc2VkID0gY29tcG9zZWQgfHwgTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcblxuICAgIGlmIChjb21wb3NlZCkge1xuICAgICAgcmV0dXJuIGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZShtIGFzIGFueSwgY29tcG9zZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gKG0gYXMgYW55KVtwa10gfHwgaWRzO1xuICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgY291bGQgbm90IHJlYnVpbGQgaWQgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSB8fCBpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMuIGJvdGggbXVzdCBiZSBhcnJheXMgb2YgZXF1YWwgbGVuZ3RoXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVscy5tYXAoKG0sIGkpID0+IGV4dHJhY3RJZChtLCBpZHNbaV0pKTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdElkKG1vZGVscywgaWRzIGFzIFByaW1hcnlLZXlUeXBlKTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCwgY29sdW1uLCBwayB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpdHkgY3JlZGVudGlhbCBtb2RlbCBzdG9yaW5nIGNyeXB0b2dyYXBoaWMgbWF0ZXJpYWxzXG4gKiBAc3VtbWFyeSBIb2xkcyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcHJpdmF0ZSBrZXkgaW5mb3JtYXRpb24gZm9yIGEgRmFicmljIGlkZW50aXR5LCBtYW5hZ2VkIGFzIGEgc2VwYXJhdGUgZW50aXR5IGxpbmtlZCBmcm9tIElkZW50aXR5XG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+fSBbYXJnXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIG1vZGVsIGZpZWxkc1xuICogQGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgY3JlZGVudGlhbHMgZW50cnlcbiAqIGNvbnN0IGNyZWRzID0gbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZDogXCJjcmVkczFcIiwgY2VydGlmaWNhdGU6IFwiLi4uXCIsIHJvb3RDZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcHJpdmF0ZUtleTogXCIuLi5cIiB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eUNyZWRlbnRpYWxzKHsgaWQsIGNlcnRpZmljYXRlLCByb290Q2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICogQHNlZSBtb2RlbFxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHMgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcbiAgICogQHN1bW1hcnkgUHJpbWFyeSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgY3JlZGVudGlhbHMgZW50cnlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcIilcbiAgQGNvbHVtbigpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBMZWFmIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWRlbnRpdHlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIGZvciB0aGUgaWRlbnRpdHlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIGNlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcm9vdCBvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUm9vdCBvZiB0cnVzdCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBsZWFmIGNlcnRpZmljYXRlXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgcm9vdENlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHByaXZhdGUga2V5XCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBwcml2YXRlS2V5ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG4gIENPTlRSQUNUID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY29udHJhY3RgLFxuICBDSEFJTkNPREUgPSBgJHtGYWJyaWNNb2RlbEtleXMuRkFCUklDfS5jaGFpbmNvZGVgLFxuICBDSEFOTkVMID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY2hhbm5lbGAsXG4gIE9WRVJSSURFUyA9IGBfX292ZXJyaWRlc2AsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgRmFicmljQ0FTZXJ2aWNlcyBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJZGVudGl0eVNlcnZpY2UsXG4gIElFbnJvbGxSZXNwb25zZSxcbiAgSVJlZ2lzdGVyUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL21vZGVsL0lkZW50aXR5XCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuLi9jcnlwdG9cIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlUmVzcG9uc2UsXG4gIEZhYnJpY0lkZW50aXR5LFxuICBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICBJZGVudGl0eVJlc3BvbnNlLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ZhYnJpYy10eXBlc1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSHlwZXJsZWRnZXIgRmFicmljIENBIGlkZW50aXR5IHR5cGVzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIGlkZW50aXR5IHR5cGVzIHJlY29nbml6ZWQgYnkgRmFicmljIENBIGZvciByZWdpc3RyYXRpb24gYW5kIGlkZW50aXR5IG1hbmFnZW1lbnQuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eVR5cGUge1xuICBQRUVSID0gXCJwZWVyXCIsXG4gIE9SREVSRVIgPSBcIm9yZGVyZXJcIixcbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbiAgVVNFUiA9IFwidXNlclwiLFxuICBBRE1JTiA9IFwiYWRtaW5cIixcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleS92YWx1ZSBhdHRyaWJ1dGUgdXNlZCBkdXJpbmcgQ0EgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgZW50cnkgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBGYWJyaWMgQ0EgaWRlbnRpdHkgZHVyaW5nIHJlZ2lzdHJhdGlvbiwgb3B0aW9uYWxseSBtYXJraW5nIGl0IGZvciBpbmNsdXNpb24gaW4gZWNlcnQuXG4gKiBAaW50ZXJmYWNlIElLZXlWYWx1ZUF0dHJpYnV0ZVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBBdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtlY2VydF0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBlbnJvbGxtZW50IGNlcnRpZmljYXRlIChFQ2VydCkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlY2VydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIEZhYnJpYyBDQSBpZGVudGl0eSBhdHRyaWJ1dGUga2V5cy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgd2VsbC1rbm93biBGYWJyaWMgQ0EgYXR0cmlidXRlIGtleXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyBmb3IgZGVsZWdhdGlvbnMgYW5kIHBlcm1pc3Npb25zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIHtcbiAgSEZSRUdJU1RSQVJST0xFUyA9IFwiaGYuUmVnaXN0cmFyLlJvbGVzXCIsXG4gIEhGUkVHSVNUUkFSREVMRUdBVEVST0xFUyA9IFwiaGYuUmVnaXN0cmFyLkRlbGVnYXRlUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJBVFRSSUJVVEVTID0gXCJoZi5SZWdpc3RyYXIuQXR0cmlidXRlc1wiLFxuICBIRklOVEVSTUVESUFURUNBID0gXCJoZi5JbnRlcm1lZGlhdGVDQVwiLFxuICBIRlJFVk9LRVIgPSBcImhmLlJldm9rZXJcIixcbiAgSEZBRkZJTElBVElPTk1HUiA9IFwiaGYuQWZmaWxpYXRpb25NZ3JcIixcbiAgSEZHRU5DUkwgPSBcImhmLkdlbkNSTFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIHdyYXBwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0EuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBoaWdoLWxldmVsIG9wZXJhdGlvbnMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYWdhaW5zdCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIGluY2x1ZGluZyByZWdpc3RyYXRpb24sIGVucm9sbG1lbnQsIHJldm9jYXRpb24sIGFuZCBhZG1pbmlzdHJhdGl2ZSBxdWVyaWVzLiBFbmNhcHN1bGF0ZXMgbG93ZXItbGV2ZWwgRmFicmljIENBIGNsaWVudCBjYWxscyB3aXRoIGNvbnNpc3RlbnQgbG9nZ2luZyBhbmQgZXJyb3IgbWFwcGluZy5cbiAqIEBwYXJhbSB7Q0FDb25maWd9IGNhQ29uZmlnIC0gQ29ubmVjdGlvbiBhbmQgVExTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YXJnZXQgQ0EuXG4gKiBAY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IHVzZXJcbiAqIGNvbnN0IHN2YyA9IG5ldyBGYWJyaWNFbnJvbGxtZW50U2VydmljZSh7XG4gKiAgIHVybDogJ2h0dHBzOi8vbG9jYWxob3N0OjcwNTQnLFxuICogICBjYU5hbWU6ICdPcmcxQ0EnLFxuICogICB0bHM6IHsgdHJ1c3RlZFJvb3RzOiBbJy9wYXRoL3RvL2NhLnBlbSddLCB2ZXJpZnk6IGZhbHNlIH0sXG4gKiAgIGNhQ2VydDogJy9wYXRoL3RvL2FkbWluL2NlcnREaXInLFxuICogICBjYUtleTogJy9wYXRoL3RvL2FkbWluL2tleURpcidcbiAqIH0pO1xuICogYXdhaXQgc3ZjLnJlZ2lzdGVyKHsgdXNlck5hbWU6ICdhbGljZScsIHBhc3N3b3JkOiAnczNjcjN0JyB9LCBmYWxzZSwgJ29yZzEuZGVwYXJ0bWVudDEnLCBDQV9ST0xFLlVTRVIpO1xuICogY29uc3QgaWQgPSBhd2FpdCBzdmMuZW5yb2xsKCdhbGljZScsICdzM2NyM3QnKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgYXV0b251bWJlclxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU3ZjIGFzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXG4gKiAgIHBhcnRpY2lwYW50IENBIGFzIEZhYnJpYyBDQVxuICogICBBcHAtPj5TdmM6IHJlZ2lzdGVyKGNyZWRlbnRpYWxzLCAuLi4pXG4gKiAgIFN2Yy0+PkNBOiByZWdpc3RlcihyZXF1ZXN0LCBhZG1pblVzZXIpXG4gKiAgIENBLS0+PlN2YzogZW5yb2xsbWVudFNlY3JldFxuICogICBTdmMtLT4+QXBwOiBzZWNyZXRcbiAqICAgQXBwLT4+U3ZjOiBlbnJvbGwoZW5yb2xsbWVudElkLCBzZWNyZXQpXG4gKiAgIFN2Yy0+PkNBOiBlbnJvbGwoe2Vucm9sbG1lbnRJRCwgc2VjcmV0fSlcbiAqICAgQ0EtLT4+U3ZjOiBjZXJ0aWZpY2F0ZXNcbiAqICAgU3ZjLS0+PkFwcDogSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIGNhPzogRmFicmljQ0FTZXJ2aWNlcztcblxuICBwcml2YXRlIGNlcnRpZmljYXRlU2VydmljZT86IGFueTtcblxuICBwcml2YXRlIGFmZmlsaWF0aW9uU2VydmljZT86IEFmZmlsaWF0aW9uU2VydmljZTtcblxuICBwcml2YXRlIGlkZW50aXR5U2VydmljZT86IElkZW50aXR5U2VydmljZTtcblxuICBwcml2YXRlIGNsaWVudD86IGFueTtcblxuICBwcml2YXRlIHVzZXI/OiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FDb25maWc6IENBQ29uZmlnKSB7XG4gICAgQ29yZVV0aWxzLmdldENyeXB0b1N1aXRlKFxuICAgICAgY2FDb25maWcuaHNtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc29mdHdhcmU6IGZhbHNlLFxuICAgICAgICAgICAgbGliOiBjYUNvbmZpZy5oc20ubGlicmFyeSxcbiAgICAgICAgICAgIHNsb3Q6IGNhQ29uZmlnLmhzbS5zbG90LFxuICAgICAgICAgICAgbGFiZWw6IGNhQ29uZmlnLmhzbS50b2tlbkxhYmVsLFxuICAgICAgICAgICAgcGluOiBTdHJpbmcoY2FDb25maWcuaHNtLnBpbiksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBVc2VyKCk6IFByb21pc2U8VXNlcj4ge1xuICAgIGlmICh0aGlzLnVzZXIpIHJldHVybiB0aGlzLnVzZXI7XG4gICAgY29uc3QgeyBjYU5hbWUsIGNhQ2VydCwgY2FLZXksIHVybCwgaHNtIH0gPSB0aGlzLmNhQ29uZmlnO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLlVzZXIpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQ0EgdXNlciBmb3IgJHtjYU5hbWV9IGF0ICR7dXJsfWApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy51c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcihcImFkbWluXCIsIGtleSwgY2VydGlmaWNhdGUsIGNhTmFtZSwge1xuICAgICAgaHNtLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnVzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ0EoKTogUHJvbWlzZTxGYWJyaWNDQVNlcnZpY2VzPiB7XG4gICAgaWYgKHRoaXMuY2EpIHJldHVybiB0aGlzLmNhO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLkNBKTtcbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IHRoaXMuY2FDb25maWc7XG5cbiAgICAvLyBGT1IgU29tZSBSZWFzb24gdGhlIHZlcmlmaWNhdGlvbiBmYWlscyBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgd29ya3MgZm9yIG5vd1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSBDbGllbnQgZm9yIENBICR7Y2FOYW1lfSB1bmRlciAke3VybH1gKTtcbiAgICB0aGlzLmNhID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmNhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENsaWVudCgpOiBQcm9taXNlPHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfT4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuIHRoaXMuY2xpZW50O1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIHRoaXMuY2xpZW50ID0gKGNhIGFzIGFueSlbXCJfRmFicmljQ0FTZXJ2aWNlc1wiXTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2VydGlmaWNhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNlcnRpZmljYXRlU2VydmljZSlcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ2xpZW50KCkpLm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmNlcnRpZmljYXRlU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBBZmZpbGlhdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLmFmZmlsaWF0aW9uU2VydmljZSlcbiAgICAgIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIElkZW50aXRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmlkZW50aXR5U2VydmljZSlcbiAgICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSBDQSBjZXJ0aWZpY2F0ZSBzZXJ2aWNlIHRvIGxpc3QgY2VydGlmaWNhdGVzLCBvcHRpb25hbGx5IG1hcHBpbmcgdG8gUEVNIHN0cmluZ3Mgb25seS5cbiAgICogQHBhcmFtIHtHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0fSBbcmVxdWVzdF0gLSBPcHRpb25hbCBmaWx0ZXIgcmVxdWVzdCBmb3IgY2VydGlmaWNhdGUgbG9va3VwLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkb01hcD10cnVlXSAtIFdoZW4gdHJ1ZSwgcmV0dXJucyBhcnJheSBvZiBQRU0gc3RyaW5nczsgb3RoZXJ3aXNlIHJldHVybnMgZnVsbCByZXNwb25zZSBvYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPn0gQXJyYXkgb2YgUEVNIHN0cmluZ3Mgb3IgdGhlIGZ1bGwgY2VydGlmaWNhdGUgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgZG9NYXAgPSB0cnVlXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGVTZXJ2aWNlID0gYXdhaXQgdGhpcy5DZXJ0aWZpY2F0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDZXJ0aWZpY2F0ZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IENlcnRpZmljYXRlUmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBjZXJ0aWZpY2F0ZVNlcnZpY2UuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3QgaWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgaWRlbnRpdHkgc2VydmljZSB0byBmZXRjaCBhbGwgaWRlbnRpdGllcyBhbmQgcmV0dXJucyB0aGUgbGlzdCBhcyBGYWJyaWNJZGVudGl0eSBvYmplY3RzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+fSBUaGUgbGlzdCBvZiBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcygpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBpZGVudGl0aWVzU2VydmljZSA9IGF3YWl0IHRoaXMuSWRlbnRpdGllcygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBJZGVudGl0aWVzIHVuZGVyIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBpZGVudGl0aWVzU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuaWRlbnRpdGllcy5sZW5ndGh9IElkZW50aXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoKSB7XG4gICAgY29uc3QgYWZmaWxpYXRpb25TZXJ2aWNlID0gYXdhaXQgdGhpcy5BZmZpbGlhdGlvbnMoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBhZmZpbGlhdGlvblNlcnZpY2UuZ2V0QWxsKGF3YWl0IHRoaXMuVXNlcigpKSlcbiAgICAgIC5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuYS5sZW5ndGh9IEFmZmlsaWF0aW9uczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYS5uZXdJZGVudGl0eVNlcnZpY2UoKS5nZXRPbmUoZW5yb2xsbWVudElkLCB1c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVnaXN0ZXIpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IGNhLnJlZ2lzdGVyKHByb3BzLCB1c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmdcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLCB7fSkuZm9yKFxuICAgICAgdGhpcy5pZGVudGl0eUZyb21FbnJvbGxtZW50XG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHkoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGtleS50b0J5dGVzKCksXG4gICAgICAgIHJvb3RDZXJ0aWZpY2F0ZTogcm9vdENlcnRpZmljYXRlLFxuICAgICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgICAgdXBkYXRlZE9uOiBub3csXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgY3JlYXRlZE9uOiBub3csXG4gICAgICB1cGRhdGVkT246IG5vdyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5yb2xsIGFuIGlkZW50aXR5IHdpdGggdGhlIENBIHVzaW5nIGEgcmVnaXN0cmF0aW9uIHNlY3JldC5cbiAgICogQHN1bW1hcnkgRXhjaGFuZ2VzIHRoZSBlbnJvbGxtZW50IElEIGFuZCBzZWNyZXQgZm9yIGNlcnRpZmljYXRlcywgcmV0dXJuaW5nIGEgY29uc3RydWN0ZWQgSWRlbnRpdHkgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGVucm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbiAtIEVucm9sbG1lbnQgc2VjcmV0IHJldHVybmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5IG9iamVjdCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgZW5yb2xsKGVucm9sbG1lbnRJZDogc3RyaW5nLCByZWdpc3RyYXRpb246IHN0cmluZykge1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZW5yb2xsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgICBsb2cuZGVidWcoYEVucm9sbGluZyAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSA9IGF3YWl0IGNhLmVucm9sbCh7XG4gICAgICAgIGVucm9sbG1lbnRJRDogZW5yb2xsbWVudElkLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlkZW50aXR5ID0gRmFicmljRW5yb2xsbWVudFNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jYUNvbmZpZy5jYU5hbWVcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHNcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlcyB0aGUgZW5yb2xsbWVudCBvZiBhbiBpZGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5yb2xsbWVudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCAtIFRoZSBlbnJvbGxtZW50IElEIG9mIHRoZSBpZGVudGl0eSB0byBiZSByZXZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSByZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gSWYgdGhlIGVucm9sbG1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldm9jYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGFzeW5jIHJldm9rZShlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLnJldm9rZShcbiAgICAgICAgeyBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLCByZWFzb246IFwiVXNlciBEZWxldGF0aW9uXCIgfSxcbiAgICAgICAgdXNlclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUmVnaXN0ZXJSZXF1ZXN0LCBJS2V5VmFsdWVBdHRyaWJ1dGUgfSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgbWluLFxuICBtaW5sZW5ndGgsXG4gIE1vZGVsLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciBleHRlbmRzIE1vZGVsIHtcbiAgQHJlcXVpcmVkKClcbiAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCI7XG4gIEBtaW5sZW5ndGgoMSlcbiAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXTtcbiAgQHJlcXVpcmVkKClcbiAgZW5yb2xsbWVudElEITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50U2VjcmV0ITogc3RyaW5nO1xuICBAbWluKDApXG4gIG1heEVucm9sbG1lbnRzPzogbnVtYmVyO1xuICBAcmVxdWlyZWQoKVxuICByb2xlITogc3RyaW5nO1xuXG4gIGJ1aWxkKCk6IElSZWdpc3RlclJlcXVlc3Qge1xuICAgIGNvbnN0IGVycnMgPSB0aGlzLmhhc0Vycm9ycygpO1xuICAgIGlmIChlcnJzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycnMudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElSZWdpc3RlclJlcXVlc3QgPSB7XG4gICAgICBlbnJvbGxtZW50SUQ6IHRoaXMuZW5yb2xsbWVudElELFxuICAgICAgZW5yb2xsbWVudFNlY3JldDogdGhpcy5lbnJvbGxtZW50U2VjcmV0LFxuICAgICAgcm9sZTogdGhpcy5yb2xlLFxuICAgICAgYWZmaWxpYXRpb246IHRoaXMuYWZmaWxpYXRpb24sXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHRoaXMubWF4RW5yb2xsbWVudHMgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXNwb25zZS5tYXhFbnJvbGxtZW50cyA9IHRoaXMubWF4RW5yb2xsbWVudHM7XG4gICAgaWYgKHRoaXMuYXR0cnMpIHJlc3BvbnNlLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBzZXRBZmZpbGlhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hZmZpbGlhdGlvbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQXR0cihhdHRyOiBJS2V5VmFsdWVBdHRyaWJ1dGUpIHtcbiAgICB0aGlzLmF0dHJzID0gdGhpcy5hdHRycyB8fCBbXTtcbiAgICB0aGlzLmF0dHJzLnB1c2goYXR0cik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdHRycyh2YWx1ZTogSUtleVZhbHVlQXR0cmlidXRlW10pIHtcbiAgICB0aGlzLmF0dHJzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50SUQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudElEID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50U2VjcmV0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVucm9sbG1lbnRTZWNyZXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1heEVucm9sbG1lbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm1heEVucm9sbG1lbnRzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSb2xlKHZhbHVlOiBDQV9ST0xFIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5yb2xlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlTWV0YWRhdGEsXG4gIENvbGxlY3Rpb25SZXNvbHZlcixcbiAgTWlycm9yTWV0YWRhdGEsXG59IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBDb250ZXh0dWFsQXJncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNTaGFyZWQgPSBmdW5jdGlvbiBpc1NoYXJlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzU2hhcmVkKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uIGlzUHJpdmF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzUHJpdmF0ZSh0aGlzLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5zZWdyZWdhdGUgPSBmdW5jdGlvbiBzZWdyZWdhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgcmV0dXJuIE1vZGVsLnNlZ3JlZ2F0ZSh0aGlzKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgaWYgKCFNb2RlbC5pc1RyYW5zaWVudChtb2RlbCkpIHJldHVybiB7IG1vZGVsOiBtb2RlbCB9O1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzID1cbiAgICBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgfHwgW107XG5cbiAgY29uc3QgdHJhbnNpZW50UHJvcHMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIERCS2V5cy5UUkFOU0lFTlRcbiAgKTtcbiAgY29uc3QgcHJpdmF0ZVByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG4gIGNvbnN0IHNoYXJlZFByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcblxuICBjb25zdCByZXN1bHQ6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiA9IHtcbiAgICBtb2RlbDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHVibGljOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICB0cmFuc2llbnQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHByaXZhdGVzOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBzaGFyZWQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICB9O1xuXG4gIGNvbnN0IHRyYW5zaWVudEtleXMgPSBPYmplY3Qua2V5cyh0cmFuc2llbnRQcm9wcyB8fCB7fSk7XG4gIGNvbnN0IHByaXZhdGVLZXlzID0gT2JqZWN0LmtleXMocHJpdmF0ZVByb3BlcnRpZXMgfHwge30pO1xuICBjb25zdCBzaGFyZWRLZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkUHJvcGVydGllcyB8fCB7fSk7XG5cbiAgLy8gY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXkgYXMga2V5b2YgTV07XG4gICAgY29uc3QgaXNUcmFuc2llbnQgPSB0cmFuc2llbnRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgY29uc3QgaXNQdWJsaWMgPSAhaXNUcmFuc2llbnQ7XG4gICAgY29uc3QgaXNQcml2YXRlID0gcHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1NoYXJlZCA9IHNoYXJlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICAvLyBjb25zdCBpc1ByaW1hcnlLZXkgPSBrZXkgPT09IHBrS2V5O1xuXG4gICAgaWYgKGlzVHJhbnNpZW50IHx8IGlzUHJpdmF0ZSB8fCBpc1NoYXJlZCkge1xuICAgICAgcmVzdWx0LnRyYW5zaWVudCA9IHJlc3VsdC50cmFuc2llbnQgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnRyYW5zaWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgcmVzdWx0LnByaXZhdGVzID0gcmVzdWx0LnByaXZhdGVzIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5wcml2YXRlcyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQuc2hhcmVkID0gcmVzdWx0LnNoYXJlZCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQuc2hhcmVkIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIHJlc3VsdC5wdWJsaWMgPSAocmVzdWx0LnB1YmxpYyB8fCB7fSkgYXMgYW55O1xuICAgICAgKHJlc3VsdC5wdWJsaWMgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0Lm1vZGVsID0gTW9kZWwuYnVpbGQocmVzdWx0LnB1YmxpYywgbW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gIHJldHVybiByZXN1bHQgYXMgU2VncmVnYXRlZE1vZGVsPE0+O1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm1pcnJvcmVkID0gZnVuY3Rpb24gbWlycm9yZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkub3duZXJPZiA9IGZ1bmN0aW9uIG93bmVyT2Y8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1vZGVsW21ldGEgYXMga2V5b2YgTV0gYXMgc3RyaW5nO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWRBdCA9IGZ1bmN0aW9uIG1pcnJvcmVkQXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogTWlycm9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICBtb2RlbCA9IHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbDtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jb2xsZWN0aW9uc0ZvciA9IGZ1bmN0aW9uIGNvbGxlY3Rpb25zRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHtcbiAgcHJpdmF0ZUNvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG4gIHNoYXJlZENvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG59IHtcbiAgY29uc3QgcHJpdmF0ZUtleXM6IHN0cmluZ1tdID0gW0ZhYnJpY01vZGVsS2V5cy5QUklWQVRFXSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hhcmVkS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlNIQVJFRF0gYXMgc3RyaW5nW107XG5cbiAgY29uc3QgcHJpdmF0ZUtleSA9IE1ldGFkYXRhLmtleSguLi5wcml2YXRlS2V5cyk7XG4gIGNvbnN0IHNoYXJlZEtleSA9IE1ldGFkYXRhLmtleSguLi5zaGFyZWRLZXlzKTtcblxuICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG5cbiAgY29uc3QgcHJpdmF0ZU1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBwcml2YXRlS2V5XG4gICk7XG4gIGNvbnN0IHNoYXJlZE1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBzaGFyZWRLZXlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVDb2xzOiBwcml2YXRlTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gICAgc2hhcmVkQ29sczogc2hhcmVkTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gIH07XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jaGFpbmNvZGVPZiA9IGZ1bmN0aW9uIGNoYWluY29kZU9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREVcbiAgKTtcbiAgaWYgKCFtIHx8ICFtLnJlc29sdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG0ucmVzb2x2ZXIgPT09IFwic3RyaW5nXCIpIHJldHVybiBtLnJlc29sdmVyO1xuICBjb25zdCBjdHggPSBhcmdzLnBvcCgpO1xuICBpZiAoIWN0eCB8fCAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBjb250ZXh0IHByb3ZpZGVkIGZvciBjaGFpbmNvZGUgcmVzb2x1dGlvbmApO1xuICByZXR1cm4gbS5yZXNvbHZlcihtb2RlbCwgLi4uYXJncywgY3R4KTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbnRyYWN0T2YgPSBmdW5jdGlvbiBjb250cmFjdE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVFxuICApO1xuICBpZiAoIW0gfHwgIW0ucmVzb2x2ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbS5yZXNvbHZlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG0ucmVzb2x2ZXI7XG4gIGNvbnN0IGN0eCA9IGFyZ3MucG9wKCk7XG4gIGlmICghY3R4IHx8ICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGNvbnRleHQgcHJvdmlkZWQgZm9yIGNoYWluY29kZSByZXNvbHV0aW9uYCk7XG4gIHJldHVybiBtLnJlc29sdmVyKG1vZGVsLCAuLi5hcmdzLCBjdHgpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuY2hhbm5lbE9mID0gZnVuY3Rpb24gY2hhbm5lbE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFOTkVMXG4gICk7XG4gIGlmICghbSB8fCAhbS5yZXNvbHZlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtLnJlc29sdmVyID09PSBcInN0cmluZ1wiKSByZXR1cm4gbS5yZXNvbHZlcjtcbiAgY29uc3QgY3R4ID0gYXJncy5wb3AoKTtcbiAgaWYgKCFjdHggfHwgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gY29udGV4dCBwcm92aWRlZCBmb3IgY2hhaW5jb2RlIHJlc29sdXRpb25gKTtcbiAgcmV0dXJuIG0ucmVzb2x2ZXIobW9kZWwsIC4uLmFyZ3MsIGN0eCk7XG59LmJpbmQoTW9kZWwpO1xuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgQ29udGV4dE9mLFxuICBDb250ZXh0dWFsQXJncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVyRnVuY3Rpb248VD4gPSAoXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiBQcm9taXNlPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250cmFjdFJlc29sdmVyID0gKFxuICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiB7XG4gIHJldHVybiBtb2RlbC5uYW1lICsgXCJDb250cmFjdFwiO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhaW5jb2RlTWV0YWRhdGEgPSB7XG4gIHJlc29sdmVyOiBzdHJpbmcgfCBSZXNvbHZlckZ1bmN0aW9uPHN0cmluZz47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29udHJhY3QocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVCwgbWV0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbmNvZGUocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREUsIG1ldGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbChyZXNvbHZlcjogYW55KSB7XG4gIGNvbnN0IG1ldGE6IENoYWluY29kZU1ldGFkYXRhID0geyByZXNvbHZlciB9O1xuICByZXR1cm4gbWV0YWRhdGEoRmFicmljTW9kZWxLZXlzLkNIQU5ORUwsIG1ldGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyB0aGUgTVNQIElEIGZyb20gZWl0aGVyIGEgc3RyaW5nIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIGlkZW50aXR5IC0gVGhlIGlkZW50aXR5IHZhbHVlIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBNU1AgSUQgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgTVNQIElEIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1zcElkKFxuICBpZGVudGl0eTogc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaWRlbnRpdHkgPT09IFwic3RyaW5nXCIpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIGlkZW50aXR5LmdldE1TUElEKCk7XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBtYXJraW5nIG1ldGhvZHMgdGhhdCByZXF1aXJlIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICogQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgdG9rZW4gYmVmb3JlIGFsbG93aW5nIHRoZSBtZXRob2QgdG8gYmUgZXhlY3V0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7XG4gKiAgIEBPd25lcigpXG4gKiAgIGFzeW5jIE1pbnQoY3R4OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcikge1xuICogICAgIC8vIE1pbnQgdG9rZW4gbG9naWNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgY2hlY2tzIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT3duZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEZhYnJpY0VSQzIwQ29udHJhY3QsXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgY29uc3QgY3R4OiBITENvbnRleHQgPSBhcmdzWzBdO1xuICAgICAgY29uc3QgYWNvdW50SWQgPSBjdHguY2xpZW50SWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gYXdhaXQgKHRoaXMgYXMgRmFicmljRVJDMjBDb250cmFjdClbXG4gICAgICAgIFwidG9rZW5SZXBvc2l0b3J5XCJcbiAgICAgIF0uc2VsZWN0KCk7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCk7XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXCJObyB0b2tlbnMgYXZhaWFsYmxlXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRvIG1hbnkgdG9rZW4gYXZhaWxhYmxlIDogJHt0b2tlbnMubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zWzBdLm93bmVyICE9IGFjb3VudElkKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVzZXIgbm90IGF1dGhvcml6ZWQgdG8gcnVuICR7cHJvcGVydHlLZXl9IG9uIHRoZSB0b2tlbmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG93bmVkQnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG5cbiAgY29uc3QgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGxldCBvd25lciA9IGNyZWF0b3IubXNwaWQ7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEV4cGVjdGVkIG1zcGlkIHRvIGJlICR7bW9kZWxba2V5XX0gfCAke293bmVyfS4gXFxuIFVzaW5nIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiAke2FsbG93R2VuZXJhdGlvbk92ZXJyaWRlfWBcbiAgKTtcblxuICBpZiAoYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUpIG93bmVyID0gbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBvd25lcjtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG0gPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZVxuICAgICAgPyBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3duZXJPdmVycmlkZVwiKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbXNwID1cbiAgICBtIHx8IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcblxuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBTdHJpbmcoaWRWYWx1ZSksIFN0cmluZyhrKSk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHwgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHxcbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIGFsbG93Q29udGV4dFRyYW5zaWVudE1hcDogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcbiAgLy8gTm9kZSBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICAvLyBjb25zdCBwcml2YXRlS2V5ID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgLy8gLS1cblxuICAvLyB3ZWIgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgY29uc3QgayA9IChwcml2YXRlS2V5IGFzIGFueSlba2V5c1swXV07XG4gIC8vIC0tXG5cbiAgcmV0dXJuIHNpZ25lcnMubmV3UHJpdmF0ZUtleVNpZ25lcihrIGFzIGFueSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIFBFTSBidWZmZXJcbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gYSBDcnlwdG9LZXkgb2JqZWN0XG4gKiBAcGFyYW0ge0J1ZmZlcn0gcGVtIC0gVGhlIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPENyeXB0b0tleT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDcnlwdG9LZXlcbiAqIEBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRXh0cmFjdFByaXZhdGVLZXlcbiAqICAgcGFydGljaXBhbnQgU3VidGxlQ3J5cHRvXG4gKlxuICogICBDYWxsZXItPj5FeHRyYWN0UHJpdmF0ZUtleTogZXh0cmFjdFByaXZhdGVLZXkocGVtKVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBHZXQgU3VidGxlQ3J5cHRvIGltcGxlbWVudGF0aW9uXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IFBhcnNlIFBFTSBmb3JtYXRcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogQ29udmVydCB0byBiaW5hcnkgREVSXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+U3VidGxlQ3J5cHRvOiBpbXBvcnRLZXkocGtjczgsIGJpbmFyeURlciwgb3B0aW9ucylcbiAqICAgU3VidGxlQ3J5cHRvLS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDcnlwdG9LZXlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktLT4+Q2FsbGVyOiBDcnlwdG9LZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gIGNvbnN0IGxpYk5hbWUgPSBcIm5vZGU6Y3J5cHRvXCI7XG4gIGxldCBzdWJ0bGU7XG4gIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgIHN1YnRsZSA9IChnbG9iYWxUaGlzIGFzIGFueSkuY3J5cHRvLnN1YnRsZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsaWIgPSAoYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChsaWJOYW1lKSkpIGFzIGFueTtcbiAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICB9XG5cbiAgaWYgKCFzdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIFN1YnRsZUNyeXB0byBtb2R1bGVcIik7XG5cbiAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpO1xuICAgIGNvbnN0IGJ1ZlZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgIGJ1ZlZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGNvbnN0IHN0ciA9IHBlbVxuICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAucmVwbGFjZShcIi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKVxuICAgIC5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oc3RyLCBcImJhc2U2NFwiKS50b1N0cmluZyhcImJpbmFyeVwiKTtcbiAgY29uc3QgYmluYXJ5RGVyID0gc3RyMmFiKGRlY29kZWQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgc3VidGxlLmltcG9ydEtleShcbiAgICAgIFwicGtjczhcIixcbiAgICAgIGJpbmFyeURlcixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBuYW1lZEN1cnZlOiBcIlAtMjU2XCIsXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIFtcInNpZ25cIl1cbiAgICApO1xuXG4gICAgcmV0dXJuIGtleTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQ0xJRU5UX09WRVJSSURFX0tFWVM6IChrZXlvZiBGYWJyaWNDbGllbnRGbGFncylbXSA9IFtcbiAgXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiLFxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmFicmljIGNsaWVudCBjb250ZXh0IHdpdGggYSBjb25zdHJhaW5lZCBvdmVycmlkZSBzdXJmYWNlXG4gKiBAc3VtbWFyeSBSZXN0cmljdHMgd2hpY2ggY2FjaGVkIHZhbHVlcyBhcmUgcHJvcGFnYXRlZCB0byBjaGlsZCBjb250ZXh0cyBvciBzZW50XG4gKiBiYWNrIGFzIG92ZXJyaWRlcyBzbyBvbmx5IGludGVudGlvbmFsIGNsaWVudCBmbGFncyBhcmUgZm9yd2FyZGVkLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50Q29udGV4dCBleHRlbmRzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgY29uc3RydWN0b3IoY3R4PzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pIHtcbiAgICBzdXBlcihjdHgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9PdmVycmlkZXMoKTogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4ge1xuICAgIGNvbnN0IG92ZXJyaWRlczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDTElFTlRfT1ZFUlJJREVfS0VZUykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE9yVW5kZWZpbmVkKGtleSk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG92ZXJyaWRlc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdmVycmlkZXM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEFkYXB0ZXJGbGFncyxcbiAgQ29uZGl0aW9uLFxuICBHcm91cE9wZXJhdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBRdWVyeUNsYXVzZSxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgU2VsZWN0U2VsZWN0b3IsXG4gIFNlcXVlbmNlLFxuICBTdGF0ZW1lbnQsXG4gIFN0YXRlbWVudEV4ZWN1dG9yLFxuICBWaWV3S2luZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIENvdWNoREJPcGVyYXRvcixcbiAgQ291Y2hEQkdyb3VwT3BlcmF0b3IsXG4gIENvdWNoREJRdWVyeUxpbWl0LFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1NlbGVjdG9yLFxuICB0cmFuc2xhdGVPcGVyYXRvcnMsXG4gIGdlbmVyYXRlRGVzaWduRG9jTmFtZSxcbiAgZ2VuZXJhdGVWaWV3TmFtZSxcbiAgZmluZFZpZXdNZXRhZGF0YSxcbiAgQ291Y2hEQlZpZXdNZXRhZGF0YSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG50eXBlIEZhYnJpY1ZpZXdEZXNjcmlwdG9yID0ge1xuICBkZG9jOiBzdHJpbmc7XG4gIHZpZXc6IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbnR5cGUgRmFicmljQWdncmVnYXRlSW5mbyA9XG4gIHwge1xuICAgICAga2luZDogVmlld0tpbmQ7XG4gICAgICBtZXRhOiBDb3VjaERCVmlld01ldGFkYXRhO1xuICAgICAgZGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERpc3RpbmN0PzogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogXCJhdmdcIjtcbiAgICAgIGF0dHJpYnV0ZTogc3RyaW5nO1xuICAgICAgc3VtRGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgIH07XG5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcblxuZnVuY3Rpb24gbmV4dExleGljb2dyYXBoaWNTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlxcdTAwMDBcIjtcbiAgY29uc3QgY2hhcnMgPSBBcnJheS5mcm9tKHZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IGNoYXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXJzW2ldLmNvZGVQb2ludEF0KDApO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChjb2RlIDwgMHgxMGZmZmYpIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSArIDEpO1xuICAgICAgcmV0dXJuIGNoYXJzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9XFx1MDAwMGA7XG59XG5cbmZ1bmN0aW9uIHByZWZpeFJhbmdlKHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHByZWZpeCxcbiAgICBlbmQ6IG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHByZWZpeCksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgTSxcbiAgRmFicmljQ2xpZW50QWRhcHRlcixcbiAgUixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3F1YXNoKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzcXVhc2hlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8TT4gfCB1bmRlZmluZWQgPSBzdXBlci5zcXVhc2goXG4gICAgICBjdHggYXMgbmV2ZXJcbiAgICApO1xuICAgIGlmICghc3F1YXNoZWQpIHJldHVybiBzcXVhc2hlZDtcblxuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMsIGFyZ3MgfSA9IHNxdWFzaGVkO1xuICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBsaW1pdCB9ID0gcGFyYW1zO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgbWV0aG9kICR7bWV0aG9kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBzcXVhc2hlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlUHJlcGFyZWQoXG4gICAgLi4uYXJnejogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKHRoaXMuZnJvbVNlbGVjdG9yLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGNvbnN0IHsgbWV0aG9kLCBhcmdzIH0gPSB0aGlzLnByZXBhcmVkIGFzIFByZXBhcmVkU3RhdGVtZW50PGFueT47XG4gICAgcmV0dXJuIHJlcG8uc3RhdGVtZW50KG1ldGhvZCwgLi4uYXJncywgLi4uYXJneik7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwcmVwYXJlKFxuICAgIGN0eD86IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTxTdGF0ZW1lbnRFeGVjdXRvcjxNLCBSPj4ge1xuICAgIGN0eCA9XG4gICAgICBjdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlFVRVJZLFxuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fCB7fSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICkpO1xuXG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gY29udGV4dCBhdmFpbGFibGUgZm9yIHN0YXRlbWVudFwiKTtcblxuICAgIGlmICh0aGlzLmlzU2ltcGxlUXVlcnkoKSAmJiBjdHguZ2V0KFwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllc1wiKSkge1xuICAgICAgY29uc3Qgc3F1YXNoZWQgPSB0aGlzLnNxdWFzaChjdHgpO1xuICAgICAgaWYgKHNxdWFzaGVkKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZWQgPSBzcXVhc2hlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHt9IGFzIGFueTtcblxuICAgIGNvbnN0IHByZXBhcmVkOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+ID0ge1xuICAgICAgY2xhc3M6IHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgYXJncyxcbiAgICAgIHBhcmFtcyxcbiAgICB9IGFzIGFueTtcblxuICAgIGNvbnN0IG1ldGhvZDogc3RyaW5nW10gPSBbUXVlcnlDbGF1c2UuRklORF9CWV07XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wcmVwYXJlQ29uZGl0aW9uKHRoaXMud2hlcmVDb25kaXRpb24sIGN0eCBhcyBuZXZlcik7XG4gICAgICBtZXRob2QucHVzaChwYXJzZWQubWV0aG9kKTtcbiAgICAgIGlmIChwYXJzZWQuYXJncyAmJiBwYXJzZWQuYXJncy5sZW5ndGgpXG4gICAgICAgIGFyZ3MucHVzaCguLi4ocGFyc2VkLmFyZ3MgYXMgKHN0cmluZyB8IG51bWJlcilbXSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIG1ldGhvZC5wdXNoKFxuICAgICAgICBRdWVyeUNsYXVzZS5TRUxFQ1QsXG4gICAgICAgIHRoaXMuc2VsZWN0U2VsZWN0b3Iuam9pbihgICR7UXVlcnlDbGF1c2UuQU5ELnRvTG93ZXJDYXNlKCl9IGApXG4gICAgICApO1xuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgbWV0aG9kLnB1c2goUXVlcnlDbGF1c2UuT1JERVJfQlksIHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVswXSBhcyBzdHJpbmcpO1xuICAgICAgYXJncy5wdXNoKHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVsxXSBhcyBhbnkpO1xuICAgIH1cbiAgICBwcmVwYXJlZC5tZXRob2QgPSB0b0NhbWVsQ2FzZShtZXRob2Quam9pbihcIiBcIikpO1xuICAgIHByZXBhcmVkLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnByZXBhcmVkID0gcHJlcGFyZWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZCBmcm9tIENvdWNoREIvRmFicmljXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIHRoZSBJRCBmcm9tIGEgQ291Y2hEQiBkb2N1bWVudCBhbmQgcmV2ZXJ0cyBpdCB0byBhIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJvY2Vzc1JlY29yZChcbiAgICByZWNvcmQ6IGFueSxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogTSB7XG4gICAgY29uc3QgcGtBdHRyID0gTW9kZWwucGsodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS5nZXQoXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIHBrQXR0ciBhcyBzdHJpbmcpXG4gICAgKT8udHlwZTtcblxuICAgIGlmIChyZWNvcmRbQ291Y2hEQktleXMuSURdKSB7XG4gICAgICBjb25zdCBbLCAuLi5rZXlBcmdzXSA9IHJlY29yZFtDb3VjaERCS2V5cy5JRF0uc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgICAgIGNvbnN0IGlkID0ga2V5QXJncy5qb2luKFwiX1wiKTtcbiAgICAgIHJlY29yZFtwa0F0dHJdID0gU2VxdWVuY2UucGFyc2VWYWx1ZSh0eXBlIGFzIGFueSwgaWQpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5wcm9jZXNzUmVjb3JkKHJlY29yZCwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnlcbiAgICogQHN1bW1hcnkgU2VuZHMgYSByYXcgTWFuZ28gcXVlcnkgdG8gRmFicmljIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0b3IgPSAocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlSW5mbztcbiAgICBpZiAoKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZSAmJiBhZ2dyZWdhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQWdncmVnYXRlPFI+KGFnZ3JlZ2F0b3IsIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhcbiAgICAgIHJhd0lucHV0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgY3R4XG4gICAgKTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3Rvcikge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gcmVzdWx0cy5tYXAoKHIpID0+IHRoaXMucHJvY2Vzc1JlY29yZChyLCBjdHgpKTtcbiAgICAgIGlmICghY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZ0ZXJRdWVyeUhhbmRsZXJzXCIpKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQgYXMgdW5rbm93biBhcyBSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFwcGx5QWZ0ZXJIYW5kbGVyc1RvUmVzdWx0KHByb2Nlc3NlZCwgY3R4KSkgYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBmcm9tIHRoZSBzdGF0ZW1lbnRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZCgpOiBNYW5nb1F1ZXJ5IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5idWlsZCk7XG4gICAgY29uc3QgYWdncmVnYXRlUXVlcnkgPSB0aGlzLmJ1aWxkQWdncmVnYXRlUXVlcnkoKTtcbiAgICBpZiAoYWdncmVnYXRlUXVlcnkpIHJldHVybiBhZ2dyZWdhdGVRdWVyeTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IE1hbmdvU2VsZWN0b3IgPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiBzZWxlY3RvcnMgfTtcbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcikgcXVlcnkuZmllbGRzID0gdGhpcy5zZWxlY3RTZWxlY3RvciBhcyBzdHJpbmdbXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBjb25kaXRpb246IE1hbmdvU2VsZWN0b3IgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBDb25kaXRpb24uYW5kKFxuICAgICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgICAgQ29uZGl0aW9uLmF0dHJpYnV0ZTxNPihDb3VjaERCS2V5cy5UQUJMRSBhcyBrZXlvZiBNKS5lcShcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IHNlbGVjdG9yS2V5cyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbikgYXMgTWFuZ29PcGVyYXRvcltdO1xuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RvcktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoQ291Y2hEQkdyb3VwT3BlcmF0b3IpLmluZGV4T2Yoc2VsZWN0b3JLZXlzWzBdKSAhPT0gLTFcbiAgICAgIClcbiAgICAgICAgc3dpdGNoIChzZWxlY3RvcktleXNbMF0pIHtcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdIGFzIE1hbmdvU2VsZWN0b3JcbiAgICAgICAgICAgICAgKS5yZWR1Y2UoKGFjY3VtOiBNYW5nb1NlbGVjdG9yW10sIHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIlRvbyBtYW55IGtleXMgaW4gcXVlcnkgc2VsZWN0b3IuIHNob3VsZCBiZSBvbmVcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0ga2V5c1swXTtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EKVxuICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaCguLi4odmFsW2tdIGFzIGFueVtdKSk7XG4gICAgICAgICAgICAgICAgZWxzZSBhY2N1bS5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgICAgICB9LCBbXSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBjb25kaXRpb247XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLk9SOiB7XG4gICAgICAgICAgICBjb25zdCBzOiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICBzW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMocXVlcnkuc2VsZWN0b3IpLm1hcCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbikuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChxdWVyeS5zZWxlY3RvcltrZXldKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBBICR7a2V5fSBxdWVyeSBwYXJhbSBpcyBhYm91dCB0byBiZSBvdmVycmlkZGVuOiAke3F1ZXJ5LnNlbGVjdG9yW2tleV19IGJ5ICR7dmFsfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jba2V5XSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBxdWVyeS5zb3J0ID0gcXVlcnkuc29ydCB8fCBbXTtcbiAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcXVlcnkuc2VsZWN0b3IgfHwgKHt9IGFzIE1hbmdvU2VsZWN0b3IpO1xuICAgICAgZm9yIChjb25zdCBbc2VsZWN0b3JLZXksIGRpcmVjdGlvbl0gb2YgdGhpcy5vcmRlckJ5U2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc2VsZWN0b3JLZXkgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPiA9IHt9O1xuICAgICAgICByZWNbc2VsZWN0b3JdID0gZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uO1xuICAgICAgICAocXVlcnkuc29ydCBhcyBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj5bXSkucHVzaChyZWMpO1xuICAgICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAgICAgKHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSXSA9XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGltaXRTZWxlY3Rvcikge1xuICAgICAgcXVlcnkubGltaXQgPSB0aGlzLmxpbWl0U2VsZWN0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgTm8gbGltaXQgc2VsZWN0b3IgZGVmaW5lZC4gVXNpbmcgZGVmYXVsdCBjb3VjaGRiIGxpbWl0IG9mICR7Q291Y2hEQlF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gQ291Y2hEQlF1ZXJ5TGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpIHF1ZXJ5LnNraXAgPSB0aGlzLm9mZnNldFNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBDb25kaXRpb24gb2JqZWN0IGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogTWFuZ29RdWVyeSB7XG4gICAgZnVuY3Rpb24gbWVyZ2UoXG4gICAgICBvcDogTWFuZ29PcGVyYXRvcixcbiAgICAgIG9iajE6IE1hbmdvU2VsZWN0b3IsXG4gICAgICBvYmoyOiBNYW5nb1NlbGVjdG9yXG4gICAgKTogTWFuZ29RdWVyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiB7fSBhcyBNYW5nb1NlbGVjdG9yIH07XG4gICAgICByZXN1bHQuc2VsZWN0b3Jbb3BdID0gW29iajEsIG9iajJdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuU1RBUlRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHJhbmdlID0gcHJlZml4UmFuZ2UoY29tcGFyaXNvbik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSX0VRXSA9IHJhbmdlLnN0YXJ0O1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuU01BTExFUl0gPSByYW5nZS5lbmQ7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuRU5EU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHtcbiAgICAgICAgW0NvdWNoREJPcGVyYXRvci5SRUdFWFBdOiBgJHtlc2NhcGVSZWdFeHAoY29tcGFyaXNvbil9JGAsXG4gICAgICB9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuQkVUV0VFTikge1xuICAgICAgY29uc3QgYXR0ciA9IGF0dHIxIGFzIHN0cmluZztcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb21wYXJpc29uKSB8fCBjb21wYXJpc29uLmxlbmd0aCAhPT0gMilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJCRVRXRUVOIG9wZXJhdG9yIHJlcXVpcmVzIFttaW4sIG1heF0gY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb21wYXJpc29uO1xuICAgICAgY29uc3Qgb3BCZXR3ZWVuOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wQmV0d2VlblthdHRyXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuQklHR0VSX0VRKVxuICAgICAgXSA9IG1pbjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5TTUFMTEVSX0VRKVxuICAgICAgXSA9IG1heDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcEJldHdlZW4gfTtcbiAgICB9XG5cbiAgICBsZXQgb3A6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgIGlmIChcbiAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICApID09PSAtMVxuICAgICkge1xuICAgICAgb3BbYXR0cjEgYXMgc3RyaW5nXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbYXR0cjEgYXMgc3RyaW5nXSBhcyBNYW5nb1NlbGVjdG9yKVt0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXSA9XG4gICAgICAgIGNvbXBhcmlzb247XG4gICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICBvcCA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvciBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIChhdHRyMSBhcyB1bmtub3duIGFzIHsgYXR0cjE6IHN0cmluZyB9KS5hdHRyMVxuICAgICAgXSA9IGNvbXBhcmlzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wMTogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgb3AyOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIG9wID0gbWVyZ2UodHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKSwgb3AxLCBvcDIpLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYW4gYWdncmVnYXRlIHF1ZXJ5IGlmIGFnZ3JlZ2F0aW9uIGlzIHJlcXVlc3RlZFxuICAgKiBAc3VtbWFyeSBDaGVja3MgZm9yIGFnZ3JlZ2F0ZSBvcGVyYXRpb25zIGFuZCByZXR1cm5zIGEgc3BlY2lhbCBNYW5nb1F1ZXJ5IGZvciB0aGVtXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWdncmVnYXRlUXVlcnkoKTogTWFuZ29RdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5hdmdTZWxlY3Rvcikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gU3RyaW5nKHRoaXMuYXZnU2VsZWN0b3IpO1xuICAgICAgY29uc3Qgc3VtSW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcInN1bVwiLCBhdHRyaWJ1dGUpO1xuICAgICAgY29uc3QgY291bnRJbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiY291bnRcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmICghc3VtSW5mbyB8fCAhY291bnRJbmZvKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICBgQXZnIG9wZXJhdGlvbiByZXF1aXJlcyBzdW0gYW5kIGNvdW50IHZpZXdzIGZvciBhdHRyaWJ1dGUgJHthdHRyaWJ1dGV9YFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoe1xuICAgICAgICBraW5kOiBcImF2Z1wiLFxuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIHN1bURlc2NyaXB0b3I6IHN1bUluZm8uZGVzY3JpcHRvcixcbiAgICAgICAgY291bnREZXNjcmlwdG9yOiBjb3VudEluZm8uZGVzY3JpcHRvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9XG4gICAgICAgIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yID09IG51bGxcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogU3RyaW5nKHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJkaXN0aW5jdFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaW5mby5jb3VudERpc3RpbmN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRvclVzZWQgPVxuICAgICAgdHlwZW9mIHRoaXMuY291bnRTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgdHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAhIXRoaXMubWluU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5tYXhTZWxlY3RvciB8fFxuICAgICAgISF0aGlzLnN1bVNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuZGlzdGluY3RTZWxlY3RvcjtcblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JDaGVja3M6IEFycmF5PFtWaWV3S2luZCwgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgIFtcbiAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAodGhpcy5jb3VudFNlbGVjdG9yID8/IHVuZGVmaW5lZCkgYXMgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWQsXG4gICAgICBdLFxuICAgICAgW1wibWF4XCIsIHRoaXMubWF4U2VsZWN0b3JdLFxuICAgICAgW1wibWluXCIsIHRoaXMubWluU2VsZWN0b3JdLFxuICAgICAgW1wic3VtXCIsIHRoaXMuc3VtU2VsZWN0b3JdLFxuICAgICAgW1wiZGlzdGluY3RcIiwgdGhpcy5kaXN0aW5jdFNlbGVjdG9yXSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBba2luZCwgc2VsZWN0b3JdIG9mIGFnZ3JlZ2F0b3JDaGVja3MpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHNlbGVjdG9yID8gU3RyaW5nKHNlbGVjdG9yKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3Ioa2luZCwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICB9XG5cbiAgICBpZiAoYWdncmVnYXRvclVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBgTm8gQ291Y2hEQiB2aWV3IG1ldGFkYXRhIGZvdW5kIGZvciB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgICApfSBhZ2dyZWdhdG9yYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBhZ2dyZWdhdGUgZGVzY3JpcHRvciBmb3IgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXG4gICAga2luZDogVmlld0tpbmQsXG4gICAgYXR0cmlidXRlPzogc3RyaW5nXG4gICk6IEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhcyA9IGZpbmRWaWV3TWV0YWRhdGEodGhpcy5mcm9tU2VsZWN0b3IsIGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgaWYgKCFtZXRhcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YSA9IG1ldGFzWzBdO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3Qgdmlld05hbWUgPSBnZW5lcmF0ZVZpZXdOYW1lKHRhYmxlTmFtZSwgbWV0YS5hdHRyaWJ1dGUsIGtpbmQsIG1ldGEpO1xuICAgIGNvbnN0IGRkb2MgPSBtZXRhLmRkb2MgfHwgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lKHRhYmxlTmFtZSwgdmlld05hbWUpO1xuICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICByZWR1Y2U6IG1ldGEucmVkdWNlICE9PSB1bmRlZmluZWQgPyB0cnVlIDogIW1ldGEucmV0dXJuRG9jcyxcbiAgICB9O1xuICAgIGlmIChraW5kID09PSBcImRpc3RpbmN0XCIgfHwga2luZCA9PT0gXCJncm91cEJ5XCIpIG9wdGlvbnMuZ3JvdXAgPSB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kLFxuICAgICAgbWV0YSxcbiAgICAgIGRlc2NyaXB0b3I6IHtcbiAgICAgICAgZGRvYyxcbiAgICAgICAgdmlldzogdmlld05hbWUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIHNwZWNpYWwgYWdncmVnYXRlIE1hbmdvUXVlcnkgbWFya2VyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3Rvcjoge30sXG4gICAgICBhZ2dyZWdhdGU6IHRydWUsXG4gICAgICBhZ2dyZWdhdGVJbmZvOiBpbmZvLFxuICAgIH0gYXMgTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIgY2FzdCB0byBGYWJyaWNDbGllbnRBZGFwdGVyIGZvciB2aWV3IGFjY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRGYWJyaWNBZGFwdGVyKCk6IEZhYnJpY0NsaWVudEFkYXB0ZXIge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYW4gYWdncmVnYXRlIHF1ZXJ5IHZpYSBhZGFwdGVyJ3MgdmlldyBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoIXRoaXMuaXNWaWV3QWdncmVnYXRlKGluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdmVyYWdlPFI+KGluZm8sIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLmRkb2MsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLnZpZXcsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLm9wdGlvbnMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oaW5mbywgcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGF2ZXJhZ2UgY2FsY3VsYXRpb24gZnJvbSBzdW0gYW5kIGNvdW50IHZpZXdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUF2ZXJhZ2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKGluZm8ua2luZCAhPT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQXZlcmFnZSBkZXNjcmlwdG9yIGlzIG5vdCB2YWxpZFwiKTtcbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3QgW3N1bURlc2MsIGNvdW50RGVzY10gPSBbaW5mby5zdW1EZXNjcmlwdG9yLCBpbmZvLmNvdW50RGVzY3JpcHRvcl07XG4gICAgY29uc3QgW3N1bVJlc3BvbnNlLCBjb3VudFJlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBzdW1EZXNjLmRkb2MsXG4gICAgICAgIHN1bURlc2MudmlldyxcbiAgICAgICAgc3VtRGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgY291bnREZXNjLmRkb2MsXG4gICAgICAgIGNvdW50RGVzYy52aWV3LFxuICAgICAgICBjb3VudERlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgIF0pO1xuICAgIGNvbnN0IHN1bSA9IHN1bVJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBjb25zdCBjb3VudCA9IGNvdW50UmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGlmICghY291bnQpIHJldHVybiAwIGFzIHVua25vd24gYXMgUjtcbiAgICByZXR1cm4gKHN1bSAvIGNvdW50KSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyB0aGUgdmlldyByZXNwb25zZSBiYXNlZCBvbiBhZ2dyZWdhdGUga2luZFxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzVmlld1Jlc3BvbnNlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgcmVzcG9uc2U6IFZpZXdSZXNwb25zZVxuICApOiBSIHtcbiAgICBpZiAoaW5mby5raW5kID09PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIFwiQXZlcmFnZSByZXN1bHRzIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBwcm9jZXNzaW5nIHJvd3NcIlxuICAgICAgKTtcbiAgICBjb25zdCByb3dzID0gcmVzcG9uc2Uucm93cyB8fCBbXTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IG1ldGEgPSB2aWV3SW5mby5tZXRhO1xuICAgIGlmICh2aWV3SW5mby5jb3VudERpc3RpbmN0KSB7XG4gICAgICByZXR1cm4gKHJvd3MubGVuZ3RoIHx8IDApIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKHZpZXdJbmZvLmtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCB2aWV3SW5mby5raW5kID09PSBcImdyb3VwQnlcIikge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5rZXkgPz8gcm93LnZhbHVlKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmIChtZXRhLnJldHVybkRvY3MpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cudmFsdWUgPz8gcm93LmRvYyA/PyByb3cpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICh2aWV3SW5mby5raW5kID09PSBcImNvdW50XCIgPyAwIDogbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gKHJvd3NbMF0udmFsdWUgPz8gcm93c1swXS5rZXkgPz8gbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGluZm8gaXMgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZpZXdBZ2dyZWdhdGUoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBpbmZvIGlzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB7XG4gICAgcmV0dXJuIGluZm8ua2luZCAhPT0gXCJhdmdcIjtcbiAgfVxufVxuIiwiaW1wb3J0IFwiLi4vc2hhcmVkL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIHR5cGUgTWFuZ29RdWVyeSxcbiAgdHlwZSBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQgKiBhcyBncnBjIGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQge1xuICBNb2RlbCxcbiAgdHlwZSBNb2RlbENvbnN0cnVjdG9yLFxuICB0eXBlIFNlcmlhbGl6ZXIsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGRlYnVnLCBmaW5hbCwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBQZWVyQ29uZmlnLFxuICB0eXBlIFNlZ3JlZ2F0ZWRNb2RlbCxcbiAgdHlwZSBNc3BEZXRhaWxzLFxufSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjb25uZWN0LFxuICB0eXBlIENvbm5lY3RPcHRpb25zLFxuICBHYXRld2F5LFxuICBOZXR3b3JrLFxuICBQcm9wb3NhbE9wdGlvbnMsXG4gIENvbnRyYWN0IGFzIENvbnRyYWt0LFxuICB0eXBlIFNpZ25lcixcbiAgR2F0ZXdheUVycm9yLFxuICBFbmRvcnNlRXJyb3IsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IEdhdGV3YXkgYXMgTGVnYWN5R2F0ZXdheSwgV2FsbGV0cyB9IGZyb20gXCJmYWJyaWMtbmV0d29ya1wiO1xuaW1wb3J0IHR5cGUgeyBFbmRvcnNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQge1xuICBnZXRJZGVudGl0eSxcbiAgZ2V0U2lnbmVyLFxuICBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCxcbiAgcmVhZEZpbGUgYXMgcmVhZEZzRmlsZSxcbn0gZnJvbSBcIi4vZmFicmljLWZzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBOb3RGb3VuZEVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIHR5cGUgUHJpbWFyeUtleVR5cGUsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJGbGFncyxcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBNaWdyYXRpb25FcnJvcixcbiAgT2JzZXJ2ZXJFcnJvcixcbiAgUGFnaW5nRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgU3RhdGVtZW50LFxuICB0eXBlIFByZXBhcmVkU3RhdGVtZW50LFxuICBQYWdpbmF0b3IsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIHR5cGUgUHJlcGFyZWRNb2RlbCxcbiAgQWxsT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyLCBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2xpZW50U2VyaWFsaXplciB9IGZyb20gXCIuLi9zaGFyZWQvQ2xpZW50U2VyaWFsaXplclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50Q29udGV4dCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudERpc3BhdGNoIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50RGlzcGF0Y2hcIjtcbi8vIGltcG9ydCB7IEhTTVNpZ25lckZhY3RvcnlDdXN0b20gfSBmcm9tIFwiLi9mYWJyaWMtaHNtXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRTdGF0ZW1lbnRcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFBhZ2luYXRvciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFBhZ2luYXRvclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7XG4gIEVuZG9yc2VtZW50RXJyb3IsXG4gIEVuZG9yc2VtZW50UG9saWN5RXJyb3IsXG4gIE12Y2NSZWFkQ29uZmxpY3RFcnJvcixcbiAgUGhhbnRvbVJlYWRDb25mbGljdEVycm9yLFxuICBRdWVyeVJlc3VsdFRvb0xhcmdlRXJyb3IsXG4gIFRyYW5zYWN0aW9uVGltZW91dEVycm9yLFxufSBmcm9tIFwiLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuL2NyeXB0b1wiO1xuaW1wb3J0IHsgZXh0cmFjdElkcyB9IGZyb20gXCIuL2lkcy9pZC1leHRyYWN0aW9uXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJhY3RSZXNvbHZlciwgSWRlbnRpdHkgfSBmcm9tIFwiLi4vc2hhcmVkL2luZGV4XCI7XG5cbnR5cGUgTGVnYWN5UGVlclRhcmdldCA9IHtcbiAgbXNwSWQ6IHN0cmluZztcbiAgcGVlckVuZHBvaW50OiBzdHJpbmc7XG4gIHBlZXJIb3N0QWxpYXM/OiBzdHJpbmc7XG4gIHRsc0NlcnQ/OiBzdHJpbmcgfCBCdWZmZXI7XG59O1xuXG50eXBlIExlZ2FjeVBlZXJXaXRoTmFtZSA9IExlZ2FjeVBlZXJUYXJnZXQgJiB7IG5hbWU6IHN0cmluZyB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3Jrc1xuICogQHN1bW1hcnkgVGhlIEZhYnJpY0FkYXB0ZXIgZXh0ZW5kcyBDb3VjaERCQWRhcHRlciB0byBwcm92aWRlIGEgc2VhbWxlc3MgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3Jrcy5cbiAqIEl0IGhhbmRsZXMgY29ubmVjdGlvbiBtYW5hZ2VtZW50LCB0cmFuc2FjdGlvbiBzdWJtaXNzaW9uLCBhbmQgQ1JVRCBvcGVyYXRpb25zIGFnYWluc3QgRmFicmljIGNoYWluY29kZS5cbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEB0ZW1wbGF0ZSBGYWJyaWNGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgQ29udGV4dDxGYWJyaWNGbGFncz4gLSBDb250ZXh0IHR5cGUgY29udGFpbmluZyBGYWJyaWMtc3BlY2lmaWMgZmxhZ3NcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBhbGlhcyAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICogQGNsYXNzIEZhYnJpY0NsaWVudEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljQWRhcHRlciBpbnN0YW5jZVxuICogY29uc3QgY29uZmlnOiBQZWVyQ29uZmlnID0ge1xuICogICBtc3BJZDogJ09yZzFNU1AnLFxuICogICBwZWVyRW5kcG9pbnQ6ICdsb2NhbGhvc3Q6NzA1MScsXG4gKiAgIGNoYW5uZWxOYW1lOiAnbXljaGFubmVsJyxcbiAqICAgY2hhaW5jb2RlTmFtZTogJ215Y2MnLFxuICogICBjb250cmFjdE5hbWU6ICdteWNvbnRyYWN0JyxcbiAqICAgdGxzQ2VydFBhdGg6ICcvcGF0aC90by90bHMvY2VydCcsXG4gKiAgIGNlcnREaXJlY3RvcnlQYXRoOiAnL3BhdGgvdG8vY2VydC9kaXInLFxuICogICBrZXlEaXJlY3RvcnlQYXRoOiAnL3BhdGgvdG8va2V5L2RpcidcbiAqIH07XG4gKlxuICogY29uc3QgYWRhcHRlciA9IG5ldyBGYWJyaWNBZGFwdGVyKGNvbmZpZywgJ29yZzEtYWRhcHRlcicpO1xuICpcbiAqIC8vIFVzZSB0aGUgYWRhcHRlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29ya1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgYWRhcHRlci5yZWFkKCd1c2VycycsICd1c2VyMScsIG15U2VyaWFsaXplcik7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+RmFicmljQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsLCB0cmFuc2llbnQsIHNlcmlhbGl6ZXIpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBzdWJtaXRUcmFuc2FjdGlvbihPcGVyYXRpb25LZXlzLkNSRUFURSwgW3NlcmlhbGl6ZWRNb2RlbF0sIHRyYW5zaWVudClcbiAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3QoKVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsTmFtZSlcbiAqICAgTmV0d29yay0+PkNvbnRyYWN0OiBnZXRDb250cmFjdChjaGFpbmNvZGVOYW1lLCBjb250cmFjdE5hbWUpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogc3VibWl0KGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBkZWNvZGUocmVzdWx0KVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkZWNvZGVkUmVzdWx0KVxuICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogZGVzZXJpYWxpemVkUmVzdWx0XG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgUGVlckNvbmZpZyxcbiAgQ2xpZW50LFxuICBNYW5nb1F1ZXJ5LFxuICBGYWJyaWNDbGllbnRDb250ZXh0XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgdGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIFVpbnQ4QXJyYXkgdG8gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICBwcml2YXRlIHN0YXRpYyBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXIoKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0NsaWVudEFkYXB0ZXIuc2VyaWFsaXplcjtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IENvbnRleHQoKTogQ29uc3RydWN0b3I8RmFicmljQ2xpZW50Q29udGV4dD4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRDb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgYWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBlZXJDb25maWcsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MsIGNvbmZpZyksXG4gICAgICBGYWJyaWNGbGF2b3VyLFxuICAgICAgYWxpYXNcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoYWluY29kZUZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuY2hhaW5jb2RlRm9yKG1vZGVsLCB0aGlzLmNvbmZpZywgLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hhbm5lbEZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuY2hhbm5lbEZvcihtb2RlbCwgdGhpcy5jb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnRyYWN0Rm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5jb250cmFjdEZvcihtb2RlbCwgdGhpcy5jb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+XG4gICk6IFN0YXRlbWVudDxNLCBGYWJyaWNDbGllbnRBZGFwdGVyLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFN0YXRlbWVudCh0aGlzLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgcXVlcnk6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gfCBNYW5nb1F1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKTogUGFnaW5hdG9yPE0sIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50UGFnaW5hdG9yKHRoaXMsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgQ29uc3RydWN0b3I8TT5bXSB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGYWJyaWNDbGllbnRGbGFncz4ge1xuICAgIGNvbnN0IG1lcmdlZEZsYWdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWcsIGZsYWdzKTtcbiAgICBjb25zdCBmID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIG1lcmdlZEZsYWdzLCAuLi5hcmdzKVxuICAgICk7XG4gICAgcmV0dXJuIGY7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgQWxsT3BlcmF0aW9uS2V5cyxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50Q29udGV4dD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5zaWxseShcbiAgICAgIGBjcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsID8gKEFycmF5LmlzQXJyYXkobW9kZWwpID8gbW9kZWwubWFwKChtKSA9PiBNb2RlbC50YWJsZU5hbWUobSkpIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKSkgOiBcIm5vXCJ9IHRhYmxlICR7b3ZlcnJpZGVzICYmIE9iamVjdC5rZXlzKG92ZXJyaWRlcykgPyBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA6IFwibm9cIn0gd2l0aCBmbGFnIG92ZXJyaWRlc2BcbiAgICApO1xuICAgIGxldCBjdHggPSBhcmdzLnBvcCgpO1xuICAgIGlmICh0eXBlb2YgY3R4ICE9PSBcInVuZGVmaW5lZFwiICYmICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpIHtcbiAgICAgIGFyZ3MucHVzaChjdHgpO1xuICAgICAgY3R4ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlcyA9IGN0eFxuICAgICAgPyBPYmplY3QuYXNzaWduKHt9LCBjdHgudG9PdmVycmlkZXMoKSwgb3ZlcnJpZGVzKVxuICAgICAgOiBvdmVycmlkZXM7XG4gICAgY29uc3QgZmxhZ3MgPSBhd2FpdCB0aGlzLmZsYWdzKFxuICAgICAgdHlwZW9mIG9wZXJhdGlvbiA9PT0gXCJzdHJpbmdcIiA/IG9wZXJhdGlvbiA6IG9wZXJhdGlvbi5uYW1lLFxuICAgICAgbW9kZWwsXG4gICAgICBvdmVycmlkZXMgYXMgUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgICAuLi5bLi4uYXJncywgY3R4XS5maWx0ZXIoQm9vbGVhbilcbiAgICApO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgaWYgKCEoY3R4IGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICBjb25zdCBuZXdDdHggPSBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAgICAgLi4uY3R4W1wiY2FjaGVcIl0sXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgICAgcGFyZW50Q29udGV4dDogY3R4LFxuICAgICAgICB9KSBhcyBhbnk7XG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50T3AgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIik7XG4gICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJhZmZlY3RlZFRhYmxlc1wiKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWN1cnJlbnRPcCB8fFxuICAgICAgICBjdXJyZW50T3AgIT09IG9wZXJhdGlvbiB8fFxuICAgICAgICAobW9kZWwgJiYgbW9kZWwgIT09IGN1cnJlbnRNb2RlbClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXdDdHggPSBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAgICAgLi4uY3R4W1wiY2FjaGVcIl0sXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgICAgcGFyZW50Q29udGV4dDogY3R4LFxuICAgICAgICB9KSBhcyBhbnk7XG5cbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdHguYWNjdW11bGF0ZShmbGFncykgYXMgYW55O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAuLi5mbGFncyxcbiAgICB9KSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY29kZXMgYSBVaW50OEFycmF5IHRvIGEgc3RyaW5nXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGJpbmFyeSBkYXRhIHJlY2VpdmVkIGZyb20gRmFicmljIHRvIGEgc3RyaW5nIHVzaW5nIFVURi04IGVuY29kaW5nXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YSAtIFRoZSBiaW5hcnkgZGF0YSB0byBkZWNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmdcbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5kZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8XG4gICAgUiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gICAgICBhbnksXG4gICAgICBBZGFwdGVyPFBlZXJDb25maWcsIENsaWVudCwgTWFuZ29RdWVyeSwgRmFicmljQ2xpZW50Q29udGV4dD5cbiAgICA+LFxuICA+KCk6IENvbnN0cnVjdG9yPFI+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50UmVwb3NpdG9yeSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFI+O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFtcbiAgICBDb25zdHJ1Y3RvcjxNPixcbiAgICBQcmltYXJ5S2V5VHlwZSxcbiAgICBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFueVtdLFxuICAgIEZhYnJpY0NsaWVudENvbnRleHQsXG4gIF0ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbY2xhenosIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSByZWNvcmRzIGZvciBjcmVhdGlvblxuICAgKiBAc3VtbWFyeSBBZGRzIG5lY2Vzc2FyeSBDb3VjaERCIGZpZWxkcyB0byBtdWx0aXBsZSByZWNvcmRzIGJlZm9yZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkcyAtIFRoZSBJRHMgb2YgdGhlIHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gcHJlcGFyZVxuICAgKiBAcmV0dXJuIEEgdHVwbGUgY29udGFpbmluZyB0aGUgdGFibGVOYW1lLCBpZHMsIGFuZCBwcmVwYXJlZCByZWNvcmRzXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGlkcyBhbmQgbW9kZWxzIGFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IG1vZGVscyAtIEFycmF5IG9mIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIC8vSEVSRSFcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB0cmFuc2llbnQgPSBjdHhBcmdzLnNoaWZ0KCkgYXMgUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4sXG4gICAgICB0aGlzLmNyZWF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy5pbmZvKGBhZGRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCBzZXJpYWxpemVkTW9kZWxzID0gbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobSwgY2xhenoubmFtZSlcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWRNb2RlbHMpXSxcbiAgICAgIGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDogdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgICAgY2xhenosXG4gICAgICAgIGN0eCxcbiAgICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgICAgcmVzWzBdW01vZGVsLnBrKGNsYXp6KSBhcyBzdHJpbmddIHx8IGlkc1swXVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtIGFzIGFueSwgdHJhbnNpZW50Py5baV0gfHwge30pLFxuICAgICAgICAgICAgICByZXNbaV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gcmVhZCBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzIHRvIHJlYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWRBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmluZm8oYHJlYWRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PixcbiAgICAgIHRoaXMudXBkYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbHMgPSBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZE1vZGVscyldLFxuICAgICAgaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcblxuICAgIGxldCByZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnQ/LltpXSB8fCB7fSksXG4gICAgICAgICAgICAgIHJlc1tpXVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRzXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBkZWxldGUgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD59IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byBkZWxldGVcbiAgICogQHBhcmFtIHtTZXJpYWxpemVyPGFueT59IHNlcmlhbGl6ZXIgLSBTZXJpYWxpemVyIGZvciB0aGUgbW9kZWwgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZHNbMF1cbiAgICApO1xuICAgIGlmIChzaG91bGRIeWRyYXRlKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJlYWRBbGwoY2xhenosIGlkcywgLi4uY3R4QXJncyk7XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYGRlbGV0aW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoaWRzKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHNob3VsZEh5ZHJhdGVcbiAgICAgICAgPyByZXN1bHRcbiAgICAgICAgOiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlcykpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogU2VncmVnYXRlZE1vZGVsPE0+ICYgUHJlcGFyZWRNb2RlbCB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdCA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG4gICAgaWYgKChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0pIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7KG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwbGl0Lm1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KG1vZGVsKTtcbiAgICBpZiAobWlycm9yTWV0YSkge1xuICAgICAgY29uc3QgbWlycm9yTXNwID0gbWlycm9yTWV0YS5tc3BJZDtcbiAgICAgIGlmICghbWlycm9yTXNwKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gbWlycm9yIE1TUCBjb3VsZCBiZSBmb3VuZGApO1xuICAgICAgbGV0IG1zcHMgPSB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSB8fCBbXTtcbiAgICAgIG1zcHMgPSBBcnJheS5pc0FycmF5KG1zcHMpID8gbXNwcyA6IFttc3BzXTtcbiAgICAgIGNvbnN0IG1lcmdlZCA9IFsuLi5uZXcgU2V0KFsuLi5tc3BzLCBtaXJyb3JNc3BdKV07XG4gICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgIGVuZG9yc2luZ09yZ3M6IG1lcmdlZCxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogbWVyZ2VkLFxuICAgICAgICBsZWdhY3k6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiBzcGxpdC5tb2RlbCxcbiAgICAgIG1vZGVsOiBzcGxpdC5tb2RlbCxcbiAgICAgIGlkOiBtb2RlbFtNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPildIGFzIHN0cmluZyxcbiAgICAgIHRyYW5zaWVudDogc3BsaXQudHJhbnNpZW50LFxuICAgICAgcHJpdmF0ZXM6IHNwbGl0LnByaXZhdGVzLFxuICAgICAgc2hhcmVkOiBzcGxpdC5zaGFyZWQsXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGlmIChcbiAgICAgIHRyYW5zaWVudCAmJlxuICAgICAgdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICAgICAgY3R4LFxuICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB0eXBlb2YgdiAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iaiAmJiAob2JqIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBvdmVyd3JpdGluZyBleGlzdGluZyAke2tleX0uIGlmIHRoaXMgaXMgbm90IGEgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtYXkgcG9zZSBhIHByb2JsZW1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgY2hpbGRSZWJ1aWxkID1cbiAgICAgIHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNoaWxkUmVidWlsZCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcmVzb2x2ZWRPcCA9IHRoaXMucmVzb2x2ZU9wZXJhdGlvbihjdHgsIG9wZXJhdGlvbik7XG4gICAgaWYgKCFyZXNvbHZlZE9wKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgb3AgPSByZXNvbHZlZE9wLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKFxuICAgICAgb3AuaW5jbHVkZXMoXCJyZWFkXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcImZpbmRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwicXVlcnlcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwic3RhdGVtZW50XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInBhZ2VcIilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlT3BlcmF0aW9uKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAob3BlcmF0aW9uKSByZXR1cm4gb3BlcmF0aW9uO1xuICAgIGlmICh0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcIm9wZXJhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGhhc1RyYW5zaWVudDogYm9vbGVhbixcbiAgICBpZD86IFByaW1hcnlLZXlUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGFzVHJhbnNpZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWQgPSBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGdlbmVyYXRlZCA9IE1vZGVsLmdlbmVyYXRlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGhhc0lkID0gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbDtcbiAgICBpZiAoIWhhc0lkICYmIGNvbXBvc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWhhc0lkICYmIGdlbmVyYXRlZCkge1xuICAgICAgY3R4LmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlZnJlc2ggcmVjb3JkIHdpdGggcHJpdmF0ZSBnZW5lcmF0ZWQgcHJpbWFyeSBrZXlgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzSWQ7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFRyYW5zaWVudE92ZXJyaWRlcyhcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBoYXNUcmFuc2llbnREYXRhID0gdGhpcy5oYXNNZWFuaW5nZnVsVHJhbnNpZW50RGF0YSh0cmFuc2llbnREYXRhKTtcbiAgICBjb25zdCBzaG91bGRJbmplY3QgPSAhIWN0eC5nZXRPclVuZGVmaW5lZChcImFsbG93Q29udGV4dFRyYW5zaWVudE1hcFwiKTtcbiAgICBpZiAoIWhhc1RyYW5zaWVudERhdGEgJiYgIXNob3VsZEluamVjdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBvdmVycmlkZXMgPSBjdHgudG9PdmVycmlkZXMoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gaGFzVHJhbnNpZW50RGF0YSA/IE9iamVjdC5hc3NpZ24oe30sIHRyYW5zaWVudERhdGEpIDoge307XG4gICAgaWYgKHNob3VsZEluamVjdCAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCkge1xuICAgICAgcGF5bG9hZFtGYWJyaWNNb2RlbEtleXMuT1ZFUlJJREVTXSA9IG92ZXJyaWRlcztcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHBheWxvYWQpLmxlbmd0aCA/IHBheWxvYWQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gdGhpcy5oYXNNZWFuaW5nZnVsVHJhbnNpZW50RGF0YShpdGVtKSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGVudHJpZXMuc29tZSgoWywgZW50cnldKSA9PiB0aGlzLmhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhKGVudHJ5KSk7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkaXJlY3QgPVxuICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwiZW5kb3JzaW5nT3Jnc1wiKSB8fFxuICAgICAgKGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpO1xuICAgIGlmIChkaXJlY3QgJiYgZGlyZWN0Lmxlbmd0aCkgcmV0dXJuIGRpcmVjdDtcbiAgICByZXR1cm4gKFxuICAgICAgKGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgKGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29uZmlnLmFsbG93R2F0ZXdheU92ZXJyaWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIGEgcmVjb3JkIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBvdmVycmlkZSBhc3luYyBjcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PixcbiAgICAgIHRoaXMuY3JlYXRlXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy52ZXJib3NlKGBhZGRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUpXSxcbiAgICAgIGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDogdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyBoZWFsdGhjaGVjazxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmhlYWx0aGNoZWNrKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcImhlYWx0aGNoZWNrXCIsXG4gICAgICBbXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWQpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cudmVyYm9zZShgcmVhZGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgW2lkLnRvU3RyaW5nKCldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgLy8gcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbY2xhenosIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdXBkYXRlIGEgcmVjb3JkIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIHVwZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+LFxuICAgICAgdGhpcy51cGRhdGVcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDTElFTlQgVVBEQVRFIGNsYXNzIDogJHt0eXBlb2YgY2xhenp9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUpXSxcbiAgICAgIGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDogdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBkZWxldGUgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZFxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZChjbGF6eiwgaWQsIGN0eCk7XG4gICAgfVxuXG4gICAgbG9nLnZlcmJvc2UoYGRlbGV0aW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICByZXR1cm4gc2hvdWxkSHlkcmF0ZVxuICAgICAgPyByZXN1bHRcbiAgICAgIDogdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHBlcmZvcm0gYSBxdWVyeSB1c2luZyBNYW5nbyBRdWVyeSBzeW50YXhcbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgcmV0dXJuIHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBRdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJvY2VzcyAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzdWx0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gICAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+RmFicmljQWRhcHRlcjogcmF3KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBKU09OLnN0cmluZ2lmeShyYXdJbnB1dClcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZXZhbHVhdGVUcmFuc2FjdGlvbihcInF1ZXJ5XCIsIFtpbnB1dF0pXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShcInF1ZXJ5XCIsIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBKU09OLnBhcnNlKGRlY29kZShyZXN1bHQpKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdCBiYXNlZCBvbiB0eXBlXG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IHByb2Nlc3NlZCByZXN1bHRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIGFzeW5jIHJhdzxWLCBEIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnksXG4gICAgZG9jc09ubHk6IEQgPSB0cnVlIGFzIEQsXG4gICAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgbG9nLmluZm8oYFBlcmZvcm1pbmcgcmF3IHN0YXRlbWVudCBvbiB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShjbGF6eil9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwicmF3XCIsXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeShyYXdJbnB1dCksIGRvY3NPbmx5XSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGNsYXp6XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pID0+IHtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKHJlY29yZCkpIHJldHVybiBNb2RlbC5idWlsZChyZWNvcmQpO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgICBjb25zdCBlbCA9IHJlc3VsdFswXTtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKGVsKSlcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IG9uZSBpcyBhIG1vZGVsLCBhbGwgYXJlIG1vZGVsc1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZWwpID0+IE1vZGVsLmJ1aWxkKGVsKSkgYXMgVjtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVzdWx0IGFzIGFueSkgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBDb3VjaERCIHZpZXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBxdWVyeSBhIGRlc2lnbiBkb2N1bWVudCB2aWV3XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHZpZXcgcmVzcG9uc2UgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGRvYyAtIERlc2lnbiBkb2N1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSAtIFZpZXcgbmFtZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBWaWV3IHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIHsuLi5Db250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0Pn0gYXJncyAtIE9wdGlvbmFsIGNvbnRleHR1YWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vmlld1Jlc3BvbnNlPFI+Pn0gVGhlIHZpZXcgcmVzcG9uc2VcbiAgICovXG4gIEBkZWJ1ZygpXG4gIGFzeW5jIHZpZXc8Uj4oXG4gICAgZGRvYzogc3RyaW5nLFxuICAgIHZpZXdOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFZpZXdSZXNwb25zZTxSPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudmlldyk7XG4gICAgbG9nLmluZm8oYFF1ZXJ5aW5nIHZpZXcgJHtkZG9jfS8ke3ZpZXdOYW1lfWApO1xuICAgIGxldCB0cmFuc2FjdGlvblJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgY3R4LFxuICAgICAgICBcInZpZXdcIixcbiAgICAgICAgW2Rkb2MsIHZpZXdOYW1lLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKV0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBWaWV3UmVzcG9uc2U8Uj47XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUodHJhbnNhY3Rpb25SZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHZpZXcgcmVzdWx0OiAke2V9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgY3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciB0aGUgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNhY2hlZCBjbGllbnQgb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgbm9uZSBleGlzdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDbGllbnQ+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZ1JQQyBjbGllbnRcbiAgICovXG4gIG92ZXJyaWRlIGdldENsaWVudCgpOiBDbGllbnQge1xuICAgIGlmICghdGhpcy5fY2xpZW50KVxuICAgICAgdGhpcy5fY2xpZW50ID0gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDbGllbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBHYXRld2F5IGluc3RhbmNlIGZvciB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBHYXRld2F5IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IGNsaWVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIEdhdGV3YXkoY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0KTogUHJvbWlzZTxHYXRld2F5PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShjdHgsIHRoaXMuY29uZmlnLCB0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBDb250cmFjdCBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBDb250cmFjdCBpbnN0YW5jZSB1c2luZyB0aGUgY3VycmVudCBHYXRld2F5XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29udHJha3Q+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ29udHJhY3QgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBDb250cmFjdChcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDb250cmFjdChcbiAgICAgIGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBjbGF6ek9yQ29udHJhY3ROYW1lLFxuICAgICAgY3R4XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgU3VibWl0cyBvciBldmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VibWl0IC0gV2hldGhlciB0byBzdWJtaXQgKHRydWUpIG9yIGV2YWx1YXRlIChmYWxzZSkgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gICAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gICAqXG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3QoKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZ2V0Q29udHJhY3QoKVxuICAgKiAgIGFsdCBzdWJtaXQgdHJhbnNhY3Rpb25cbiAgICogICAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogc3VibWl0KGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIGVsc2UgZXZhbHVhdGUgdHJhbnNhY3Rpb25cbiAgICogICAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZXZhbHVhdGUoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZW5kXG4gICAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICAgKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAgICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY2xvc2UoKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHRyYW5zYWN0aW9uKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBhcGk6IHN0cmluZyxcbiAgICBzdWJtaXQgPSB0cnVlLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkID0ge30sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IHN0cmluZ1tdLFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50cmFuc2FjdGlvbik7XG4gICAgdHJhbnNpZW50RGF0YSA9IHRoaXMuaW5qZWN0VHJhbnNpZW50T3ZlcnJpZGVzKHRyYW5zaWVudERhdGEsIGN0eCk7XG4gICAgaWYgKHN1Ym1pdCAmJiB0aGlzLnNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4KSkge1xuICAgICAgY29uc3QgbGVnYWN5QXJncyA9IHRoaXMucHJlcGFyZUxlZ2FjeUFyZ3MoYXJncyk7XG4gICAgICBjb25zdCB0cmFuc2llbnRNYXAgPSB0aGlzLmJ1aWxkTGVnYWN5VHJhbnNpZW50KHRyYW5zaWVudERhdGEpO1xuICAgICAgY29uc3QgcGVlckNvbmZpZ3MgPSB0aGlzLmJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4KTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICAgICAgY3R4LFxuICAgICAgICBhcGksXG4gICAgICAgIGxlZ2FjeUFyZ3MsXG4gICAgICAgIHRyYW5zaWVudE1hcCxcbiAgICAgICAgcGVlckNvbmZpZ3MsXG4gICAgICAgIGNsYXp6T3JDb250cmFjdE5hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCB0aGlzLkdhdGV3YXkoY3R4KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udHJhY3QgPSBhd2FpdCB0aGlzLkNvbnRyYWN0KGN0eCwgY2xhenpPckNvbnRyYWN0TmFtZSk7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYCR7c3VibWl0ID8gXCJTdWJtaXRcIiA6IFwiRXZhbHVhdGVcIn10aW5nIHRyYW5zYWN0aW9uICR7Y29udHJhY3QuZ2V0Q29udHJhY3ROYW1lKCl9LiR7YXBpfWBcbiAgICAgICk7XG4gICAgICBsb2cuZGVidWcoYGFyZ3M6ICR7YXJncz8ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpLmpvaW4oXCJcXG5cIikgfHwgXCJub25lXCJ9YCk7XG4gICAgICBjb25zdCBtZXRob2QgPSBzdWJtaXQgPyBjb250cmFjdC5zdWJtaXQgOiBjb250cmFjdC5ldmFsdWF0ZTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRBcmdzID0gKGFyZ3MgfHwgW10pLm1hcCgoYXJnKSA9PlxuICAgICAgICB0aGlzLm5vcm1hbGl6ZVRyYW5zYWN0aW9uQXJndW1lbnQoYXJnKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYW5zaWVudEVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0cmFuc2llbnREYXRhIHx8IHt9KTtcblxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyA9IGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/Lmxlbmd0aFxuICAgICAgICA/IGVuZG9yc2luZ09yZ2FuaXphdGlvbnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm9wb3NhbE9wdGlvbnM6IFByb3Bvc2FsT3B0aW9ucyA9IHtcbiAgICAgICAgYXJndW1lbnRzOiBub3JtYWxpemVkQXJncyxcbiAgICAgICAgdHJhbnNpZW50RGF0YTogdHJhbnNpZW50RW50cmllcy5sZW5ndGhcbiAgICAgICAgICA/IHRyYW5zaWVudEVudHJpZXMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KFxuICAgICAgICAgICAgICAoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM6IGN0eC5nZXRPclVuZGVmaW5lZChcImFsbG93TWFudWFsRW5kb3JzaW5nT3Jnc1wiKVxuICAgICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9ucyB8fCB1bmRlZmluZWRcbiAgICAgICAgICA6IHVuZGVmaW5lZCwgLy8gbXNwSWQgbGlzdFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IG1ldGhvZC5jYWxsKGNvbnRyYWN0LCBhcGksIHByb3Bvc2FsT3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY29ubmVjdGlvbmApO1xuICAgICAgZ2F0ZXdheS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVHJhbnNhY3Rpb25Bcmd1bWVudChhcmc6IGFueSk6IGFueSB7XG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCBhcmcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGFyZztcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFyZztcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGFyZztcbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGFyZztcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVXNlTGVnYWN5R2F0ZXdheShjdHg6IEZhYnJpY0NsaWVudENvbnRleHQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJsZWdhY3lcIikgJiYgISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxlZ2FjeUFyZ3MoYXJncz86IGFueVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5VHJhbnNpZW50KFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNpZW50RGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSk7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICBtYXBba2V5XSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMZWdhY3lNc3BDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZy5sZWdhY3lNc3BDb3VudCA/PyAxO1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihjb25maWd1cmVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHBhcnNlZCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tMZWdhY3lDYW5kaWRhdGVzKFxuICAgIGNhbmRpZGF0ZXM6IE1zcERldGFpbHNbXSxcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IE1zcERldGFpbHNbXSB7XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYXZhaWxhYmxlID0gWy4uLmNhbmRpZGF0ZXNdO1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWluKGxpbWl0LCBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICBjb25zdCBwaWNrZWQ6IE1zcERldGFpbHNbXSA9IFtdO1xuICAgIHdoaWxlIChwaWNrZWQubGVuZ3RoIDwgdGFyZ2V0ICYmIGF2YWlsYWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgICAgY29uc3QgW3NlbGVjdGlvbl0gPSBhdmFpbGFibGUuc3BsaWNlKGlkeCwgMSk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHBpY2tlZC5wdXNoKHNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0KTogTGVnYWN5UGVlclRhcmdldFtdIHtcbiAgICBjb25zdCBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdID0gW1xuICAgICAge1xuICAgICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICAgIHBlZXJFbmRwb2ludDogdGhpcy5jb25maWcucGVlckVuZHBvaW50LFxuICAgICAgICBwZWVySG9zdEFsaWFzOiB0aGlzLmNvbmZpZy5wZWVySG9zdEFsaWFzLFxuICAgICAgICB0bHNDZXJ0OiB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgbGV0IGVuZG9yc2luZ09yZ3MgPSB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSB8fCBbXTtcbiAgICBlbmRvcnNpbmdPcmdzID0gQXJyYXkuaXNBcnJheShlbmRvcnNpbmdPcmdzKVxuICAgICAgPyBlbmRvcnNpbmdPcmdzXG4gICAgICA6IFtlbmRvcnNpbmdPcmdzXTtcbiAgICBjb25zdCBlbmRvcnNlcnMgPVxuICAgICAgZW5kb3JzaW5nT3Jncy5maWx0ZXIoKG9yZyk6IG9yZyBpcyBzdHJpbmcgPT4gQm9vbGVhbihvcmcpKSB8fCBbXTtcbiAgICBjb25zdCBleHRyYXMgPSBlbmRvcnNlcnMuZmlsdGVyKChvcmcpID0+IG9yZyAhPT0gdGhpcy5jb25maWcubXNwSWQpO1xuICAgIGlmICghZXh0cmFzLmxlbmd0aCkgcmV0dXJuIHBlZXJzO1xuXG4gICAgY29uc3QgbWFwID0gdGhpcy5jb25maWcubXNwTWFwO1xuICAgIGNvbnN0IGxlZ2FjeUNvdW50ID0gdGhpcy5yZXNvbHZlTGVnYWN5TXNwQ291bnQoKTtcbiAgICBmb3IgKGNvbnN0IG1zcCBvZiBleHRyYXMpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBtYXA/Llttc3BdO1xuICAgICAgaWYgKCFjYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy5waWNrTGVnYWN5Q2FuZGlkYXRlcyhjYW5kaWRhdGVzLCBsZWdhY3lDb3VudCk7XG4gICAgICBpZiAoIXNlbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBObyB2YWxpZCBwZWVyIG1hcHBpbmcgYXZhaWxhYmxlIGZvciBNU1AgJHttc3B9LiBQcm92aWRlIGl0IHZpYSBjb25maWcubXNwTWFwYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaG9pY2Ugb2Ygc2VsZWN0aW9ucykge1xuICAgICAgICBpZiAoIWNob2ljZS5lbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgcGVlciBtYXBwaW5nIGZvciBNU1AgJHttc3B9OiBtaXNzaW5nIGVuZHBvaW50YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcGVlcnMucHVzaCh7XG4gICAgICAgICAgbXNwSWQ6IG1zcCxcbiAgICAgICAgICBwZWVyRW5kcG9pbnQ6IGNob2ljZS5lbmRwb2ludCxcbiAgICAgICAgICBwZWVySG9zdEFsaWFzOiBjaG9pY2UuYWxpYXMsXG4gICAgICAgICAgdGxzQ2VydDogY2hvaWNlLnRsc0NlcnQgfHwgdGhpcy5jb25maWcudGxzQ2VydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGZjbjogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdLFxuICAgIHRyYW5zaWVudE1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCxcbiAgICBwZWVyQ29uZmlnczogTGVnYWN5UGVlclRhcmdldFtdLFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMpO1xuICAgIGNvbnN0IHBlZXJzID0gdGhpcy5ub3JtYWxpemVMZWdhY3lQZWVycyhwZWVyQ29uZmlncyk7XG4gICAgY29uc3QgaWRlbnRpdHlNYXRlcmlhbCA9IGF3YWl0IHRoaXMucmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBXYWxsZXRzLm5ld0luTWVtb3J5V2FsbGV0KCk7XG4gICAgY29uc3QgaWRlbnRpdHlMYWJlbCA9IGAke3RoaXMuY29uZmlnLm1zcElkfS1sZWdhY3lgO1xuICAgIGF3YWl0IHdhbGxldC5wdXQoaWRlbnRpdHlMYWJlbCwge1xuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB0eXBlOiBcIlguNTA5XCIsXG4gICAgfSBhcyBJZGVudGl0eSk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uUHJvZmlsZSA9IGF3YWl0IHRoaXMuYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVycyk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBMZWdhY3lHYXRld2F5KCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2F0ZXdheS5jb25uZWN0KGNvbm5lY3Rpb25Qcm9maWxlLCB7XG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUxhYmVsLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXNMb2NhbGhvc3Q6IHRoaXMuc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGxzSW5mbzoge1xuICAgICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICAgIGtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBjaGFubmVsID0gdGhpcy5jb25maWcuY2hhbm5lbDtcbiAgICAgIGxldCBjaGFpbmNvZGUgPSB0aGlzLmNvbmZpZy5jaGFpbmNvZGVOYW1lO1xuICAgICAgbGV0IGNvbnRyYWN0TmFtZSA9IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZTtcblxuICAgICAgaWYgKGNsYXp6T3JDb250cmFjdE5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGF6ek9yQ29udHJhY3ROYW1lID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgIGNvbnRyYWN0TmFtZSA9IGNsYXp6T3JDb250cmFjdE5hbWU7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBObyBjb250ZXh0IHJlY2VpdmVkIHRvIGRldGVybWluZSBjaGFpbmNvZGUgY29uZmlnYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjaGFubmVsID1cbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmNoYW5uZWxGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY3R4KSkgfHwgY2hhbm5lbDtcbiAgICAgICAgICBjaGFpbmNvZGUgPVxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuY2hhaW5jb2RlRm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGN0eCkpIHx8IGNoYWluY29kZTtcbiAgICAgICAgICBjb250cmFjdE5hbWUgPSBhd2FpdCB0aGlzLmNvbnRyYWN0Rm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV0d29yayA9IGF3YWl0IGdhdGV3YXkuZ2V0TmV0d29yayhjaGFubmVsKTtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV0d29yay5nZXRDb250cmFjdChjaGFpbmNvZGUsIGNvbnRyYWN0TmFtZSk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGNvbnRyYWN0LmNyZWF0ZVRyYW5zYWN0aW9uKGZjbik7XG5cbiAgICAgIGlmICh0cmFuc2llbnRNYXApIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpZW50KHRyYW5zaWVudE1hcCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZG9yc2VycyA9IHBlZXJzXG4gICAgICAgIC5tYXAoKHBlZXIpID0+IG5ldHdvcmsuZ2V0Q2hhbm5lbCgpLmdldEVuZG9yc2VyKHBlZXIubmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGVuZG9yc2VyKTogZW5kb3JzZXIgaXMgRW5kb3JzZXIgPT4gQm9vbGVhbihlbmRvcnNlcikpO1xuICAgICAgaWYgKGVuZG9yc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0RW5kb3JzaW5nUGVlcnMoZW5kb3JzZXJzKTtcbiAgICAgIH1cblxuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBMZWdhY3kgc3VibWl0dGluZyAke2NvbnRyYWN0TmFtZX0uJHtmY259IHZpYSBwZWVycyAke3BlZXJzLm1hcCgocCkgPT4gcC5wZWVyRW5kcG9pbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbi5zdWJtaXQoLi4uYXJncyk7XG4gICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGdhdGV3YXkuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTGVnYWN5UGVlcnMoXG4gICAgcGVlcnM6IExlZ2FjeVBlZXJUYXJnZXRbXVxuICApOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBMZWdhY3lQZWVyV2l0aE5hbWU+KCk7XG4gICAgY29uc3QgYWRkUGVlciA9IChwZWVyOiBMZWdhY3lQZWVyVGFyZ2V0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtwZWVyLnBlZXJFbmRwb2ludH18JHtwZWVyLnBlZXJIb3N0QWxpYXMgfHwgXCJcIn1gO1xuICAgICAgaWYgKGRlZHVwZWQuaGFzKGtleSkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5hbWUgPSBgcGVlci0ke3BlZXIubXNwSWR9LSR7ZGVkdXBlZC5zaXplfWA7XG4gICAgICBkZWR1cGVkLnNldChrZXksIHtcbiAgICAgICAgLi4ucGVlcixcbiAgICAgICAgbmFtZSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwZWVycy5mb3JFYWNoKGFkZFBlZXIpO1xuICAgIGFkZFBlZXIoe1xuICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICBwZWVySG9zdEFsaWFzOiB0aGlzLmNvbmZpZy5wZWVySG9zdEFsaWFzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZGVkdXBlZC52YWx1ZXMoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsKCk6IFByb21pc2U8e1xuICAgIGNlcnRpZmljYXRlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZUtleTogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoXG4gICAgKTtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICB0aGlzLmNvbmZpZy5rZXlDZXJ0T3JEaXJlY3RvcnlQYXRoXG4gICAgKTtcbiAgICByZXR1cm4geyBjZXJ0aWZpY2F0ZSwgcHJpdmF0ZUtleSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlKHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSkge1xuICAgIGNvbnN0IHBlZXJFbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgY2hhbm5lbFBlZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3Qgb3JnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgcGVlciBvZiBwZWVycykge1xuICAgICAgY29uc3QgdGxzUGVtID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICAgIHBlZXIudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0XG4gICAgICApO1xuICAgICAgY29uc3QgaG9zdG5hbWUgPVxuICAgICAgICBwZWVyLnBlZXJIb3N0QWxpYXMgfHwgdGhpcy5leHRyYWN0SG9zdChwZWVyLnBlZXJFbmRwb2ludCk7XG4gICAgICBwZWVyRW50cmllc1twZWVyLm5hbWVdID0ge1xuICAgICAgICB1cmw6IHRoaXMuZW5zdXJlR3JwY1VybChwZWVyLnBlZXJFbmRwb2ludCksXG4gICAgICAgIHRsc0NBQ2VydHM6IHsgcGVtOiB0bHNQZW0gfSxcbiAgICAgICAgZ3JwY09wdGlvbnM6IHtcbiAgICAgICAgICBcInNzbC10YXJnZXQtbmFtZS1vdmVycmlkZVwiOiBob3N0bmFtZSxcbiAgICAgICAgICBob3N0bmFtZU92ZXJyaWRlOiBob3N0bmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjaGFubmVsUGVlcnNbcGVlci5uYW1lXSA9IHtcbiAgICAgICAgZW5kb3JzaW5nUGVlcjogdHJ1ZSxcbiAgICAgICAgY2hhaW5jb2RlUXVlcnk6IHRydWUsXG4gICAgICAgIGxlZGdlclF1ZXJ5OiB0cnVlLFxuICAgICAgICBldmVudFNvdXJjZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdID0gb3Jnc1twZWVyLm1zcElkXSB8fCB7XG4gICAgICAgIG1zcGlkOiBwZWVyLm1zcElkLFxuICAgICAgICBwZWVyczogW10sXG4gICAgICB9O1xuICAgICAgb3Jnc1twZWVyLm1zcElkXS5wZWVycy5wdXNoKHBlZXIubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IFwibGVnYWN5LW1hbnVhbFwiLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgICAgY2xpZW50OiB7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB9LFxuICAgICAgb3JnYW5pemF0aW9uczogb3JncyxcbiAgICAgIHBlZXJzOiBwZWVyRW50cmllcyxcbiAgICAgIG9yZGVyZXJzOiB7fSxcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIFt0aGlzLmNvbmZpZy5jaGFubmVsXToge1xuICAgICAgICAgIHBlZXJzOiBjaGFubmVsUGVlcnMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdChwZWVyczogTGVnYWN5UGVlcldpdGhOYW1lW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVlcnMuZXZlcnkoKHBlZXIpID0+IHRoaXMuaXNMb2NhbEVuZHBvaW50KHBlZXIucGVlckVuZHBvaW50KSk7XG4gIH1cblxuICBwcml2YXRlIGlzTG9jYWxFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZXh0cmFjdEhvc3QoZW5kcG9pbnQpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGhvc3QgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdCA9PT0gXCIxMjcuMC4wLjFcIjtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEhvc3QoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2FuaXRpemVkID0gZW5kcG9pbnQucmVwbGFjZSgvXmdycGNzPzpcXC9cXC8vLCBcIlwiKTtcbiAgICByZXR1cm4gc2FuaXRpemVkLnNwbGl0KFwiOlwiKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlR3JwY1VybChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoL15ncnBjcz86XFwvXFwvL2kudGVzdChlbmRwb2ludCkpIHJldHVybiBlbmRwb2ludDtcbiAgICByZXR1cm4gYGdycGNzOi8vJHtlbmRwb2ludH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkUGVtSW5wdXQoc291cmNlPzogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIGNlcnRpZmljYXRlIG9yIGtleSBtYXRlcmlhbFwiKTtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHJldHVybiBzb3VyY2UudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgIGNvbnN0IHRyaW1tZWQgPSBzb3VyY2UudHJpbSgpO1xuICAgIGlmICgvLS0tLS1CRUdJTiBbQS1aIF0rLS0tLS0vLnRlc3QodHJpbW1lZCkpIHJldHVybiB0cmltbWVkO1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChzb3VyY2UpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgaWYgKHN0YXRzPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCByZWFkRnNGaWxlKHNvdXJjZSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvclxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IgfCBzdHJpbmcpOiBFIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5wYXJzZUVycm9yPEU+KGVycik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgdHJ1ZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXp6T3JDb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiB0aGF0IGRvZXMgbm90IG1vZGlmeSB0aGUgbGVkZ2VyIHN0YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqL1xuICBhc3luYyBldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgZmFsc2UsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGF6ek9yQ29udHJhY3ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG1pZ3JhdGUoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcHJvdmlkZWRDdHggPVxuICAgICAgbGFzdCBpbnN0YW5jZW9mIENvbnRleHQgPyAobGFzdCBhcyBGYWJyaWNDbGllbnRDb250ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtaWdyYXRpb25BcmdzID0gcHJvdmlkZWRDdHggPyBhcmdzLnNsaWNlKDAsIC0xKSA6IGFyZ3M7XG4gICAgY29uc3QgY3R4ID1cbiAgICAgIHByb3ZpZGVkQ3R4IHx8XG4gICAgICAoYXdhaXQgdGhpcy5jb250ZXh0KFxuICAgICAgICBQZXJzaXN0ZW5jZUtleXMuTUlHUkFUSU9OLFxuICAgICAgICB7fSxcbiAgICAgICAgdW5kZWZpbmVkIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw8YW55Pj5cbiAgICAgICkpO1xuICAgIHJldHVybiB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJtaWdyYXRlXCIsXG4gICAgICBbcmVmZXJlbmNlLCBtaWdyYXRpb25BcmdzXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFwiTWlncmF0aW9uQ29udHJhY3RcIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgYWN0aXZlIGRpc3BhdGNoICh3aGljaCBpbiB0dXJuIGNsb3NlcyBhbnkgZ2F0ZXdheVxuICAgKiBldmVudCBzdWJzY3JpcHRpb24pIHZpYSB0aGUgYmFzZSBjbGFzcywgdGhlbiBjbG9zZXMgdGhlIGdSUEMgY2xpZW50LlxuICAgKiBXb3JrcyBjb3JyZWN0bHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBzeW50aGV0aWNFdmVudHNgIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaHV0ZG93bihcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGRpc3BhdGNoLmNsb3NlKCkgaW50ZXJuYWxseS5cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93biguLi5hcmdzKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IHN0cmluZyB8IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIGN0eD86IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTxDb250cmFrdD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENvbnRyYWN0KTtcblxuICAgIGxldCBjaGFubmVsID0gY29uZmlnLmNoYW5uZWw7XG4gICAgbGV0IGNoYWluY29kZSA9IGNvbmZpZy5jaGFpbmNvZGVOYW1lO1xuICAgIGxldCBjb250cmFjdE5hbWUgPSBjb25maWcuY29udHJhY3ROYW1lO1xuXG4gICAgaWYgKGNsYXp6T3JDb250cmFjdE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgY2xhenpPckNvbnRyYWN0TmFtZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgY29udHJhY3ROYW1lID0gY2xhenpPckNvbnRyYWN0TmFtZTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBObyBjb250ZXh0IHJlY2VpdmVkIHRvIGRldGVybWluZSBjaGFpbmNvZGUgY29uZmlnYFxuICAgICAgICAgICk7XG4gICAgICAgIGNoYW5uZWwgPVxuICAgICAgICAgIChhd2FpdCB0aGlzLmNoYW5uZWxGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY29uZmlnLCBjdHgpKSB8fCBjaGFubmVsO1xuICAgICAgICBjaGFpbmNvZGUgPVxuICAgICAgICAgIChhd2FpdCB0aGlzLmNoYWluY29kZUZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjb25maWcsIGN0eCkpIHx8XG4gICAgICAgICAgY2hhaW5jb2RlO1xuICAgICAgICBjb250cmFjdE5hbWUgPSBhd2FpdCB0aGlzLmNvbnRyYWN0Rm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGNvbmZpZywgY3R4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBuZXR3b3JrID0gdGhpcy5nZXROZXR3b3JrKGdhdGV3YXksIGNoYW5uZWwpO1xuICAgIGxldCBjb250cmFjdDogQ29udHJha3Q7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFJldHJpZXZpbmcgY2hhaW5jb2RlICR7Y2hhaW5jb2RlfSBjb250cmFjdCAke2NvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y2hhbm5lbH1gXG4gICAgICApO1xuICAgICAgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KGNoYWluY29kZSwgY29udHJhY3ROYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyYWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgTmV0d29yayBpbnN0YW5jZSBmcm9tIGEgR2F0ZXdheVxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0byBhIHNwZWNpZmljIGNoYW5uZWwgb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHJldHVybiB7TmV0d29ya30gVGhlIE5ldHdvcmsgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXROZXR3b3JrKGdhdGV3YXk6IEdhdGV3YXksIGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBOZXR3b3JrIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldE5ldHdvcmspO1xuICAgIGxldCBuZXR3b3JrOiBOZXR3b3JrO1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gY2hhbm5lbCAke2NoYW5uZWxOYW1lfWApO1xuICAgICAgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayhjaGFubmVsTmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldHdvcms7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBHYXRld2F5IGluc3RhbmNlIGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSB1c2luZyB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBhbmQgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge0NsaWVudH0gW2NsaWVudF0gLSBPcHRpb25hbCBnUlBDIGNsaWVudCwgd2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEdhdGV3YXkoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjbGllbnQ/OiBDbGllbnRcbiAgKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldENvbm5lY3Rpb24oXG4gICAgICBjbGllbnQgfHwgKGF3YWl0IHRoaXMuZ2V0Q2xpZW50KGNvbmZpZykpLFxuICAgICAgY29uZmlnLFxuICAgICAgY3R4XG4gICAgKSkgYXMgR2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBjbGllbnQgd2l0aCBUTFMgY3JlZGVudGlhbHMgZm9yIHNlY3VyZSBjb21tdW5pY2F0aW9uXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDbGllbnR9IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgc3RhdGljIGdldENsaWVudChjb25maWc6IFBlZXJDb25maWcpOiBDbGllbnQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENsaWVudCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIFRMUyBjcmVkZW50aWFscyBmb3IgbXNwICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGxldCBwYXRoT3JDZXJ0OiBzdHJpbmcgfCBCdWZmZXIgPSBjb25maWcudGxzQ2VydCBhcyBzdHJpbmcgfCBCdWZmZXI7XG5cbiAgICBpZiAodHlwZW9mIHBhdGhPckNlcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGF0aE9yQ2VydC5tYXRjaChcbiAgICAgICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKHBhdGhPckNlcnQsIFwidXRmOFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKGZzLnJlYWRGaWxlU3luYyhwYXRoT3JDZXJ0LCBcInV0ZjhcIikpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgdGhlIHRscyBjZXJ0aWZpY2F0ZSBmcm9tICR7cGF0aE9yQ2VydH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRsc0NyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2wocGF0aE9yQ2VydCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIEdhdGV3YXkgQ2xpZW50IGZvciB1cmwgJHtjb25maWcucGVlckVuZHBvaW50fWApO1xuICAgIHJldHVybiBuZXcgQ2xpZW50KGNvbmZpZy5wZWVyRW5kcG9pbnQsIHRsc0NyZWRlbnRpYWxzLCB7XG4gICAgICBcImdycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgICBcImdycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgY29ubmVjdGlvbiB3aXRoIGlkZW50aXR5IGFuZCBzaWduZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIFRoZSBnUlBDIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbm5lY3RlZCBHYXRld2F5XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBJZGVudGl0eVxuICAgKiAgIHBhcnRpY2lwYW50IFNpZ25lclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICpcbiAgICogICBDYWxsZXItPj5GYWJyaWNBZGFwdGVyOiBnZXRDb25uZWN0aW9uKGNsaWVudCwgY29uZmlnKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5JZGVudGl0eTogZ2V0SWRlbnRpdHkobXNwSWQsIGNlcnREaXJlY3RvcnlQYXRoKVxuICAgKiAgIElkZW50aXR5LS0+PkZhYnJpY0FkYXB0ZXI6IGlkZW50aXR5XG4gICAqICAgRmFicmljQWRhcHRlci0+PlNpZ25lcjogZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGgpXG4gICAqICAgU2lnbmVyLS0+PkZhYnJpY0FkYXB0ZXI6IHNpZ25lclxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBDcmVhdGUgQ29ubmVjdE9wdGlvbnNcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdChvcHRpb25zKVxuICAgKiAgIEdhdGV3YXktLT4+RmFicmljQWRhcHRlcjogZ2F0ZXdheVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2FsbGVyOiBnYXRld2F5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q29ubmVjdGlvbihcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNoYWluY29kZUZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBNb2RlbC5jaGFpbmNvZGVPZihtb2RlbCwgLi4uYXJncykgfHwgY29uZmlnLmNoYWluY29kZU5hbWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNoYW5uZWxGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gTW9kZWwuY2hhbm5lbE9mKG1vZGVsLCAuLi5hcmdzKSB8fCBjb25maWcuY2hhbm5lbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY29udHJhY3RGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgTW9kZWwuY29udHJhY3RPZihtb2RlbCwgLi4uYXJncykgfHxcbiAgICAgIERlZmF1bHRDb250cmFjdFJlc29sdmVyKG1vZGVsLCAuLi5hcmdzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvciB1c2luZyB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nIHwgR2F0ZXdheUVycm9yXG4gICk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuXG4gICAgbGV0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2F0ZXdheUVycm9yICYmIGVyci5kZXRhaWxzLmxlbmd0aCAmJiBlcnIuY29kZSA9PT0gMTApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlcnIgaW5zdGFuY2VvZiBFbmRvcnNlRXJyb3IgJiZcbiAgICAgIGVyci5kZXRhaWxzLmxlbmd0aCAmJlxuICAgICAgZXJyLmNvZGUgPT09IDEwICYmXG4gICAgICBlcnIuZGV0YWlsc1swXS5tZXNzYWdlPy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpXG4gICAgKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIk1WQ0NfUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgTXZjY1JlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJERUFETElORV9FWENFRURFRFwiKSlcbiAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKFxuICAgICAgbXNnLmluY2x1ZGVzKFwiY2hhaW5jb2RlIHN0cmVhbSB0ZXJtaW5hdGVkXCIpIHx8XG4gICAgICBtc2cuaW5jbHVkZXMoXCJSRVNPVVJDRV9FWEhBVVNURURcIikgfHxcbiAgICAgIG1zZy5pbmNsdWRlcyhcInJlY2VpdmVkIG1lc3NhZ2UgbGFyZ2VyIHRoYW4gbWF4XCIpIHx8XG4gICAgICBtc2cuaW5jbHVkZXMoXCJncnBjOiByZWNlaXZlZCBtZXNzYWdlIGxhcmdlclwiKVxuICAgIClcbiAgICAgIHJldHVybiBuZXcgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJFTkRPUlNFTUVOVF9QT0xJQ1lfRkFJTFVSRVwiKSlcbiAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiUEhBTlRPTV9SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICBzd2l0Y2ggKChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50RXJyb3IoZXJyKSBhcyBFO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoVmFsaWRhdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTm90Rm91bmRFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbmZsaWN0RXJyb3IubmFtZSkpIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhCYWRSZXF1ZXN0RXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhRdWVyeUVycm9yLm5hbWUpKSByZXR1cm4gbmV3IFF1ZXJ5RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUGFnaW5nRXJyb3IubmFtZSkpIHJldHVybiBuZXcgUGFnaW5nRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhNaWdyYXRpb25FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBNaWdyYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhPYnNlcnZlckVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE9ic2VydmVyRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQXV0aG9yaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoRm9yYmlkZGVuRXJyb3IubmFtZSkpIHJldHVybiBuZXcgRm9yYmlkZGVuRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29ubmVjdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIEU7XG4gIH1cbn1cblxuRmFicmljQ2xpZW50QWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoRmFicmljRmxhdm91cik7XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRGlzcGF0Y2gsXG4gIEV2ZW50SWRzLFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUGVlckNvbmZpZyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50Q29udGV4dCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudENvbnRleHRcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVFdmVudCxcbiAgQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZSxcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgcGFyc2VFdmVudE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL2V2ZW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBkaXNwYXRjaGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgYW5kIHByb2Nlc3NlcyBldmVudHMgZW1pdHRlZCBieSBGYWJyaWMgY2hhaW5jb2RlLCBkaXNwYXRjaGluZyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IEZhYnJpY0FkYXB0ZXIuZ2V0Q2xpZW50KHBlZXJDb25maWcpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KTtcbiAqXG4gKiAvLyBDb25maWd1cmUgdGhlIGRpc3BhdGNoIHdpdGggcGVlciBjb25maWd1cmF0aW9uXG4gKiBkaXNwYXRjaC5jb25maWd1cmUocGVlckNvbmZpZyk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgc3BlY2lmaWMgdGFibGUgYW5kIGV2ZW50XG4gKiBkaXNwYXRjaC5vYnNlcnZlKCd1c2VycycsICdjcmVhdGUnLCAoaWQpID0+IHtcbiAqICAgY29uc29sZS5sb2coYFVzZXIgY3JlYXRlZDogJHtpZH1gKTtcbiAqIH0pO1xuICpcbiAqIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gKiBhd2FpdCBkaXNwYXRjaC5zdGFydCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudClcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IGNvbmZpZ3VyZShwZWVyQ29uZmlnKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogb2JzZXJ2ZSh0YWJsZSwgZXZlbnQsIGNhbGxiYWNrKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogc3RhcnQoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBpbml0aWFsaXplKClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5HYXRld2F5OiBnZXRHYXRld2F5KGNvbmZpZywgY2xpZW50KVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsKVxuICogICBOZXR3b3JrLT4+TmV0d29yazogZ2V0Q2hhaW5jb2RlRXZlbnRzKGNoYWluY29kZU5hbWUpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gKiAgIGxvb3AgRm9yIGVhY2ggZXZlbnRcbiAqICAgICBDaGFpbmNvZGUtLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLS0+PkNsaWVudDogY2FsbGJhY2soaWQpXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDbGllbnRBZGFwdGVyPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgbGlzdGVuaW5nIHN0YWNrIGZvciBjaGFpbmNvZGUgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbmluZ1N0YWNrPzogQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZTxDaGFpbmNvZGVFdmVudD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgZXZlbnQgcGF5bG9hZHMgZnJvbSBieXRlcyB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGRpc3BhdGNoZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjbGllbnQ6IENsaWVudCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZXZlbnQgbGlzdGVuaW5nIGNvbm5lY3Rpb25cbiAgICogQHN1bW1hcnkgU3RvcHMgbGlzdGVuaW5nIGZvciBjaGFpbmNvZGUgZXZlbnRzIGFuZCByZWxlYXNlcyByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjbG9zZShcbiAgICAuLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJnczogbG9nZ2VkQXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoY3R4QXJncywgUGVyc2lzdGVuY2VLZXlzLlNIVVRET1dOLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY2xvc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5jbG9zZSguLi5sb2dnZWRBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbG9zZSBGYWJyaWMgcHJveGllcyBldmVudCBsaXN0ZW5lcmAsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBpZiAodGhpcy5saXN0ZW5pbmdTdGFjaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5saXN0ZW5pbmdTdGFjay5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbG9zZSBGYWJyaWMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgZXZlbnQgcGF5bG9hZCBmcm9tIGJpbmFyeSBmb3JtYXRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBVaW50OEFycmF5IGNvbnRhaW5pbmcgSlNPTiB0byBhbiBvYmplY3Qgd2l0aCBhbiBpZCBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGpzb25CeXRlcyAtIFRoZSBiaW5hcnkgcGF5bG9hZCBmcm9tIHRoZSBjaGFpbmNvZGUgZXZlbnRcbiAgICogQHJldHVybiB7eyBpZDogc3RyaW5nIH19IFRoZSBwYXJzZWQgcGF5bG9hZCBjb250YWluaW5nIHRoZSByZWNvcmQgSURcbiAgICovXG4gIHByaXZhdGUgcGFyc2VQYXlsb2FkKGpzb25CeXRlczogVWludDhBcnJheSk6IHsgaWQ6IHN0cmluZzsgcmVzdWx0PzogYW55IH0ge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLmRlY29kZXIuZGVjb2RlKGpzb25CeXRlcyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0aGlzIGRpc3BhdGNoIHRvIGFuIGFkYXB0ZXIgdG8gbW9uaXRvciBpdHMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gb2JzZXJ2ZXIgLSBUaGUgYWRhcHRlciB0byBvYnNlcnZlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBvdmVycmlkZSBvYnNlcnZlKG9ic2VydmVyOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pOiAoKSA9PiB2b2lkIHtcbiAgICBpZiAoIShvYnNlcnZlciBpbnN0YW5jZW9mIEZhYnJpY0NsaWVudEFkYXB0ZXIpKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIFwiT25seSBGYWJyaWNDbGllbnRBZGFwdGVyIGNhbiBiZSBvYnNlcnZlZCBieSBkaXNwYXRjaFwiXG4gICAgICApO1xuICAgIHN1cGVyLm9ic2VydmUob2JzZXJ2ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7YW55fSBwYXlsb2FkIC0gVGhlIGV2ZW50IHBheWxvYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gQWRhcHRlci5sb2dDdHg8RmFicmljQ2xpZW50Q29udGV4dD4oXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyxcbiAgICAgIGV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3R5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKX06JHtldmVudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgY2hhaW5jb2RlIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlbnQgaGFuZGxpbmcgc3RvcHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFN0YWNrXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRQYXJzZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAgICpcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRTdGFjazogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgbGlzdGVuaW5nU3RhY2spXG4gICAqICAgRXZlbnRTdGFjay0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKVxuICAgKiAgIEV2ZW50UGFyc2VyLS0+PkZhYnJpY0Rpc3BhdGNoOiB7IHRhYmxlLCBldmVudCwgb3duZXIgfVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IENoZWNrIGlmIGV2ZW50IGlzIGZvciB0aGlzIE1TUFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChldnQucGF5bG9hZClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+Pk9ic2VydmVyczogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgcGF5bG9hZC5pZClcbiAgICogICBPYnNlcnZlcnMtLT4+RmFicmljRGlzcGF0Y2g6IENhbGxiYWNrcyBleGVjdXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUV2ZW50cyhcbiAgICBjdHhBcmc/OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5saXN0ZW5pbmdTdGFjaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRXZlbnQgc3RhY2sgbm90IGluaXRpYWxpemVkLiBFbnN1cmUgdGhhdCBcInN0YXJ0TGlzdGVuaW5nXCIgaXMgY2FsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRoaXMgb3BlcmF0aW9uLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5hZGFwdGVyLmNvbmZpZylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIGZvdW5kLiBzaG91bGQgYmUgaW1wb3NzaWJsZWApO1xuXG4gICAgY29uc3QgY3R4ID1cbiAgICAgIGN0eEFyZyB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgICh0aGlzLm1vZGVscyAmJiB0aGlzLm1vZGVsc1swXSkgfHwgKE1vZGVsIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3IpXG4gICAgICApKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5oYW5kbGVFdmVudHMpO1xuXG4gICAgbG9nLmluZm8oXG4gICAgICBgTGlzdGVuaW5nIGZvciBpbmNvbWluZyBldmVudHMgb24gY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiLi4uYFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBldnQgb2YgdGhpcy5saXN0ZW5pbmdTdGFjaykge1xuICAgICAgICBjb25zdCB7IHRhYmxlLCBldmVudCwgb3duZXIgfSA9IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwRXZlbnRPbmx5ICYmXG4gICAgICAgICAgb3duZXIgJiZcbiAgICAgICAgICBvd25lciAhPT0gdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwSWRcbiAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9ID0gdGhpcy5wYXJzZVBheWxvYWQoXG4gICAgICAgICAgZXZ0LnBheWxvYWRcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRNb2RlbCA9IHRhYmxlXG4gICAgICAgICAgICA/IE1vZGVsLmdldCh0YWJsZSlcbiAgICAgICAgICAgIDogTW9kZWwuZ2V0KHRoaXMubW9kZWxzWzBdLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGFyZ2V0TW9kZWwgPz8gKHRhYmxlIHx8IHRoaXMubW9kZWxzWzBdPy5uYW1lKTtcbiAgICAgICAgICBjb25zdCBvYnNlcnZlckFyZ3MgPSBwYXlsb2FkLnJlc3VsdCA/IFtwYXlsb2FkLnJlc3VsdCwgY3R4XSA6IFtjdHhdO1xuICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgbW9kZWxSZWYgYXMgQ29uc3RydWN0b3IgfCBzdHJpbmcsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHBheWxvYWQuaWQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgLi4uKG9ic2VydmVyQXJncyBhcyBDb250ZXh0dWFsQXJnczxhbnk+KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHVwZGF0ZSBvYnNlcnZhYmxlcyBmb3IgdGFibGUgJHt0YWJsZX0gZXZlbnQgJHtldmVudH0gaWQ6ICR7cGF5bG9hZC5pZH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlYWQgZXZlbnQgZm9yIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIjogJHtlfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKGN0eCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICogQHN1bW1hcnkgU2V0cyB1cCBldmVudCBkaXNwYXRjaGluZyBmb3IgdGhlIG9ic2VydmVkIGFkYXB0ZXIuIFdoZW5cbiAgICogYHN5bnRoZXRpY0V2ZW50c2AgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpIG5vIGdhdGV3YXkgY29ubmVjdGlvbiBpcyBvcGVuZWQ7XG4gICAqIGluc3RlYWQgZXZlcnkgQ1JVRCBvcGVyYXRpb24gaXMgd3JhcHBlZCB3aXRoIGEgUHJveHkgdGhhdCBmaXJlc1xuICAgKiBgdXBkYXRlT2JzZXJ2ZXJzYCBmb3IgKiphbGwqKiBtb2RlbHMuIFdoZW4gYHN5bnRoZXRpY0V2ZW50c2AgaXMgZmFsc2UgdGhlXG4gICAqIGV4aXN0aW5nIGdhdGV3YXktYmFzZWQgY2hhaW5jb2RlLWV2ZW50IHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgdGhlXG4gICAqIGxvY2FsIFByb3h5IGZhbGxiYWNrIGlzIGxpbWl0ZWQgdG8gZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHMgb25seS5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb3IgY29uZmlnIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuXG4gICAgY29uc3Qgc3ludGhldGljRXZlbnRzID0gdGhpcy5hZGFwdGVyLmNvbmZpZy5zeW50aGV0aWNFdmVudHMgIT09IGZhbHNlO1xuXG4gICAgaWYgKCFzeW50aGV0aWNFdmVudHMpIHtcbiAgICAgIC8vIEdhdGV3YXktYmFzZWQgY2hhaW5jb2RlLWV2ZW50IHN1YnNjcmlwdGlvbiAobm9uLXN5bnRoZXRpYyBwYXRoKVxuICAgICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBcImRpc3BhdGNoXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIE1vZGVsIGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgICBjb25zdCBnYXRld2F5ID0gYXdhaXQgRmFicmljQ2xpZW50QWRhcHRlci5nZXRHYXRld2F5KFxuICAgICAgICBjdHgsXG4gICAgICAgIHRoaXMuYWRhcHRlci5jb25maWcgYXMgUGVlckNvbmZpZyxcbiAgICAgICAgdGhpcy5jbGllbnRcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKHRoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbCk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gYXdhaXQgbmV0d29yay5nZXRDaGFpbmNvZGVFdmVudHMoXG4gICAgICAgIHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZVxuICAgICAgKTtcbiAgICAgIHRoaXMuaGFuZGxlRXZlbnRzKGN0eCk7XG4gICAgfVxuXG4gICAgLy8gUHJveHkgQ1JVRCBtZXRob2RzLlxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSB0cnVlICDihpIgbm90aWZ5IGZvciBBTEwgbW9kZWxzIChyZXBsYWNlcyBnYXRld2F5IGV2ZW50cyBlbnRpcmVseSlcbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gZmFsc2Ug4oaSIG5vdGlmeSBvbmx5IGZvciBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVsc1xuICAgIC8vICAgKHRoZSBnYXRld2F5IHN1YnNjcmlwdGlvbiBoYW5kbGVzIHB1YmxpYyBtb2RlbHMpXG4gICAgKFxuICAgICAgW1xuICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgXSBhcyAoa2V5b2YgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KVtdXG4gICAgKS5mb3JFYWNoKCh0b1dyYXApID0+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gYWRhcHRlciBwcm92aWRlZCBmb3IgdGhlIGZhbGxiYWNrIG9mIGZ1bGx5IHNlZ3JlZ2F0ZWQgbW9kZWxzYFxuICAgICAgICApO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXJbdG9XcmFwXSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1ldGhvZCAke3RvV3JhcH0gbm90IGZvdW5kIGluICR7dGhpcy5hZGFwdGVyLmFsaWFzfSBhZGFwdGVyIHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG5cbiAgICAgIGxldCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLmFkYXB0ZXIsIHRvV3JhcCk7XG4gICAgICBsZXQgcHJvdG86IGFueSA9IHRoaXMuYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCB0b1dyYXApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke3RvV3JhcH0gdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnVsa1RvU2luZ2xlKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkNSRUFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuVVBEQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZXJlIGFyZSByZWFkIG9ubHkgcHJvcGVydGllc1xuICAgICAgdGhpcy5hZGFwdGVyW3RvV3JhcF0gPSBuZXcgUHJveHkodGhpcy5hZGFwdGVyW3RvV3JhcF0sIHtcbiAgICAgICAgYXBwbHk6IGFzeW5jIChcbiAgICAgICAgICB0YXJnZXQ6IGFueSxcbiAgICAgICAgICB0aGlzQXJnOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgICAgICAgIGFyZ0FycmF5OiBhbnlbXVxuICAgICAgICApID0+IHtcbiAgICAgICAgICAvLyBSdW4gdGhlIG9yaWdpbmFsIG1ldGhvZCB1bmNoYW5nZWQgc28gdHJhbnNpZW50IGRhdGEgaXMgcHJlc2VydmVkXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFyZ2V0LmFwcGx5KHRoaXNBcmcsIGFyZ0FycmF5KTtcblxuICAgICAgICAgIGNvbnN0IGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+ID0gYXJnQXJyYXlbMF07XG4gICAgICAgICAgLy8gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgZmFsc2UsIHB1YmxpYyBtb2RlbHMgZW1pdCBhIGNoYWluY29kZSBldmVudFxuICAgICAgICAgIC8vIG9uIHRoZSBjb250cmFjdCBzaWRlOyBza2lwIHRoZSBsb2NhbCBmYWxsYmFjayB0byBhdm9pZFxuICAgICAgICAgIC8vIGRvdWJsZS1ub3RpZmljYXRpb24uIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIHRydWUgd2UgaGFuZGxlIGFsbCBtb2RlbHMuXG4gICAgICAgICAgaWYgKCFzeW50aGV0aWNFdmVudHMgJiYgIU1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSkgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICAgIC8vIENvbnRleHQgaXMgYWx3YXlzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYXJnQXJyYXlcbiAgICAgICAgICBjb25zdCB7IGxvZywgY3R4QXJncywgY3R4IH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKFxuICAgICAgICAgICAgYXJnQXJyYXkuc2xpY2UoYXJnQXJyYXkubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGlkcyA9IGFyZ0FycmF5WzFdO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEFyZ3M6IGFueVtdID0gW2NsYXp6LCBidWxrVG9TaW5nbGUodG9XcmFwKSwgaWRzXTtcblxuICAgICAgICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJvYnNlcnZlRnVsbFJlc3VsdFwiKSkge1xuICAgICAgICAgICAgcmVzdWx0QXJncy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgcmVzdWx0QXJnc1swXSxcbiAgICAgICAgICAgIHJlc3VsdEFyZ3NbMV0sXG4gICAgICAgICAgICByZXN1bHRBcmdzWzJdLFxuICAgICAgICAgICAgLi4ucmVzdWx0QXJncy5zbGljZSgzKSxcbiAgICAgICAgICAgIC4uLihjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+KVxuICAgICAgICAgICkuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHt0b1dyYXB9IG9uICR7Y2xhenoubmFtZSB8fCBjbGF6en0gZm9yICR7aWRzfTogJHtlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5pZiAoRmFicmljQ2xpZW50QWRhcHRlcilcbiAgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBGYWJyaWNDbGllbnREaXNwYXRjaDtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbW1pdCBoYXNoIG9mIHRoZSBtb2R1bGUgYnVpbGQuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgZ2l0IGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS4gVGhlIGJ1aWxkIHJlcGxhY2VzXG4gKiB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvbW1pdCBoYXNoIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBDT01NSVRcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbXZlciB2ZXJzaW9uIGFuZCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuXG4gKiBUaGUgYnVpbGQgcmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBgPHZlcnNpb24+LTxjb21taXQ+YCB2YWx1ZSBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgRlVMTF9WRVJTSU9OXG4gKi9cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsicmVzb2x2ZVByaW1hcnlLZXlGaWVsZCIsIm0iLCJsb2ciLCJTdHJpbmciLCJNb2RlbCIsInBrIiwibWVzc2FnZSIsIm5hbWUiLCJ2ZXJib3NlIiwidW5kZWZpbmVkIiwid2l0aERlZmF1bHRRdWVyeVBrVGllQnJlYWtlciIsImluZGV4ZXMiLCJwa0ZpZWxkIiwibWFwIiwiaW5kZXgiLCJmaWVsZHMiLCJpbmNsdWRlcyIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInNvcnRlZEZpZWxkcyIsImZpbHRlciIsImZpZWxkIiwiaGFzUGsiLCJzb21lIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibGFzdEZpZWxkIiwibGFzdERpcmVjdGlvbiIsInZhbHVlcyIsInRvTG93ZXJDYXNlIiwiZGlyZWN0aW9uIiwiYXNzaWduIiwiZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlIiwiZmlsZVBhdGgiLCJmcyIsInJlcXVpcmUiLCJwYXRoIiwiZGlybmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJnZW5lcmF0ZU1vZGVsSW5kZXhlcyIsImdlbmVyYXRlSW5kZXhlcyIsImdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzIiwiYWNjdW0iLCJ2aWV3cyIsImdlbmVyYXRlVmlld3MiLCJzdG9yYWdlIiwiZm9yRWFjaCIsImRvYyIsIl9pZCIsInJlYWRNb2RlbEZpbGUiLCJmaWxlIiwicmVzb2x2ZSIsInBhcmVudFBhdGgiLCJleHBvcnRzIiwiZSIsImFzeW5jIiwicmVhZE1vZGVsRm9sZGVycyIsImZvbGRlcnMiLCJyZXN1bHQiLCJmb2xkZXIiLCJyZXNvbHZlZEZvbGRlciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicmVjdXJzaXZlIiwiZiIsImlzRmlsZSIsImVuZHNXaXRoIiwicHVzaCIsIndyaXRlSW5kZXhlcyIsInAiLCJwcm9jZXNzIiwiY3dkIiwiY29sbGVjdGlvbiIsImpvaW4iLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsIndyaXRlRGVzaWduRG9jcyIsImRlc2lnbkRvY3MiLCJkb2NJZCIsInJlcGxhY2UiLCJwYXlsb2FkIiwiX3JldiIsImNvbGxlY3Rpb25Gb3IiLCJjb2xsZWN0aW9uTmFtZSIsInBvbGljeSIsInJlcXVpcmVkUGVlckNvdW50IiwibWF4UGVlckNvdW50IiwiYmxvY2tUb0xpdmUiLCJtZW1iZXJPbmx5UmVhZCIsIm1lbWJlck9ubHlXcml0ZSIsInByaXZhdGVDb2xsZWN0aW9uRm9yIiwibXNwSWQiLCJjIiwiZW5kb3JzZW1lbnRQb2xpY3kiLCJzaWduYXR1cmVQb2xpY3kiLCJzaGFyZWRDb2xsZWN0aW9uRm9yIiwibXNwSWRzIiwiZXh0cmFjdENvbGxlY3Rpb25zIiwib3ZlcnJpZGVzIiwibWlycm9yIiwicHJpdmF0ZUNvbHMiLCJzaGFyZWRDb2xzIiwiY29sbGVjdGlvbnNGb3IiLCJyZXNvbHZlQ29sbGVjdGlvbiIsImFyZyIsIkludGVybmFsRXJyb3IiLCJwcml2YXRlRGVmYXVsdHMiLCJzaGFyZWREZWZhdWx0cyIsIm1pcnJvck1ldGEiLCJtaXJyb3JlZEF0IiwicHJpdmF0ZXMiLCJmbGF0IiwicmVzb2x2ZWQiLCJyZXNvbHZlciIsInNoYXJlZCIsIndyaXRlQ29sbGVjdGlvbnMiLCJjb2xzIiwiZmlsZU5hbWUiLCJ3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzIiwiZG9jcyIsIkZhYnJpY0NsaWVudFBhZ2luYXRvciIsIlBhZ2luYXRvciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsInF1ZXJ5Iiwic2l6ZSIsImNsYXp6Iiwic3VwZXIiLCJwcmVwYXJlIiwicmF3U3RhdGVtZW50IiwiVW5zdXBwb3J0ZWRFcnJvciIsInBhZ2UiLCJhcmdzIiwiaXNTZXJpYWxpemVkUGFnZSIsIm9iaiIsImRhdGEiLCJPdmVyZmxvd0Vycm9yIiwibXNnIiwiQmFsYW5jZUVycm9yIiwiQWxsb3dhbmNlRXJyb3IiLCJSZWdpc3RyYXRpb25FcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIk1pc3NpbmdDb250ZXh0RXJyb3IiLCJVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyIsIkJhc2VFcnJvciIsIk5vdEluaXRpYWxpemVkRXJyb3IiLCJNaXNzaW5nUEtDU1MxMUxpYiIsIkVuZG9yc2VtZW50RXJyb3IiLCJNdmNjUmVhZENvbmZsaWN0RXJyb3IiLCJQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IiLCJFbmRvcnNlbWVudFBvbGljeUVycm9yIiwiVHJhbnNhY3Rpb25MaW1pdHNFcnJvciIsImNvZGUiLCJUcmFuc2FjdGlvblRpbWVvdXRFcnJvciIsIlRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yIiwiUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yIiwiRmFicmljQ2xpZW50UmVwb3NpdG9yeSIsIlJlcG9zaXRvcnkiLCJmb3JjZSIsInRoaXMiLCJfb3ZlcnJpZGVzIiwiaWdub3JlVmFsaWRhdGlvbiIsImlnbm9yZUhhbmRsZXJzIiwiYWxsb3dSYXdTdGF0ZW1lbnRzIiwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllcyIsImZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzIiwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUiLCJyZWJ1aWxkV2l0aFRyYW5zaWVudCIsIm92ZXJyaWRlIiwiZmxhZ3MiLCJmb3IiLCJPYnNlcnZlckhhbmRsZXIiLCJwYWdpbmF0ZUJ5Iiwia2V5Iiwib3JkZXIiLCJyZWYiLCJvZmZzZXQiLCJsaW1pdCIsImN0eEFyZ3MiLCJsb2dDdHgiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJQQUdFX0JZIiwidGFibGVOYW1lIiwiY2xhc3MiLCJzdGF0ZW1lbnQiLCJib29rbWFyayIsImxpc3RCeSIsIkxJU1RfQlkiLCJ3YXJuIiwiZmluZEJ5IiwidmFsdWUiLCJGSU5EX0JZIiwiZmluZE9uZUJ5IiwiRklORF9PTkVfQlkiLCJmaW5kIiwiT3JkZXJEaXJlY3Rpb24iLCJBU0MiLCJGSU5EIiwiUEFHRSIsImN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlNUQVRFTUVOVCIsImNhbGxBcmdzIiwic2xpY2UiLCJwYXJzZSIsImRlY29kZSIsImV2YWx1YXRlVHJhbnNhY3Rpb24iLCJoeWRyYXRlZCIsInIiLCJDb3VjaERCS2V5cyIsIlRBQkxFIiwiZCIsImFwcGx5QWZ0ZXJSZWFkIiwiZ2V0T3JVbmRlZmluZWQiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJBRlRFUiIsIlByb21pc2UiLCJhbGwiLCJlbnRyeSIsImNvdW50T2YiLCJDT1VOVF9PRiIsInN0bXRBcmdzIiwibWF4T2YiLCJNQVhfT0YiLCJtaW5PZiIsIk1JTl9PRiIsImF2Z09mIiwiQVZHX09GIiwic3VtT2YiLCJTVU1fT0YiLCJkaXN0aW5jdE9mIiwiRElTVElOQ1RfT0YiLCJncm91cE9mIiwiR1JPVVBfT0YiLCJoZWFsdGhjaGVjayIsImNyZWF0ZSIsIm1vZGVsIiwiZGVidWciLCJlbnN1cmVMZWdhY3lNaXJyb3JGbGFnIiwicHJlcGFyZWQiLCJyZWNvcmQiLCJpZCIsInRyYW5zaWVudCIsInJldmVydCIsInVwZGF0ZSIsImNyZWF0ZUFsbFByZWZpeCIsIm1vZGVscyIsIkNSRUFURSIsImdldCIsImlnbm9yZVZhbGlkYXRlIiwiT04iLCJpZ25vcmVkUHJvcHMiLCJlcnJvcnMiLCJoYXNFcnJvcnMiLCJlcnJvck1lc3NhZ2VzIiwicmVkdWNlRXJyb3JzVG9QcmludCIsIlZhbGlkYXRpb25FcnJvciIsImNyZWF0ZUFsbCIsImlkcyIsInBheWxvYWRzIiwidHJhbnNpZW50cyIsImNyZWF0ZWQiLCJpIiwicmVhZEFsbCIsImtleXMiLCJyZWNvcmRzIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsInUiLCJhY2N1bXVsYXRlIiwibGVnYWN5IiwiRVJDMjBUb2tlbiIsIkJhc2VNb2RlbCIsIl9fZGVjb3JhdGUiLCJ0eXBlIiwiY29sdW1uIiwicmVxdWlyZWQiLCJ0YWJsZSIsIkVSQzIwV2FsbGV0IiwiQWxsb3dhbmNlIiwiQ2xpZW50U2VyaWFsaXplciIsIkpTT05TZXJpYWxpemVyIiwicHJlU2VyaWFsaXplIiwibW9kZWxOYW1lIiwidG9TZXJpYWxpemUiLCJtZXRhZGF0YSIsIk1ldGFkYXRhIiwiU2VyaWFsaXphdGlvbkVycm9yIiwiTW9kZWxLZXlzIiwiQU5DSE9SIiwiZGVzZXJpYWxpemUiLCJzdHIiLCJkZXNlcmlhbGl6YXRpb24iLCJjbGFzc05hbWUiLCJFcnJvciIsImJ1aWxkIiwic2VyaWFsaXplIiwiRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5Iiwic2VyaWFsaXplciIsImRlY29kZXIiLCJUZXh0RGVjb2RlciIsInVwZGF0ZU9ic2VydmVycyIsImV2ZW50Iiwib2JzZXJ2ZXJIYW5kbGVyIiwiY291bnQiLCJwYXJzZWRJZCIsIlNlcXVlbmNlIiwicGFyc2VWYWx1ZSIsInNlcXVlbmNlRm9yIiwidG9rZW5OYW1lIiwic3ltYm9sIiwiZGVjaW1hbHMiLCJOdW1iZXIiLCJ0b3RhbFN1cHBseSIsInRvdGFsIiwiYmFsYW5jZU9mIiwib3duZXIiLCJiYWxhbmNlIiwidHJhbnNmZXIiLCJ0byIsInRyYW5zZmVycmVkIiwic3VibWl0VHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsInRyYW5zZmVyRnJvbSIsImZyb20iLCJjb250ZXh0QXJncyIsIkNvbnRleHQiLCJhcHByb3ZlIiwic3BlbmRlciIsImFwcHJvdmVkIiwiYWxsb3dhbmNlIiwiaW5pdGlhbGl6ZSIsInRva2VuIiwiaW5pdGlsaWF6ZWQiLCJjaGVja0luaXRpYWxpemVkIiwibWludCIsImFtb3VudCIsImJ1cm4iLCJidXJuRnJvbSIsImFjY291bnQiLCJjbGllbnRBY2NvdW50QmFsYW5jZSIsInNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSIsImNsaWVudEFjY291bnRJRCIsImV4dHJhY3RJZHMiLCJjb21wb3NlZCIsInBrUHJvcHMiLCJleHRyYWN0SWQiLCJjb21wb3NlQXR0cmlidXRlVmFsdWUiLCJJZGVudGl0eUNyZWRlbnRpYWxzIiwiZGVzY3JpcHRpb24iLCJGYWJyaWNNb2RlbEtleXMiLCJJZGVudGl0eVR5cGUiLCJGYWJyaWNGbGF2b3VyIiwiSWRlbnRpdHkiLCJYNTA5Iiwib25lVG9PbmUiLCJDYXNjYWRlIiwiQ0FTQ0FERSIsImRlbGV0ZSIsIkNvcmVVdGlscyIsImxvZ2dlciIsIk1pbmlMb2dnZXIiLCJjb250ZW50T2ZMb2FkRmlsZSIsImNvbnRlbnRPclBhdGgiLCJmaWxlUmVhZGVyIiwiVWludDhBcnJheSIsIm1hdGNoIiwicmVhZEZpbGUiLCJwcm9taXNlcyIsIm5vcm1hbGl6ZUltcG9ydCIsImltcG9ydCIsImdldENBVXNlciIsInVzZXJOYW1lIiwicHJpdmF0ZUtleSIsImNlcnRpZmljYXRlIiwib3B0aW9ucyIsInN0cmluZ0Zvcm1hdCIsInVzZXIiLCJVc2VyIiwiY29uZmlnIiwiaHNtIiwic29mdHdhcmUiLCJsaWIiLCJsaWJyYXJ5Iiwic2xvdCIsImxhYmVsIiwidG9rZW5MYWJlbCIsInBpbiIsImNyeXB0b1N1aXRlIiwiZ2V0Q3J5cHRvU3VpdGUiLCJzZXRDcnlwdG9TdWl0ZSIsImVucm9sbG1lbnRLZXkiLCJnZXRIU01FbnJvbGxtZW50S2V5IiwiZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5Iiwic2V0RW5yb2xsbWVudCIsIm5ld0NyeXB0b1N1aXRlIiwiY3JlYXRlS2V5RnJvbVJhdyIsInNraSIsImtleUlkSGV4IiwidHJpbSIsIkJ1ZmZlciIsImdldENlcnRpZmljYXRlU0tJIiwiZ2V0S2V5IiwiaXNQcml2YXRlIiwieDUwOSIsIlg1MDlDZXJ0aWZpY2F0ZSIsImp3ayIsInB1YmxpY0tleSIsImV4cG9ydCIsImZvcm1hdCIsInByZWZpeCIsIngiLCJ5IiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsImNvbmNhdCIsImRpZ2VzdCIsImdldElkZW50aXR5IiwiY2VydERpcmVjdG9yeVBhdGgiLCJpZGVudGl0eUZpbGVSZWFkZXIiLCJjZXJ0UGF0aCIsImdldEZpcnN0RGlyRmlsZU5hbWUiLCJjcmVkZW50aWFscyIsImRpclBhdGgiLCJyZWFkZGlyIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQiLCJnZXRGaWxlQ29udGVudCIsImdldFNpZ25lciIsImtleURpcmVjdG9yeVBhdGgiLCJzaWduZXJGaWxlUmVhZGVyIiwia2V5UGF0aCIsInByaXZhdGVLZXlQZW0iLCJleHRyYWN0UHJpdmF0ZUtleSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImsiLCJzaWduZXJzIiwibmV3UHJpdmF0ZUtleVNpZ25lciIsInBlbSIsImxpYk5hbWUiLCJzdWJ0bGUiLCJnbG9iYWxUaGlzIiwid2luZG93IiwiQ3J5cHRvIiwid2ViY3J5cHRvIiwic3RyMmFiIiwiYnVmIiwiQXJyYXlCdWZmZXIiLCJidWZWaWV3Iiwic3RyTGVuIiwiY2hhckNvZGVBdCIsInJlcGxhY2VBbGwiLCJkZWNvZGVkIiwiYmluYXJ5RGVyIiwiaW1wb3J0S2V5IiwibmFtZWRDdXJ2ZSIsImdldEFraUFuZFNlcmlhbEZyb21DZXJ0IiwiY2VydCIsIng1MDlDZXJ0aWZpY2F0ZSIsIlg1MDlDZXJ0IiwiYWtpRXh0IiwiZXh0ZW5zaW9ucyIsImFraSIsInRvVXBwZXJDYXNlIiwic3RhcnRzV2l0aCIsInNlcmlhbCIsInNlcmlhbE51bWJlciIsImNyeXB0b1Byb3ZpZGVyIiwic2V0IiwiQkFTRV9BTFBIQUJFVCIsIkNSWVBUTyIsIkJhc2VFbmNvZGVyIiwiYWxwaGFiZXQiLCJiYXNlTWFwIiwiaiIsImNoYXJBdCIsInhjIiwiYmFzZSIsImxlYWRlciIsImZhY3RvciIsIk1hdGgiLCJpRmFjdG9yIiwiZW5jb2RlIiwic291cmNlIiwiaXNWaWV3IiwiYnVmZmVyIiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJ6ZXJvZXMiLCJwYmVnaW4iLCJwZW5kIiwiYjU4IiwiY2FycnkiLCJpdDEiLCJpdDIiLCJyZXBlYXQiLCJkZWNvZGVVbnNhZmUiLCJwc3oiLCJiMjU2IiwiaXQzIiwiaXQ0IiwidmNoIiwiQ3J5cHRvVXRpbHMiLCJiNThlbmNvZGVyIiwiQkFTRTU4IiwiZmFicmljSWRGcm9tQ2VydGlmaWNhdGUiLCJzdWJqZWN0IiwiaXNzdWVyIiwic3RyaW5nVG9BcnJheUJ1ZmZlciIsImV4dHJhY3RLZXkiLCJ1c2FnZXMiLCJSZWdFeHAiLCJleHRyYWN0UHVibGljS2V5Iiwic2lnbiIsImJ1ZmYiLCJoYXNoIiwiYiIsInBhZFN0YXJ0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwiZW5jcnlwdCIsImdldFN1YnRsZUNyeXB0byIsImlzQnJvd3NlciIsImRlY3J5cHQiLCJnZXRNYXN0ZXIiLCJ0ZXh0RW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZ2VuR2VuZXNpcyIsInJhbmRvbVVVSUQiLCJpbXBvcnRlZEtleSIsIktFWV9BTEdPUllUSE0iLCJpdiIsImdldERlcml2YXRpb25LZXkiLCJzYWx0Iiwic2FsdEJ1ZmZlciIsInNhbHRIYXNoZWQiLCJwYXJhbXMiLCJIQVNIIiwiaXRlcmF0aW9ucyIsIklURVJBVElPTlMiLCJkZXJpdmF0aW9uIiwiZGVyaXZlQml0cyIsIktFWUxFTkdUSCIsIml2bGVuIiwia2V5bGVuIiwiZGVyaXZlZEtleSIsImltcG9ydGVkRW5jcnlwdGlvbktleSIsIkFMR09SWVRITSIsImVuY3J5cHRQaW4iLCJ0ZXh0Iiwia2V5T2JqZWN0IiwidGV4dEJ1ZmZlciIsImVuY3J5cHRlZFRleHQiLCJkZWNyeXB0UGluIiwidGV4dERlY29kZXIiLCJkZWNyeXB0ZWRUZXh0IiwiSEZDQUlkZW50aXR5VHlwZSIsIkhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMiLCJGYWJyaWNFbnJvbGxtZW50U2VydmljZSIsIkxvZ2dlZENsYXNzIiwiY2FDb25maWciLCJjYU5hbWUiLCJjYUNlcnQiLCJjYUtleSIsInVybCIsIkNBIiwiY2EiLCJ0bHMiLCJ0cnVzdGVkUm9vdHMiLCJyb290IiwiRmFicmljQ0FTZXJ2aWNlcyIsIkNsaWVudCIsImNsaWVudCIsIkNlcnRpZmljYXRlIiwiY2VydGlmaWNhdGVTZXJ2aWNlIiwibmV3Q2VydGlmaWNhdGVTZXJ2aWNlIiwiQWZmaWxpYXRpb25zIiwiYWZmaWxpYXRpb25TZXJ2aWNlIiwibmV3QWZmaWxpYXRpb25TZXJ2aWNlIiwiSWRlbnRpdGllcyIsImlkZW50aXR5U2VydmljZSIsIm5ld0lkZW50aXR5U2VydmljZSIsImdldENlcnRpZmljYXRlcyIsInJlcXVlc3QiLCJkb01hcCIsInJlc3BvbnNlIiwiY2VydHMiLCJQRU0iLCJnZXRJZGVudGl0aWVzIiwiaWRlbnRpdGllc1NlcnZpY2UiLCJnZXRBbGwiLCJpZGVudGl0aWVzIiwicGFyc2VFcnJvciIsInJlZ2V4cCIsImV4ZWMiLCJDb25mbGljdEVycm9yIiwiZ2V0QWZmaWxpYXRpb25zIiwiYSIsInJlYWQiLCJlbnJvbGxtZW50SWQiLCJnZXRPbmUiLCJOb3RGb3VuZEVycm9yIiwic3VjY2VzcyIsInJlZ2lzdGVyIiwiaXNTdXBlclVzZXIiLCJhZmZpbGlhdGlvbiIsInVzZXJSb2xlIiwiYXR0cnMiLCJtYXhFbnJvbGxtZW50cyIsInJlZ2lzdHJhdGlvbiIsInBhc3N3b3JkIiwicHJvcHMiLCJlbnJvbGxtZW50SUQiLCJlbnJvbGxtZW50U2VjcmV0IiwiaW5mbyIsImlkZW50aXR5RnJvbUVucm9sbG1lbnQiLCJlbnJvbGxtZW50Iiwicm9vdENlcnRpZmljYXRlIiwiTG9nZ2luZyIsImNsaWVudElkIiwibm93IiwiRGF0ZSIsInRvQnl0ZXMiLCJjcmVhdGVkT24iLCJ1cGRhdGVkT24iLCJlbnJvbGwiLCJpZGVudGl0eSIsInJlZ2lzdGVyQW5kRW5yb2xsIiwicmV2b2tlIiwicmVhc29uIiwiUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIiLCJlcnJzIiwicm9sZSIsInNldEFmZmlsaWF0aW9uIiwiYWRkQXR0ciIsImF0dHIiLCJzZXRBdHRycyIsInNldEVucm9sbG1lbnRJRCIsInNldEVucm9sbG1lbnRTZWNyZXQiLCJzZXRNYXhFbnJvbGxtZW50cyIsInNldFJvbGUiLCJtaW5sZW5ndGgiLCJtaW4iLCJpc1NoYXJlZCIsInNlZ3JlZ2F0ZSIsImlzVHJhbnNpZW50IiwiZGVjb3JhdGVkUHJvcGVydGllcyIsImdldEF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRQcm9wcyIsIkRCS2V5cyIsIlRSQU5TSUVOVCIsInByaXZhdGVQcm9wZXJ0aWVzIiwiUFJJVkFURSIsInNoYXJlZFByb3BlcnRpZXMiLCJTSEFSRUQiLCJwdWJsaWMiLCJ0cmFuc2llbnRLZXlzIiwicHJpdmF0ZUtleXMiLCJzaGFyZWRLZXlzIiwiaXNQdWJsaWMiLCJiaW5kIiwibWlycm9yZWQiLCJGQUJSSUMiLCJNSVJST1IiLCJvd25lck9mIiwibWV0YSIsIk9XTkVEX0JZIiwic2hhcmVkS2V5IiwiY29uc3RyIiwicHJpdmF0ZU1ldGEiLCJzaGFyZWRNZXRhIiwiY29sbGVjdGlvbnMiLCJjaGFpbmNvZGVPZiIsIkNIQUlOQ09ERSIsInBvcCIsImNvbnRyYWN0T2YiLCJDT05UUkFDVCIsImNoYW5uZWxPZiIsIkNIQU5ORUwiLCJFUkMyMEV2ZW50cyIsIkZhYnJpY0Jhc2VNb2RlbCIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsInZlcnNpb24iLCJ1c2VzIiwiRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCIsImNyZWF0ZWRCeSIsInVwZGF0ZWRCeSIsIkRlZmF1bHRDb250cmFjdFJlc29sdmVyIiwiY29udHJhY3QiLCJjaGFpbmNvZGUiLCJjaGFubmVsIiwiZXh0cmFjdE1zcElkIiwiZ2V0TVNQSUQiLCJPd25lciIsInRhcmdldCIsInByb3BlcnR5S2V5IiwiZGVzY3JpcHRvciIsIm9yaWdpbmFsTWV0aG9kIiwiYWNvdW50SWQiLCJjbGllbnRJZGVudGl0eSIsImdldElEIiwic2VsZWN0IiwidG9rZW5zIiwiZXhlY3V0ZSIsImFwcGx5Iiwib3duZWRCeU9uQ3JlYXRlIiwiY29udGV4dCIsInN0dWIiLCJjcmVhdG9yIiwiZ2V0Q3JlYXRvciIsIm1zcGlkIiwic2V0T3duZWRCeUtleVZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJvd25lZEJ5IiwiYXR0cmlidXRlIiwiZ2VuZXJhdGVkIiwicmVhZG9ubHkiLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIkRlY29yYXRpb24iLCJkZWZpbmUiLCJkZWNvcmF0b3IiLCJ0cmFuc2FjdGlvbklkT25DcmVhdGUiLCJnZXRUeElEIiwidHJhbnNhY3Rpb25JZCIsIm9uVXBkYXRlIiwiVFJBTlNBQ1RJT05fSUQiLCJldmFsTWlycm9yTWV0YWRhdGEiLCJjcmVhdGVNaXJyb3JIYW5kbGVyIiwiZmFicmljQ3R4Iiwic291cmNlTW9kZWwiLCJwdXQiLCJyZXBvIiwibWlycm9yQ29sbGVjdGlvbiIsInVwZGF0ZU1pcnJvckhhbmRsZXIiLCJhcHBseVVwZGF0ZVZhbGlkYXRpb24iLCJtZXJnZUZvclVwZGF0ZSIsImRlbGV0ZU1pcnJvckhhbmRsZXIiLCJwa1Byb3AiLCJzZWdyZWdhdGVkIiwibWlycm9yV3JpdGVHdWFyZCIsIm1zcCIsImNvbmRpdGlvbiIsInJlYWRNaXJyb3JIYW5kbGVyIiwibWF0Y2hlcyIsInJlYWRGcm9tIiwibXNwSWRPckNvbmRpdGlvbiIsImlzQ29uZGl0aW9uT25seSIsIkJvb2xlYW4iLCJjb25kIiwib25SZWFkIiwicHJpb3JpdHkiLCJvbkRlbGV0ZSIsIk1vZGVsQ29sbGVjdGlvbiIsIm9yZ05hbWUiLCJ0b1Bhc2NhbENhc2UiLCJOYW1lc3BhY2VDb2xsZWN0aW9uIiwibmFtZXNwYWNlIiwiSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbiIsIlNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZIiwiYXBwbHlTZWdyZWdhdGlvbkZsYWdzIiwiaXNGdWxseVNlZ3JlZ2F0ZWQiLCJoYXNQdWJsaWNQcm9wZXJ0aWVzIiwibWFya0Z1bGx5U2VncmVnYXRlZCIsImFwcGx5TWlycm9yRmxhZ3MiLCJhdHRyaWJ1dGVzIiwidHJhbnNpZW50TWV0YSIsImV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMiLCJkYXRhQXJyYXkiLCJjb2xsZWN0aW9uUmVzb2x2ZXIiLCJrZXlBcnJheSIsInBrS2V5IiwicGtTZXFOYW1lIiwic2VxdWVuY2VOYW1lIiwiaWRWYWx1ZSIsImNhbkJ1aWxkUGVySW5zdGFuY2UiLCJzZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uIiwicHJvcFNlcU5hbWUiLCJzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlIiwiX2siLCJrZXlTdHJpbmdzIiwid3JpdGVUbyIsInNlZ3JlZ2F0ZWREYXRhT25SZWFkIiwic2VncmVnYXRlZERhdGFPblVwZGF0ZSIsIm9sZE1vZGVsIiwic2VncmVnYXRlZERhdGFPbkRlbGV0ZSIsImlubmVyU2VncmVnYXRlZCIsInNlZ3JlZ2F0ZWREZWMiLCJTZXQiLCJhZGQiLCJjb25zdHJNZXRhIiwiY29uc3RyQ29sbGVjdGlvbnMiLCJ1cGRhdGVkVHJhbnNpZW50TWV0YSIsImRlY3MiLCJwcm9wZXJ0aWVzIiwiZ3JvdXBOYW1lIiwiZXh0cmFjdEdyb3VwTmFtZSIsImRhdGFHcm91cE5hbWUiLCJlYXJseUV4dHJhY3Rpb25NZXRhIiwiZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0IiwiZ3JvdXAiLCJwcm9wIiwib24iLCJEQk9wZXJhdGlvbnMiLCJBTEwiLCJwcml2YXRlRGF0YSIsInNoYXJlZERhdGEiLCJzb3J0S2V5c09ubHlSZWN1cnNpdmUiLCJzb3J0IiwicmVkdWNlIiwiYWNjIiwiRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJlcnJvciIsInNlbGYiLCJvIiwicmVsYXRpb25zIiwiZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUiLCJwYXJzZUV2ZW50TmFtZSIsInBhcnRzIiwic3BsaXQiLCJzdWIiLCJzYWZlUGFyc2VJbnQiLCJzdHJpbmciLCJkaWdpdFJlZ2V4IiwidGVzdCIsInBhcnNlZGludCIsInBhcnNlSW50IiwiaXNOYU4iLCJTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsInB1dEFuY2hvciIsInByZVNlcmlhbGl6YXRpb24iLCJGYWJyaWNJZGVudGl0eVNlcnZpY2UiLCJDbGllbnRCYXNlZFNlcnZpY2UiLCJyb290Q2xpZW50IiwiX3VzZXIiLCJjZXJ0aWZpY2F0ZXMiLCJhZmZpbGlhdGlvbnMiLCJnZXRVc2VyIiwiY2ZnIiwiSU5JVElBTElaQVRJT04iLCJnZXROYW1lIiwidXBkYXRlSWRlbnRpdHkiLCJpZGVudGl0eVJlcXVlc3QiLCJjYVVzZXJJZGVudGl0eSIsInJlZW5yb2xsVXNlciIsImNyZWF0ZVVzZXIiLCJnZXRNc3BpZCIsImVucm9sbG1lbnRBdHRycyIsIm9wdGlvbmFsIiwicmVlbnJvbGwiLCJyZW5ld2VkSWRlbnRpdHkiLCJyZXZva2VPcHRpb25zIiwicmV2b2tlUmVxdWVzdCIsIkNBX1JPTEUiLCJEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MiLCJldmFsdWF0ZVRpbWVvdXQiLCJlbmRvcnNlVGltZW91dCIsInN1Ym1pdFRpbWVvdXQiLCJjb21taXRUaW1lb3V0IiwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzIiwiYWxsb3dHYXRld2F5T3ZlcnJpZGUiLCJhbGxvd0NvbnRleHRUcmFuc2llbnRNYXAiLCJlbmNyeXB0VHJhbnNpZW50Iiwic3ludGhldGljRXZlbnRzIiwiQ0xJRU5UX09WRVJSSURFX0tFWVMiLCJGYWJyaWNDbGllbnRDb250ZXh0IiwidG9PdmVycmlkZXMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwib3JkZXJCeVNlbGVjdG9ycyIsIk9SREVSX0JZIiwidG9DYW1lbENhc2UiLCJwcm9jZXNzUmVjb3JkIiwicGtBdHRyIiwiSUQiLCJrZXlBcmdzIiwiU0VQQVJBVE9SIiwicmF3IiwicmF3SW5wdXQiLCJhZ2dyZWdhdG9yIiwiYWdncmVnYXRlSW5mbyIsImFnZ3JlZ2F0ZSIsImV4ZWN1dGVBZ2dyZWdhdGUiLCJyZXN1bHRzIiwicHJvY2Vzc2VkIiwiYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQiLCJhZ2dyZWdhdGVRdWVyeSIsImJ1aWxkQWdncmVnYXRlUXVlcnkiLCJzZWxlY3RvcnMiLCJzZWxlY3RvciIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiZXEiLCJzZWxlY3RvcktleXMiLCJDb3VjaERCR3JvdXBPcGVyYXRvciIsImluZGV4T2YiLCJ2YWwiLCJPUiIsInMiLCJlbnRyaWVzIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwiY2hhaW5jb2RlRm9yIiwiY2hhbm5lbEZvciIsImNvbnRyYWN0Rm9yIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsIm5ld0N0eCIsInBhcmVudENvbnRleHQiLCJjaGlsZENvbnRleHRzIiwiY3VycmVudE9wIiwiY3VycmVudE1vZGVsIiwicmVwb3NpdG9yeSIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZUFsbFByZWZpeCIsInNoaWZ0IiwiaGFzVHJhbnNpZW50IiwibmVlZHNGdWxsUGF5bG9hZCIsInNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbiIsInNlcmlhbGl6ZWRNb2RlbHMiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJDUkVBVEVfQUxMIiwiZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInJlcyIsInNob3VsZFJlZnJlc2hBZnRlcldyaXRlIiwiUkVBRF9BTEwiLCJVUERBVEVfQUxMIiwiZGVsZXRlQWxsIiwic2hvdWxkSHlkcmF0ZSIsIkRFTEVURV9BTEwiLCJNRVRBREFUQSIsIm1pcnJvck1zcCIsIm1zcHMiLCJtZXJnZWQiLCJlbmRvcnNpbmdPcmdzIiwiZW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50IiwidiIsImNoaWxkUmVidWlsZCIsImdldEZyb21DaGlsZHJlbiIsInJlc29sdmVkT3AiLCJyZXNvbHZlT3BlcmF0aW9uIiwiaGFzSWQiLCJpbmplY3RUcmFuc2llbnRPdmVycmlkZXMiLCJ0cmFuc2llbnREYXRhIiwiaGFzVHJhbnNpZW50RGF0YSIsImhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhIiwic2hvdWxkSW5qZWN0IiwiT1ZFUlJJREVTIiwiaXRlbSIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsIkNvbnRyYWN0IiwiY2xhenpPckNvbnRyYWN0TmFtZSIsImdldENvbnRyYWN0IiwidHJhbnNhY3Rpb24iLCJhcGkiLCJzdWJtaXQiLCJzaG91bGRVc2VMZWdhY3lHYXRld2F5IiwibGVnYWN5QXJncyIsInByZXBhcmVMZWdhY3lBcmdzIiwidHJhbnNpZW50TWFwIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJwZWVyQ29uZmlncyIsImJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MiLCJzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMiLCJnYXRld2F5IiwiZ2V0Q29udHJhY3ROYW1lIiwiZXZhbHVhdGUiLCJub3JtYWxpemVkQXJncyIsIm5vcm1hbGl6ZVRyYW5zYWN0aW9uQXJndW1lbnQiLCJ0cmFuc2llbnRFbnRyaWVzIiwicHJvcG9zYWxPcHRpb25zIiwiYXJndW1lbnRzIiwiY2xvc2UiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwicGVlcnMiLCJwZWVyRW5kcG9pbnQiLCJwZWVySG9zdEFsaWFzIiwidGxzQ2VydCIsImVuZG9yc2VycyIsIm9yZyIsImV4dHJhcyIsIm1zcE1hcCIsImxlZ2FjeUNvdW50Iiwic2VsZWN0aW9ucyIsImNob2ljZSIsImVuZHBvaW50IiwiZmNuIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwiY2hhaW5jb2RlTmFtZSIsImNvbnRyYWN0TmFtZSIsIm5ldHdvcmsiLCJnZXROZXR3b3JrIiwiY3JlYXRlVHJhbnNhY3Rpb24iLCJzZXRUcmFuc2llbnQiLCJwZWVyIiwiZ2V0Q2hhbm5lbCIsImdldEVuZG9yc2VyIiwiZW5kb3JzZXIiLCJzZXRFbmRvcnNpbmdQZWVycyIsImRpc2Nvbm5lY3QiLCJkZWR1cGVkIiwiTWFwIiwiYWRkUGVlciIsImhhcyIsInJlYWRQZW1JbnB1dCIsImNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIiwia2V5Q2VydE9yRGlyZWN0b3J5UGF0aCIsInBlZXJFbnRyaWVzIiwiY2hhbm5lbFBlZXJzIiwib3JncyIsInRsc1BlbSIsImhvc3RuYW1lIiwiZXh0cmFjdEhvc3QiLCJlbnN1cmVHcnBjVXJsIiwidGxzQ0FDZXJ0cyIsImdycGNPcHRpb25zIiwiaG9zdG5hbWVPdmVycmlkZSIsImVuZG9yc2luZ1BlZXIiLCJjaGFpbmNvZGVRdWVyeSIsImxlZGdlclF1ZXJ5IiwiZXZlbnRTb3VyY2UiLCJvcmdhbml6YXRpb24iLCJvcmdhbml6YXRpb25zIiwib3JkZXJlcnMiLCJjaGFubmVscyIsImV2ZXJ5IiwiaXNMb2NhbEVuZHBvaW50IiwiaG9zdCIsInNhbml0aXplZCIsImlzQnVmZmVyIiwidHJpbW1lZCIsInN0YXRzIiwic3RhdCIsImNhdGNoIiwiaXNEaXJlY3RvcnkiLCJyZWFkRnNGaWxlIiwiZXJyIiwibWlncmF0ZSIsInJlZmVyZW5jZSIsImxhc3QiLCJwcm92aWRlZEN0eCIsIm1pZ3JhdGlvbkFyZ3MiLCJNSUdSQVRJT04iLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBWUEsU0FBU0EsdUJBQ1BDLEdBQ0FDO1FBRUE7WUFDRSxPQUFPQyxPQUFPQyxvQkFBQUEsTUFBTUMsR0FBR0o7QUFDekIsVUFBRTtZQUNBLE1BQU1LLFVBQVUsWUFBWUwsRUFBRU07WUFDOUJMLElBQUlNLFFBQVFGO1lBQ1osT0FBT0c7QUFDVDtBQUNG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
|
|
4000
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvc2hhcmVkL2Vycm9ycy50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvbW9kZWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9lcmMyMC9GYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY2xpZW50L2lkcy9pZC1leHRyYWN0aW9uLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eUNyZWRlbnRpYWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5LnRzIiwiLi4vc3JjL2NsaWVudC91dGlscy50cyIsIi4uL3NyYy9jbGllbnQvY3J5cHRvLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRDb250ZXh0LnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEluZGV4ID0gQ3JlYXRlSW5kZXhSZXF1ZXN0O1xuXG5mdW5jdGlvbiByZXNvbHZlUHJpbWFyeUtleUZpZWxkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBsb2c6IExvZ2dlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gU3RyaW5nKE1vZGVsLnBrKG0pKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBTa2lwcGluZyAke20ubmFtZX0gd2hpbGUgZXh0cmFjdGluZyBpbmRleGVzOiBubyBwcmltYXJ5IGtleSBpcyBkZWZpbmVkYDtcbiAgICBsb2cudmVyYm9zZShtZXNzYWdlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0UXVlcnlQa1RpZUJyZWFrZXIoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHBrRmllbGQ6IHN0cmluZ1xuKTogSW5kZXhbXSB7XG4gIGlmICghcGtGaWVsZCkge1xuICAgIHJldHVybiBpbmRleGVzO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXMubWFwKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IChpbmRleCBhcyBhbnkpPy5pbmRleD8uZmllbGRzO1xuICAgIGlmIChcbiAgICAgICFpbmRleD8ubmFtZSB8fFxuICAgICAgdHlwZW9mIGluZGV4Lm5hbWUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICFpbmRleC5uYW1lLmluY2x1ZGVzKFwiZGVmYXVsdFF1ZXJ5XCIpIHx8XG4gICAgICAhQXJyYXkuaXNBcnJheShmaWVsZHMpIHx8XG4gICAgICBmaWVsZHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkRmllbGRzID0gZmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZDogYW55KSA9PiB0eXBlb2YgZmllbGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZmllbGQpXG4gICAgKTtcbiAgICBpZiAoc29ydGVkRmllbGRzLmxlbmd0aCAhPT0gZmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1BrID0gZmllbGRzLnNvbWUoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGQsIHBrRmllbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGhhc1BrKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEZpZWxkID0gZmllbGRzW2ZpZWxkcy5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGxhc3REaXJlY3Rpb24gPSBTdHJpbmcoXG4gICAgICBPYmplY3QudmFsdWVzKGxhc3RGaWVsZCB8fCB7fSlbMF0gfHwgXCJhc2NcIlxuICAgICkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBsYXN0RGlyZWN0aW9uID09PSBcImRlc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbmRleCwge1xuICAgICAgaW5kZXg6IE9iamVjdC5hc3NpZ24oe30sIChpbmRleCBhcyBhbnkpLmluZGV4LCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBbcGtGaWVsZF06IGRpcmVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbEluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGxvZzogTG9nZ2VyXG4pOiBJbmRleFtdIHtcbiAgY29uc3QgaW5kZXhlcyA9IGdlbmVyYXRlSW5kZXhlcyhbbV0pO1xuICBjb25zdCBwa0ZpZWxkID0gcmVzb2x2ZVByaW1hcnlLZXlGaWVsZChtLCBsb2cpO1xuICByZXR1cm4gd2l0aERlZmF1bHRRdWVyeVBrVGllQnJlYWtlcihpbmRleGVzLCBwa0ZpZWxkIHx8IFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3M8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGFjY3VtPzogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz5cbik6IENvdWNoREJEZXNpZ25Eb2NbXSB7XG4gIGNvbnN0IHZpZXdzID0gZ2VuZXJhdGVWaWV3cyhbbV0pO1xuICBjb25zdCBzdG9yYWdlOiBSZWNvcmQ8c3RyaW5nLCBDb3VjaERCRGVzaWduRG9jPiA9IGFjY3VtIHx8IHt9O1xuICB2aWV3cy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBzdG9yYWdlW2RvYy5faWRdID0gZG9jO1xuICB9KTtcbiAgcmV0dXJuIHZpZXdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsRmlsZShmaWxlOiBhbnkpIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlLnBhcmVudFBhdGgsIGZpbGUubmFtZSk7XG4gIGNvbnN0IGV4cG9ydHMgPSByZXF1aXJlKGZpbGVQYXRoKTtcblxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbHRlcigoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gbmV3IChlIGFzIENvbnN0cnVjdG9yKSgpO1xuICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNb2RlbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PltdO1xuICByZXR1cm4gdmFsdWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZGVsRm9sZGVycyhcbiAgLi4uZm9sZGVyczogc3RyaW5nW11cbik6IFByb21pc2U8TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10+IHtcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IHJlc29sdmVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKGZvbGRlcik7XG4gICAgY29uc3QgZmlsZXMgPSBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHJlc29sdmVkRm9sZGVyLCB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmOiBhbnkpID0+IGYuaXNGaWxlKCkgJiYgZi5uYW1lLmVuZHNXaXRoKFwianNcIikpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ucmVhZE1vZGVsRmlsZShmaWxlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUluZGV4ZXMoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9aW5kZXhlcy8ke2luZGV4Lm5hbWV9Lmpzb25gXG4gICAgICApXG4gICAgKTtcbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShpbmRleCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZXNpZ25Eb2NzKFxuICBkZXNpZ25Eb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRlc2lnbkRvY3MubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZGVzaWduRG9jcy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBkb2NJZCA9IGRvYy5faWQucmVwbGFjZSgvXl9kZXNpZ25cXC8vLCBcIlwiKTtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9ZGVzaWduX2RvY3MvJHtkb2NJZH0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBjb25zdCBwYXlsb2FkID0geyAuLi5kb2MgfTtcbiAgICBkZWxldGUgcGF5bG9hZC5fcmV2O1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJEZXNpZ25Eb2MgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvbHZlciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IHdyaXRlRGVzaWduRG9jcyB9IGZyb20gXCIuLi9pbmRleGVzL2dlbmVyYXRpb25cIjtcblxuLy9cbi8vIGV4cG9ydCB0eXBlIEZhYnJpY0NvbGxlY3Rpb24gPSB7XG4vLyAgIG5hbWU6IFwiY29sbGVjdGlvbk1hcmJsZXNcIjtcbi8vICAgcG9saWN5OiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIHJlcXVpcmVkUGVlckNvdW50OiAwO1xuLy8gICBtYXhQZWVyQ291bnQ6IDM7XG4vLyAgIGJsb2NrVG9MaXZlOiAwO1xuLy8gICBtZW1iZXJPbmx5UmVhZDogdHJ1ZTtcbi8vICAgbWVtYmVyT25seVdyaXRlOiB0cnVlO1xuLy8gICBlbmRvcnNlbWVudFBvbGljeToge1xuLy8gICAgIGlkZW50aXRpZXM6IFtcbi8vICAgICAgIHsgcm9sZTogeyBuYW1lOiBcIm1lbWJlclwiOyBtc3BJZDogXCJPcmcxTVNQXCIgfSB9LFxuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzJNU1BcIiB9IH0sXG4vLyAgICAgXTtcbi8vICAgICBydWxlOiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIH07XG4vLyB9O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNQb2xpY3lJZGVudGl0eSA9IHtcbiAgcm9sZToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtc3BJZDogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5OiB7XG4gICAgaWRlbnRpdGllczogRmFicmljUG9saWN5SWRlbnRpdHlbXTtcbiAgICBydWxlOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcml2YXRlQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5Pzoge1xuICAgIHNpZ25hdHVyZVBvbGljeTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3Rpb25Gb3IoXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHBvbGljeTogc3RyaW5nLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlcixcbiAgYmxvY2tUb0xpdmU6IG51bWJlcixcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4sXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhblxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNvbGxlY3Rpb25OYW1lLFxuICAgIHBvbGljeTogcG9saWN5LFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IGAke21zcElkfVByaXZhdGVgLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyID0gMCxcbiAgbWF4UGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyID0gMCxcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIGNvbnN0IGMgPSBjb2xsZWN0aW9uRm9yKFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIGBPUignJHttc3BJZH0ubWVtYmVyJylgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcblxuICBjLmVuZG9yc2VtZW50UG9saWN5ID0ge1xuICAgIHNpZ25hdHVyZVBvbGljeTogYE9SKCcke21zcElkfS5wZWVyJylgLFxuICB9O1xuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gIG1zcElkczogc3RyaW5nW10sXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAxLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDIsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219Lm1lbWJlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlXG4gICk7XG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgQU5EKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219LnBlZXInYCkuam9pbihcIixcIil9KWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdENvbGxlY3Rpb25zPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZHM6IHN0cmluZ1tdLFxuICBvdmVycmlkZXM6IHtcbiAgICBwcml2YXRlQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICAgIHNoYXJlZENvbHM/OiBQYXJ0aWFsPFByaXZhdGVDb2xsZWN0aW9uPjtcbiAgfSA9IHt9LFxuICBtaXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIGxldCB7IHByaXZhdGVDb2xzLCBzaGFyZWRDb2xzIH0gPSBNb2RlbC5jb2xsZWN0aW9uc0ZvcihtKTtcblxuICBmdW5jdGlvbiByZXNvbHZlQ29sbGVjdGlvbihhcmc6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJnO1xuICAgICAgcmV0dXJuIGFyZyhtLCBtc3BJZHNbMF0pIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlQ29scyA9IHByaXZhdGVDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG4gIHNoYXJlZENvbHMgPSBzaGFyZWRDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG5cbiAgY29uc3QgcHJpdmF0ZURlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMCxcbiAgICAgIG1heFBlZXJDb3VudDogMCxcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnByaXZhdGVDb2xzIHx8IHt9XG4gICk7XG4gIGNvbnN0IHNoYXJlZERlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMSxcbiAgICAgIG1heFBlZXJDb3VudDogMixcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnNoYXJlZENvbHMgfHwge31cbiAgKTtcblxuICBjb25zdCBtaXJyb3JNZXRhID0gbWlycm9yID8gTW9kZWwubWlycm9yZWRBdChtKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBwcml2YXRlcyA9IG1zcElkc1xuICAgIC5tYXAoKG1zcElkKSA9PlxuICAgICAgKHByaXZhdGVDb2xzIGFzIHN0cmluZ1tdKS5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgICByZXR1cm4gcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbXNwSWQsXG4gICAgICAgICAgcCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKVxuICAgIC5mbGF0KCk7XG5cbiAgaWYgKG1pcnJvck1ldGEgJiYgbWlycm9yTWV0YS5tc3BJZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgIHR5cGVvZiBtaXJyb3JNZXRhLnJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWlycm9yTWV0YS5yZXNvbHZlclxuICAgICAgICA6IG1pcnJvck1ldGEucmVzb2x2ZXIobSwgbWlycm9yTWV0YS5tc3BJZCk7XG4gICAgaWYgKFxuICAgICAgcmVzb2x2ZWQgJiZcbiAgICAgICFwcml2YXRlcy5zb21lKFxuICAgICAgICAocCkgPT4gcC5uYW1lID09PSByZXNvbHZlZCAmJiBwLnBvbGljeS5pbmNsdWRlcyhtaXJyb3JNZXRhLm1zcElkKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgIHByaXZhdGVEZWZhdWx0cztcbiAgICAgIHByaXZhdGVzLnB1c2goXG4gICAgICAgIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICAgICAgICAgIG1pcnJvck1ldGEubXNwSWQsXG4gICAgICAgICAgcmVzb2x2ZWQsXG4gICAgICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2hhcmVkID0gKHNoYXJlZENvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgICB9ID0gc2hhcmVkRGVmYXVsdHM7XG4gICAgcmV0dXJuIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gICAgICBtc3BJZHMsXG4gICAgICBwLFxuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlcyxcbiAgICBzaGFyZWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25zKFxuICBjb2xzOiBQcml2YXRlQ29sbGVjdGlvbltdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBmaWxlTmFtZSA9IFwiY29sbGVjdGlvbnNfY29uZmlnXCJcbikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlybmFtZTogc3RyaW5nID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSBhcyBzdHJpbmc7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlybmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZGlybmFtZSk7XG4gICAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4ocCwgYC4vTUVUQS1JTkYvJHtmaWxlTmFtZX0uanNvbmApKTtcbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGNvbHMsIHVuZGVmaW5lZCwgMikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyhcbiAgZG9jczogQ291Y2hEQkRlc2lnbkRvY1tdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFkb2NzPy5sZW5ndGgpIHJldHVybjtcbiAgd3JpdGVEZXNpZ25Eb2NzKGRvY3MsIHAsIGNvbGxlY3Rpb24pO1xufVxuIiwiaW1wb3J0IHtcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQYWdpbmF0b3IsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBTZXJpYWxpemVkUGFnZSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBNW10sXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBib29rbWFyaz86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5IHwgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFJhdyBxdWVyeSBhY2Nlc3MgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLiBvbmx5IHByZXBhcmVkIHN0YXRlbWVudHMgYXJlIG5hdGl2ZWx5IGF2YWlsYWJsZWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFnZShcbiAgICBwYWdlOiBudW1iZXIgPSAxLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHN1cGVyLnBhZ2UocGFnZSwgLi4uYXJncyk7IC8vIHRoaXMgd2lsbCBmYWlsIGZvciBub24tcHJlcGFyZWQgc3RhdGVtZW50c1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGlzU2VyaWFsaXplZFBhZ2Uob2JqOiBTZXJpYWxpemVkUGFnZTxhbnk+IHwgYW55KSB7XG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciBleHRlbmRzIFRyYW5zYWN0aW9uTGltaXRzRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvci5uYW1lLCA1OTMpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dE9mLFxuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgRmxhZ3NPZixcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6ZWRQYWdlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciB9IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjbGllbnQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgZ2VuZXJpYyBSZXBvc2l0b3J5IHRvIHByZXBhcmUgY29udGV4dCBhbmQgYXJndW1lbnRzIGZvciBDUlVEIG9wZXJhdGlvbnMgZXhlY3V0ZWQgdmlhIGEgRmFicmljIGNsaWVudCBBZGFwdGVyLCB3aXJpbmcgUmVwb3NpdG9yeUZsYWdzIGFuZCBGYWJyaWMtc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyByZXBvc2l0b3J5XG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBNYW5nb1F1ZXJ5LCBGYWJyaWNGbGFncywgQ29udGV4dDxGYWJyaWNGbGFncz4+fSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIHVzZWQgdG8gZXhlY3V0ZSBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgbW9kZWwgY29uc3RydWN0b3IgdXNlZCBieSB0aGUgcmVwb3NpdG9yeVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuICogaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWZhYnJpY1wiO1xuICpcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBNb2RlbCB7IGlkITogc3RyaW5nOyBuYW1lITogc3RyaW5nOyB9XG4gKiBjb25zdCByZXBvID0gbmV3IEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8VXNlcj4oKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHJlcG8ucmVhZChcIjFcIik7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+UmVwbzogY3JlYXRlUHJlZml4KG1vZGVsLCAuLi5hcmdzKVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIGZsYWdzKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHJlc3VsdFxuICogICBSZXBvLS0+PkFwcDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQSBleHRlbmRzIEZhYnJpY0NsaWVudEFkYXB0ZXIgPSBGYWJyaWNDbGllbnRBZGFwdGVyLFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgQT4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX292ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHN1cGVyW1wiX292ZXJyaWRlc1wiXSwge1xuICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgYWxsb3dSYXdTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzOiB0cnVlLFxuICAgIGZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzOiB0cnVlLFxuICAgIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiBmYWxzZSxcbiAgICByZWJ1aWxkV2l0aFRyYW5zaWVudDogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenosIGZvcmNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q29udGV4dE9mPEE+Pj4pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5vdmVycmlkZShPYmplY3QuYXNzaWduKHt9LCBmbGFncywgdGhpcy5fb3ZlcnJpZGVzKSlcbiAgICAgIC5mb3IoZmxhZ3MgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gc3VwZXIuT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmF0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIHBhZ2Ugc2l6ZSAke3JlZi5saW1pdH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2luYXRlQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgeyBsaW1pdDogcmVmLmxpbWl0LCBvZmZzZXQ6IHJlZi5vZmZzZXQsIGJvb2ttYXJrOiByZWYuYm9va21hcmsgfSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5saXN0QnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGxpc3RpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ30gJHtvcmRlcn1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgICAgdGhpcy5saXN0QnkubmFtZSxcbiAgICAgICAga2V5LFxuICAgICAgICBvcmRlcixcbiAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgKSkgYXMgYW55O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yKSB7XG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgIGBsaXN0QnkgcmVzdWx0IHNldCB0b28gbGFyZ2UgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBrZXk9JHtTdHJpbmcoa2V5KX0gb3JkZXI9JHtvcmRlcn0uIFJldHVybmluZyBlbXB0eSBsaXN0LiBVc2UgcGFnaW5hdGVCeSBmb3IgbGFyZ2UgZGF0YXNldHMuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW10gYXMgTVtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgYWxsICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZE9uZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIE9uZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZE9uZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZC5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2UpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnZS5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICByZWYsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGxvZy52ZXJib3NlKGBFeGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50ICR7bmFtZX1gKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmFkYXB0ZXIuZGVjb2RlKFxuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCxcbiAgICAgICAgICBbbmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FsbEFyZ3MpXSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFJlcG9zaXRvcnk8TSwgQT4sIGFueT4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGN0eCxcbiAgICAgICAgdmFsdWUgYXMgTSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IHRoaXMuYXBwbHlBZnRlclJlYWQoZW50cnksIGN0eCkpKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEZhYnJpY0NsaWVudFBhZ2luYXRvci5pc1NlcmlhbGl6ZWRQYWdlKHZhbHVlKSkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUFmdGVyUmVhZCh2YWx1ZS5kYXRhLCBjdHgpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY291bnRPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY291bnRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9JHtrZXkgPyBgIGJ5ICR7a2V5IGFzIHN0cmluZ31gIDogXCJcIn1gXG4gICAgKTtcbiAgICBjb25zdCBzdG10QXJncyA9IGtleSA/IFtrZXksIC4uLmN0eEFyZ3NdIDogY3R4QXJncztcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCAuLi5zdG10QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtYXhPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWF4T2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWF4IG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtaW5PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWluT2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWluIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBhdmdPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5hdmdPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgYXZnIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdW1PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdW1PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgc3VtIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkaXN0aW5jdE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZGlzdGluY3RPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBkaXN0aW5jdCB2YWx1ZXMgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZ3JvdXBPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTVtdPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5ncm91cE9mKTtcbiAgICBsb2cudmVyYm9zZShgZ3JvdXBpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ31gKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoY2hlY2soLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aGNoZWNrKHRoaXMuY2xhc3MsIC4uLmN0eEFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHByZXBhcmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWQsXG4gICAgICByZWNvcmQsXG4gICAgICB0cmFuc2llbnQsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZXN1bHQsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnQsIGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBjdHhBcmdzLCBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCBjdHgpO1xuICAgIGNvbnN0IHsgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgbGV0IHJlY29yZCA9IHByZXBhcmVkLnJlY29yZDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgdXBkYXRpbmcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIGlkICR7aWR9YFxuICAgICk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxbTVtdLCAuLi5hbnlbXSwgQ29udGV4dE9mPEE+XT4ge1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgaWdub3JlSGFuZGxlcnMgPSBjdHguZ2V0KFwiaWdub3JlSGFuZGxlcnNcIik7XG4gICAgY29uc3QgaWdub3JlVmFsaWRhdGUgPSBjdHguZ2V0KFwiaWdub3JlVmFsaWRhdGlvblwiKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhhbmRsZXJzKVxuICAgICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkUHJvcHMgPSBjdHguZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IHJlZHVjZUVycm9yc1RvUHJpbnQoZXJyb3JzKTtcblxuICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHBheWxvYWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgY29uc3QgdHJhbnNpZW50cyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC50cmFuc2llbnQpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcGF5bG9hZHMsXG4gICAgICB0cmFuc2llbnRzLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgY3JlYXRlZC5tYXAoYXN5bmMgKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHIsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnRzW2ldLCBjdHgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJlYWRpbmcgJHtrZXlzLmxlbmd0aH0gJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLmNsYXNzLCBrZXlzLCAuLi5jdHhBcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIGtleXNbaV0sIHt9LCBjdHgpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgJHttb2RlbHMubGVuZ3RofSBuZXcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCkpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgY3R4KSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZHMgYXMgUHJpbWFyeUtleVR5cGVbXSxcbiAgICAgIHByZXBhcmVkLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnRyYW5zaWVudCksXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB1cGRhdGVkLm1hcChhc3luYyAodSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICAgICAgdSxcbiAgICAgICAgICB0aGlzLmNsYXNzLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHByZXBhcmVkW2ldLnRyYW5zaWVudCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHg6IENvbnRleHRPZjxBPiwgbW9kZWw6IE0pOiB2b2lkIHtcbiAgICBpZiAoTW9kZWwubWlycm9yZWRBdChtb2RlbCkpIHtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHsgbGVnYWN5OiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHVuaXF1ZSBuYW1lXG4gICAqIEBzdW1tYXJ5IFNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBFUkMyMCB0b2tlbiBkZWZpbml0aW9uOyB0eXBpY2FsbHkgYSBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmluZyBpZGVudGl0eSBvZiB0aGUgdG9rZW5cbiAgICogQHN1bW1hcnkgWC41MDkgc3ViamVjdCBvciBNU1AgaWRlbnRpdHkgc3RyaW5nIHRoYXQgZGVub3RlcyB3aG8gb3ducy9jb250cm9scyB0aGUgdG9rZW4gZGVmaW5pdGlvblxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBTaG9ydCB0aWNrZXItbGlrZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIChlLmcuLCBNVEspXG4gICAqL1xuICBzeW1ib2whOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY2ltYWwgcHJlY2lzaW9uIGZvciB0b2tlbiBhbW91bnRzXG4gICAqIEBzdW1tYXJ5IE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRva2VuIGJhbGFuY2VzXG4gICAqL1xuICBkZWNpbWFscyE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgd2FsbGV0IG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgaG9sZGVyIGFjY291bnQgZm9yIGFuIEVSQzIwIHRva2VuIHdpdGhpbiB0aGUgRmFicmljIG5ldHdvcmssIHRyYWNraW5nIGJhbGFuY2UgYW5kIHRva2VuIGFzc29jaWF0aW9uLlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFdhbGxldD59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEVSQzIwV2FsbGV0XG4gKiBAZXhhbXBsZVxuICogY29uc3Qgd2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHsgaWQ6IFwiYWNjdDFcIiwgdG9rZW46IFwiTXlUb2tlblwiLCBiYWxhbmNlOiAxMDAwIH0pO1xuICogLy8gVXBkYXRlIGJhbGFuY2UgdmlhIHJlcG9zaXRvcnk6IGF3YWl0IHJlcG8udXBkYXRlKHdhbGxldCwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBBcHAtPj5SZXBvOiByZWFkKFwiYWNjdDFcIiwgY3R4KVxuICogICBSZXBvLS0+PkFwcDogRVJDMjBXYWxsZXRcbiAqL1xuQHRhYmxlKFwiZXJjMjBfd2FsbGV0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFdhbGxldCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdhbGxldCB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIHdhbGxldDsgY29tbW9ubHkgcmVmZXJlbmNlcyBhbiBhY2NvdW50IG9yIGlkZW50aXR5XG4gICAqL1xuICBpZCE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVkIHRva2VuIG5hbWVcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgRVJDMjBUb2tlbiB0aGlzIHdhbGxldCBob2xkczsgbWFpbnRhaW5lZCBhcyBhIHJlbGF0aW9uc2hpcCBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMvZGVsZXRlc1xuICAgKi9cbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gYmFsYW5jZSBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHN1bW1hcnkgQ3VycmVudCBhbW91bnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gaGVsZCBieSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSE6IG51bWJlcjtcblxuICBAY29sdW1uKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYXB0aXZlIGZsYWcgb3IgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBPcHRpb25hbCBmaWVsZCB1c2VkIGJ5IHNvbWUgZmxvd3MgdG8gbWFyayBub24tdHJhbnNmZXJhYmxlIGZ1bmRzIG9yIG1hbmFnZWQgY3VzdG9keVxuICAgKi9cbiAgY2FwdGl2ZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgYWxsb3dhbmNlIG1vZGVsXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBhbiBhcHByb3ZhbCByZWxhdGlvbnNoaXAgd2hlcmUgYW4gb3duZXIgYWxsb3dzIGEgc3BlbmRlciB0byB0cmFuc2ZlciB1cCB0byBhIGNlcnRhaW4gdmFsdWUgZnJvbSB0aGUgb3duZXIncyB3YWxsZXQuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEFsbG93YW5jZT59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEFsbG93YW5jZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbG93YW5jZSA9IG5ldyBBbGxvd2FuY2UoeyBvd25lcjogXCJhY2N0MVwiLCBzcGVuZGVyOiBcImFjY3QyXCIsIHZhbHVlOiA1MCB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIEFwcC0+PkFwcDogbmV3IEFsbG93YW5jZSh7IG93bmVyLCBzcGVuZGVyLCB2YWx1ZSB9KVxuICovXG5AdGFibGUoXCJlcmMyMF9hbGxvd2FuY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEFsbG93YW5jZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGllbnQtc2lkZSBKU09OIHNlcmlhbGl6ZXIgZm9yIERlY2FmIG1vZGVscyB0YXJnZXRpbmcgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIEpTT05TZXJpYWxpemVyIHRvIGVtYmVkIG1vZGVsIG1ldGFkYXRhIChhbmNob3IpIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IGluc3RhbmNlcyBvbiB0aGUgY2xpZW50LCBhbmQgdG8gc2FmZWx5IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBGYWJyaWMtYm91bmQgbW9kZWxzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBEZWNhZiBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyBzZXJpYWxpemVyXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50czsgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gY29tcGxldGVuZXNzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENsaWVudFNlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXI8VXNlcj4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHVzZXIgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VyaWFsaXplciBhcyBDbGllbnRTZXJpYWxpemVyXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0tPj5BcHA6IEpTT04gc3RyaW5nXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IGRlc2VyaWFsaXplKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5TZXJpYWxpemVyOiBKU09OLnBhcnNlKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5Nb2RlbDogTW9kZWwuYnVpbGQocGFyc2VkLCBhbmNob3IpXG4gKiAgIE1vZGVsLS0+PkFwcDogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudFNlcmlhbGl6ZXI8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYSBtb2RlbCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIGVtYmVkZGluZyBjbGFzcyBhbmNob3JcbiAgICogQHN1bW1hcnkgQ2xvbmVzIHRoZSBtb2RlbCBhbmQgaW5qZWN0cyB0aGUgY2xhc3MgbWV0YWRhdGEgYW5jaG9yIHNvIGl0IGNhbiBiZSByZWNvbnN0cnVjdGVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIEZhbGxzIGJhY2sgdG8gcHJvdmlkZWQgdGFibGUgbmFtZSBpZiBtZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byB1c2Ugd2hlbiBtZXRhZGF0YSBjYW5ub3QgYmUgZGVyaXZlZFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBIHBsYWluIG9iamVjdCByZWFkeSB0byBiZSBKU09OLnN0cmluZ2lmeSdkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICBpZiAoIW1ldGFkYXRhIHx8IG1ldGFkYXRhID09PSBcIk9iamVjdFwiKVxuICAgICAgaWYgKG1vZGVsTmFtZSkgbWV0YWRhdGEgPSBtb2RlbE5hbWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICApO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gaXRzIEpTT04gc2VyaWFsaXphdGlvblxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIEpTT04gc3RyaW5nLCByZXRyaWV2ZXMgdGhlIGVtYmVkZGVkIG1vZGVsIGFuY2hvciwgYW5kIHVzZXMgTW9kZWwuYnVpbGQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgSlNPTiBzdHJpbmcgcHJldmlvdXNseSBwcm9kdWNlZCBieSBzZXJpYWxpemVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZXMgYSBtb2RlbCB0byBhIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB2aWEgcHJlU2VyaWFsaXplLCBlbWJlZGRpbmcgbWV0YWRhdGEgbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlXSAtIE9wdGlvbmFsIHRhYmxlIG5hbWUgdG8gaW5jbHVkZSBhcyBhbmNob3Igd2hlbiBtZXRhZGF0YSBpcyB1bmF2YWlsYWJsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBtb2RlbCB3aXRoIGFuY2hvciBtZXRhZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgbW9kZWxOYW1lKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL2VyYzIwL21vZGVsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRPZixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIEV2ZW50SWRzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFNlcXVlbmNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuLyoqXG4gKiBSZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIEVSQzIwIGNvbnRyYWN0cyBvbiBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrLlxuICogRXh0ZW5kcyB0aGUgYmFzZSBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGNsYXNzIGFuZCB1dGlsaXplcyB0aGUgQ2xpZW50U2VyaWFsaXplciBmb3IgZGF0YSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5PFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PEVSQzIwV2FsbGV0LCBBPiB7XG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS5zZXJpYWxpemVyO1xuXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnM8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgKTtcblxuICAgIHRhYmxlID0gKFxuICAgICAgdHlwZW9mIHRhYmxlID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHRhYmxlKSA6IHRhYmxlXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBsZXQgcGFyc2VkSWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlZElkID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgIHBhcnNlZElkID0gaWQubWFwKFxuICAgICAgICAoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZShNb2RlbC5zZXF1ZW5jZUZvcih0YWJsZSkudHlwZSwgaSkgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRJZCA9IFNlcXVlbmNlLnBhcnNlVmFsdWUoXG4gICAgICAgIE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJzZWRJZCEsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgVWludDhBcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBUZXh0RGVjb2Rlci5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgVWludDhBcnJheSB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBFUkMyMFdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlRva2VuTmFtZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b2tlbk5hbWUoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b2tlbk5hbWVcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudG9rZW5OYW1lXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIlRva2VuTmFtZVwiKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlN5bWJvbFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHN5bWJvbCguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInN5bWJvbFwiLCB0cnVlKSkuZm9yKHRoaXMuc3ltYm9sKTtcbiAgICBjb25zdCBzeW1ib2wgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiU3ltYm9sXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShzeW1ib2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIkRlY2ltYWxzXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGRlY2ltYWxzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZGVjaW1hbHNcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZGVjaW1hbHNcbiAgICApO1xuICAgIGNvbnN0IGRlY2ltYWxzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkRlY2ltYWxzXCIpO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoZGVjaW1hbHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG90YWxTdXBwbHlcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b3RhbFN1cHBseShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b3RhbFN1cHBseVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b3RhbFN1cHBseVxuICAgICk7XG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG90YWxTdXBwbHlcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZSh0b3RhbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIGEgc3BlY2lmaWVkIG93bmVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBnaXZlbiBvd25lci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQmFsYW5jZU9mXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIG93bmVyJ3MgYWRkcmVzcyBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBFUkMyMCB0b2tlbiBvd25lci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBiYWxhbmNlT2YoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJiYWxhbmNlXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmJhbGFuY2VPZlxuICAgICk7XG4gICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJCYWxhbmNlT2ZcIiwgW1xuICAgICAgb3duZXIsXG4gICAgXSk7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShiYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYSByZWNpcGllbnQuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcmVjaXBpZW50J3MgYWRkcmVzcyBhbmQgdGhlIHRyYW5zZmVyIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyKFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwidHJhbnNmZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudHJhbnNmZXJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZmVycmVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJUcmFuc2ZlclwiLCBbXG4gICAgICB0byxcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHRyYW5zZmVycmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKiBGb3IgdGhpcyB0cmFuc2ZlciB0byB3b3JrIHRoZSBzcGVuZGVyICggYWNjb3VudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGlzIGZ1bmN0aW9uICkgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZSBhcHByb3ZlZCBhcyBhbiBhbGxvd2FuY2UgYnkgdGhlIHNlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJGcm9tXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlbmRlcidzIGFkZHJlc3MsIHJlY2lwaWVudCdzIGFkZHJlc3MsIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIHRyYW5zZmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckZyb20oXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwidHJhbnNmZXJGcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLnRyYW5zZmVyRnJvbSk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIlRyYW5zZmVyRnJvbVwiLFxuICAgICAgW2Zyb20sIHRvLCB2YWx1ZS50b1N0cmluZygpXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJlIHNwZW50IGJ5IGEgc3BlY2lmaWVkIHNwZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBhcHByb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQXBwcm92ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhbmQgdGhlIGFwcHJvdmFsIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYXBwcm92ZSBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgYXBwcm92YWwgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoc3BlbmRlcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFwcHJvdmVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYXBwcm92ZSk7XG4gICAgY29uc3QgYXBwcm92ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkFwcHJvdmVcIiwgW1xuICAgICAgc3BlbmRlcixcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGFwcHJvdmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgYWxsb3dhbmNlIG9mIEVSQzIwIHRva2VucyB0aGF0IHRoZSBzcGVjaWZpZWQgb3duZXIgaGFzIGFwcHJvdmVkIGZvciBhIHNwZW5kZXIuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkFsbG93YW5jZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBvd25lcidzIGFkZHJlc3MgYW5kIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYWxsb3dhbmNlKG93bmVyOiBzdHJpbmcsIHNwZW5kZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFsbG93YW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hbGxvd2FuY2UpO1xuICAgIGNvbnN0IGFsbG93YW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQWxsb3dhbmNlXCIsIFtcbiAgICAgIG93bmVyLFxuICAgICAgc3BlbmRlcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGFsbG93YW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBwcm92aWRlZCB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBpbml0aWFsaXplIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBnaXZlbiB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiSW5pdGlhbGl6ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzZXJpYWxpemVkIHRva2VuIGRhdGEgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgRVJDMjAgdG9rZW4gaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJhY3Qgd2l0aC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh0b2tlbjogRVJDMjBUb2tlbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJpbml0aWFsaXplXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGluaXRpbGlhemVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJJbml0aWFsaXplXCIsXG4gICAgICBbRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHRva2VuKV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGluaXRpbGlhemVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHZlcmlmeSBpZiB0aGUgRVJDMjAgY29udHJhY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNoZWNrSW5pdGlhbGl6ZWRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBjaGVjayBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBjaGVja0luaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJjaGVja0luaXRpYWxpemVkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJDaGVja0luaXRpYWxpemVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnRzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gbWludCBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJNaW50XCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG1pbnRpbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IHVwZGF0ZXMgdGhlIG1pbnRlcidzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBtaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWludGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIG1pbnQoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwibWludFwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5taW50KTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIk1pbnRcIiwgW2Ftb3VudC50b1N0cmluZygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQnVybnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIHRoZSBtaW50ZXIncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIGJ1cm5pbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJ1cm4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidXJuaW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYnVybihhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJidXJuXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm4pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVyblwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGJ1cm4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQnVybkZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYWNjb3VudCdzIGFkZHJlc3MgYW5kIHRoZSBidXJuaW5nIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgc3BlY2lmaWVkIGFjY291bnQncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdG8gYnVybiB0aGUgRVJDMjAgdG9rZW5zLlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuRnJvbShhY2NvdW50OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5Gcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkJ1cm5Gcm9tXCIsIFtcbiAgICAgIGFjY291bnQsXG4gICAgICBhbW91bnQudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRCYWxhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0LCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgY2xpZW50QWNjb3VudEJhbGFuY2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudEJhbGFuY2VcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudEJhbGFuY2UpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJDbGllbnRBY2NvdW50QmFsYW5jZVwiXG4gICAgKTtcblxuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoc2VyaWFsaXplZEFjY291bnRCYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjbGllbnQncyBhY2NvdW50IElEIGZyb20gdGhlIGJsb2NrY2hhaW4gbmV0d29yay5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBjbGllbnQncyBhY2NvdW50IElELlxuICAgKiBJdCBjYWxscyB0aGUgXCJDbGllbnRBY2NvdW50SURcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgcmV0dXJuZWQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50SUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudElkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNsaWVudEFjY291bnRJRCk7XG4gICAgY29uc3QgY2xpZW50QWNjb3VudElEID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRJRFwiXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZShjbGllbnRBY2NvdW50SUQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFByaW1hcnlLZXlUeXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBjb21wb3NlQXR0cmlidXRlVmFsdWUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZHM8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtb2RlbHM6IE0gfCBNW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICBpZHM6IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXVxuKSB7XG4gIGxldCBwazoga2V5b2YgTTtcbiAgbGV0IGNvbXBvc2VkOiBhbnk7XG4gIGxldCBwa1Byb3BzOiBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgZnVuY3Rpb24gZXh0cmFjdElkKG06IE0gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZHM6IFByaW1hcnlLZXlUeXBlKSB7XG4gICAgcGsgPSBwayB8fCBNb2RlbC5wayhjbGF6eik7XG4gICAgcGtQcm9wcyA9IHBrUHJvcHMgfHwgTW9kZWwuc2VxdWVuY2VGb3IoY2xhenopO1xuICAgIGNvbXBvc2VkID0gY29tcG9zZWQgfHwgTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcblxuICAgIGlmIChjb21wb3NlZCkge1xuICAgICAgcmV0dXJuIGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZShtIGFzIGFueSwgY29tcG9zZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gKG0gYXMgYW55KVtwa10gfHwgaWRzO1xuICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgY291bGQgbm90IHJlYnVpbGQgaWQgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSB8fCBpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMuIGJvdGggbXVzdCBiZSBhcnJheXMgb2YgZXF1YWwgbGVuZ3RoXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVscy5tYXAoKG0sIGkpID0+IGV4dHJhY3RJZChtLCBpZHNbaV0pKTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdElkKG1vZGVscywgaWRzIGFzIFByaW1hcnlLZXlUeXBlKTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCwgY29sdW1uLCBwayB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpdHkgY3JlZGVudGlhbCBtb2RlbCBzdG9yaW5nIGNyeXB0b2dyYXBoaWMgbWF0ZXJpYWxzXG4gKiBAc3VtbWFyeSBIb2xkcyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcHJpdmF0ZSBrZXkgaW5mb3JtYXRpb24gZm9yIGEgRmFicmljIGlkZW50aXR5LCBtYW5hZ2VkIGFzIGEgc2VwYXJhdGUgZW50aXR5IGxpbmtlZCBmcm9tIElkZW50aXR5XG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+fSBbYXJnXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIG1vZGVsIGZpZWxkc1xuICogQGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgY3JlZGVudGlhbHMgZW50cnlcbiAqIGNvbnN0IGNyZWRzID0gbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZDogXCJjcmVkczFcIiwgY2VydGlmaWNhdGU6IFwiLi4uXCIsIHJvb3RDZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcHJpdmF0ZUtleTogXCIuLi5cIiB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eUNyZWRlbnRpYWxzKHsgaWQsIGNlcnRpZmljYXRlLCByb290Q2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICogQHNlZSBtb2RlbFxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHMgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcbiAgICogQHN1bW1hcnkgUHJpbWFyeSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgY3JlZGVudGlhbHMgZW50cnlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcIilcbiAgQGNvbHVtbigpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBMZWFmIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWRlbnRpdHlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIGZvciB0aGUgaWRlbnRpdHlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIGNlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcm9vdCBvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUm9vdCBvZiB0cnVzdCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBsZWFmIGNlcnRpZmljYXRlXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgcm9vdENlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHByaXZhdGUga2V5XCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBwcml2YXRlS2V5ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG4gIENPTlRSQUNUID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY29udHJhY3RgLFxuICBDSEFJTkNPREUgPSBgJHtGYWJyaWNNb2RlbEtleXMuRkFCUklDfS5jaGFpbmNvZGVgLFxuICBDSEFOTkVMID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY2hhbm5lbGAsXG4gIE9WRVJSSURFUyA9IGBfX292ZXJyaWRlc2AsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgRmFicmljQ0FTZXJ2aWNlcyBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJZGVudGl0eVNlcnZpY2UsXG4gIElFbnJvbGxSZXNwb25zZSxcbiAgSVJlZ2lzdGVyUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL21vZGVsL0lkZW50aXR5XCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuLi9jcnlwdG9cIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlUmVzcG9uc2UsXG4gIEZhYnJpY0lkZW50aXR5LFxuICBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICBJZGVudGl0eVJlc3BvbnNlLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ZhYnJpYy10eXBlc1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSHlwZXJsZWRnZXIgRmFicmljIENBIGlkZW50aXR5IHR5cGVzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIGlkZW50aXR5IHR5cGVzIHJlY29nbml6ZWQgYnkgRmFicmljIENBIGZvciByZWdpc3RyYXRpb24gYW5kIGlkZW50aXR5IG1hbmFnZW1lbnQuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eVR5cGUge1xuICBQRUVSID0gXCJwZWVyXCIsXG4gIE9SREVSRVIgPSBcIm9yZGVyZXJcIixcbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbiAgVVNFUiA9IFwidXNlclwiLFxuICBBRE1JTiA9IFwiYWRtaW5cIixcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleS92YWx1ZSBhdHRyaWJ1dGUgdXNlZCBkdXJpbmcgQ0EgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgZW50cnkgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBGYWJyaWMgQ0EgaWRlbnRpdHkgZHVyaW5nIHJlZ2lzdHJhdGlvbiwgb3B0aW9uYWxseSBtYXJraW5nIGl0IGZvciBpbmNsdXNpb24gaW4gZWNlcnQuXG4gKiBAaW50ZXJmYWNlIElLZXlWYWx1ZUF0dHJpYnV0ZVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBBdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtlY2VydF0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBlbnJvbGxtZW50IGNlcnRpZmljYXRlIChFQ2VydCkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlY2VydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIEZhYnJpYyBDQSBpZGVudGl0eSBhdHRyaWJ1dGUga2V5cy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgd2VsbC1rbm93biBGYWJyaWMgQ0EgYXR0cmlidXRlIGtleXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyBmb3IgZGVsZWdhdGlvbnMgYW5kIHBlcm1pc3Npb25zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIHtcbiAgSEZSRUdJU1RSQVJST0xFUyA9IFwiaGYuUmVnaXN0cmFyLlJvbGVzXCIsXG4gIEhGUkVHSVNUUkFSREVMRUdBVEVST0xFUyA9IFwiaGYuUmVnaXN0cmFyLkRlbGVnYXRlUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJBVFRSSUJVVEVTID0gXCJoZi5SZWdpc3RyYXIuQXR0cmlidXRlc1wiLFxuICBIRklOVEVSTUVESUFURUNBID0gXCJoZi5JbnRlcm1lZGlhdGVDQVwiLFxuICBIRlJFVk9LRVIgPSBcImhmLlJldm9rZXJcIixcbiAgSEZBRkZJTElBVElPTk1HUiA9IFwiaGYuQWZmaWxpYXRpb25NZ3JcIixcbiAgSEZHRU5DUkwgPSBcImhmLkdlbkNSTFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIHdyYXBwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0EuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBoaWdoLWxldmVsIG9wZXJhdGlvbnMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYWdhaW5zdCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIGluY2x1ZGluZyByZWdpc3RyYXRpb24sIGVucm9sbG1lbnQsIHJldm9jYXRpb24sIGFuZCBhZG1pbmlzdHJhdGl2ZSBxdWVyaWVzLiBFbmNhcHN1bGF0ZXMgbG93ZXItbGV2ZWwgRmFicmljIENBIGNsaWVudCBjYWxscyB3aXRoIGNvbnNpc3RlbnQgbG9nZ2luZyBhbmQgZXJyb3IgbWFwcGluZy5cbiAqIEBwYXJhbSB7Q0FDb25maWd9IGNhQ29uZmlnIC0gQ29ubmVjdGlvbiBhbmQgVExTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YXJnZXQgQ0EuXG4gKiBAY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IHVzZXJcbiAqIGNvbnN0IHN2YyA9IG5ldyBGYWJyaWNFbnJvbGxtZW50U2VydmljZSh7XG4gKiAgIHVybDogJ2h0dHBzOi8vbG9jYWxob3N0OjcwNTQnLFxuICogICBjYU5hbWU6ICdPcmcxQ0EnLFxuICogICB0bHM6IHsgdHJ1c3RlZFJvb3RzOiBbJy9wYXRoL3RvL2NhLnBlbSddLCB2ZXJpZnk6IGZhbHNlIH0sXG4gKiAgIGNhQ2VydDogJy9wYXRoL3RvL2FkbWluL2NlcnREaXInLFxuICogICBjYUtleTogJy9wYXRoL3RvL2FkbWluL2tleURpcidcbiAqIH0pO1xuICogYXdhaXQgc3ZjLnJlZ2lzdGVyKHsgdXNlck5hbWU6ICdhbGljZScsIHBhc3N3b3JkOiAnczNjcjN0JyB9LCBmYWxzZSwgJ29yZzEuZGVwYXJ0bWVudDEnLCBDQV9ST0xFLlVTRVIpO1xuICogY29uc3QgaWQgPSBhd2FpdCBzdmMuZW5yb2xsKCdhbGljZScsICdzM2NyM3QnKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgYXV0b251bWJlclxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU3ZjIGFzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXG4gKiAgIHBhcnRpY2lwYW50IENBIGFzIEZhYnJpYyBDQVxuICogICBBcHAtPj5TdmM6IHJlZ2lzdGVyKGNyZWRlbnRpYWxzLCAuLi4pXG4gKiAgIFN2Yy0+PkNBOiByZWdpc3RlcihyZXF1ZXN0LCBhZG1pblVzZXIpXG4gKiAgIENBLS0+PlN2YzogZW5yb2xsbWVudFNlY3JldFxuICogICBTdmMtLT4+QXBwOiBzZWNyZXRcbiAqICAgQXBwLT4+U3ZjOiBlbnJvbGwoZW5yb2xsbWVudElkLCBzZWNyZXQpXG4gKiAgIFN2Yy0+PkNBOiBlbnJvbGwoe2Vucm9sbG1lbnRJRCwgc2VjcmV0fSlcbiAqICAgQ0EtLT4+U3ZjOiBjZXJ0aWZpY2F0ZXNcbiAqICAgU3ZjLS0+PkFwcDogSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIGNhPzogRmFicmljQ0FTZXJ2aWNlcztcblxuICBwcml2YXRlIGNlcnRpZmljYXRlU2VydmljZT86IGFueTtcblxuICBwcml2YXRlIGFmZmlsaWF0aW9uU2VydmljZT86IEFmZmlsaWF0aW9uU2VydmljZTtcblxuICBwcml2YXRlIGlkZW50aXR5U2VydmljZT86IElkZW50aXR5U2VydmljZTtcblxuICBwcml2YXRlIGNsaWVudD86IGFueTtcblxuICBwcml2YXRlIHVzZXI/OiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FDb25maWc6IENBQ29uZmlnKSB7XG4gICAgQ29yZVV0aWxzLmdldENyeXB0b1N1aXRlKFxuICAgICAgY2FDb25maWcuaHNtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc29mdHdhcmU6IGZhbHNlLFxuICAgICAgICAgICAgbGliOiBjYUNvbmZpZy5oc20ubGlicmFyeSxcbiAgICAgICAgICAgIHNsb3Q6IGNhQ29uZmlnLmhzbS5zbG90LFxuICAgICAgICAgICAgbGFiZWw6IGNhQ29uZmlnLmhzbS50b2tlbkxhYmVsLFxuICAgICAgICAgICAgcGluOiBTdHJpbmcoY2FDb25maWcuaHNtLnBpbiksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBVc2VyKCk6IFByb21pc2U8VXNlcj4ge1xuICAgIGlmICh0aGlzLnVzZXIpIHJldHVybiB0aGlzLnVzZXI7XG4gICAgY29uc3QgeyBjYU5hbWUsIGNhQ2VydCwgY2FLZXksIHVybCwgaHNtIH0gPSB0aGlzLmNhQ29uZmlnO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLlVzZXIpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQ0EgdXNlciBmb3IgJHtjYU5hbWV9IGF0ICR7dXJsfWApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy51c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcihcImFkbWluXCIsIGtleSwgY2VydGlmaWNhdGUsIGNhTmFtZSwge1xuICAgICAgaHNtLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnVzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ0EoKTogUHJvbWlzZTxGYWJyaWNDQVNlcnZpY2VzPiB7XG4gICAgaWYgKHRoaXMuY2EpIHJldHVybiB0aGlzLmNhO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLkNBKTtcbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IHRoaXMuY2FDb25maWc7XG5cbiAgICAvLyBGT1IgU29tZSBSZWFzb24gdGhlIHZlcmlmaWNhdGlvbiBmYWlscyBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgd29ya3MgZm9yIG5vd1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSBDbGllbnQgZm9yIENBICR7Y2FOYW1lfSB1bmRlciAke3VybH1gKTtcbiAgICB0aGlzLmNhID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmNhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENsaWVudCgpOiBQcm9taXNlPHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfT4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuIHRoaXMuY2xpZW50O1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIHRoaXMuY2xpZW50ID0gKGNhIGFzIGFueSlbXCJfRmFicmljQ0FTZXJ2aWNlc1wiXTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2VydGlmaWNhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNlcnRpZmljYXRlU2VydmljZSlcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ2xpZW50KCkpLm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmNlcnRpZmljYXRlU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBBZmZpbGlhdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLmFmZmlsaWF0aW9uU2VydmljZSlcbiAgICAgIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIElkZW50aXRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmlkZW50aXR5U2VydmljZSlcbiAgICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSBDQSBjZXJ0aWZpY2F0ZSBzZXJ2aWNlIHRvIGxpc3QgY2VydGlmaWNhdGVzLCBvcHRpb25hbGx5IG1hcHBpbmcgdG8gUEVNIHN0cmluZ3Mgb25seS5cbiAgICogQHBhcmFtIHtHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0fSBbcmVxdWVzdF0gLSBPcHRpb25hbCBmaWx0ZXIgcmVxdWVzdCBmb3IgY2VydGlmaWNhdGUgbG9va3VwLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkb01hcD10cnVlXSAtIFdoZW4gdHJ1ZSwgcmV0dXJucyBhcnJheSBvZiBQRU0gc3RyaW5nczsgb3RoZXJ3aXNlIHJldHVybnMgZnVsbCByZXNwb25zZSBvYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPn0gQXJyYXkgb2YgUEVNIHN0cmluZ3Mgb3IgdGhlIGZ1bGwgY2VydGlmaWNhdGUgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgZG9NYXAgPSB0cnVlXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGVTZXJ2aWNlID0gYXdhaXQgdGhpcy5DZXJ0aWZpY2F0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDZXJ0aWZpY2F0ZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IENlcnRpZmljYXRlUmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBjZXJ0aWZpY2F0ZVNlcnZpY2UuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3QgaWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgaWRlbnRpdHkgc2VydmljZSB0byBmZXRjaCBhbGwgaWRlbnRpdGllcyBhbmQgcmV0dXJucyB0aGUgbGlzdCBhcyBGYWJyaWNJZGVudGl0eSBvYmplY3RzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+fSBUaGUgbGlzdCBvZiBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcygpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBpZGVudGl0aWVzU2VydmljZSA9IGF3YWl0IHRoaXMuSWRlbnRpdGllcygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBJZGVudGl0aWVzIHVuZGVyIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBpZGVudGl0aWVzU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuaWRlbnRpdGllcy5sZW5ndGh9IElkZW50aXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoKSB7XG4gICAgY29uc3QgYWZmaWxpYXRpb25TZXJ2aWNlID0gYXdhaXQgdGhpcy5BZmZpbGlhdGlvbnMoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBhZmZpbGlhdGlvblNlcnZpY2UuZ2V0QWxsKGF3YWl0IHRoaXMuVXNlcigpKSlcbiAgICAgIC5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuYS5sZW5ndGh9IEFmZmlsaWF0aW9uczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYS5uZXdJZGVudGl0eVNlcnZpY2UoKS5nZXRPbmUoZW5yb2xsbWVudElkLCB1c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVnaXN0ZXIpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IGNhLnJlZ2lzdGVyKHByb3BzLCB1c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmdcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLCB7fSkuZm9yKFxuICAgICAgdGhpcy5pZGVudGl0eUZyb21FbnJvbGxtZW50XG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHkoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGtleS50b0J5dGVzKCksXG4gICAgICAgIHJvb3RDZXJ0aWZpY2F0ZTogcm9vdENlcnRpZmljYXRlLFxuICAgICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgICAgdXBkYXRlZE9uOiBub3csXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgY3JlYXRlZE9uOiBub3csXG4gICAgICB1cGRhdGVkT246IG5vdyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5yb2xsIGFuIGlkZW50aXR5IHdpdGggdGhlIENBIHVzaW5nIGEgcmVnaXN0cmF0aW9uIHNlY3JldC5cbiAgICogQHN1bW1hcnkgRXhjaGFuZ2VzIHRoZSBlbnJvbGxtZW50IElEIGFuZCBzZWNyZXQgZm9yIGNlcnRpZmljYXRlcywgcmV0dXJuaW5nIGEgY29uc3RydWN0ZWQgSWRlbnRpdHkgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGVucm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbiAtIEVucm9sbG1lbnQgc2VjcmV0IHJldHVybmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5IG9iamVjdCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgZW5yb2xsKGVucm9sbG1lbnRJZDogc3RyaW5nLCByZWdpc3RyYXRpb246IHN0cmluZykge1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZW5yb2xsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgICBsb2cuZGVidWcoYEVucm9sbGluZyAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSA9IGF3YWl0IGNhLmVucm9sbCh7XG4gICAgICAgIGVucm9sbG1lbnRJRDogZW5yb2xsbWVudElkLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlkZW50aXR5ID0gRmFicmljRW5yb2xsbWVudFNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jYUNvbmZpZy5jYU5hbWVcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHNcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlcyB0aGUgZW5yb2xsbWVudCBvZiBhbiBpZGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5yb2xsbWVudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCAtIFRoZSBlbnJvbGxtZW50IElEIG9mIHRoZSBpZGVudGl0eSB0byBiZSByZXZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSByZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gSWYgdGhlIGVucm9sbG1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldm9jYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGFzeW5jIHJldm9rZShlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLnJldm9rZShcbiAgICAgICAgeyBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLCByZWFzb246IFwiVXNlciBEZWxldGF0aW9uXCIgfSxcbiAgICAgICAgdXNlclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUmVnaXN0ZXJSZXF1ZXN0LCBJS2V5VmFsdWVBdHRyaWJ1dGUgfSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgbWluLFxuICBtaW5sZW5ndGgsXG4gIE1vZGVsLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciBleHRlbmRzIE1vZGVsIHtcbiAgQHJlcXVpcmVkKClcbiAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCI7XG4gIEBtaW5sZW5ndGgoMSlcbiAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXTtcbiAgQHJlcXVpcmVkKClcbiAgZW5yb2xsbWVudElEITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50U2VjcmV0ITogc3RyaW5nO1xuICBAbWluKDApXG4gIG1heEVucm9sbG1lbnRzPzogbnVtYmVyO1xuICBAcmVxdWlyZWQoKVxuICByb2xlITogc3RyaW5nO1xuXG4gIGJ1aWxkKCk6IElSZWdpc3RlclJlcXVlc3Qge1xuICAgIGNvbnN0IGVycnMgPSB0aGlzLmhhc0Vycm9ycygpO1xuICAgIGlmIChlcnJzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycnMudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElSZWdpc3RlclJlcXVlc3QgPSB7XG4gICAgICBlbnJvbGxtZW50SUQ6IHRoaXMuZW5yb2xsbWVudElELFxuICAgICAgZW5yb2xsbWVudFNlY3JldDogdGhpcy5lbnJvbGxtZW50U2VjcmV0LFxuICAgICAgcm9sZTogdGhpcy5yb2xlLFxuICAgICAgYWZmaWxpYXRpb246IHRoaXMuYWZmaWxpYXRpb24sXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHRoaXMubWF4RW5yb2xsbWVudHMgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXNwb25zZS5tYXhFbnJvbGxtZW50cyA9IHRoaXMubWF4RW5yb2xsbWVudHM7XG4gICAgaWYgKHRoaXMuYXR0cnMpIHJlc3BvbnNlLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBzZXRBZmZpbGlhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hZmZpbGlhdGlvbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQXR0cihhdHRyOiBJS2V5VmFsdWVBdHRyaWJ1dGUpIHtcbiAgICB0aGlzLmF0dHJzID0gdGhpcy5hdHRycyB8fCBbXTtcbiAgICB0aGlzLmF0dHJzLnB1c2goYXR0cik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdHRycyh2YWx1ZTogSUtleVZhbHVlQXR0cmlidXRlW10pIHtcbiAgICB0aGlzLmF0dHJzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50SUQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudElEID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50U2VjcmV0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVucm9sbG1lbnRTZWNyZXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1heEVucm9sbG1lbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm1heEVucm9sbG1lbnRzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSb2xlKHZhbHVlOiBDQV9ST0xFIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5yb2xlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlTWV0YWRhdGEsXG4gIENvbGxlY3Rpb25SZXNvbHZlcixcbiAgTWlycm9yTWV0YWRhdGEsXG59IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBDb250ZXh0dWFsQXJncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNTaGFyZWQgPSBmdW5jdGlvbiBpc1NoYXJlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzU2hhcmVkKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uIGlzUHJpdmF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzUHJpdmF0ZSh0aGlzLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5zZWdyZWdhdGUgPSBmdW5jdGlvbiBzZWdyZWdhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgcmV0dXJuIE1vZGVsLnNlZ3JlZ2F0ZSh0aGlzKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgaWYgKCFNb2RlbC5pc1RyYW5zaWVudChtb2RlbCkpIHJldHVybiB7IG1vZGVsOiBtb2RlbCB9O1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzID1cbiAgICBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgfHwgW107XG5cbiAgY29uc3QgdHJhbnNpZW50UHJvcHMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIERCS2V5cy5UUkFOU0lFTlRcbiAgKTtcbiAgY29uc3QgcHJpdmF0ZVByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG4gIGNvbnN0IHNoYXJlZFByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcblxuICBjb25zdCByZXN1bHQ6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiA9IHtcbiAgICBtb2RlbDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHVibGljOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICB0cmFuc2llbnQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHByaXZhdGVzOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBzaGFyZWQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICB9O1xuXG4gIGNvbnN0IHRyYW5zaWVudEtleXMgPSBPYmplY3Qua2V5cyh0cmFuc2llbnRQcm9wcyB8fCB7fSk7XG4gIGNvbnN0IHByaXZhdGVLZXlzID0gT2JqZWN0LmtleXMocHJpdmF0ZVByb3BlcnRpZXMgfHwge30pO1xuICBjb25zdCBzaGFyZWRLZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkUHJvcGVydGllcyB8fCB7fSk7XG5cbiAgLy8gY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXkgYXMga2V5b2YgTV07XG4gICAgY29uc3QgaXNUcmFuc2llbnQgPSB0cmFuc2llbnRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgY29uc3QgaXNQdWJsaWMgPSAhaXNUcmFuc2llbnQ7XG4gICAgY29uc3QgaXNQcml2YXRlID0gcHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1NoYXJlZCA9IHNoYXJlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICAvLyBjb25zdCBpc1ByaW1hcnlLZXkgPSBrZXkgPT09IHBrS2V5O1xuXG4gICAgaWYgKGlzVHJhbnNpZW50IHx8IGlzUHJpdmF0ZSB8fCBpc1NoYXJlZCkge1xuICAgICAgcmVzdWx0LnRyYW5zaWVudCA9IHJlc3VsdC50cmFuc2llbnQgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnRyYW5zaWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgcmVzdWx0LnByaXZhdGVzID0gcmVzdWx0LnByaXZhdGVzIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5wcml2YXRlcyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQuc2hhcmVkID0gcmVzdWx0LnNoYXJlZCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQuc2hhcmVkIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIHJlc3VsdC5wdWJsaWMgPSAocmVzdWx0LnB1YmxpYyB8fCB7fSkgYXMgYW55O1xuICAgICAgKHJlc3VsdC5wdWJsaWMgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0Lm1vZGVsID0gTW9kZWwuYnVpbGQocmVzdWx0LnB1YmxpYywgbW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gIHJldHVybiByZXN1bHQgYXMgU2VncmVnYXRlZE1vZGVsPE0+O1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm1pcnJvcmVkID0gZnVuY3Rpb24gbWlycm9yZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkub3duZXJPZiA9IGZ1bmN0aW9uIG93bmVyT2Y8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1vZGVsW21ldGEgYXMga2V5b2YgTV0gYXMgc3RyaW5nO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWRBdCA9IGZ1bmN0aW9uIG1pcnJvcmVkQXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogTWlycm9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICBtb2RlbCA9IHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbDtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jb2xsZWN0aW9uc0ZvciA9IGZ1bmN0aW9uIGNvbGxlY3Rpb25zRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHtcbiAgcHJpdmF0ZUNvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG4gIHNoYXJlZENvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG59IHtcbiAgY29uc3QgcHJpdmF0ZUtleXM6IHN0cmluZ1tdID0gW0ZhYnJpY01vZGVsS2V5cy5QUklWQVRFXSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hhcmVkS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlNIQVJFRF0gYXMgc3RyaW5nW107XG5cbiAgY29uc3QgcHJpdmF0ZUtleSA9IE1ldGFkYXRhLmtleSguLi5wcml2YXRlS2V5cyk7XG4gIGNvbnN0IHNoYXJlZEtleSA9IE1ldGFkYXRhLmtleSguLi5zaGFyZWRLZXlzKTtcblxuICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG5cbiAgY29uc3QgcHJpdmF0ZU1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBwcml2YXRlS2V5XG4gICk7XG4gIGNvbnN0IHNoYXJlZE1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBzaGFyZWRLZXlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVDb2xzOiBwcml2YXRlTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gICAgc2hhcmVkQ29sczogc2hhcmVkTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gIH07XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jaGFpbmNvZGVPZiA9IGZ1bmN0aW9uIGNoYWluY29kZU9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREVcbiAgKTtcbiAgaWYgKCFtIHx8ICFtLnJlc29sdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG0ucmVzb2x2ZXIgPT09IFwic3RyaW5nXCIpIHJldHVybiBtLnJlc29sdmVyO1xuICBjb25zdCBjdHggPSBhcmdzLnBvcCgpO1xuICBpZiAoIWN0eCB8fCAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBjb250ZXh0IHByb3ZpZGVkIGZvciBjaGFpbmNvZGUgcmVzb2x1dGlvbmApO1xuICByZXR1cm4gbS5yZXNvbHZlcihtb2RlbCwgLi4uYXJncywgY3R4KTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbnRyYWN0T2YgPSBmdW5jdGlvbiBjb250cmFjdE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVFxuICApO1xuICBpZiAoIW0gfHwgIW0ucmVzb2x2ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbS5yZXNvbHZlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG0ucmVzb2x2ZXI7XG4gIGNvbnN0IGN0eCA9IGFyZ3MucG9wKCk7XG4gIGlmICghY3R4IHx8ICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGNvbnRleHQgcHJvdmlkZWQgZm9yIGNoYWluY29kZSByZXNvbHV0aW9uYCk7XG4gIHJldHVybiBtLnJlc29sdmVyKG1vZGVsLCAuLi5hcmdzLCBjdHgpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuY2hhbm5lbE9mID0gZnVuY3Rpb24gY2hhbm5lbE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFOTkVMXG4gICk7XG4gIGlmICghbSB8fCAhbS5yZXNvbHZlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtLnJlc29sdmVyID09PSBcInN0cmluZ1wiKSByZXR1cm4gbS5yZXNvbHZlcjtcbiAgY29uc3QgY3R4ID0gYXJncy5wb3AoKTtcbiAgaWYgKCFjdHggfHwgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gY29udGV4dCBwcm92aWRlZCBmb3IgY2hhaW5jb2RlIHJlc29sdXRpb25gKTtcbiAgcmV0dXJuIG0ucmVzb2x2ZXIobW9kZWwsIC4uLmFyZ3MsIGN0eCk7XG59LmJpbmQoTW9kZWwpO1xuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgQ29udGV4dE9mLFxuICBDb250ZXh0dWFsQXJncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVyRnVuY3Rpb248VD4gPSAoXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiBQcm9taXNlPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250cmFjdFJlc29sdmVyID0gKFxuICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiB7XG4gIHJldHVybiBtb2RlbC5uYW1lICsgXCJDb250cmFjdFwiO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhaW5jb2RlTWV0YWRhdGEgPSB7XG4gIHJlc29sdmVyOiBzdHJpbmcgfCBSZXNvbHZlckZ1bmN0aW9uPHN0cmluZz47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29udHJhY3QocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVCwgbWV0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbmNvZGUocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREUsIG1ldGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbChyZXNvbHZlcjogYW55KSB7XG4gIGNvbnN0IG1ldGE6IENoYWluY29kZU1ldGFkYXRhID0geyByZXNvbHZlciB9O1xuICByZXR1cm4gbWV0YWRhdGEoRmFicmljTW9kZWxLZXlzLkNIQU5ORUwsIG1ldGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyB0aGUgTVNQIElEIGZyb20gZWl0aGVyIGEgc3RyaW5nIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIGlkZW50aXR5IC0gVGhlIGlkZW50aXR5IHZhbHVlIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBNU1AgSUQgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgTVNQIElEIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1zcElkKFxuICBpZGVudGl0eTogc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaWRlbnRpdHkgPT09IFwic3RyaW5nXCIpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIGlkZW50aXR5LmdldE1TUElEKCk7XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBtYXJraW5nIG1ldGhvZHMgdGhhdCByZXF1aXJlIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICogQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgdG9rZW4gYmVmb3JlIGFsbG93aW5nIHRoZSBtZXRob2QgdG8gYmUgZXhlY3V0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7XG4gKiAgIEBPd25lcigpXG4gKiAgIGFzeW5jIE1pbnQoY3R4OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcikge1xuICogICAgIC8vIE1pbnQgdG9rZW4gbG9naWNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgY2hlY2tzIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT3duZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEZhYnJpY0VSQzIwQ29udHJhY3QsXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgY29uc3QgY3R4OiBITENvbnRleHQgPSBhcmdzWzBdO1xuICAgICAgY29uc3QgYWNvdW50SWQgPSBjdHguY2xpZW50SWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gYXdhaXQgKHRoaXMgYXMgRmFicmljRVJDMjBDb250cmFjdClbXG4gICAgICAgIFwidG9rZW5SZXBvc2l0b3J5XCJcbiAgICAgIF0uc2VsZWN0KCk7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCk7XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXCJObyB0b2tlbnMgYXZhaWFsYmxlXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRvIG1hbnkgdG9rZW4gYXZhaWxhYmxlIDogJHt0b2tlbnMubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zWzBdLm93bmVyICE9IGFjb3VudElkKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVzZXIgbm90IGF1dGhvcml6ZWQgdG8gcnVuICR7cHJvcGVydHlLZXl9IG9uIHRoZSB0b2tlbmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG93bmVkQnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG5cbiAgY29uc3QgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGxldCBvd25lciA9IGNyZWF0b3IubXNwaWQ7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEV4cGVjdGVkIG1zcGlkIHRvIGJlICR7bW9kZWxba2V5XX0gfCAke293bmVyfS4gXFxuIFVzaW5nIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiAke2FsbG93R2VuZXJhdGlvbk92ZXJyaWRlfWBcbiAgKTtcblxuICBpZiAoYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUpIG93bmVyID0gbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBvd25lcjtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG0gPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZVxuICAgICAgPyBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3duZXJPdmVycmlkZVwiKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbXNwID1cbiAgICBtIHx8IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcblxuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBTdHJpbmcoaWRWYWx1ZSksIFN0cmluZyhrKSk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHwgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHxcbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIGFsbG93Q29udGV4dFRyYW5zaWVudE1hcDogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGNyZWF0ZVByaXZhdGVLZXkgfSBmcm9tIFwiY3J5cHRvXCI7XG5cbmNvbnN0IGxvZyA9IG5ldyBNaW5pTG9nZ2VyKFwiZmFicmljLWZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMb2FkcyBjb250ZW50IGZyb20gYSBmaWxlIG9yIHJldHVybnMgdGhlIGNvbnRlbnQgaWYgYWxyZWFkeSBsb2FkZWRcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgdGhlIGlucHV0IGlzIGFscmVhZHkgY29udGVudCBvciBhIHBhdGggdG8gYSBmaWxlLCBhbmQgbG9hZHMgdGhlIGZpbGUgaWYgbmVlZGVkXG4gKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnRPclBhdGggLSBUaGUgY29udGVudCBvciBwYXRoIHRvIGxvYWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbGVSZWFkZXIgLSBGdW5jdGlvbiB0byByZWFkIHRoZSBmaWxlIGlmIGNvbnRlbnRPclBhdGggaXMgYSBwYXRoXG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+fSBUaGUgY29udGVudFxuICogQGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250ZW50T2ZMb2FkRmlsZShcbiAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgZmlsZVJlYWRlcjogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBVaW50OEFycmF5IHwgQnVmZmVyPlxuKSB7XG4gIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gIGlmIChcbiAgICBjb250ZW50T3JQYXRoLm1hdGNoKFxuICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICApXG4gIClcbiAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbVxuICogQHN1bW1hcnkgTG9hZHMgYSBmaWxlIHVzaW5nIHRoZSBOb2RlLmpzIGZpbGUgc3lzdGVtIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IGNvbnRlbnRPclBhdGggLSBUaGUgY29udGVudCBvciBwYXRoIHRvIGxvYWRcbiAqIEByZXR1cm4ge1Byb21pc2U8QnVmZmVyPn0gVGhlIGZpbGUgY29udGVudCBhcyBhIEJ1ZmZlclxuICogQGZ1bmN0aW9uIHJlYWRGaWxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZShjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICBjb25zdCBmaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICB9O1xuXG4gIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHVzZXJcbiAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgdXNlciB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEZhYnJpYyBDQVxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lIC0gVGhlIHVzZXIgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHByaXZhdGVLZXkgLSBUaGUgcHJpdmF0ZSBrZXkgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0aWZpY2F0ZSAtIFRoZSBjZXJ0aWZpY2F0ZSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gVGhlIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBJRFxuICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgdXNlclxuICogQGZ1bmN0aW9uIGdldENBVXNlclxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q0FVc2VyKFxuICB1c2VyTmFtZTogc3RyaW5nLFxuICBwcml2YXRlS2V5OiBzdHJpbmcsXG4gIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gIG1zcElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlcj4ge1xuICBsb2cuZGVidWcoXG4gICAgYENyZWF0aW5nIGEgQ0EgJHttc3BJZH0gdXNlciAke3VzZXJOYW1lfSB3aXRoIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9YFxuICApO1xuICBjb25zdCB1c2VyID0gbmV3IFVzZXIodXNlck5hbWUpO1xuICBjb25zdCBjcnlwdG9TdWl0ZSA9IFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgdXNlci5zZXRDcnlwdG9TdWl0ZShjcnlwdG9TdWl0ZSk7XG4gIGNvbnN0IGltcG9ydGVkS2V5ID0gY3J5cHRvU3VpdGUuY3JlYXRlS2V5RnJvbVJhdyhwcml2YXRlS2V5KTtcbiAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGltcG9ydGVkS2V5LCBjZXJ0aWZpY2F0ZSwgbXNwSWQpO1xuICByZXR1cm4gdXNlcjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyBhbiBpZGVudGl0eSBmcm9tIGEgY2VydGlmaWNhdGUgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIGNlcnRpZmljYXRlIGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYW4gSWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcGFyYW0ge3N0cmluZ30gY2VydERpcmVjdG9yeVBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGVcbiAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgaWRlbnRpdHlcbiAqIEBmdW5jdGlvbiBnZXRJZGVudGl0eVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SWRlbnRpdHkoXG4gIG1zcElkOiBzdHJpbmcsXG4gIGNlcnREaXJlY3RvcnlQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3QgY2VydFBhdGggPSBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoY2VydFBhdGgpO1xuICAgIHJldHVybiBjcmVkZW50aWFscztcbiAgfTtcblxuICBjb25zdCBjcmVkZW50aWFsczogVWludDhBcnJheSA9IChhd2FpdCBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICBpZGVudGl0eUZpbGVSZWFkZXJcbiAgKSkgYXMgVWludDhBcnJheTtcblxuICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlIGluIGEgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBSZWFkcyBhIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgcGF0aCB0byB0aGUgZmlyc3QgZmlsZSBmb3VuZFxuICogQHBhcmFtIHtzdHJpbmd9IGRpclBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlyc3QgZmlsZVxuICogQGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWUoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlIGluIGEgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBSZWFkcyBhIGRpcmVjdG9yeSwgZmluZHMgdGhlIGZpcnN0IGZpbGUsIGFuZCByZXR1cm5zIGl0cyBjb250ZW50IGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgZmlsZVxuICogQGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChcbiAgZGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pKSkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyBhIHNpZ25lciBmcm9tIGEga2V5IGRpcmVjdG9yeVxuICogQHN1bW1hcnkgTG9hZHMgYSBwcml2YXRlIGtleSBmcm9tIGEgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGEgU2lnbmVyIGZvciBGYWJyaWMgdHJhbnNhY3Rpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxTaWduZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgc2lnbmVyXG4gKiBAZnVuY3Rpb24gZ2V0U2lnbmVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgY29uc3Qgc2lnbmVyRmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShrZXlQYXRoKTtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlS2V5UGVtID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgc2lnbmVyRmlsZVJlYWRlclxuICApKSBhcyBCdWZmZXI7XG5cbiAgbGV0IGs7XG4gIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgIC8vIHdlYiBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCBleHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgICBrID0gKHByaXZhdGVLZXkgYXMgYW55KVtrZXlzWzBdXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBOb2RlIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gICAgayA9IGNyZWF0ZVByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gIH1cblxuICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgYSBwcml2YXRlIGtleSBmcm9tIGEgUEVNIGJ1ZmZlclxuICogQHN1bW1hcnkgQ29udmVydHMgYSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleSB0byBhIENyeXB0b0tleSBvYmplY3RcbiAqIEBwYXJhbSB7QnVmZmVyfSBwZW0gLSBUaGUgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAqIEByZXR1cm4ge1Byb21pc2U8Q3J5cHRvS2V5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENyeXB0b0tleVxuICogQGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBFeHRyYWN0UHJpdmF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBTdWJ0bGVDcnlwdG9cbiAqXG4gKiAgIENhbGxlci0+PkV4dHJhY3RQcml2YXRlS2V5OiBleHRyYWN0UHJpdmF0ZUtleShwZW0pXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IEdldCBTdWJ0bGVDcnlwdG8gaW1wbGVtZW50YXRpb25cbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogUGFyc2UgUEVNIGZvcm1hdFxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDb252ZXJ0IHRvIGJpbmFyeSBERVJcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5TdWJ0bGVDcnlwdG86IGltcG9ydEtleShwa2NzOCwgYmluYXJ5RGVyLCBvcHRpb25zKVxuICogICBTdWJ0bGVDcnlwdG8tLT4+RXh0cmFjdFByaXZhdGVLZXk6IENyeXB0b0tleVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0tPj5DYWxsZXI6IENyeXB0b0tleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIpIHtcbiAgLy8gY29uc3QgbGliTmFtZSA9IFwibm9kZTpjcnlwdG9cIjtcbiAgbGV0IHN1YnRsZTtcbiAgLy8gaWYgKGlzQnJvd3NlcigpKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgc3VidGxlID0gKGdsb2JhbFRoaXMgYXMgYW55KS5jcnlwdG8uc3VidGxlO1xuICAvLyB9IGVsc2Uge1xuICAvLyAgIGNvbnN0IGxpYiA9IChhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KGxpYk5hbWUpKSkgYXMgYW55O1xuICAvLyAgIHN1YnRsZSA9IGxpYi5zdWJ0bGUgfHwgbGliLndlYmNyeXB0by5zdWJ0bGU7XG4gIC8vIH1cblxuICBpZiAoIXN1YnRsZSkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgU3VidGxlQ3J5cHRvIG1vZHVsZVwiKTtcblxuICBmdW5jdGlvbiBzdHIyYWIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgY29uc3Qgc3RyID0gcGVtXG4gICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAucmVwbGFjZShcIi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIik7XG4gIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICBjb25zdCBiaW5hcnlEZXIgPSBzdHIyYWIoZGVjb2RlZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBDTElFTlRfT1ZFUlJJREVfS0VZUzogKGtleW9mIEZhYnJpY0NsaWVudEZsYWdzKVtdID0gW1xuICBcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIsXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGYWJyaWMgY2xpZW50IGNvbnRleHQgd2l0aCBhIGNvbnN0cmFpbmVkIG92ZXJyaWRlIHN1cmZhY2VcbiAqIEBzdW1tYXJ5IFJlc3RyaWN0cyB3aGljaCBjYWNoZWQgdmFsdWVzIGFyZSBwcm9wYWdhdGVkIHRvIGNoaWxkIGNvbnRleHRzIG9yIHNlbnRcbiAqIGJhY2sgYXMgb3ZlcnJpZGVzIHNvIG9ubHkgaW50ZW50aW9uYWwgY2xpZW50IGZsYWdzIGFyZSBmb3J3YXJkZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRDb250ZXh0IGV4dGVuZHMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4ge1xuICBjb25zdHJ1Y3RvcihjdHg/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPikge1xuICAgIHN1cGVyKGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSB0b092ZXJyaWRlcygpOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPiB7XG4gICAgY29uc3Qgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIENMSUVOVF9PVkVSUklERV9LRVlTKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0T3JVbmRlZmluZWQoa2V5KTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgb3ZlcnJpZGVzW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG92ZXJyaWRlcztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQWRhcHRlckZsYWdzLFxuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgT3BlcmF0b3IsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFF1ZXJ5Q2xhdXNlLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RTZWxlY3RvcixcbiAgU2VxdWVuY2UsXG4gIFN0YXRlbWVudCxcbiAgU3RhdGVtZW50RXhlY3V0b3IsXG4gIFZpZXdLaW5kLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudENvbnRleHQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBDb3VjaERCR3JvdXBPcGVyYXRvcixcbiAgQ291Y2hEQlF1ZXJ5TGltaXQsXG4gIE1hbmdvUXVlcnksXG4gIE1hbmdvT3BlcmF0b3IsXG4gIE1hbmdvU2VsZWN0b3IsXG4gIHRyYW5zbGF0ZU9wZXJhdG9ycyxcbiAgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lLFxuICBnZW5lcmF0ZVZpZXdOYW1lLFxuICBmaW5kVmlld01ldGFkYXRhLFxuICBDb3VjaERCVmlld01ldGFkYXRhLFxuICBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IHRvQ2FtZWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBEQktleXMsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbnR5cGUgRmFicmljVmlld0Rlc2NyaXB0b3IgPSB7XG4gIGRkb2M6IHN0cmluZztcbiAgdmlldzogc3RyaW5nO1xuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxudHlwZSBGYWJyaWNBZ2dyZWdhdGVJbmZvID1cbiAgfCB7XG4gICAgICBraW5kOiBWaWV3S2luZDtcbiAgICAgIG1ldGE6IENvdWNoREJWaWV3TWV0YWRhdGE7XG4gICAgICBkZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGlzdGluY3Q/OiBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBcImF2Z1wiO1xuICAgICAgYXR0cmlidXRlOiBzdHJpbmc7XG4gICAgICBzdW1EZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgfTtcblxuY29uc3QgZXNjYXBlUmVnRXhwID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xuXG5mdW5jdGlvbiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXFx1MDAwMFwiO1xuICBjb25zdCBjaGFycyA9IEFycmF5LmZyb20odmFsdWUpO1xuICBmb3IgKGxldCBpID0gY2hhcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhcnNbaV0uY29kZVBvaW50QXQoMCk7XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKGNvZGUgPCAweDEwZmZmZikge1xuICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlICsgMSk7XG4gICAgICByZXR1cm4gY2hhcnMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHt2YWx1ZX1cXHUwMDAwYDtcbn1cblxuZnVuY3Rpb24gcHJlZml4UmFuZ2UocHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcHJlZml4LFxuICAgIGVuZDogbmV4dExleGljb2dyYXBoaWNTdHJpbmcocHJlZml4KSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBNLFxuICBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICBSLFxuICBNYW5nb1F1ZXJ5XG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogRmFicmljQ2xpZW50QWRhcHRlciwgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzcXVhc2goXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNxdWFzaGVkOiBQcmVwYXJlZFN0YXRlbWVudDxNPiB8IHVuZGVmaW5lZCA9IHN1cGVyLnNxdWFzaChcbiAgICAgIGN0eCBhcyBuZXZlclxuICAgICk7XG4gICAgaWYgKCFzcXVhc2hlZCkgcmV0dXJuIHNxdWFzaGVkO1xuXG4gICAgY29uc3QgeyBtZXRob2QsIHBhcmFtcywgYXJncyB9ID0gc3F1YXNoZWQ7XG4gICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0IH0gPSBwYXJhbXM7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiwgbGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiwgbGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCBtZXRob2QgJHttZXRob2R9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxdWFzaGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGVQcmVwYXJlZChcbiAgICAuLi5hcmd6OiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5mcm9tU2VsZWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgY29uc3QgeyBtZXRob2QsIGFyZ3MgfSA9IHRoaXMucHJlcGFyZWQgYXMgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PjtcbiAgICByZXR1cm4gcmVwby5zdGF0ZW1lbnQobWV0aG9kLCAuLi5hcmdzLCAuLi5hcmd6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHByZXBhcmUoXG4gICAgY3R4PzogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPFN0YXRlbWVudEV4ZWN1dG9yPE0sIFI+PiB7XG4gICAgY3R4ID1cbiAgICAgIGN0eCB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBQZXJzaXN0ZW5jZUtleXMuUVVFUlksXG4gICAgICAgIHRoaXMub3ZlcnJpZGVzIHx8IHt9LFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKSk7XG5cbiAgICBpZiAoIWN0eCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBjb250ZXh0IGF2YWlsYWJsZSBmb3Igc3RhdGVtZW50XCIpO1xuXG4gICAgaWYgKHRoaXMuaXNTaW1wbGVRdWVyeSgpICYmIGN0eC5nZXQoXCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzXCIpKSB7XG4gICAgICBjb25zdCBzcXVhc2hlZCA9IHRoaXMuc3F1YXNoKGN0eCk7XG4gICAgICBpZiAoc3F1YXNoZWQpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlZCA9IHNxdWFzaGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge30gYXMgYW55O1xuXG4gICAgY29uc3QgcHJlcGFyZWQ6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gPSB7XG4gICAgICBjbGFzczogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBhcmdzLFxuICAgICAgcGFyYW1zLFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgbWV0aG9kOiBzdHJpbmdbXSA9IFtRdWVyeUNsYXVzZS5GSU5EX0JZXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnByZXBhcmVDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbiwgY3R4IGFzIG5ldmVyKTtcbiAgICAgIG1ldGhvZC5wdXNoKHBhcnNlZC5tZXRob2QpO1xuICAgICAgaWYgKHBhcnNlZC5hcmdzICYmIHBhcnNlZC5hcmdzLmxlbmd0aClcbiAgICAgICAgYXJncy5wdXNoKC4uLihwYXJzZWQuYXJncyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgbWV0aG9kLnB1c2goXG4gICAgICAgIFF1ZXJ5Q2xhdXNlLlNFTEVDVCxcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5qb2luKGAgJHtRdWVyeUNsYXVzZS5BTkQudG9Mb3dlckNhc2UoKX0gYClcbiAgICAgICk7XG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBtZXRob2QucHVzaChRdWVyeUNsYXVzZS5PUkRFUl9CWSwgdGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzBdIGFzIHN0cmluZyk7XG4gICAgICBhcmdzLnB1c2godGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzFdIGFzIGFueSk7XG4gICAgfVxuICAgIHByZXBhcmVkLm1ldGhvZCA9IHRvQ2FtZWxDYXNlKG1ldGhvZC5qb2luKFwiIFwiKSk7XG4gICAgcHJlcGFyZWQucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMucHJlcGFyZWQgPSBwcmVwYXJlZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgcmVjb3JkIGZyb20gQ291Y2hEQi9GYWJyaWNcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgdGhlIElEIGZyb20gYSBDb3VjaERCIGRvY3VtZW50IGFuZCByZXZlcnRzIGl0IHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcm9jZXNzUmVjb3JkKFxuICAgIHJlY29yZDogYW55LFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBNIHtcbiAgICBjb25zdCBwa0F0dHIgPSBNb2RlbC5wayh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLmdldChcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5JRCwgcGtBdHRyIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuXG4gICAgaWYgKHJlY29yZFtDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcmVjb3JkW0NvdWNoREJLZXlzLklEXS5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmVjb3JkW3BrQXR0cl0gPSBTZXF1ZW5jZS5wYXJzZVZhbHVlKHR5cGUgYXMgYW55LCBpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NSZWNvcmQocmVjb3JkLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeVxuICAgKiBAc3VtbWFyeSBTZW5kcyBhIHJhdyBNYW5nbyBxdWVyeSB0byBGYWJyaWMgYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgYWdncmVnYXRvciA9IChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGVJbmZvO1xuICAgIGlmICgocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlICYmIGFnZ3JlZ2F0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBZ2dyZWdhdGU8Uj4oYWdncmVnYXRvciwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgcmF3SW5wdXQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBjdHhcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIGN0eCkpO1xuICAgICAgaWYgKCFjdHguZ2V0T3JVbmRlZmluZWQoXCJhZnRlclF1ZXJ5SGFuZGxlcnNcIikpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZCBhcyB1bmtub3duIGFzIFI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQocHJvY2Vzc2VkLCBjdHgpKSBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkKCk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCBhZ2dyZWdhdGVRdWVyeSA9IHRoaXMuYnVpbGRBZ2dyZWdhdGVRdWVyeSgpO1xuICAgIGlmIChhZ2dyZWdhdGVRdWVyeSkgcmV0dXJuIGFnZ3JlZ2F0ZVF1ZXJ5O1xuICAgIGNvbnN0IHNlbGVjdG9yczogTWFuZ29TZWxlY3RvciA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBmb3IgKGNvbnN0IFtzZWxlY3RvcktleSwgZGlyZWN0aW9uXSBvZiB0aGlzLm9yZGVyQnlTZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcktleSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+ID0ge307XG4gICAgICAgIHJlY1tzZWxlY3Rvcl0gPSBkaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb247XG4gICAgICAgIChxdWVyeS5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPltdKS5wdXNoKHJlYyk7XG4gICAgICAgIGlmICghcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdKSB7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3Igc3RydWN0dXJlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5TVEFSVFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVmaXhSYW5nZShjb21wYXJpc29uKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJfRVFdID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5TTUFMTEVSXSA9IHJhbmdlLmVuZDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5FTkRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge1xuICAgICAgICBbQ291Y2hEQk9wZXJhdG9yLlJFR0VYUF06IGAke2VzY2FwZVJlZ0V4cChjb21wYXJpc29uKX0kYCxcbiAgICAgIH0gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5CRVRXRUVOKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cjEgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBhcmlzb24pIHx8IGNvbXBhcmlzb24ubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkJFVFdFRU4gb3BlcmF0b3IgcmVxdWlyZXMgW21pbiwgbWF4XSBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbXBhcmlzb247XG4gICAgICBjb25zdCBvcEJldHdlZW46IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BCZXR3ZWVuW2F0dHJdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5CSUdHRVJfRVEpXG4gICAgICBdID0gbWluO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLlNNQUxMRVJfRVEpXG4gICAgICBdID0gbWF4O1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wQmV0d2VlbiB9O1xuICAgIH1cblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhbiBhZ2dyZWdhdGUgcXVlcnkgaWYgYWdncmVnYXRpb24gaXMgcmVxdWVzdGVkXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBmb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMgYW5kIHJldHVybnMgYSBzcGVjaWFsIE1hbmdvUXVlcnkgZm9yIHRoZW1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZ2dyZWdhdGVRdWVyeSgpOiBNYW5nb1F1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmF2Z1NlbGVjdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBTdHJpbmcodGhpcy5hdmdTZWxlY3Rvcik7XG4gICAgICBjb25zdCBzdW1JbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwic3VtXCIsIGF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBjb3VudEluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJjb3VudFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCFzdW1JbmZvIHx8ICFjb3VudEluZm8pXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgIGBBdmcgb3BlcmF0aW9uIHJlcXVpcmVzIHN1bSBhbmQgY291bnQgdmlld3MgZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeSh7XG4gICAgICAgIGtpbmQ6IFwiYXZnXCIsXG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgc3VtRGVzY3JpcHRvcjogc3VtSW5mby5kZXNjcmlwdG9yLFxuICAgICAgICBjb3VudERlc2NyaXB0b3I6IGNvdW50SW5mby5kZXNjcmlwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID1cbiAgICAgICAgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgPT0gbnVsbFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IpO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImRpc3RpbmN0XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmNvdW50RGlzdGluY3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yVXNlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICEhdGhpcy5taW5TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLm1heFNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuc3VtU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5kaXN0aW5jdFNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWdncmVnYXRvckNoZWNrczogQXJyYXk8W1ZpZXdLaW5kLCBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW1xuICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICh0aGlzLmNvdW50U2VsZWN0b3IgPz8gdW5kZWZpbmVkKSBhcyBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICAgIF0sXG4gICAgICBbXCJtYXhcIiwgdGhpcy5tYXhTZWxlY3Rvcl0sXG4gICAgICBbXCJtaW5cIiwgdGhpcy5taW5TZWxlY3Rvcl0sXG4gICAgICBbXCJzdW1cIiwgdGhpcy5zdW1TZWxlY3Rvcl0sXG4gICAgICBbXCJkaXN0aW5jdFwiLCB0aGlzLmRpc3RpbmN0U2VsZWN0b3JdLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBzZWxlY3Rvcl0gb2YgYWdncmVnYXRvckNoZWNrcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZWN0b3IgPyBTdHJpbmcoc2VsZWN0b3IpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihraW5kLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgIH1cblxuICAgIGlmIChhZ2dyZWdhdG9yVXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIHZpZXcgbWV0YWRhdGEgZm91bmQgZm9yIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICAgICl9IGFnZ3JlZ2F0b3JgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yIGZvciBhIHZpZXctYmFzZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcbiAgICBraW5kOiBWaWV3S2luZCxcbiAgICBhdHRyaWJ1dGU/OiBzdHJpbmdcbiAgKTogRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGFzID0gZmluZFZpZXdNZXRhZGF0YSh0aGlzLmZyb21TZWxlY3Rvciwga2luZCwgYXR0cmlidXRlKTtcbiAgICBpZiAoIW1ldGFzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhID0gbWV0YXNbMF07XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGdlbmVyYXRlVmlld05hbWUodGFibGVOYW1lLCBtZXRhLmF0dHJpYnV0ZSwga2luZCwgbWV0YSk7XG4gICAgY29uc3QgZGRvYyA9IG1ldGEuZGRvYyB8fCBnZW5lcmF0ZURlc2lnbkRvY05hbWUodGFibGVOYW1lLCB2aWV3TmFtZSk7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHJlZHVjZTogbWV0YS5yZWR1Y2UgIT09IHVuZGVmaW5lZCA/IHRydWUgOiAhbWV0YS5yZXR1cm5Eb2NzLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCBraW5kID09PSBcImdyb3VwQnlcIikgb3B0aW9ucy5ncm91cCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQsXG4gICAgICBtZXRhLFxuICAgICAgZGVzY3JpcHRvcjoge1xuICAgICAgICBkZG9jLFxuICAgICAgICB2aWV3OiB2aWV3TmFtZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgc3BlY2lhbCBhZ2dyZWdhdGUgTWFuZ29RdWVyeSBtYXJrZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlUXVlcnkoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiB7fSxcbiAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgIGFnZ3JlZ2F0ZUluZm86IGluZm8sXG4gICAgfSBhcyBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBjYXN0IHRvIEZhYnJpY0NsaWVudEFkYXB0ZXIgZm9yIHZpZXcgYWNjZXNzXG4gICAqL1xuICBwcml2YXRlIGdldEZhYnJpY0FkYXB0ZXIoKTogRmFicmljQ2xpZW50QWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgdmlhIGFkYXB0ZXIncyB2aWV3IG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWdncmVnYXRlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmICghdGhpcy5pc1ZpZXdBZ2dyZWdhdGUoaW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF2ZXJhZ2U8Uj4oaW5mbywgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IuZGRvYyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IudmlldyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3Iub3B0aW9ucyxcbiAgICAgIGN0eFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihpbmZvLCByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgYXZlcmFnZSBjYWxjdWxhdGlvbiBmcm9tIHN1bSBhbmQgY291bnQgdmlld3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQXZlcmFnZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoaW5mby5raW5kICE9PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJBdmVyYWdlIGRlc2NyaXB0b3IgaXMgbm90IHZhbGlkXCIpO1xuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCBbc3VtRGVzYywgY291bnREZXNjXSA9IFtpbmZvLnN1bURlc2NyaXB0b3IsIGluZm8uY291bnREZXNjcmlwdG9yXTtcbiAgICBjb25zdCBbc3VtUmVzcG9uc2UsIGNvdW50UmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIHN1bURlc2MuZGRvYyxcbiAgICAgICAgc3VtRGVzYy52aWV3LFxuICAgICAgICBzdW1EZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBjb3VudERlc2MuZGRvYyxcbiAgICAgICAgY291bnREZXNjLnZpZXcsXG4gICAgICAgIGNvdW50RGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgXSk7XG4gICAgY29uc3Qgc3VtID0gc3VtUmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRSZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgaWYgKCFjb3VudCkgcmV0dXJuIDAgYXMgdW5rbm93biBhcyBSO1xuICAgIHJldHVybiAoc3VtIC8gY291bnQpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHRoZSB2aWV3IHJlc3BvbnNlIGJhc2VkIG9uIGFnZ3JlZ2F0ZSBraW5kXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICByZXNwb25zZTogVmlld1Jlc3BvbnNlXG4gICk6IFIge1xuICAgIGlmIChpbmZvLmtpbmQgPT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgXCJBdmVyYWdlIHJlc3VsdHMgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIHByb2Nlc3Npbmcgcm93c1wiXG4gICAgICApO1xuICAgIGNvbnN0IHJvd3MgPSByZXNwb25zZS5yb3dzIHx8IFtdO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgbWV0YSA9IHZpZXdJbmZvLm1ldGE7XG4gICAgaWYgKHZpZXdJbmZvLmNvdW50RGlzdGluY3QpIHtcbiAgICAgIHJldHVybiAocm93cy5sZW5ndGggfHwgMCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAodmlld0luZm8ua2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IHZpZXdJbmZvLmtpbmQgPT09IFwiZ3JvdXBCeVwiKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LmtleSA/PyByb3cudmFsdWUpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKG1ldGEucmV0dXJuRG9jcykge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy52YWx1ZSA/PyByb3cuZG9jID8/IHJvdykgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gKHZpZXdJbmZvLmtpbmQgPT09IFwiY291bnRcIiA/IDAgOiBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiAocm93c1swXS52YWx1ZSA/PyByb3dzWzBdLmtleSA/PyBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgaW5mbyBpcyBhIHZpZXctYmFzZWQgYWdncmVnYXRlXG4gICAqL1xuICBwcml2YXRlIGlzVmlld0FnZ3JlZ2F0ZShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IGluZm8gaXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHtcbiAgICByZXR1cm4gaW5mby5raW5kICE9PSBcImF2Z1wiO1xuICB9XG59XG4iLCJpbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgdHlwZSBNYW5nb1F1ZXJ5LFxuICB0eXBlIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCAqIGFzIGdycGMgZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7XG4gIE1vZGVsLFxuICB0eXBlIE1vZGVsQ29uc3RydWN0b3IsXG4gIHR5cGUgU2VyaWFsaXplcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVidWcsIGZpbmFsLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIFBlZXJDb25maWcsXG4gIHR5cGUgU2VncmVnYXRlZE1vZGVsLFxuICB0eXBlIE1zcERldGFpbHMsXG59IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNvbm5lY3QsXG4gIHR5cGUgQ29ubmVjdE9wdGlvbnMsXG4gIEdhdGV3YXksXG4gIE5ldHdvcmssXG4gIFByb3Bvc2FsT3B0aW9ucyxcbiAgQ29udHJhY3QgYXMgQ29udHJha3QsXG4gIHR5cGUgU2lnbmVyLFxuICBHYXRld2F5RXJyb3IsXG4gIEVuZG9yc2VFcnJvcixcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgR2F0ZXdheSBhcyBMZWdhY3lHYXRld2F5LCBXYWxsZXRzIH0gZnJvbSBcImZhYnJpYy1uZXR3b3JrXCI7XG5pbXBvcnQgdHlwZSB7IEVuZG9yc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7XG4gIGdldElkZW50aXR5LFxuICBnZXRTaWduZXIsXG4gIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50LFxuICByZWFkRmlsZSBhcyByZWFkRnNGaWxlLFxufSBmcm9tIFwiLi9mYWJyaWMtZnNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgdHlwZSBQcmltYXJ5S2V5VHlwZSxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIEFkYXB0ZXIsXG4gIHR5cGUgQWRhcHRlckZsYWdzLFxuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE1pZ3JhdGlvbkVycm9yLFxuICBPYnNlcnZlckVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBTdGF0ZW1lbnQsXG4gIHR5cGUgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFBhZ2luYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBDb250ZXh0dWFsQXJncyxcbiAgdHlwZSBQcmVwYXJlZE1vZGVsLFxuICBBbGxPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIsIEZhYnJpY01vZGVsS2V5cyB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDbGllbnRTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RGlzcGF0Y2ggfSBmcm9tIFwiLi9GYWJyaWNDbGllbnREaXNwYXRjaFwiO1xuLy8gaW1wb3J0IHsgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbSB9IGZyb20gXCIuL2ZhYnJpYy1oc21cIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFN0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFN0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UGFnaW5hdG9yIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgRW5kb3JzZW1lbnRFcnJvcixcbiAgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcixcbiAgTXZjY1JlYWRDb25mbGljdEVycm9yLFxuICBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IsXG4gIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvcixcbiAgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IsXG59IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4vY3J5cHRvXCI7XG5pbXBvcnQgeyBleHRyYWN0SWRzIH0gZnJvbSBcIi4vaWRzL2lkLWV4dHJhY3Rpb25cIjtcbmltcG9ydCB7IERlZmF1bHRDb250cmFjdFJlc29sdmVyLCBJZGVudGl0eSB9IGZyb20gXCIuLi9zaGFyZWQvaW5kZXhcIjtcblxudHlwZSBMZWdhY3lQZWVyVGFyZ2V0ID0ge1xuICBtc3BJZDogc3RyaW5nO1xuICBwZWVyRW5kcG9pbnQ6IHN0cmluZztcbiAgcGVlckhvc3RBbGlhcz86IHN0cmluZztcbiAgdGxzQ2VydD86IHN0cmluZyB8IEJ1ZmZlcjtcbn07XG5cbnR5cGUgTGVnYWN5UGVlcldpdGhOYW1lID0gTGVnYWN5UGVlclRhcmdldCAmIHsgbmFtZTogc3RyaW5nIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzXG4gKiBAc3VtbWFyeSBUaGUgRmFicmljQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyIHRvIHByb3ZpZGUgYSBzZWFtbGVzcyBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzLlxuICogSXQgaGFuZGxlcyBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIHRyYW5zYWN0aW9uIHN1Ym1pc3Npb24sIGFuZCBDUlVEIG9wZXJhdGlvbnMgYWdhaW5zdCBGYWJyaWMgY2hhaW5jb2RlLlxuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHRlbXBsYXRlIEZhYnJpY0ZsYWdzIC0gRmxhZ3Mgc3BlY2lmaWMgdG8gRmFicmljIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBDb250ZXh0PEZhYnJpY0ZsYWdzPiAtIENvbnRleHQgdHlwZSBjb250YWluaW5nIEZhYnJpYy1zcGVjaWZpYyBmbGFnc1xuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGFsaWFzIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gKiBjb25zdCBjb25maWc6IFBlZXJDb25maWcgPSB7XG4gKiAgIG1zcElkOiAnT3JnMU1TUCcsXG4gKiAgIHBlZXJFbmRwb2ludDogJ2xvY2FsaG9zdDo3MDUxJyxcbiAqICAgY2hhbm5lbE5hbWU6ICdteWNoYW5uZWwnLFxuICogICBjaGFpbmNvZGVOYW1lOiAnbXljYycsXG4gKiAgIGNvbnRyYWN0TmFtZTogJ215Y29udHJhY3QnLFxuICogICB0bHNDZXJ0UGF0aDogJy9wYXRoL3RvL3Rscy9jZXJ0JyxcbiAqICAgY2VydERpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9jZXJ0L2RpcicsXG4gKiAgIGtleURpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9rZXkvZGlyJ1xuICogfTtcbiAqXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IEZhYnJpY0FkYXB0ZXIoY29uZmlnLCAnb3JnMS1hZGFwdGVyJyk7XG4gKlxuICogLy8gVXNlIHRoZSBhZGFwdGVyIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJ3VzZXIxJywgbXlTZXJpYWxpemVyKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgc2VyaWFsaXplcilcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHN1Ym1pdFRyYW5zYWN0aW9uKE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbc2VyaWFsaXplZE1vZGVsXSwgdHJhbnNpZW50KVxuICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWxOYW1lKVxuICogICBOZXR3b3JrLT4+Q29udHJhY3Q6IGdldENvbnRyYWN0KGNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSlcbiAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IGRlY29kZShyZXN1bHQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRlY29kZWRSZXN1bHQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2xpZW50OiBkZXNlcmlhbGl6ZWRSZXN1bHRcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBQZWVyQ29uZmlnLFxuICBDbGllbnQsXG4gIE1hbmdvUXVlcnksXG4gIEZhYnJpY0NsaWVudENvbnRleHRcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyB0ZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgVWludDhBcnJheSB0byBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljQ2xpZW50QWRhcHRlcik7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljQ2xpZW50QWRhcHRlci5zZXJpYWxpemVyO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXQgQ29udGV4dCgpOiBDb25zdHJ1Y3RvcjxGYWJyaWNDbGllbnRDb250ZXh0PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudENvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBhZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGVlckNvbmZpZywgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRGYWJyaWNDbGllbnRGbGFncywgY29uZmlnKSxcbiAgICAgIEZhYnJpY0ZsYXZvdXIsXG4gICAgICBhbGlhc1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hhaW5jb2RlRm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5jaGFpbmNvZGVGb3IobW9kZWwsIHRoaXMuY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGFubmVsRm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5jaGFubmVsRm9yKG1vZGVsLCB0aGlzLmNvbmZpZywgLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29udHJhY3RGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmNvbnRyYWN0Rm9yKG1vZGVsLCB0aGlzLmNvbmZpZywgLi4uYXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz5cbiAgKTogU3RhdGVtZW50PE0sIEZhYnJpY0NsaWVudEFkYXB0ZXIsIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50U3RhdGVtZW50KHRoaXMsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsPihcbiAgICBxdWVyeTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IE1hbmdvUXVlcnksXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQYWdpbmF0b3I8TSwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRQYWdpbmF0b3IodGhpcywgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZhYnJpY0NsaWVudEZsYWdzPiB7XG4gICAgY29uc3QgbWVyZ2VkRmxhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZywgZmxhZ3MpO1xuICAgIGNvbnN0IGYgPSBPYmplY3QuYXNzaWduKFxuICAgICAgYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgbWVyZ2VkRmxhZ3MsIC4uLmFyZ3MpXG4gICAgKTtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBBbGxPcGVyYXRpb25LZXlzLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgQ29uc3RydWN0b3I8TT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxGYWJyaWNDbGllbnRDb250ZXh0PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY29udGV4dCk7XG4gICAgbG9nLnNpbGx5KFxuICAgICAgYGNyZWF0aW5nIG5ldyBjb250ZXh0IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uIG9uICR7bW9kZWwgPyAoQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbC5tYXAoKG0pID0+IE1vZGVsLnRhYmxlTmFtZShtKSkgOiBNb2RlbC50YWJsZU5hbWUobW9kZWwpKSA6IFwibm9cIn0gdGFibGUgJHtvdmVycmlkZXMgJiYgT2JqZWN0LmtleXMob3ZlcnJpZGVzKSA/IE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoIDogXCJub1wifSB3aXRoIGZsYWcgb3ZlcnJpZGVzYFxuICAgICk7XG4gICAgbGV0IGN0eCA9IGFyZ3MucG9wKCk7XG4gICAgaWYgKHR5cGVvZiBjdHggIT09IFwidW5kZWZpbmVkXCIgJiYgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSkge1xuICAgICAgYXJncy5wdXNoKGN0eCk7XG4gICAgICBjdHggPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGVzID0gY3R4XG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGN0eC50b092ZXJyaWRlcygpLCBvdmVycmlkZXMpXG4gICAgICA6IG92ZXJyaWRlcztcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3MoXG4gICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSBcInN0cmluZ1wiID8gb3BlcmF0aW9uIDogb3BlcmF0aW9uLm5hbWUsXG4gICAgICBtb2RlbCxcbiAgICAgIG92ZXJyaWRlcyBhcyBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICAgIC4uLlsuLi5hcmdzLCBjdHhdLmZpbHRlcihCb29sZWFuKVxuICAgICk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBpZiAoIShjdHggaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRPcCA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGN0eC5nZXRPclVuZGVmaW5lZChcImFmZmVjdGVkVGFibGVzXCIpO1xuICAgICAgaWYgKFxuICAgICAgICAhY3VycmVudE9wIHx8XG4gICAgICAgIGN1cnJlbnRPcCAhPT0gb3BlcmF0aW9uIHx8XG4gICAgICAgIChtb2RlbCAmJiBtb2RlbCAhPT0gY3VycmVudE1vZGVsKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcblxuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN0eC5hY2N1bXVsYXRlKGZsYWdzKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgIC4uLmZsYWdzLFxuICAgIH0pIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVjb2RlcyBhIFVpbnQ4QXJyYXkgdG8gYSBzdHJpbmdcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBGYWJyaWMgdG8gYSBzdHJpbmcgdXNpbmcgVVRGLTggZW5jb2RpbmdcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhIC0gVGhlIGJpbmFyeSBkYXRhIHRvIGRlY29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHN0cmluZ1xuICAgKi9cbiAgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxcbiAgICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgICAgIGFueSxcbiAgICAgIEFkYXB0ZXI8UGVlckNvbmZpZywgQ2xpZW50LCBNYW5nb1F1ZXJ5LCBGYWJyaWNDbGllbnRDb250ZXh0PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogW1xuICAgIENvbnN0cnVjdG9yPE0+LFxuICAgIFByaW1hcnlLZXlUeXBlLFxuICAgIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYW55W10sXG4gICAgRmFicmljQ2xpZW50Q29udGV4dCxcbiAgXSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIHJlY29yZHMgZm9yIGNyZWF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmVjZXNzYXJ5IENvdWNoREIgZmllbGRzIHRvIG11bHRpcGxlIHJlY29yZHMgYmVmb3JlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIElEcyBvZiB0aGUgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSB0YWJsZU5hbWUsIGlkcywgYW5kIHByZXBhcmVkIHJlY29yZHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgaWRzIGFuZCBtb2RlbHMgYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGxQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWRzLCByZWNvcmRzLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVBbGxQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWRzLCByZWNvcmRzLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgLy9IRVJFIVxuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PixcbiAgICAgIHRoaXMuY3JlYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLmluZm8oYGFkZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbHMgPSBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZE1vZGVscyldLFxuICAgICAgaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcblxuICAgIGxldCByZXM6IFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgY3R4LFxuICAgICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgICByZXNbMF1bTW9kZWwucGsoY2xhenopIGFzIHN0cmluZ10gfHwgaWRzWzBdXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnQ/LltpXSB8fCB7fSksXG4gICAgICAgICAgICAgIHJlc1tpXVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRzXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byByZWFkIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gcmVhZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgcmVhZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdXBkYXRlIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IG1vZGVscyAtIEFycmF5IG9mIHVwZGF0ZWQgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+LFxuICAgICAgdGhpcy51cGRhdGVBbGxcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmluZm8oYHVwZGF0aW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZE1vZGVscyA9IG1vZGVscy5tYXAoKG0pID0+XG4gICAgICB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkTW9kZWxzKV0sXG4gICAgICBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuXG4gICAgbGV0IHJlczogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudD8uW2ldIHx8IHt9KSxcbiAgICAgICAgICAgICAgcmVzW2ldXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50Pn0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge1NlcmlhbGl6ZXI8YW55Pn0gc2VyaWFsaXplciAtIFNlcmlhbGl6ZXIgZm9yIHRoZSBtb2RlbCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkc1swXVxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZEFsbChjbGF6eiwgaWRzLCAuLi5jdHhBcmdzKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2hvdWxkSHlkcmF0ZVxuICAgICAgICA/IHJlc3VsdFxuICAgICAgICA6IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzKSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBwZXJzaXN0ZW5jZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIGludG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRhdGFiYXNlIHN0b3JhZ2UsXG4gICAqIGhhbmRsaW5nIGNvbHVtbiBtYXBwaW5nIGFuZCBzZXBhcmF0aW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIGRhdGFcbiAgICovXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBTZWdyZWdhdGVkTW9kZWw8TT4gJiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BsaXQubW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQobW9kZWwpO1xuICAgIGlmIChtaXJyb3JNZXRhKSB7XG4gICAgICBjb25zdCBtaXJyb3JNc3AgPSBtaXJyb3JNZXRhLm1zcElkO1xuICAgICAgaWYgKCFtaXJyb3JNc3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBtaXJyb3IgTVNQIGNvdWxkIGJlIGZvdW5kYCk7XG4gICAgICBsZXQgbXNwcyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgICAgbXNwcyA9IEFycmF5LmlzQXJyYXkobXNwcykgPyBtc3BzIDogW21zcHNdO1xuICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLm1zcHMsIG1pcnJvck1zcF0pXTtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgZW5kb3JzaW5nT3JnczogbWVyZ2VkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBtZXJnZWQsXG4gICAgICAgIGxlZ2FjeTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNwbGl0Lm1vZGVsLFxuICAgICAgbW9kZWw6IHNwbGl0Lm1vZGVsLFxuICAgICAgaWQ6IG1vZGVsW01vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KV0gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgICBwcml2YXRlczogc3BsaXQucHJpdmF0ZXMsXG4gICAgICBzaGFyZWQ6IHNwbGl0LnNoYXJlZCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBNIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJldmVydCk7XG4gICAgaWYgKFxuICAgICAgdHJhbnNpZW50ICYmXG4gICAgICB0aGlzLnNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KFxuICAgICAgICBjdHgsXG4gICAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQgYXMgUmVjb3JkPHN0cmluZywgYW55PilcbiAgICAgICAgLmZpbHRlcigoWywgdl0pID0+IHR5cGVvZiB2ICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgaW4gb2JqICYmIChvYmogYXMgYW55KVtrZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYG92ZXJ3cml0aW5nIGV4aXN0aW5nICR7a2V5fS4gaWYgdGhpcyBpcyBub3QgYSBkZWZhdWx0IHZhbHVlLCB0aGlzIG1heSBwb3NlIGEgcHJvYmxlbWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgKG9iaiBhcyBNKVtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgb3BlcmF0aW9uPzogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghY3R4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBjaGlsZFJlYnVpbGQgPVxuICAgICAgdHlwZW9mIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4oXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY2hpbGRSZWJ1aWxkKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByZXNvbHZlZE9wID0gdGhpcy5yZXNvbHZlT3BlcmF0aW9uKGN0eCwgb3BlcmF0aW9uKTtcbiAgICBpZiAoIXJlc29sdmVkT3ApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBvcCA9IHJlc29sdmVkT3AudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBvcC5pbmNsdWRlcyhcInJlYWRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwiZmluZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJxdWVyeVwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJzdGF0ZW1lbnRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwicGFnZVwiKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVPcGVyYXRpb24oXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChvcGVyYXRpb24pIHJldHVybiBvcGVyYXRpb247XG4gICAgaWYgKHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwib3BlcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgaGFzVHJhbnNpZW50OiBib29sZWFuLFxuICAgIGlkPzogUHJpbWFyeUtleVR5cGVcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFoYXNUcmFuc2llbnQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1vZGVsLmNvbXBvc2VkKGNsYXp6LCBwayk7XG4gICAgY29uc3QgZ2VuZXJhdGVkID0gTW9kZWwuZ2VuZXJhdGVkKGNsYXp6LCBwayk7XG4gICAgY29uc3QgaGFzSWQgPSBpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsO1xuICAgIGlmICghaGFzSWQgJiYgY29tcG9zZWQpIHJldHVybiB0cnVlO1xuICAgIGlmICghaGFzSWQgJiYgZ2VuZXJhdGVkKSB7XG4gICAgICBjdHgubG9nZ2VyLndhcm4oXG4gICAgICAgIGBDYW5ub3QgcmVmcmVzaCByZWNvcmQgd2l0aCBwcml2YXRlIGdlbmVyYXRlZCBwcmltYXJ5IGtleWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBoYXNJZDtcbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0VHJhbnNpZW50T3ZlcnJpZGVzKFxuICAgIHRyYW5zaWVudERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQsXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudERhdGEgPSB0aGlzLmhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhKHRyYW5zaWVudERhdGEpO1xuICAgIGNvbnN0IHNob3VsZEluamVjdCA9ICEhY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dDb250ZXh0VHJhbnNpZW50TWFwXCIpO1xuICAgIGlmICghaGFzVHJhbnNpZW50RGF0YSAmJiAhc2hvdWxkSW5qZWN0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IGN0eC50b092ZXJyaWRlcygpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBoYXNUcmFuc2llbnREYXRhID8gT2JqZWN0LmFzc2lnbih7fSwgdHJhbnNpZW50RGF0YSkgOiB7fTtcbiAgICBpZiAoc2hvdWxkSW5qZWN0ICYmIE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoKSB7XG4gICAgICBwYXlsb2FkW0ZhYnJpY01vZGVsS2V5cy5PVkVSUklERVNdID0gb3ZlcnJpZGVzO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocGF5bG9hZCkubGVuZ3RoID8gcGF5bG9hZCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgIHJldHVybiB2YWx1ZS5zb21lKChpdGVtKSA9PiB0aGlzLmhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhKGl0ZW0pKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZW50cmllcy5zb21lKChbLCBlbnRyeV0pID0+IHRoaXMuaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEoZW50cnkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRpcmVjdCA9XG4gICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIHx8XG4gICAgICAoY3R4LmdldE9yVW5kZWZpbmVkKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCk7XG4gICAgaWYgKGRpcmVjdCAmJiBkaXJlY3QubGVuZ3RoKSByZXR1cm4gZGlyZWN0O1xuICAgIHJldHVybiAoXG4gICAgICAoY3R4LmdldEZyb21DaGlsZHJlbihcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpIHx8XG4gICAgICAoY3R4LmdldEZyb21DaGlsZHJlbihcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+LFxuICAgICAgdGhpcy5jcmVhdGVcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLnZlcmJvc2UoYGFkZGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBbdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCwgY2xhenoubmFtZSldLFxuICAgICAgaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIGhlYWx0aGNoZWNrPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cudmVyYm9zZShgcmVhZGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwiaGVhbHRoY2hlY2tcIixcbiAgICAgIFtdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcmVhZCBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIHJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIHVwZGF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAvLyByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0cmFuc2llbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4sXG4gICAgICB0aGlzLnVwZGF0ZVxuICAgICk7XG4gICAgbG9nLmluZm8oYENMSUVOVCBVUERBVEUgY2xhc3MgOiAke3R5cGVvZiBjbGF6en1gKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy52ZXJib3NlKGB1cGRhdGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBbdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCwgY2xhenoubmFtZSldLFxuICAgICAgaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXIgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkSHlkcmF0ZSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWFkKGNsYXp6LCBpZCwgY3R4KTtcbiAgICB9XG5cbiAgICBsb2cudmVyYm9zZShgZGVsZXRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICA/IHJlc3VsdFxuICAgICAgOiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcGVyZm9ybSBhIHF1ZXJ5IHVzaW5nIE1hbmdvIFF1ZXJ5IHN5bnRheFxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiByYXcocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBldmFsdWF0ZVRyYW5zYWN0aW9uKFwicXVlcnlcIiwgW2lucHV0XSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKFwicXVlcnlcIiwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04ucGFyc2UoZGVjb2RlKHJlc3VsdCkpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0IGJhc2VkIG9uIHR5cGVcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogcHJvY2Vzc2VkIHJlc3VsdFxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgcmF3PFYsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8Vj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBsb2cuaW5mbyhgUGVyZm9ybWluZyByYXcgc3RhdGVtZW50IG9uIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKGNsYXp6KX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJyYXdcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KSwgZG9jc09ubHldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgY2xhenpcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUodHJhbnNhY3Rpb25SZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHJlc3VsdDogJHtlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlUmVjb3JkID0gKHJlY29yZDogUmVjb3JkPGFueSwgYW55PikgPT4ge1xuICAgICAgaWYgKE1vZGVsLmlzTW9kZWwocmVjb3JkKSkgcmV0dXJuIE1vZGVsLmJ1aWxkKHJlY29yZCk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICAgIGNvbnN0IGVsID0gcmVzdWx0WzBdO1xuICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoZWwpKVxuICAgICAgICAvLyBpZiB0aGUgZmlyc3Qgb25lIGlzIGEgbW9kZWwsIGFsbCBhcmUgbW9kZWxzXG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKChlbCkgPT4gTW9kZWwuYnVpbGQoZWwpKSBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3VsdCBhcyBWO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZVJlY29yZChyZXN1bHQgYXMgYW55KSBhcyBWO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIENvdWNoREIgdmlldyBxdWVyeSBhZ2FpbnN0IHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHF1ZXJ5IGEgZGVzaWduIGRvY3VtZW50IHZpZXdcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdmlldyByZXNwb25zZSB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZG9jIC0gRGVzaWduIGRvY3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZpZXdOYW1lIC0gVmlldyBuYW1lXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFZpZXcgcXVlcnkgb3B0aW9uc1xuICAgKiBAcGFyYW0gey4uLkNvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+fSBhcmdzIC0gT3B0aW9uYWwgY29udGV4dHVhbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+fSBUaGUgdmlldyByZXNwb25zZVxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgdmlldzxSPihcbiAgICBkZG9jOiBzdHJpbmcsXG4gICAgdmlld05hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy52aWV3KTtcbiAgICBsb2cuaW5mbyhgUXVlcnlpbmcgdmlldyAke2Rkb2N9LyR7dmlld05hbWV9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwidmlld1wiLFxuICAgICAgICBbZGRvYywgdmlld05hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFZpZXdSZXNwb25zZTxSPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmlldyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIHRoZSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2FjaGVkIGNsaWVudCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENsaWVudD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IENsaWVudCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpXG4gICAgICB0aGlzLl9jbGllbnQgPSBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENsaWVudCh0aGlzLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IEdhdGV3YXkgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgR2F0ZXdheShjdHg6IEZhYnJpY0NsaWVudENvbnRleHQpOiBQcm9taXNlPEdhdGV3YXk+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRHYXRld2F5KGN0eCwgdGhpcy5jb25maWcsIHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IEdhdGV3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250cmFrdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIENvbnRyYWN0KFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxDb250cmFrdD4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENvbnRyYWN0KFxuICAgICAgYXdhaXQgdGhpcy5HYXRld2F5KGN0eCksXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIGNsYXp6T3JDb250cmFjdE5hbWUsXG4gICAgICBjdHhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIG9yIGV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWJtaXQgLSBXaGV0aGVyIHRvIHN1Ym1pdCAodHJ1ZSkgb3IgZXZhbHVhdGUgKGZhbHNlKSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBnZXRDb250cmFjdCgpXG4gICAqICAgYWx0IHN1Ym1pdCB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZWxzZSBldmFsdWF0ZSB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbmRcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjbG9zZSgpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNhY3Rpb24oXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIHN1Ym1pdCA9IHRydWUsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQgPSB7fSxcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogc3RyaW5nW10sXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnRyYW5zYWN0aW9uKTtcbiAgICB0cmFuc2llbnREYXRhID0gdGhpcy5pbmplY3RUcmFuc2llbnRPdmVycmlkZXModHJhbnNpZW50RGF0YSwgY3R4KTtcbiAgICBpZiAoc3VibWl0ICYmIHRoaXMuc2hvdWxkVXNlTGVnYWN5R2F0ZXdheShjdHgpKSB7XG4gICAgICBjb25zdCBsZWdhY3lBcmdzID0gdGhpcy5wcmVwYXJlTGVnYWN5QXJncyhhcmdzKTtcbiAgICAgIGNvbnN0IHRyYW5zaWVudE1hcCA9IHRoaXMuYnVpbGRMZWdhY3lUcmFuc2llbnQodHJhbnNpZW50RGF0YSk7XG4gICAgICBjb25zdCBwZWVyQ29uZmlncyA9IHRoaXMuYnVpbGRMZWdhY3lQZWVyQ29uZmlncyhjdHgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKFxuICAgICAgICBjdHgsXG4gICAgICAgIGFwaSxcbiAgICAgICAgbGVnYWN5QXJncyxcbiAgICAgICAgdHJhbnNpZW50TWFwLFxuICAgICAgICBwZWVyQ29uZmlncyxcbiAgICAgICAgY2xhenpPckNvbnRyYWN0TmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGF3YWl0IHRoaXMuQ29udHJhY3QoY3R4LCBjbGF6ek9yQ29udHJhY3ROYW1lKTtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgJHtzdWJtaXQgPyBcIlN1Ym1pdFwiIDogXCJFdmFsdWF0ZVwifXRpbmcgdHJhbnNhY3Rpb24gJHtjb250cmFjdC5nZXRDb250cmFjdE5hbWUoKX0uJHthcGl9YFxuICAgICAgKTtcbiAgICAgIGxvZy5kZWJ1ZyhgYXJnczogJHthcmdzPy5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSkuam9pbihcIlxcblwiKSB8fCBcIm5vbmVcIn1gKTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1Ym1pdCA/IGNvbnRyYWN0LnN1Ym1pdCA6IGNvbnRyYWN0LmV2YWx1YXRlO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEFyZ3MgPSAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICAgIHRoaXMubm9ybWFsaXplVHJhbnNhY3Rpb25Bcmd1bWVudChhcmcpXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhbnNpZW50RW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEgfHwge30pO1xuXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zID0gZW5kb3JzaW5nT3JnYW5pemF0aW9ucz8ubGVuZ3RoXG4gICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Bvc2FsT3B0aW9uczogUHJvcG9zYWxPcHRpb25zID0ge1xuICAgICAgICBhcmd1bWVudHM6IG5vcm1hbGl6ZWRBcmdzLFxuICAgICAgICB0cmFuc2llbnREYXRhOiB0cmFuc2llbnRFbnRyaWVzLmxlbmd0aFxuICAgICAgICAgID8gdHJhbnNpZW50RW50cmllcy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gICAgICAgICAgICAgIChhY2MsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge31cbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzXCIpXG4gICAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICAgIDogdW5kZWZpbmVkLCAvLyBtc3BJZCBsaXN0XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmNhbGwoY29udHJhY3QsIGFwaSwgcHJvcG9zYWxPcHRpb25zKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjb25uZWN0aW9uYCk7XG4gICAgICBnYXRld2F5LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVUcmFuc2FjdGlvbkFyZ3VtZW50KGFyZzogYW55KTogYW55IHtcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IGFyZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXJnO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJnO1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSBcIm9iamVjdFwiKSByZXR1cm4gYXJnO1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gYXJnO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eDogRmFicmljQ2xpZW50Q29udGV4dCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWN0eC5nZXRPclVuZGVmaW5lZChcImxlZ2FjeVwiKSAmJiAhIXRoaXMuY29uZmlnLmFsbG93R2F0ZXdheU92ZXJyaWRlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlTGVnYWN5QXJncyhhcmdzPzogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIChhcmdzIHx8IFtdKS5tYXAoKGFyZykgPT5cbiAgICAgIHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgPyBhcmcgOiBKU09OLnN0cmluZ2lmeShhcmcpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdhY3lUcmFuc2llbnQoXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0cmFuc2llbnREYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0cmFuc2llbnREYXRhKTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgIG1hcFtrZXldID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUxlZ2FjeU1zcENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgY29uZmlndXJlZCA9IHRoaXMuY29uZmlnLmxlZ2FjeU1zcENvdW50ID8/IDE7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGNvbmZpZ3VyZWQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgfHwgcGFyc2VkIDwgMSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IocGFyc2VkKTtcbiAgfVxuXG4gIHByaXZhdGUgcGlja0xlZ2FjeUNhbmRpZGF0ZXMoXG4gICAgY2FuZGlkYXRlczogTXNwRGV0YWlsc1tdLFxuICAgIGxpbWl0OiBudW1iZXJcbiAgKTogTXNwRGV0YWlsc1tdIHtcbiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoIHx8IGxpbWl0IDw9IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBbLi4uY2FuZGlkYXRlc107XG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5taW4obGltaXQsIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgIGNvbnN0IHBpY2tlZDogTXNwRGV0YWlsc1tdID0gW107XG4gICAgd2hpbGUgKHBpY2tlZC5sZW5ndGggPCB0YXJnZXQgJiYgYXZhaWxhYmxlLmxlbmd0aCkge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXZhaWxhYmxlLmxlbmd0aCk7XG4gICAgICBjb25zdCBbc2VsZWN0aW9uXSA9IGF2YWlsYWJsZS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgcGlja2VkLnB1c2goc2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBpY2tlZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdhY3lQZWVyQ29uZmlncyhjdHg6IEZhYnJpY0NsaWVudENvbnRleHQpOiBMZWdhY3lQZWVyVGFyZ2V0W10ge1xuICAgIGNvbnN0IHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgICAgIHRsc0NlcnQ6IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBsZXQgZW5kb3JzaW5nT3JncyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgIGVuZG9yc2luZ09yZ3MgPSBBcnJheS5pc0FycmF5KGVuZG9yc2luZ09yZ3MpXG4gICAgICA/IGVuZG9yc2luZ09yZ3NcbiAgICAgIDogW2VuZG9yc2luZ09yZ3NdO1xuICAgIGNvbnN0IGVuZG9yc2VycyA9XG4gICAgICBlbmRvcnNpbmdPcmdzLmZpbHRlcigob3JnKTogb3JnIGlzIHN0cmluZyA9PiBCb29sZWFuKG9yZykpIHx8IFtdO1xuICAgIGNvbnN0IGV4dHJhcyA9IGVuZG9yc2Vycy5maWx0ZXIoKG9yZykgPT4gb3JnICE9PSB0aGlzLmNvbmZpZy5tc3BJZCk7XG4gICAgaWYgKCFleHRyYXMubGVuZ3RoKSByZXR1cm4gcGVlcnM7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLmNvbmZpZy5tc3BNYXA7XG4gICAgY29uc3QgbGVnYWN5Q291bnQgPSB0aGlzLnJlc29sdmVMZWdhY3lNc3BDb3VudCgpO1xuICAgIGZvciAoY29uc3QgbXNwIG9mIGV4dHJhcykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG1hcD8uW21zcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnBpY2tMZWdhY3lDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIGxlZ2FjeUNvdW50KTtcbiAgICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHZhbGlkIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBwZWVyIG1hcHBpbmcgZm9yIE1TUCAke21zcH06IG1pc3NpbmcgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwZWVycy5wdXNoKHtcbiAgICAgICAgICBtc3BJZDogbXNwLFxuICAgICAgICAgIHBlZXJFbmRwb2ludDogY2hvaWNlLmVuZHBvaW50LFxuICAgICAgICAgIHBlZXJIb3N0QWxpYXM6IGNob2ljZS5hbGlhcyxcbiAgICAgICAgICB0bHNDZXJ0OiBjaG9pY2UudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGVlcnM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgZmNuOiBzdHJpbmcsXG4gICAgYXJnczogc3RyaW5nW10sXG4gICAgdHJhbnNpZW50TWFwOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IHwgdW5kZWZpbmVkLFxuICAgIHBlZXJDb25maWdzOiBMZWdhY3lQZWVyVGFyZ2V0W10sXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2Vycyk7XG4gICAgY29uc3QgcGVlcnMgPSB0aGlzLm5vcm1hbGl6ZUxlZ2FjeVBlZXJzKHBlZXJDb25maWdzKTtcbiAgICBjb25zdCBpZGVudGl0eU1hdGVyaWFsID0gYXdhaXQgdGhpcy5yZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IFdhbGxldHMubmV3SW5NZW1vcnlXYWxsZXQoKTtcbiAgICBjb25zdCBpZGVudGl0eUxhYmVsID0gYCR7dGhpcy5jb25maWcubXNwSWR9LWxlZ2FjeWA7XG4gICAgYXdhaXQgd2FsbGV0LnB1dChpZGVudGl0eUxhYmVsLCB7XG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBjZXJ0aWZpY2F0ZTogaWRlbnRpdHlNYXRlcmlhbC5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgfSxcbiAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIHR5cGU6IFwiWC41MDlcIixcbiAgICB9IGFzIElkZW50aXR5KTtcblxuICAgIGNvbnN0IGNvbm5lY3Rpb25Qcm9maWxlID0gYXdhaXQgdGhpcy5idWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlKHBlZXJzKTtcbiAgICBjb25zdCBnYXRld2F5ID0gbmV3IExlZ2FjeUdhdGV3YXkoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBnYXRld2F5LmNvbm5lY3QoY29ubmVjdGlvblByb2ZpbGUsIHtcbiAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5TGFiZWwsXG4gICAgICAgIHdhbGxldCxcbiAgICAgICAgZGlzY292ZXJ5OiB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhc0xvY2FsaG9zdDogdGhpcy5zaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QocGVlcnMpLFxuICAgICAgICB9LFxuICAgICAgICB0bHNJbmZvOiB7XG4gICAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgICAga2V5OiBpZGVudGl0eU1hdGVyaWFsLnByaXZhdGVLZXksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNvbmZpZy5jaGFubmVsO1xuICAgICAgbGV0IGNoYWluY29kZSA9IHRoaXMuY29uZmlnLmNoYWluY29kZU5hbWU7XG4gICAgICBsZXQgY29udHJhY3ROYW1lID0gdGhpcy5jb25maWcuY29udHJhY3ROYW1lO1xuXG4gICAgICBpZiAoY2xhenpPckNvbnRyYWN0TmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIGNsYXp6T3JDb250cmFjdE5hbWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgY29udHJhY3ROYW1lID0gY2xhenpPckNvbnRyYWN0TmFtZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYE5vIGNvbnRleHQgcmVjZWl2ZWQgdG8gZGV0ZXJtaW5lIGNoYWluY29kZSBjb25maWdgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNoYW5uZWwgPVxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuY2hhbm5lbEZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjdHgpKSB8fCBjaGFubmVsO1xuICAgICAgICAgIGNoYWluY29kZSA9XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5jaGFpbmNvZGVGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY3R4KSkgfHwgY2hhaW5jb2RlO1xuICAgICAgICAgIGNvbnRyYWN0TmFtZSA9IGF3YWl0IHRoaXMuY29udHJhY3RGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXR3b3JrID0gYXdhaXQgZ2F0ZXdheS5nZXROZXR3b3JrKGNoYW5uZWwpO1xuICAgICAgY29uc3QgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KGNoYWluY29kZSwgY29udHJhY3ROYW1lKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gY29udHJhY3QuY3JlYXRlVHJhbnNhY3Rpb24oZmNuKTtcblxuICAgICAgaWYgKHRyYW5zaWVudE1hcCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2llbnQodHJhbnNpZW50TWFwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kb3JzZXJzID0gcGVlcnNcbiAgICAgICAgLm1hcCgocGVlcikgPT4gbmV0d29yay5nZXRDaGFubmVsKCkuZ2V0RW5kb3JzZXIocGVlci5uYW1lKSlcbiAgICAgICAgLmZpbHRlcigoZW5kb3JzZXIpOiBlbmRvcnNlciBpcyBFbmRvcnNlciA9PiBCb29sZWFuKGVuZG9yc2VyKSk7XG4gICAgICBpZiAoZW5kb3JzZXJzLmxlbmd0aCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRFbmRvcnNpbmdQZWVycyhlbmRvcnNlcnMpO1xuICAgICAgfVxuXG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYExlZ2FjeSBzdWJtaXR0aW5nICR7Y29udHJhY3ROYW1lfS4ke2Zjbn0gdmlhIHBlZXJzICR7cGVlcnMubWFwKChwKSA9PiBwLnBlZXJFbmRwb2ludCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uLnN1Ym1pdCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2F0ZXdheS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMZWdhY3lQZWVycyhcbiAgICBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdXG4gICk6IExlZ2FjeVBlZXJXaXRoTmFtZVtdIHtcbiAgICBjb25zdCBkZWR1cGVkID0gbmV3IE1hcDxzdHJpbmcsIExlZ2FjeVBlZXJXaXRoTmFtZT4oKTtcbiAgICBjb25zdCBhZGRQZWVyID0gKHBlZXI6IExlZ2FjeVBlZXJUYXJnZXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BlZXIucGVlckVuZHBvaW50fXwke3BlZXIucGVlckhvc3RBbGlhcyB8fCBcIlwifWA7XG4gICAgICBpZiAoZGVkdXBlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9IGBwZWVyLSR7cGVlci5tc3BJZH0tJHtkZWR1cGVkLnNpemV9YDtcbiAgICAgIGRlZHVwZWQuc2V0KGtleSwge1xuICAgICAgICAuLi5wZWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHBlZXJzLmZvckVhY2goYWRkUGVlcik7XG4gICAgYWRkUGVlcih7XG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkZWR1cGVkLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTogUHJvbWlzZTx7XG4gICAgY2VydGlmaWNhdGU6IHN0cmluZztcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBwcml2YXRlS2V5IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKSB7XG4gICAgY29uc3QgcGVlckVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBjaGFubmVsUGVlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBvcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBjb25zdCB0bHNQZW0gPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgICAgcGVlci50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0bmFtZSA9XG4gICAgICAgIHBlZXIucGVlckhvc3RBbGlhcyB8fCB0aGlzLmV4dHJhY3RIb3N0KHBlZXIucGVlckVuZHBvaW50KTtcbiAgICAgIHBlZXJFbnRyaWVzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIHVybDogdGhpcy5lbnN1cmVHcnBjVXJsKHBlZXIucGVlckVuZHBvaW50KSxcbiAgICAgICAgdGxzQ0FDZXJ0czogeyBwZW06IHRsc1BlbSB9LFxuICAgICAgICBncnBjT3B0aW9uczoge1xuICAgICAgICAgIFwic3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlXCI6IGhvc3RuYW1lLFxuICAgICAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IGhvc3RuYW1lLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWxQZWVyc1twZWVyLm5hbWVdID0ge1xuICAgICAgICBlbmRvcnNpbmdQZWVyOiB0cnVlLFxuICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZSxcbiAgICAgICAgbGVkZ2VyUXVlcnk6IHRydWUsXG4gICAgICAgIGV2ZW50U291cmNlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0gPSBvcmdzW3BlZXIubXNwSWRdIHx8IHtcbiAgICAgICAgbXNwaWQ6IHBlZXIubXNwSWQsXG4gICAgICAgIHBlZXJzOiBbXSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdLnBlZXJzLnB1c2gocGVlci5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogXCJsZWdhY3ktbWFudWFsXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBjbGllbnQ6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIH0sXG4gICAgICBvcmdhbml6YXRpb25zOiBvcmdzLFxuICAgICAgcGVlcnM6IHBlZXJFbnRyaWVzLFxuICAgICAgb3JkZXJlcnM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmNoYW5uZWxdOiB7XG4gICAgICAgICAgcGVlcnM6IGNoYW5uZWxQZWVycyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZWVycy5ldmVyeSgocGVlcikgPT4gdGhpcy5pc0xvY2FsRW5kcG9pbnQocGVlci5wZWVyRW5kcG9pbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2NhbEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5leHRyYWN0SG9zdChlbmRwb2ludCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0ID09PSBcIjEyNy4wLjAuMVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG9zdChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbmRwb2ludC5yZXBsYWNlKC9eZ3JwY3M/OlxcL1xcLy8sIFwiXCIpO1xuICAgIHJldHVybiBzYW5pdGl6ZWQuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVHcnBjVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICgvXmdycGNzPzpcXC9cXC8vaS50ZXN0KGVuZHBvaW50KSkgcmV0dXJuIGVuZHBvaW50O1xuICAgIHJldHVybiBgZ3JwY3M6Ly8ke2VuZHBvaW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQZW1JbnB1dChzb3VyY2U/OiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgY2VydGlmaWNhdGUgb3Iga2V5IG1hdGVyaWFsXCIpO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc291cmNlKSkgcmV0dXJuIHNvdXJjZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG4gICAgaWYgKC8tLS0tLUJFR0lOIFtBLVogXSstLS0tLS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHNvdXJjZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHJlYWRGc0ZpbGUoc291cmNlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLnBhcnNlRXJyb3I8RT4oZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICB0cnVlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhenpPckNvbnRyYWN0TmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXp6T3JDb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbWlncmF0ZShcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBwcm92aWRlZEN0eCA9XG4gICAgICBsYXN0IGluc3RhbmNlb2YgQ29udGV4dCA/IChsYXN0IGFzIEZhYnJpY0NsaWVudENvbnRleHQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1pZ3JhdGlvbkFyZ3MgPSBwcm92aWRlZEN0eCA/IGFyZ3Muc2xpY2UoMCwgLTEpIDogYXJncztcbiAgICBjb25zdCBjdHggPVxuICAgICAgcHJvdmlkZWRDdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmNvbnRleHQoXG4gICAgICAgIFBlcnNpc3RlbmNlS2V5cy5NSUdSQVRJT04sXG4gICAgICAgIHt9LFxuICAgICAgICB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PlxuICAgICAgKSk7XG4gICAgcmV0dXJuIHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIm1pZ3JhdGVcIixcbiAgICAgIFtyZWZlcmVuY2UsIG1pZ3JhdGlvbkFyZ3NdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgXCJNaWdyYXRpb25Db250cmFjdFwiXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2h1dHMgZG93biB0aGUgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ2xvc2VzIHRoZSBhY3RpdmUgZGlzcGF0Y2ggKHdoaWNoIGluIHR1cm4gY2xvc2VzIGFueSBnYXRld2F5XG4gICAqIGV2ZW50IHN1YnNjcmlwdGlvbikgdmlhIHRoZSBiYXNlIGNsYXNzLCB0aGVuIGNsb3NlcyB0aGUgZ1JQQyBjbGllbnQuXG4gICAqIFdvcmtzIGNvcnJlY3RseSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYHN5bnRoZXRpY0V2ZW50c2AgaXMgZW5hYmxlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCYXNlIGNsYXNzIGhhbmRsZXMgZGlzcGF0Y2guY2xvc2UoKSBpbnRlcm5hbGx5LlxuICAgIGF3YWl0IHN1cGVyLnNodXRkb3duKC4uLmFyZ3MpO1xuICAgIGlmICh0aGlzLmNsaWVudCkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgQ2xvc2luZyAke3RoaXMuY29uZmlnLm1zcElkfSBnYXRld2F5IGNsaWVudGApO1xuICAgICAgdGhpcy5jbGllbnQuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBDb250cmFjdCBpbnN0YW5jZSBmcm9tIGEgR2F0ZXdheVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBjaGFpbmNvZGUgY29udHJhY3QgZnJvbSB0aGUgc3BlY2lmaWVkIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NvbnRyYWt0fSBUaGUgQ29udHJhY3QgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb250cmFjdChcbiAgICBnYXRld2F5OiBHYXRld2F5LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogc3RyaW5nIHwgQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgY3R4PzogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPENvbnRyYWt0PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q29udHJhY3QpO1xuXG4gICAgbGV0IGNoYW5uZWwgPSBjb25maWcuY2hhbm5lbDtcbiAgICBsZXQgY2hhaW5jb2RlID0gY29uZmlnLmNoYWluY29kZU5hbWU7XG4gICAgbGV0IGNvbnRyYWN0TmFtZSA9IGNvbmZpZy5jb250cmFjdE5hbWU7XG5cbiAgICBpZiAoY2xhenpPckNvbnRyYWN0TmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBjbGF6ek9yQ29udHJhY3ROYW1lID09PSBcInN0cmluZ1wiKVxuICAgICAgICBjb250cmFjdE5hbWUgPSBjbGF6ek9yQ29udHJhY3ROYW1lO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYE5vIGNvbnRleHQgcmVjZWl2ZWQgdG8gZGV0ZXJtaW5lIGNoYWluY29kZSBjb25maWdgXG4gICAgICAgICAgKTtcbiAgICAgICAgY2hhbm5lbCA9XG4gICAgICAgICAgKGF3YWl0IHRoaXMuY2hhbm5lbEZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjb25maWcsIGN0eCkpIHx8IGNoYW5uZWw7XG4gICAgICAgIGNoYWluY29kZSA9XG4gICAgICAgICAgKGF3YWl0IHRoaXMuY2hhaW5jb2RlRm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGNvbmZpZywgY3R4KSkgfHxcbiAgICAgICAgICBjaGFpbmNvZGU7XG4gICAgICAgIGNvbnRyYWN0TmFtZSA9IGF3YWl0IHRoaXMuY29udHJhY3RGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY29uZmlnLCBjdHgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLmdldE5ldHdvcmsoZ2F0ZXdheSwgY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjaGFpbmNvZGV9IGNvbnRyYWN0ICR7Y29udHJhY3ROYW1lfSBmcm9tIG5ldHdvcmsgJHtjaGFubmVsfWBcbiAgICAgICk7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY2hhaW5jb2RlLCBjb250cmFjdE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3Q7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBOZXR3b3JrIGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRvIGEgc3BlY2lmaWMgY2hhbm5lbCBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgKiBAcmV0dXJuIHtOZXR3b3JrfSBUaGUgTmV0d29yayBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldE5ldHdvcmsoZ2F0ZXdheTogR2F0ZXdheSwgY2hhbm5lbE5hbWU6IHN0cmluZyk6IE5ldHdvcmsge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0TmV0d29yayk7XG4gICAgbGV0IG5ldHdvcms6IE5ldHdvcms7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byBjaGFubmVsICR7Y2hhbm5lbE5hbWV9YCk7XG4gICAgICBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKGNoYW5uZWxOYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IHVzaW5nIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBbY2xpZW50XSAtIE9wdGlvbmFsIGdSUEMgY2xpZW50LCB3aWxsIGJlIGNyZWF0ZWQgaWYgbm90IHByb3ZpZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0R2F0ZXdheShcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXRDb25uZWN0aW9uKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBQZWVyIElkZW50aXR5IGZvciAke2NvbmZpZy5tc3BJZH0gdW5kZXIgJHtjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGh9YFxuICAgICk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBnZXRJZGVudGl0eShcbiAgICAgIGNvbmZpZy5tc3BJZCxcbiAgICAgIGNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnlcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBwcmVwYXJpbmcgdHJhbnNhY3Rpb24gc2lnbmVyIGZvciAke0NyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGlkZW50aXR5LmNyZWRlbnRpYWxzLnRvU3RyaW5nKCkpfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCBGYWJyaWMgSUQgZnJvbSBjZXJ0aWZpY2F0ZWAsIGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzaWduZXI6IFNpZ25lcjtcbiAgICBjb25zdCBjbG9zZSA9ICgpID0+IHt9O1xuICAgIGlmICghY29uZmlnLmhzbSkge1xuICAgICAgc2lnbmVyID0gYXdhaXQgZ2V0U2lnbmVyKGNvbmZpZy5rZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnN0IGhzbSA9IG5ldyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tKGNvbmZpZy5oc20ubGlicmFyeSk7XG4gICAgICAvLyBjb25zdCBpZGVudGlmaWVyID0gaHNtLmdldFNLSUZyb21DZXJ0aWZpY2F0ZVBhdGgoXG4gICAgICAvLyAgIGNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnlcbiAgICAgIC8vICk7XG4gICAgICAvLyBjb25zdCBwa2NzMTFTaWduZXIgPSBoc20ubmV3U2lnbmVyKHtcbiAgICAgIC8vICAgbGFiZWw6IGNvbmZpZy5oc20udG9rZW5MYWJlbCBhcyBzdHJpbmcsXG4gICAgICAvLyAgIHBpbjogU3RyaW5nKGNvbmZpZy5oc20ucGluKSBhcyBzdHJpbmcsXG4gICAgICAvLyAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAvLyAgIC8vIHVzZXJUeXBlOiAxIC8qQ0tVX1VTRVIgKi8sXG4gICAgICAvLyB9KTtcbiAgICAgIC8vIHNpZ25lciA9IHBrY3MxMVNpZ25lci5zaWduZXI7XG4gICAgICAvLyBjbG9zZSA9IHBrY3MxMVNpZ25lci5jbG9zZTtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiSFNNIE5PVCBJTVBMRU1FTlRFRFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY2xpZW50LFxuICAgICAgaWRlbnRpdHk6IGlkZW50aXR5LFxuICAgICAgc2lnbmVyOiBzaWduZXIsXG4gICAgICAvLyBEZWZhdWx0IHRpbWVvdXRzIGZvciBkaWZmZXJlbnQgZ1JQQyBjYWxsc1xuICAgICAgZXZhbHVhdGVPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJldmFsdWF0ZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgZW5kb3JzZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImVuZG9yc2VUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDE1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBzdWJtaXRPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJzdWJtaXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGNvbW1pdFN0YXR1c09wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImNvbW1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMSBtaW51dGVcbiAgICAgIH0sXG4gICAgfSBhcyBDb25uZWN0T3B0aW9ucztcblxuICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byAke2NvbmZpZy5tc3BJZH1gKTtcbiAgICBjb25zdCBnYXRld2F5ID0gY29ubmVjdChvcHRpb25zKTtcblxuICAgIC8vIFRPRE86IHJlcGxhY2U/XG4gICAgaWYgKGNvbmZpZy5oc20pIHtcbiAgICAgIGdhdGV3YXkuY2xvc2UgPSBuZXcgUHJveHkoZ2F0ZXdheS5jbG9zZSwge1xuICAgICAgICBhcHBseSh0YXJnZXQ6ICgpID0+IHZvaWQsIHRoaXNBcmc6IGFueSwgYXJnQXJyYXk6IGFueVtdKTogYW55IHtcbiAgICAgICAgICBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpO1xuICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBjbGllbnQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgbmV3IEZhYnJpY0NsaWVudERpc3BhdGNoIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmsuXG4gICAqIEByZXR1cm5zIHtEaXNwYXRjaH0gQSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgY29uZmlndXJlZCBmb3IgdGhlIEZhYnJpYyBjbGllbnQuXG4gICAqIEByZW1hcmtzIFRoZSBEaXNwYXRjaCBpbnN0YW5jZSBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBsb2dpYyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIG5ldHdvcmssIHN1Y2ggYXMgc3VibWl0dGluZyB0cmFuc2FjdGlvbnMgb3IgcXVlcnlpbmcgZGF0YS5cbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZmFicmljRGlzcGF0Y2ggPSBmYWJyaWNDbGllbnRBZGFwdGVyLkRpc3BhdGNoKCk7XG4gICAqIGZhYnJpY0Rpc3BhdGNoLnN1Ym1pdFRyYW5zYWN0aW9uKCdjcmVhdGVQcm9kdWN0JywgeyBuYW1lOiAnUHJvZHVjdCBBJywgcHJpY2U6IDEwMCB9KTtcbiAgICovXG4gIG92ZXJyaWRlIERpc3BhdGNoKCk6IEZhYnJpY0NsaWVudERpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY2hhaW5jb2RlRm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIE1vZGVsLmNoYWluY29kZU9mKG1vZGVsLCAuLi5hcmdzKSB8fCBjb25maWcuY2hhaW5jb2RlTmFtZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY2hhbm5lbEZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBNb2RlbC5jaGFubmVsT2YobW9kZWwsIC4uLmFyZ3MpIHx8IGNvbmZpZy5jaGFubmVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjb250cmFjdEZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICBNb2RlbC5jb250cmFjdE9mKG1vZGVsLCAuLi5hcmdzKSB8fFxuICAgICAgRGVmYXVsdENvbnRyYWN0UmVzb2x2ZXIobW9kZWwsIC4uLmFyZ3MpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yIHVzaW5nIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvclxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KFxuICAgIGVycjogRXJyb3IgfCBzdHJpbmcgfCBHYXRld2F5RXJyb3JcbiAgKTogRSB7XG4gICAgLy8gaWYgKFxuICAgIC8vICAgTUlTU0lOR19QUklWQVRFX0RBVEFfUkVHRVgudGVzdChcbiAgICAvLyAgICAgdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlXG4gICAgLy8gICApXG4gICAgLy8gKVxuICAgIC8vICAgcmV0dXJuIG5ldyBVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyhlcnIpIGFzIEU7XG5cbiAgICBsZXQgbXNnID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBHYXRld2F5RXJyb3IgJiYgZXJyLmRldGFpbHMubGVuZ3RoICYmIGVyci5jb2RlID09PSAxMCkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGVyciBpbnN0YW5jZW9mIEVuZG9yc2VFcnJvciAmJlxuICAgICAgZXJyLmRldGFpbHMubGVuZ3RoICYmXG4gICAgICBlcnIuY29kZSA9PT0gMTAgJiZcbiAgICAgIGVyci5kZXRhaWxzWzBdLm1lc3NhZ2U/LmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSlcbiAgICApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiTVZDQ19SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBNdmNjUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkRFQURMSU5FX0VYQ0VFREVEXCIpKVxuICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvblRpbWVvdXRFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoXG4gICAgICBtc2cuaW5jbHVkZXMoXCJjaGFpbmNvZGUgc3RyZWFtIHRlcm1pbmF0ZWRcIikgfHxcbiAgICAgIG1zZy5pbmNsdWRlcyhcIlJFU09VUkNFX0VYSEFVU1RFRFwiKSB8fFxuICAgICAgbXNnLmluY2x1ZGVzKFwicmVjZWl2ZWQgbWVzc2FnZSBsYXJnZXIgdGhhbiBtYXhcIikgfHxcbiAgICAgIG1zZy5pbmNsdWRlcyhcImdycGM6IHJlY2VpdmVkIG1lc3NhZ2UgbGFyZ2VyXCIpXG4gICAgKVxuICAgICAgcmV0dXJuIG5ldyBRdWVyeVJlc3VsdFRvb0xhcmdlRXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkVORE9SU0VNRU5UX1BPTElDWV9GQUlMVVJFXCIpKVxuICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudFBvbGljeUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJQSEFOVE9NX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgIHN3aXRjaCAoKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRFcnJvcihlcnIpIGFzIEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhWYWxpZGF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxufVxuXG5GYWJyaWNDbGllbnRBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENvbnRleHR1YWxBcmdzLFxuICBEaXNwYXRjaCxcbiAgRXZlbnRJZHMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQZWVyQ29uZmlnIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENoYWluY29kZUV2ZW50LFxuICBDbG9zZWFibGVBc3luY0l0ZXJhYmxlLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBwYXJzZUV2ZW50TmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvZXZlbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV2ZW50IGRpc3BhdGNoZXIgZm9yIEh5cGVybGVkZ2VyIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBhbmQgcHJvY2Vzc2VzIGV2ZW50cyBlbWl0dGVkIGJ5IEZhYnJpYyBjaGFpbmNvZGUsIGRpc3BhdGNoaW5nIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICogY29uc3QgY2xpZW50ID0gYXdhaXQgRmFicmljQWRhcHRlci5nZXRDbGllbnQocGVlckNvbmZpZyk7XG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpO1xuICpcbiAqIC8vIENvbmZpZ3VyZSB0aGUgZGlzcGF0Y2ggd2l0aCBwZWVyIGNvbmZpZ3VyYXRpb25cbiAqIGRpc3BhdGNoLmNvbmZpZ3VyZShwZWVyQ29uZmlnKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlciBmb3IgYSBzcGVjaWZpYyB0YWJsZSBhbmQgZXZlbnRcbiAqIGRpc3BhdGNoLm9ic2VydmUoJ3VzZXJzJywgJ2NyZWF0ZScsIChpZCkgPT4ge1xuICogICBjb25zb2xlLmxvZyhgVXNlciBjcmVhdGVkOiAke2lkfWApO1xuICogfSk7XG4gKlxuICogLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBldmVudHNcbiAqIGF3YWl0IGRpc3BhdGNoLnN0YXJ0KCk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogY29uZmlndXJlKHBlZXJDb25maWcpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBvYnNlcnZlKHRhYmxlLCBldmVudCwgY2FsbGJhY2spXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBzdGFydCgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkdhdGV3YXk6IGdldEdhdGV3YXkoY29uZmlnLCBjbGllbnQpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWwpXG4gKiAgIE5ldHdvcmstPj5OZXR3b3JrOiBnZXRDaGFpbmNvZGVFdmVudHMoY2hhaW5jb2RlTmFtZSlcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAqICAgbG9vcCBGb3IgZWFjaCBldmVudFxuICogICAgIENoYWluY29kZS0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZUV2ZW50TmFtZShldmVudE5hbWUpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKHBheWxvYWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtLT4+Q2xpZW50OiBjYWxsYmFjayhpZClcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoPEZhYnJpY0NsaWVudEFkYXB0ZXI+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBsaXN0ZW5pbmcgc3RhY2sgZm9yIGNoYWluY29kZSBldmVudHNcbiAgICovXG4gIHByaXZhdGUgbGlzdGVuaW5nU3RhY2s/OiBDbG9zZWFibGVBc3luY0l0ZXJhYmxlPENoYWluY29kZUV2ZW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBldmVudCBwYXlsb2FkcyBmcm9tIGJ5dGVzIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgZGlzcGF0Y2hlciBmb3IgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNsaWVudDogQ2xpZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBldmVudCBsaXN0ZW5pbmcgY29ubmVjdGlvblxuICAgKiBAc3VtbWFyeSBTdG9wcyBsaXN0ZW5pbmcgZm9yIGNoYWluY29kZSBldmVudHMgYW5kIHJlbGVhc2VzIHJlc291cmNlc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNsb3NlKFxuICAgIC4uLmN0eEFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzOiBsb2dnZWRBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChjdHhBcmdzLCBQZXJzaXN0ZW5jZUtleXMuU0hVVERPV04sIHRydWUpXG4gICAgKS5mb3IodGhpcy5jbG9zZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLmNsb3NlKC4uLmxvZ2dlZEFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNsb3NlIEZhYnJpYyBwcm94aWVzIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGlmICh0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmxpc3RlbmluZ1N0YWNrLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNsb3NlIEZhYnJpYyBldmVudCBsaXN0ZW5lcmAsIGUgYXMgRXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBldmVudCBwYXlsb2FkIGZyb20gYmluYXJ5IGZvcm1hdFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyBKU09OIHRvIGFuIG9iamVjdCB3aXRoIGFuIGlkIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ganNvbkJ5dGVzIC0gVGhlIGJpbmFyeSBwYXlsb2FkIGZyb20gdGhlIGNoYWluY29kZSBldmVudFxuICAgKiBAcmV0dXJuIHt7IGlkOiBzdHJpbmcgfX0gVGhlIHBhcnNlZCBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBJRFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVBheWxvYWQoanNvbkJ5dGVzOiBVaW50OEFycmF5KTogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSB7XG4gICAgY29uc3QganNvbiA9IHRoaXMuZGVjb2Rlci5kZWNvZGUoanNvbkJ5dGVzKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggdG8gYW4gYWRhcHRlciB0byBtb25pdG9yIGl0cyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIG9ic2VydmVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG92ZXJyaWRlIG9ic2VydmUob2JzZXJ2ZXI6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pik6ICgpID0+IHZvaWQge1xuICAgIGlmICghKG9ic2VydmVyIGluc3RhbmNlb2YgRmFicmljQ2xpZW50QWRhcHRlcikpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJPbmx5IEZhYnJpY0NsaWVudEFkYXB0ZXIgY2FuIGJlIG9ic2VydmVkIGJ5IGRpc3BhdGNoXCJcbiAgICAgICk7XG4gICAgc3VwZXIub2JzZXJ2ZShvYnNlcnZlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHthbnl9IHBheWxvYWQgLSBUaGUgZXZlbnQgcGF5bG9hZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBBZGFwdGVyLmxvZ0N0eDxGYWJyaWNDbGllbnRDb250ZXh0PihcbiAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzLFxuICAgICAgZXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiBNb2RlbC50YWJsZU5hbWUobW9kZWwpfToke2V2ZW50fWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIucmVmcmVzaChtb2RlbCwgZXZlbnQsIGlkLCAuLi5jdHhBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggZGlzcGF0Y2g6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBpbmNvbWluZyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSBjaGFpbmNvZGUgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVudCBoYW5kbGluZyBzdG9wc1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50U3RhY2tcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFBhcnNlclxuICAgKiAgIHBhcnRpY2lwYW50IE9ic2VydmVyc1xuICAgKlxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFN0YWNrOiBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiBsaXN0ZW5pbmdTdGFjaylcbiAgICogICBFdmVudFN0YWNrLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRQYXJzZXI6IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpXG4gICAqICAgRXZlbnRQYXJzZXItLT4+RmFicmljRGlzcGF0Y2g6IHsgdGFibGUsIGV2ZW50LCBvd25lciB9XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogQ2hlY2sgaWYgZXZlbnQgaXMgZm9yIHRoaXMgTVNQXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKGV2dC5wYXlsb2FkKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+T2JzZXJ2ZXJzOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBwYXlsb2FkLmlkKVxuICAgKiAgIE9ic2VydmVycy0tPj5GYWJyaWNEaXNwYXRjaDogQ2FsbGJhY2tzIGV4ZWN1dGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXZlbnRzKFxuICAgIGN0eEFyZz86IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmluZ1N0YWNrKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBFdmVudCBzdGFjayBub3QgaW5pdGlhbGl6ZWQuIEVuc3VyZSB0aGF0IFwic3RhcnRMaXN0ZW5pbmdcIiBpcyBjYWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdGhpcyBvcGVyYXRpb24uYFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5hZGFwdGVyIHx8ICF0aGlzLmFkYXB0ZXIuY29uZmlnKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgZm91bmQuIHNob3VsZCBiZSBpbXBvc3NpYmxlYCk7XG5cbiAgICBjb25zdCBjdHggPVxuICAgICAgY3R4QXJnIHx8XG4gICAgICAoYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgKHRoaXMubW9kZWxzICYmIHRoaXMubW9kZWxzWzBdKSB8fCAoTW9kZWwgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcilcbiAgICAgICkpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmhhbmRsZUV2ZW50cyk7XG5cbiAgICBsb2cuaW5mbyhcbiAgICAgIGBMaXN0ZW5pbmcgZm9yIGluY29taW5nIGV2ZW50cyBvbiBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCIuLi5gXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiB0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGUsIGV2ZW50LCBvd25lciB9ID0gcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnPy5tc3BFdmVudE9ubHkgJiZcbiAgICAgICAgICBvd25lciAmJlxuICAgICAgICAgIG93bmVyICE9PSB0aGlzLmFkYXB0ZXIuY29uZmlnPy5tc3BJZFxuICAgICAgICApXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IHsgaWQ6IHN0cmluZzsgcmVzdWx0PzogYW55IH0gPSB0aGlzLnBhcnNlUGF5bG9hZChcbiAgICAgICAgICBldnQucGF5bG9hZFxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldE1vZGVsID0gdGFibGVcbiAgICAgICAgICAgID8gTW9kZWwuZ2V0KHRhYmxlKVxuICAgICAgICAgICAgOiBNb2RlbC5nZXQodGhpcy5tb2RlbHNbMF0ubmFtZSk7XG4gICAgICAgICAgY29uc3QgbW9kZWxSZWYgPSB0YXJnZXRNb2RlbCA/PyAodGFibGUgfHwgdGhpcy5tb2RlbHNbMF0/Lm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXJncyA9IHBheWxvYWQucmVzdWx0ID8gW3BheWxvYWQucmVzdWx0LCBjdHhdIDogW2N0eF07XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICBtb2RlbFJlZiBhcyBDb25zdHJ1Y3RvciB8IHN0cmluZyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgcGF5bG9hZC5pZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAuLi4ob2JzZXJ2ZXJBcmdzIGFzIENvbnRleHR1YWxBcmdzPGFueT4pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdXBkYXRlIG9ic2VydmFibGVzIGZvciB0YWJsZSAke3RhYmxlfSBldmVudCAke2V2ZW50fSBpZDogJHtwYXlsb2FkLmlkfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBldmVudCBmb3IgY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoY3R4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lclxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIGV2ZW50IGRpc3BhdGNoaW5nIGZvciB0aGUgb2JzZXJ2ZWQgYWRhcHRlci4gV2hlblxuICAgKiBgc3ludGhldGljRXZlbnRzYCBpcyB0cnVlICh0aGUgZGVmYXVsdCkgbm8gZ2F0ZXdheSBjb25uZWN0aW9uIGlzIG9wZW5lZDtcbiAgICogaW5zdGVhZCBldmVyeSBDUlVEIG9wZXJhdGlvbiBpcyB3cmFwcGVkIHdpdGggYSBQcm94eSB0aGF0IGZpcmVzXG4gICAqIGB1cGRhdGVPYnNlcnZlcnNgIGZvciAqKmFsbCoqIG1vZGVscy4gV2hlbiBgc3ludGhldGljRXZlbnRzYCBpcyBmYWxzZSB0aGVcbiAgICogZXhpc3RpbmcgZ2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGVcbiAgICogbG9jYWwgUHJveHkgZmFsbGJhY2sgaXMgbGltaXRlZCB0byBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVscyBvbmx5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvciBjb25maWcgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICBjb25zdCBzeW50aGV0aWNFdmVudHMgPSB0aGlzLmFkYXB0ZXIuY29uZmlnLnN5bnRoZXRpY0V2ZW50cyAhPT0gZmFsc2U7XG5cbiAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cykge1xuICAgICAgLy8gR2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIChub24tc3ludGhldGljIHBhdGgpXG4gICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFwiZGlzcGF0Y2hcIixcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgTW9kZWwgYXMgYW55XG4gICAgICApO1xuICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5pbml0aWFsaXplKTtcbiAgICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZyBhcyBQZWVyQ29uZmlnLFxuICAgICAgICB0aGlzLmNsaWVudFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSBhd2FpdCBuZXR3b3JrLmdldENoYWluY29kZUV2ZW50cyhcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lXG4gICAgICApO1xuICAgICAgdGhpcy5oYW5kbGVFdmVudHMoY3R4KTtcbiAgICB9XG5cbiAgICAvLyBQcm94eSBDUlVEIG1ldGhvZHMuXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IHRydWUgIOKGkiBub3RpZnkgZm9yIEFMTCBtb2RlbHMgKHJlcGxhY2VzIGdhdGV3YXkgZXZlbnRzIGVudGlyZWx5KVxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSBmYWxzZSDihpIgbm90aWZ5IG9ubHkgZm9yIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzXG4gICAgLy8gICAodGhlIGdhdGV3YXkgc3Vic2NyaXB0aW9uIGhhbmRsZXMgcHVibGljIG1vZGVscylcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKHRvV3JhcCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyBhZGFwdGVyIHByb3ZpZGVkIGZvciB0aGUgZmFsbGJhY2sgb2YgZnVsbHkgc2VncmVnYXRlZCBtb2RlbHNgXG4gICAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlclt0b1dyYXBdKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWV0aG9kICR7dG9XcmFwfSBub3QgZm91bmQgaW4gJHt0aGlzLmFkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuYWRhcHRlciwgdG9XcmFwKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gdGhpcy5hZGFwdGVyO1xuICAgICAgd2hpbGUgKCFkZXNjcmlwdG9yICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHRvV3JhcCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0aG9kICR7dG9XcmFwfSB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidWxrVG9TaW5nbGUobWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5VUERBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkRFTEVURTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmFkYXB0ZXJbdG9XcmFwXSA9IG5ldyBQcm94eSh0aGlzLmFkYXB0ZXJbdG9XcmFwXSwge1xuICAgICAgICBhcHBseTogYXN5bmMgKFxuICAgICAgICAgIHRhcmdldDogYW55LFxuICAgICAgICAgIHRoaXNBcmc6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgICAgICAgYXJnQXJyYXk6IGFueVtdXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIC8vIFJ1biB0aGUgb3JpZ2luYWwgbWV0aG9kIHVuY2hhbmdlZCBzbyB0cmFuc2llbnQgZGF0YSBpcyBwcmVzZXJ2ZWRcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuXG4gICAgICAgICAgY29uc3QgY2xheno6IENvbnN0cnVjdG9yPGFueT4gPSBhcmdBcnJheVswXTtcbiAgICAgICAgICAvLyBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyBmYWxzZSwgcHVibGljIG1vZGVscyBlbWl0IGEgY2hhaW5jb2RlIGV2ZW50XG4gICAgICAgICAgLy8gb24gdGhlIGNvbnRyYWN0IHNpZGU7IHNraXAgdGhlIGxvY2FsIGZhbGxiYWNrIHRvIGF2b2lkXG4gICAgICAgICAgLy8gZG91YmxlLW5vdGlmaWNhdGlvbi4gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgdHJ1ZSB3ZSBoYW5kbGUgYWxsIG1vZGVscy5cbiAgICAgICAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cyAmJiAhTW9kZWwuaXNUcmFuc2llbnQoY2xhenopKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgICAgLy8gQ29udGV4dCBpcyBhbHdheXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhcmdBcnJheVxuICAgICAgICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzLCBjdHggfSA9IHRoaXNBcmdbXCJsb2dDdHhcIl0oXG4gICAgICAgICAgICBhcmdBcnJheS5zbGljZShhcmdBcnJheS5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaWRzID0gYXJnQXJyYXlbMV07XG4gICAgICAgICAgY29uc3QgcmVzdWx0QXJnczogYW55W10gPSBbY2xhenosIGJ1bGtUb1NpbmdsZSh0b1dyYXApLCBpZHNdO1xuXG4gICAgICAgICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcIm9ic2VydmVGdWxsUmVzdWx0XCIpKSB7XG4gICAgICAgICAgICByZXN1bHRBcmdzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICByZXN1bHRBcmdzWzBdLFxuICAgICAgICAgICAgcmVzdWx0QXJnc1sxXSxcbiAgICAgICAgICAgIHJlc3VsdEFyZ3NbMl0sXG4gICAgICAgICAgICAuLi5yZXN1bHRBcmdzLnNsaWNlKDMpLFxuICAgICAgICAgICAgLi4uKGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4pXG4gICAgICAgICAgKS5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RvV3JhcH0gb24gJHtjbGF6ei5uYW1lIHx8IGNsYXp6fSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmlmIChGYWJyaWNDbGllbnRBZGFwdGVyKVxuICBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IEZhYnJpY0NsaWVudERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJyZXNvbHZlUHJpbWFyeUtleUZpZWxkIiwibSIsImxvZyIsIlN0cmluZyIsIk1vZGVsIiwicGsiLCJtZXNzYWdlIiwibmFtZSIsInZlcmJvc2UiLCJ1bmRlZmluZWQiLCJ3aXRoRGVmYXVsdFF1ZXJ5UGtUaWVCcmVha2VyIiwiaW5kZXhlcyIsInBrRmllbGQiLCJtYXAiLCJpbmRleCIsImZpZWxkcyIsImluY2x1ZGVzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwic29ydGVkRmllbGRzIiwiZmlsdGVyIiwiZmllbGQiLCJoYXNQayIsInNvbWUiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJsYXN0RmllbGQiLCJsYXN0RGlyZWN0aW9uIiwidmFsdWVzIiwidG9Mb3dlckNhc2UiLCJkaXJlY3Rpb24iLCJhc3NpZ24iLCJlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UiLCJmaWxlUGF0aCIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTW9kZWxJbmRleGVzIiwiZ2VuZXJhdGVJbmRleGVzIiwiZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3MiLCJhY2N1bSIsInZpZXdzIiwiZ2VuZXJhdGVWaWV3cyIsInN0b3JhZ2UiLCJmb3JFYWNoIiwiZG9jIiwiX2lkIiwicmVhZE1vZGVsRmlsZSIsImZpbGUiLCJyZXNvbHZlIiwicGFyZW50UGF0aCIsImV4cG9ydHMiLCJlIiwiYXN5bmMiLCJyZWFkTW9kZWxGb2xkZXJzIiwiZm9sZGVycyIsInJlc3VsdCIsImZvbGRlciIsInJlc29sdmVkRm9sZGVyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJyZWN1cnNpdmUiLCJmIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJwdXNoIiwid3JpdGVJbmRleGVzIiwicCIsInByb2Nlc3MiLCJjd2QiLCJjb2xsZWN0aW9uIiwiam9pbiIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5Iiwid3JpdGVEZXNpZ25Eb2NzIiwiZGVzaWduRG9jcyIsImRvY0lkIiwicmVwbGFjZSIsInBheWxvYWQiLCJfcmV2IiwiY29sbGVjdGlvbkZvciIsImNvbGxlY3Rpb25OYW1lIiwicG9saWN5IiwicmVxdWlyZWRQZWVyQ291bnQiLCJtYXhQZWVyQ291bnQiLCJibG9ja1RvTGl2ZSIsIm1lbWJlck9ubHlSZWFkIiwibWVtYmVyT25seVdyaXRlIiwicHJpdmF0ZUNvbGxlY3Rpb25Gb3IiLCJtc3BJZCIsImMiLCJlbmRvcnNlbWVudFBvbGljeSIsInNpZ25hdHVyZVBvbGljeSIsInNoYXJlZENvbGxlY3Rpb25Gb3IiLCJtc3BJZHMiLCJleHRyYWN0Q29sbGVjdGlvbnMiLCJvdmVycmlkZXMiLCJtaXJyb3IiLCJwcml2YXRlQ29scyIsInNoYXJlZENvbHMiLCJjb2xsZWN0aW9uc0ZvciIsInJlc29sdmVDb2xsZWN0aW9uIiwiYXJnIiwiSW50ZXJuYWxFcnJvciIsInByaXZhdGVEZWZhdWx0cyIsInNoYXJlZERlZmF1bHRzIiwibWlycm9yTWV0YSIsIm1pcnJvcmVkQXQiLCJwcml2YXRlcyIsImZsYXQiLCJyZXNvbHZlZCIsInJlc29sdmVyIiwic2hhcmVkIiwid3JpdGVDb2xsZWN0aW9ucyIsImNvbHMiLCJmaWxlTmFtZSIsIndyaXRlQ29sbGVjdGlvbkRlc2lnbkRvY3MiLCJkb2NzIiwiRmFicmljQ2xpZW50UGFnaW5hdG9yIiwiUGFnaW5hdG9yIiwiY29uc3RydWN0b3IiLCJhZGFwdGVyIiwicXVlcnkiLCJzaXplIiwiY2xhenoiLCJzdXBlciIsInByZXBhcmUiLCJyYXdTdGF0ZW1lbnQiLCJVbnN1cHBvcnRlZEVycm9yIiwicGFnZSIsImFyZ3MiLCJpc1NlcmlhbGl6ZWRQYWdlIiwib2JqIiwiZGF0YSIsIk92ZXJmbG93RXJyb3IiLCJtc2ciLCJCYWxhbmNlRXJyb3IiLCJBbGxvd2FuY2VFcnJvciIsIlJlZ2lzdHJhdGlvbkVycm9yIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiTWlzc2luZ0NvbnRleHRFcnJvciIsIlVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIiwiQmFzZUVycm9yIiwiTm90SW5pdGlhbGl6ZWRFcnJvciIsIk1pc3NpbmdQS0NTUzExTGliIiwiRW5kb3JzZW1lbnRFcnJvciIsIk12Y2NSZWFkQ29uZmxpY3RFcnJvciIsIlBoYW50b21SZWFkQ29uZmxpY3RFcnJvciIsIkVuZG9yc2VtZW50UG9saWN5RXJyb3IiLCJUcmFuc2FjdGlvbkxpbWl0c0Vycm9yIiwiY29kZSIsIlRyYW5zYWN0aW9uVGltZW91dEVycm9yIiwiVHJhbnNhY3Rpb25CdWZmZXJTaXplRXJyb3IiLCJRdWVyeVJlc3VsdFRvb0xhcmdlRXJyb3IiLCJGYWJyaWNDbGllbnRSZXBvc2l0b3J5IiwiUmVwb3NpdG9yeSIsImZvcmNlIiwidGhpcyIsIl9vdmVycmlkZXMiLCJpZ25vcmVWYWxpZGF0aW9uIiwiaWdub3JlSGFuZGxlcnMiLCJhbGxvd1Jhd1N0YXRlbWVudHMiLCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzIiwiZm9yY2VQcmVwYXJlQ29tcGxleFF1ZXJpZXMiLCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZSIsInJlYnVpbGRXaXRoVHJhbnNpZW50Iiwib3ZlcnJpZGUiLCJmbGFncyIsImZvciIsIk9ic2VydmVySGFuZGxlciIsInBhZ2luYXRlQnkiLCJrZXkiLCJvcmRlciIsInJlZiIsIm9mZnNldCIsImxpbWl0IiwiY3R4QXJncyIsImxvZ0N0eCIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIlBBR0VfQlkiLCJ0YWJsZU5hbWUiLCJjbGFzcyIsInN0YXRlbWVudCIsImJvb2ttYXJrIiwibGlzdEJ5IiwiTElTVF9CWSIsIndhcm4iLCJmaW5kQnkiLCJ2YWx1ZSIsIkZJTkRfQlkiLCJmaW5kT25lQnkiLCJGSU5EX09ORV9CWSIsImZpbmQiLCJPcmRlckRpcmVjdGlvbiIsIkFTQyIsIkZJTkQiLCJQQUdFIiwiY3R4IiwiUGVyc2lzdGVuY2VLZXlzIiwiU1RBVEVNRU5UIiwiY2FsbEFyZ3MiLCJzbGljZSIsInBhcnNlIiwiZGVjb2RlIiwiZXZhbHVhdGVUcmFuc2FjdGlvbiIsImh5ZHJhdGVkIiwiciIsIkNvdWNoREJLZXlzIiwiVEFCTEUiLCJkIiwiYXBwbHlBZnRlclJlYWQiLCJnZXRPclVuZGVmaW5lZCIsImVuZm9yY2VEQkRlY29yYXRvcnMiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkFGVEVSIiwiUHJvbWlzZSIsImFsbCIsImVudHJ5IiwiY291bnRPZiIsIkNPVU5UX09GIiwic3RtdEFyZ3MiLCJtYXhPZiIsIk1BWF9PRiIsIm1pbk9mIiwiTUlOX09GIiwiYXZnT2YiLCJBVkdfT0YiLCJzdW1PZiIsIlNVTV9PRiIsImRpc3RpbmN0T2YiLCJESVNUSU5DVF9PRiIsImdyb3VwT2YiLCJHUk9VUF9PRiIsImhlYWx0aGNoZWNrIiwiY3JlYXRlIiwibW9kZWwiLCJkZWJ1ZyIsImVuc3VyZUxlZ2FjeU1pcnJvckZsYWciLCJwcmVwYXJlZCIsInJlY29yZCIsImlkIiwidHJhbnNpZW50IiwicmV2ZXJ0IiwidXBkYXRlIiwiY3JlYXRlQWxsUHJlZml4IiwibW9kZWxzIiwiQ1JFQVRFIiwiZ2V0IiwiaWdub3JlVmFsaWRhdGUiLCJPTiIsImlnbm9yZWRQcm9wcyIsImVycm9ycyIsImhhc0Vycm9ycyIsImVycm9yTWVzc2FnZXMiLCJyZWR1Y2VFcnJvcnNUb1ByaW50IiwiVmFsaWRhdGlvbkVycm9yIiwiY3JlYXRlQWxsIiwiaWRzIiwicGF5bG9hZHMiLCJ0cmFuc2llbnRzIiwiY3JlYXRlZCIsImkiLCJyZWFkQWxsIiwia2V5cyIsInJlY29yZHMiLCJ1cGRhdGVBbGwiLCJ1cGRhdGVkIiwidSIsImFjY3VtdWxhdGUiLCJsZWdhY3kiLCJFUkMyMFRva2VuIiwiQmFzZU1vZGVsIiwiX19kZWNvcmF0ZSIsInR5cGUiLCJjb2x1bW4iLCJyZXF1aXJlZCIsInRhYmxlIiwiRVJDMjBXYWxsZXQiLCJBbGxvd2FuY2UiLCJDbGllbnRTZXJpYWxpemVyIiwiSlNPTlNlcmlhbGl6ZXIiLCJwcmVTZXJpYWxpemUiLCJtb2RlbE5hbWUiLCJ0b1NlcmlhbGl6ZSIsIm1ldGFkYXRhIiwiTWV0YWRhdGEiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJNb2RlbEtleXMiLCJBTkNIT1IiLCJkZXNlcmlhbGl6ZSIsInN0ciIsImRlc2VyaWFsaXphdGlvbiIsImNsYXNzTmFtZSIsIkVycm9yIiwiYnVpbGQiLCJzZXJpYWxpemUiLCJGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkiLCJzZXJpYWxpemVyIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXBkYXRlT2JzZXJ2ZXJzIiwiZXZlbnQiLCJvYnNlcnZlckhhbmRsZXIiLCJjb3VudCIsInBhcnNlZElkIiwiU2VxdWVuY2UiLCJwYXJzZVZhbHVlIiwic2VxdWVuY2VGb3IiLCJ0b2tlbk5hbWUiLCJzeW1ib2wiLCJkZWNpbWFscyIsIk51bWJlciIsInRvdGFsU3VwcGx5IiwidG90YWwiLCJiYWxhbmNlT2YiLCJvd25lciIsImJhbGFuY2UiLCJ0cmFuc2ZlciIsInRvIiwidHJhbnNmZXJyZWQiLCJzdWJtaXRUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwidHJhbnNmZXJGcm9tIiwiZnJvbSIsImNvbnRleHRBcmdzIiwiQ29udGV4dCIsImFwcHJvdmUiLCJzcGVuZGVyIiwiYXBwcm92ZWQiLCJhbGxvd2FuY2UiLCJpbml0aWFsaXplIiwidG9rZW4iLCJpbml0aWxpYXplZCIsImNoZWNrSW5pdGlhbGl6ZWQiLCJtaW50IiwiYW1vdW50IiwiYnVybiIsImJ1cm5Gcm9tIiwiYWNjb3VudCIsImNsaWVudEFjY291bnRCYWxhbmNlIiwic2VyaWFsaXplZEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiZXh0cmFjdElkcyIsImNvbXBvc2VkIiwicGtQcm9wcyIsImV4dHJhY3RJZCIsImNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSIsIklkZW50aXR5Q3JlZGVudGlhbHMiLCJkZXNjcmlwdGlvbiIsIkZhYnJpY01vZGVsS2V5cyIsIklkZW50aXR5VHlwZSIsIkZhYnJpY0ZsYXZvdXIiLCJJZGVudGl0eSIsIlg1MDkiLCJvbmVUb09uZSIsIkNhc2NhZGUiLCJDQVNDQURFIiwiZGVsZXRlIiwiQ29yZVV0aWxzIiwibG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbnRlbnRPZkxvYWRGaWxlIiwiY29udGVudE9yUGF0aCIsImZpbGVSZWFkZXIiLCJVaW50OEFycmF5IiwibWF0Y2giLCJyZWFkRmlsZSIsInByb21pc2VzIiwibm9ybWFsaXplSW1wb3J0IiwiaW1wb3J0IiwiZ2V0Q0FVc2VyIiwidXNlck5hbWUiLCJwcml2YXRlS2V5IiwiY2VydGlmaWNhdGUiLCJvcHRpb25zIiwic3RyaW5nRm9ybWF0IiwidXNlciIsIlVzZXIiLCJjb25maWciLCJoc20iLCJzb2Z0d2FyZSIsImxpYiIsImxpYnJhcnkiLCJzbG90IiwibGFiZWwiLCJ0b2tlbkxhYmVsIiwicGluIiwiY3J5cHRvU3VpdGUiLCJnZXRDcnlwdG9TdWl0ZSIsInNldENyeXB0b1N1aXRlIiwiZW5yb2xsbWVudEtleSIsImdldEhTTUVucm9sbG1lbnRLZXkiLCJnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkiLCJzZXRFbnJvbGxtZW50IiwibmV3Q3J5cHRvU3VpdGUiLCJjcmVhdGVLZXlGcm9tUmF3Iiwic2tpIiwia2V5SWRIZXgiLCJ0cmltIiwiQnVmZmVyIiwiZ2V0Q2VydGlmaWNhdGVTS0kiLCJnZXRLZXkiLCJpc1ByaXZhdGUiLCJ4NTA5IiwiWDUwOUNlcnRpZmljYXRlIiwiandrIiwicHVibGljS2V5IiwiZXhwb3J0IiwiZm9ybWF0IiwicHJlZml4IiwieCIsInkiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiY29uY2F0IiwiZGlnZXN0IiwiZ2V0SWRlbnRpdHkiLCJjZXJ0RGlyZWN0b3J5UGF0aCIsImlkZW50aXR5RmlsZVJlYWRlciIsImNlcnRQYXRoIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZSIsImNyZWRlbnRpYWxzIiwiZGlyUGF0aCIsInJlYWRkaXIiLCJnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCIsImdldEZpbGVDb250ZW50IiwiZ2V0U2lnbmVyIiwia2V5RGlyZWN0b3J5UGF0aCIsInNpZ25lckZpbGVSZWFkZXIiLCJrZXlQYXRoIiwicHJpdmF0ZUtleVBlbSIsImV4dHJhY3RQcml2YXRlS2V5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiayIsInNpZ25lcnMiLCJuZXdQcml2YXRlS2V5U2lnbmVyIiwicGVtIiwibGliTmFtZSIsInN1YnRsZSIsImdsb2JhbFRoaXMiLCJ3aW5kb3ciLCJDcnlwdG8iLCJ3ZWJjcnlwdG8iLCJzdHIyYWIiLCJidWYiLCJBcnJheUJ1ZmZlciIsImJ1ZlZpZXciLCJzdHJMZW4iLCJjaGFyQ29kZUF0IiwicmVwbGFjZUFsbCIsImRlY29kZWQiLCJiaW5hcnlEZXIiLCJpbXBvcnRLZXkiLCJuYW1lZEN1cnZlIiwiZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQiLCJjZXJ0IiwieDUwOUNlcnRpZmljYXRlIiwiWDUwOUNlcnQiLCJha2lFeHQiLCJleHRlbnNpb25zIiwiYWtpIiwidG9VcHBlckNhc2UiLCJzdGFydHNXaXRoIiwic2VyaWFsIiwic2VyaWFsTnVtYmVyIiwiY3J5cHRvUHJvdmlkZXIiLCJzZXQiLCJCQVNFX0FMUEhBQkVUIiwiQ1JZUFRPIiwiQmFzZUVuY29kZXIiLCJhbHBoYWJldCIsImJhc2VNYXAiLCJqIiwiY2hhckF0IiwieGMiLCJiYXNlIiwibGVhZGVyIiwiZmFjdG9yIiwiTWF0aCIsImlGYWN0b3IiLCJlbmNvZGUiLCJzb3VyY2UiLCJpc1ZpZXciLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInplcm9lcyIsInBiZWdpbiIsInBlbmQiLCJiNTgiLCJjYXJyeSIsIml0MSIsIml0MiIsInJlcGVhdCIsImRlY29kZVVuc2FmZSIsInBzeiIsImIyNTYiLCJpdDMiLCJpdDQiLCJ2Y2giLCJDcnlwdG9VdGlscyIsImI1OGVuY29kZXIiLCJCQVNFNTgiLCJmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZSIsInN1YmplY3QiLCJpc3N1ZXIiLCJzdHJpbmdUb0FycmF5QnVmZmVyIiwiZXh0cmFjdEtleSIsInVzYWdlcyIsIlJlZ0V4cCIsImV4dHJhY3RQdWJsaWNLZXkiLCJzaWduIiwiYnVmZiIsImhhc2giLCJiIiwicGFkU3RhcnQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJlbmNyeXB0IiwiZ2V0U3VidGxlQ3J5cHRvIiwiaXNCcm93c2VyIiwiZGVjcnlwdCIsImdldE1hc3RlciIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJnZW5HZW5lc2lzIiwicmFuZG9tVVVJRCIsImltcG9ydGVkS2V5IiwiS0VZX0FMR09SWVRITSIsIml2IiwiZ2V0RGVyaXZhdGlvbktleSIsInNhbHQiLCJzYWx0QnVmZmVyIiwic2FsdEhhc2hlZCIsInBhcmFtcyIsIkhBU0giLCJpdGVyYXRpb25zIiwiSVRFUkFUSU9OUyIsImRlcml2YXRpb24iLCJkZXJpdmVCaXRzIiwiS0VZTEVOR1RIIiwiaXZsZW4iLCJrZXlsZW4iLCJkZXJpdmVkS2V5IiwiaW1wb3J0ZWRFbmNyeXB0aW9uS2V5IiwiQUxHT1JZVEhNIiwiZW5jcnlwdFBpbiIsInRleHQiLCJrZXlPYmplY3QiLCJ0ZXh0QnVmZmVyIiwiZW5jcnlwdGVkVGV4dCIsImRlY3J5cHRQaW4iLCJ0ZXh0RGVjb2RlciIsImRlY3J5cHRlZFRleHQiLCJIRkNBSWRlbnRpdHlUeXBlIiwiSEZDQUlkZW50aXR5QXR0cmlidXRlcyIsIkZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIiwiTG9nZ2VkQ2xhc3MiLCJjYUNvbmZpZyIsImNhTmFtZSIsImNhQ2VydCIsImNhS2V5IiwidXJsIiwiQ0EiLCJjYSIsInRscyIsInRydXN0ZWRSb290cyIsInJvb3QiLCJGYWJyaWNDQVNlcnZpY2VzIiwiQ2xpZW50IiwiY2xpZW50IiwiQ2VydGlmaWNhdGUiLCJjZXJ0aWZpY2F0ZVNlcnZpY2UiLCJuZXdDZXJ0aWZpY2F0ZVNlcnZpY2UiLCJBZmZpbGlhdGlvbnMiLCJhZmZpbGlhdGlvblNlcnZpY2UiLCJuZXdBZmZpbGlhdGlvblNlcnZpY2UiLCJJZGVudGl0aWVzIiwiaWRlbnRpdHlTZXJ2aWNlIiwibmV3SWRlbnRpdHlTZXJ2aWNlIiwiZ2V0Q2VydGlmaWNhdGVzIiwicmVxdWVzdCIsImRvTWFwIiwicmVzcG9uc2UiLCJjZXJ0cyIsIlBFTSIsImdldElkZW50aXRpZXMiLCJpZGVudGl0aWVzU2VydmljZSIsImdldEFsbCIsImlkZW50aXRpZXMiLCJwYXJzZUVycm9yIiwicmVnZXhwIiwiZXhlYyIsIkNvbmZsaWN0RXJyb3IiLCJnZXRBZmZpbGlhdGlvbnMiLCJhIiwicmVhZCIsImVucm9sbG1lbnRJZCIsImdldE9uZSIsIk5vdEZvdW5kRXJyb3IiLCJzdWNjZXNzIiwicmVnaXN0ZXIiLCJpc1N1cGVyVXNlciIsImFmZmlsaWF0aW9uIiwidXNlclJvbGUiLCJhdHRycyIsIm1heEVucm9sbG1lbnRzIiwicmVnaXN0cmF0aW9uIiwicGFzc3dvcmQiLCJwcm9wcyIsImVucm9sbG1lbnRJRCIsImVucm9sbG1lbnRTZWNyZXQiLCJpbmZvIiwiaWRlbnRpdHlGcm9tRW5yb2xsbWVudCIsImVucm9sbG1lbnQiLCJyb290Q2VydGlmaWNhdGUiLCJMb2dnaW5nIiwiY2xpZW50SWQiLCJub3ciLCJEYXRlIiwidG9CeXRlcyIsImNyZWF0ZWRPbiIsInVwZGF0ZWRPbiIsImVucm9sbCIsImlkZW50aXR5IiwicmVnaXN0ZXJBbmRFbnJvbGwiLCJyZXZva2UiLCJyZWFzb24iLCJSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciIsImVycnMiLCJyb2xlIiwic2V0QWZmaWxpYXRpb24iLCJhZGRBdHRyIiwiYXR0ciIsInNldEF0dHJzIiwic2V0RW5yb2xsbWVudElEIiwic2V0RW5yb2xsbWVudFNlY3JldCIsInNldE1heEVucm9sbG1lbnRzIiwic2V0Um9sZSIsIm1pbmxlbmd0aCIsIm1pbiIsImlzU2hhcmVkIiwic2VncmVnYXRlIiwiaXNUcmFuc2llbnQiLCJkZWNvcmF0ZWRQcm9wZXJ0aWVzIiwiZ2V0QXR0cmlidXRlcyIsInRyYW5zaWVudFByb3BzIiwiREJLZXlzIiwiVFJBTlNJRU5UIiwicHJpdmF0ZVByb3BlcnRpZXMiLCJQUklWQVRFIiwic2hhcmVkUHJvcGVydGllcyIsIlNIQVJFRCIsInB1YmxpYyIsInRyYW5zaWVudEtleXMiLCJwcml2YXRlS2V5cyIsInNoYXJlZEtleXMiLCJpc1B1YmxpYyIsImJpbmQiLCJtaXJyb3JlZCIsIkZBQlJJQyIsIk1JUlJPUiIsIm93bmVyT2YiLCJtZXRhIiwiT1dORURfQlkiLCJzaGFyZWRLZXkiLCJjb25zdHIiLCJwcml2YXRlTWV0YSIsInNoYXJlZE1ldGEiLCJjb2xsZWN0aW9ucyIsImNoYWluY29kZU9mIiwiQ0hBSU5DT0RFIiwicG9wIiwiY29udHJhY3RPZiIsIkNPTlRSQUNUIiwiY2hhbm5lbE9mIiwiQ0hBTk5FTCIsIkVSQzIwRXZlbnRzIiwiRmFicmljQmFzZU1vZGVsIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0IiwidmVyc2lvbiIsInVzZXMiLCJGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsIiwiY3JlYXRlZEJ5IiwidXBkYXRlZEJ5IiwiRGVmYXVsdENvbnRyYWN0UmVzb2x2ZXIiLCJjb250cmFjdCIsImNoYWluY29kZSIsImNoYW5uZWwiLCJleHRyYWN0TXNwSWQiLCJnZXRNU1BJRCIsIk93bmVyIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZXNjcmlwdG9yIiwib3JpZ2luYWxNZXRob2QiLCJhY291bnRJZCIsImNsaWVudElkZW50aXR5IiwiZ2V0SUQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwiYXBwbHkiLCJvd25lZEJ5T25DcmVhdGUiLCJjb250ZXh0Iiwic3R1YiIsImNyZWF0b3IiLCJnZXRDcmVhdG9yIiwibXNwaWQiLCJzZXRPd25lZEJ5S2V5VmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIm93bmVkQnkiLCJhdHRyaWJ1dGUiLCJnZW5lcmF0ZWQiLCJyZWFkb25seSIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIiwiRGVjb3JhdGlvbiIsImRlZmluZSIsImRlY29yYXRvciIsInRyYW5zYWN0aW9uSWRPbkNyZWF0ZSIsImdldFR4SUQiLCJ0cmFuc2FjdGlvbklkIiwib25VcGRhdGUiLCJUUkFOU0FDVElPTl9JRCIsImV2YWxNaXJyb3JNZXRhZGF0YSIsImNyZWF0ZU1pcnJvckhhbmRsZXIiLCJmYWJyaWNDdHgiLCJzb3VyY2VNb2RlbCIsInB1dCIsInJlcG8iLCJtaXJyb3JDb2xsZWN0aW9uIiwidXBkYXRlTWlycm9ySGFuZGxlciIsImFwcGx5VXBkYXRlVmFsaWRhdGlvbiIsIm1lcmdlRm9yVXBkYXRlIiwiZGVsZXRlTWlycm9ySGFuZGxlciIsInBrUHJvcCIsInNlZ3JlZ2F0ZWQiLCJtaXJyb3JXcml0ZUd1YXJkIiwibXNwIiwiY29uZGl0aW9uIiwicmVhZE1pcnJvckhhbmRsZXIiLCJtYXRjaGVzIiwicmVhZEZyb20iLCJtc3BJZE9yQ29uZGl0aW9uIiwiaXNDb25kaXRpb25Pbmx5IiwiQm9vbGVhbiIsImNvbmQiLCJvblJlYWQiLCJwcmlvcml0eSIsIm9uRGVsZXRlIiwiTW9kZWxDb2xsZWN0aW9uIiwib3JnTmFtZSIsInRvUGFzY2FsQ2FzZSIsIk5hbWVzcGFjZUNvbGxlY3Rpb24iLCJuYW1lc3BhY2UiLCJJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uIiwiU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkiLCJhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MiLCJpc0Z1bGx5U2VncmVnYXRlZCIsImhhc1B1YmxpY1Byb3BlcnRpZXMiLCJtYXJrRnVsbHlTZWdyZWdhdGVkIiwiYXBwbHlNaXJyb3JGbGFncyIsImF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRNZXRhIiwiZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyIsImRhdGFBcnJheSIsImNvbGxlY3Rpb25SZXNvbHZlciIsImtleUFycmF5IiwicGtLZXkiLCJwa1NlcU5hbWUiLCJzZXF1ZW5jZU5hbWUiLCJpZFZhbHVlIiwiY2FuQnVpbGRQZXJJbnN0YW5jZSIsInNldFNlcXVlbmNlU2VncmVnYXRpb24iLCJwcm9wU2VxTmFtZSIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJfayIsImtleVN0cmluZ3MiLCJ3cml0ZVRvIiwic2VncmVnYXRlZERhdGFPblJlYWQiLCJzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIiwib2xkTW9kZWwiLCJzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIiwiaW5uZXJTZWdyZWdhdGVkIiwic2VncmVnYXRlZERlYyIsIlNldCIsImFkZCIsImNvbnN0ck1ldGEiLCJjb25zdHJDb2xsZWN0aW9ucyIsInVwZGF0ZWRUcmFuc2llbnRNZXRhIiwiZGVjcyIsInByb3BlcnRpZXMiLCJncm91cE5hbWUiLCJleHRyYWN0R3JvdXBOYW1lIiwiZGF0YUdyb3VwTmFtZSIsImVhcmx5RXh0cmFjdGlvbk1ldGEiLCJlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQiLCJncm91cCIsInByb3AiLCJvbiIsIkRCT3BlcmF0aW9ucyIsIkFMTCIsInByaXZhdGVEYXRhIiwic2hhcmVkRGF0YSIsInNvcnRLZXlzT25seVJlY3Vyc2l2ZSIsInNvcnQiLCJyZWR1Y2UiLCJhY2MiLCJEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsImVycm9yIiwic2VsZiIsIm8iLCJyZWxhdGlvbnMiLCJnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSIsInBhcnNlRXZlbnROYW1lIiwicGFydHMiLCJzcGxpdCIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIlNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIiwicHV0QW5jaG9yIiwicHJlU2VyaWFsaXphdGlvbiIsIkZhYnJpY0lkZW50aXR5U2VydmljZSIsIkNsaWVudEJhc2VkU2VydmljZSIsInJvb3RDbGllbnQiLCJfdXNlciIsImNlcnRpZmljYXRlcyIsImFmZmlsaWF0aW9ucyIsImdldFVzZXIiLCJjZmciLCJJTklUSUFMSVpBVElPTiIsImdldE5hbWUiLCJ1cGRhdGVJZGVudGl0eSIsImlkZW50aXR5UmVxdWVzdCIsImNhVXNlcklkZW50aXR5IiwicmVlbnJvbGxVc2VyIiwiY3JlYXRlVXNlciIsImdldE1zcGlkIiwiZW5yb2xsbWVudEF0dHJzIiwib3B0aW9uYWwiLCJyZWVucm9sbCIsInJlbmV3ZWRJZGVudGl0eSIsInJldm9rZU9wdGlvbnMiLCJyZXZva2VSZXF1ZXN0IiwiQ0FfUk9MRSIsIkRlZmF1bHRGYWJyaWNDbGllbnRGbGFncyIsImV2YWx1YXRlVGltZW91dCIsImVuZG9yc2VUaW1lb3V0Iiwic3VibWl0VGltZW91dCIsImNvbW1pdFRpbWVvdXQiLCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3MiLCJhbGxvd0dhdGV3YXlPdmVycmlkZSIsImFsbG93Q29udGV4dFRyYW5zaWVudE1hcCIsImVuY3J5cHRUcmFuc2llbnQiLCJzeW50aGV0aWNFdmVudHMiLCJjcmVhdGVQcml2YXRlS2V5IiwiQ0xJRU5UX09WRVJSSURFX0tFWVMiLCJGYWJyaWNDbGllbnRDb250ZXh0IiwidG9PdmVycmlkZXMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwib3JkZXJCeVNlbGVjdG9ycyIsIk9SREVSX0JZIiwidG9DYW1lbENhc2UiLCJwcm9jZXNzUmVjb3JkIiwicGtBdHRyIiwiSUQiLCJrZXlBcmdzIiwiU0VQQVJBVE9SIiwicmF3IiwicmF3SW5wdXQiLCJhZ2dyZWdhdG9yIiwiYWdncmVnYXRlSW5mbyIsImFnZ3JlZ2F0ZSIsImV4ZWN1dGVBZ2dyZWdhdGUiLCJyZXN1bHRzIiwicHJvY2Vzc2VkIiwiYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQiLCJhZ2dyZWdhdGVRdWVyeSIsImJ1aWxkQWdncmVnYXRlUXVlcnkiLCJzZWxlY3RvcnMiLCJzZWxlY3RvciIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiZXEiLCJzZWxlY3RvcktleXMiLCJDb3VjaERCR3JvdXBPcGVyYXRvciIsImluZGV4T2YiLCJ2YWwiLCJPUiIsInMiLCJlbnRyaWVzIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwiY2hhaW5jb2RlRm9yIiwiY2hhbm5lbEZvciIsImNvbnRyYWN0Rm9yIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsIm5ld0N0eCIsInBhcmVudENvbnRleHQiLCJjaGlsZENvbnRleHRzIiwiY3VycmVudE9wIiwiY3VycmVudE1vZGVsIiwicmVwb3NpdG9yeSIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZUFsbFByZWZpeCIsInNoaWZ0IiwiaGFzVHJhbnNpZW50IiwibmVlZHNGdWxsUGF5bG9hZCIsInNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbiIsInNlcmlhbGl6ZWRNb2RlbHMiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJDUkVBVEVfQUxMIiwiZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInJlcyIsInNob3VsZFJlZnJlc2hBZnRlcldyaXRlIiwiUkVBRF9BTEwiLCJVUERBVEVfQUxMIiwiZGVsZXRlQWxsIiwic2hvdWxkSHlkcmF0ZSIsIkRFTEVURV9BTEwiLCJNRVRBREFUQSIsIm1pcnJvck1zcCIsIm1zcHMiLCJtZXJnZWQiLCJlbmRvcnNpbmdPcmdzIiwiZW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50IiwidiIsImNoaWxkUmVidWlsZCIsImdldEZyb21DaGlsZHJlbiIsInJlc29sdmVkT3AiLCJyZXNvbHZlT3BlcmF0aW9uIiwiaGFzSWQiLCJpbmplY3RUcmFuc2llbnRPdmVycmlkZXMiLCJ0cmFuc2llbnREYXRhIiwiaGFzVHJhbnNpZW50RGF0YSIsImhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhIiwic2hvdWxkSW5qZWN0IiwiT1ZFUlJJREVTIiwiaXRlbSIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsIkNvbnRyYWN0IiwiY2xhenpPckNvbnRyYWN0TmFtZSIsImdldENvbnRyYWN0IiwidHJhbnNhY3Rpb24iLCJhcGkiLCJzdWJtaXQiLCJzaG91bGRVc2VMZWdhY3lHYXRld2F5IiwibGVnYWN5QXJncyIsInByZXBhcmVMZWdhY3lBcmdzIiwidHJhbnNpZW50TWFwIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJwZWVyQ29uZmlncyIsImJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MiLCJzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMiLCJnYXRld2F5IiwiZ2V0Q29udHJhY3ROYW1lIiwiZXZhbHVhdGUiLCJub3JtYWxpemVkQXJncyIsIm5vcm1hbGl6ZVRyYW5zYWN0aW9uQXJndW1lbnQiLCJ0cmFuc2llbnRFbnRyaWVzIiwicHJvcG9zYWxPcHRpb25zIiwiYXJndW1lbnRzIiwiY2xvc2UiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwicGVlcnMiLCJwZWVyRW5kcG9pbnQiLCJwZWVySG9zdEFsaWFzIiwidGxzQ2VydCIsImVuZG9yc2VycyIsIm9yZyIsImV4dHJhcyIsIm1zcE1hcCIsImxlZ2FjeUNvdW50Iiwic2VsZWN0aW9ucyIsImNob2ljZSIsImVuZHBvaW50IiwiZmNuIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwiY2hhaW5jb2RlTmFtZSIsImNvbnRyYWN0TmFtZSIsIm5ldHdvcmsiLCJnZXROZXR3b3JrIiwiY3JlYXRlVHJhbnNhY3Rpb24iLCJzZXRUcmFuc2llbnQiLCJwZWVyIiwiZ2V0Q2hhbm5lbCIsImdldEVuZG9yc2VyIiwiZW5kb3JzZXIiLCJzZXRFbmRvcnNpbmdQZWVycyIsImRpc2Nvbm5lY3QiLCJkZWR1cGVkIiwiTWFwIiwiYWRkUGVlciIsImhhcyIsInJlYWRQZW1JbnB1dCIsImNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIiwia2V5Q2VydE9yRGlyZWN0b3J5UGF0aCIsInBlZXJFbnRyaWVzIiwiY2hhbm5lbFBlZXJzIiwib3JncyIsInRsc1BlbSIsImhvc3RuYW1lIiwiZXh0cmFjdEhvc3QiLCJlbnN1cmVHcnBjVXJsIiwidGxzQ0FDZXJ0cyIsImdycGNPcHRpb25zIiwiaG9zdG5hbWVPdmVycmlkZSIsImVuZG9yc2luZ1BlZXIiLCJjaGFpbmNvZGVRdWVyeSIsImxlZGdlclF1ZXJ5IiwiZXZlbnRTb3VyY2UiLCJvcmdhbml6YXRpb24iLCJvcmdhbml6YXRpb25zIiwib3JkZXJlcnMiLCJjaGFubmVscyIsImV2ZXJ5IiwiaXNMb2NhbEVuZHBvaW50IiwiaG9zdCIsInNhbml0aXplZCIsImlzQnVmZmVyIiwidHJpbW1lZCIsInN0YXRzIiwic3RhdCIsImNhdGNoIiwiaXNEaXJlY3RvcnkiLCJyZWFkRnNGaWxlIiwiZXJyIiwibWlncmF0ZSIsInJlZmVyZW5jZSIsImxhc3QiLCJwcm92aWRlZEN0eCIsIm1pZ3JhdGlvbkFyZ3MiLCJNSUdSQVRJT04iLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|