@decaf-ts/for-fabric 0.4.9 → 0.5.1-query
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 +18 -6
- package/dist/for-fabric.js +18 -6
- package/lib/contract/models/BaseModel.cjs +3 -3
- package/lib/contract/models/OtherProductShared.cjs +2 -3
- package/lib/contract/models/history-dec.cjs +15 -29
- package/lib/contracts/ContractAdapter.cjs +59 -39
- package/lib/contracts/ContractContext.cjs +10 -3
- package/lib/contracts/FabricContractSequence.cjs +114 -13
- package/lib/contracts/FabricContractSequence.d.ts +6 -0
- package/lib/contracts/crud/serialized-crud-contract.cjs +1 -1
- package/lib/esm/contract/models/BaseModel.js +3 -3
- package/lib/esm/contract/models/OtherProductShared.js +3 -4
- package/lib/esm/contract/models/history-dec.js +17 -31
- package/lib/esm/contracts/ContractAdapter.js +59 -39
- package/lib/esm/contracts/ContractContext.js +10 -3
- package/lib/esm/contracts/FabricContractSequence.d.ts +6 -0
- package/lib/esm/contracts/FabricContractSequence.js +114 -13
- package/lib/esm/contracts/crud/serialized-crud-contract.js +1 -1
- package/lib/esm/shared/decorators.js +27 -7
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/shared/decorators.cjs +27 -7
- package/lib/version.cjs +1 -1
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/for-fabric.cjs
CHANGED
|
@@ -1540,9 +1540,11 @@
|
|
|
1540
1540
|
}
|
|
1541
1541
|
async function ownedByOnCreate(context, data, key, model) {
|
|
1542
1542
|
const {stub: stub} = context;
|
|
1543
|
-
const allowGenerationOverride = context.
|
|
1543
|
+
const allowGenerationOverride = context.getOrUndefined("allowGenerationOverride") || false;
|
|
1544
1544
|
const creator = await stub.getCreator();
|
|
1545
|
-
|
|
1545
|
+
let owner = creator.mspid;
|
|
1546
|
+
context.log.info(`Expected mspid to be ${model[key]} | ${owner}. \n Using allowGenerationOverride: ${allowGenerationOverride}`);
|
|
1547
|
+
if (allowGenerationOverride) owner = model[key] ? model[key] : owner;
|
|
1546
1548
|
const setOwnedByKeyValue = function(target, propertyKey, value) {
|
|
1547
1549
|
Object.defineProperty(target, propertyKey, {
|
|
1548
1550
|
enumerable: true,
|
|
@@ -1784,8 +1786,18 @@
|
|
|
1784
1786
|
}
|
|
1785
1787
|
}
|
|
1786
1788
|
applySegregationFlags(model, collections, context);
|
|
1787
|
-
const
|
|
1788
|
-
|
|
1789
|
+
const keyArray = Array.isArray(keys) ? keys : [ keys ];
|
|
1790
|
+
const pkKey = decoratorValidation.Model.pk(model.constructor);
|
|
1791
|
+
const pkSeqName = decoratorValidation.Model.sequenceName(model, "pk");
|
|
1792
|
+
const idValue = model[pkKey];
|
|
1793
|
+
const canBuildPerInstance = typeof idValue !== "undefined" && idValue !== null;
|
|
1794
|
+
context.setSequenceSegregation(pkSeqName, context.isFullySegregated, collections);
|
|
1795
|
+
if (canBuildPerInstance) {
|
|
1796
|
+
for (const k of keyArray) {
|
|
1797
|
+
const propSeqName = decoratorValidation.Model.sequenceName(model, String(idValue), String(k));
|
|
1798
|
+
context.setSequenceSegregation(propSeqName, context.isFullySegregated, collections);
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1789
1801
|
}
|
|
1790
1802
|
async function segregatedDataOnCreate(context, data, keys, model) {
|
|
1791
1803
|
const dataArray = Array.isArray(data) ? data : [ data ];
|
|
@@ -3685,7 +3697,7 @@
|
|
|
3685
3697
|
}
|
|
3686
3698
|
}
|
|
3687
3699
|
if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
|
|
3688
|
-
const VERSION = "0.
|
|
3700
|
+
const VERSION = "0.5.1";
|
|
3689
3701
|
const PACKAGE_NAME = "@decaf-ts/for-fabric";
|
|
3690
3702
|
decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
3691
3703
|
exports.AllowanceError = AllowanceError;
|
|
@@ -3775,4 +3787,4 @@
|
|
|
3775
3787
|
exports.writeDesignDocs = writeDesignDocs;
|
|
3776
3788
|
exports.writeIndexes = writeIndexes;
|
|
3777
3789
|
});
|
|
3778
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY29udHJhY3RzL2VyYzIwL21vZGVscy50cyIsIi4uL3NyYy9zaGFyZWQvQ2xpZW50U2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvZXJjMjAvRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnRzIiwiLi4vc3JjL2NsaWVudC9pZHMvaWQtZXh0cmFjdGlvbi50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvSWRlbnRpdHlDcmVkZW50aWFscy50cyIsIi4uL3NyYy9zaGFyZWQvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eS50cyIsIi4uL3NyYy9jbGllbnQvdXRpbHMudHMiLCIuLi9zcmMvY2xpZW50L2NyeXB0by50cyIsIi4uL3NyYy9zaGFyZWQvZXJyb3JzLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgSW5kZXggPSBDcmVhdGVJbmRleFJlcXVlc3Q7XG5cbmZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG4gIGNvbnN0IGRpcm5hbWU6IHN0cmluZyA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGRpcm5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGRpcm5hbWUpO1xuICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vZGVsSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPlxuKTogSW5kZXhbXSB7XG4gIHJldHVybiBnZW5lcmF0ZUluZGV4ZXMoW21dKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBhY2N1bT86IFJlY29yZDxzdHJpbmcsIENvdWNoREJEZXNpZ25Eb2M+XG4pOiBDb3VjaERCRGVzaWduRG9jW10ge1xuICBjb25zdCB2aWV3cyA9IGdlbmVyYXRlVmlld3MoW21dKTtcbiAgY29uc3Qgc3RvcmFnZTogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz4gPSBhY2N1bSB8fCB7fTtcbiAgdmlld3MuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgc3RvcmFnZVtkb2MuX2lkXSA9IGRvYztcbiAgfSk7XG4gIHJldHVybiB2aWV3cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNb2RlbEZpbGUoZmlsZTogYW55KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZXhwb3J0cyA9IHJlcXVpcmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGZpbGUucGFyZW50UGF0aCwgZmlsZS5uYW1lKSk7XG5cbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhleHBvcnRzKS5maWx0ZXIoKGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbSA9IG5ldyAoZSBhcyBDb25zdHJ1Y3RvcikoKTtcbiAgICAgIHJldHVybiBtIGluc3RhbmNlb2YgTW9kZWw7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kZWxGb2xkZXJzKFxuICAuLi5mb2xkZXJzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTxNb2RlbENvbnN0cnVjdG9yPGFueT5bXT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IGZpbGVzID0gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhmb2xkZXIsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGY6IGFueSkgPT4gZi5pc0ZpbGUoKSAmJiBmLm5hbWUuZW5kc1dpdGgoXCJqc1wiKSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5yZWFkTW9kZWxGaWxlKGZpbGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW5kZXhlcyhcbiAgaW5kZXhlczogSW5kZXhbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1pbmRleGVzLyR7aW5kZXgubmFtZX0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGluZGV4LCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlc2lnbkRvY3MoXG4gIGRlc2lnbkRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIGlmICghZGVzaWduRG9jcy5sZW5ndGgpIHJldHVybjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBkZXNpZ25Eb2NzLmZvckVhY2goKGRvYykgPT4ge1xuICAgIGNvbnN0IGRvY0lkID0gZG9jLl9pZC5yZXBsYWNlKC9eX2Rlc2lnblxcLy8sIFwiXCIpO1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1kZXNpZ25fZG9jcy8ke2RvY0lkfS5qc29uYFxuICAgICAgKVxuICAgICk7XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IC4uLmRvYyB9O1xuICAgIGRlbGV0ZSBwYXlsb2FkLl9yZXY7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQ291Y2hEQkRlc2lnbkRvYyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgd3JpdGVEZXNpZ25Eb2NzIH0gZnJvbSBcIi4uL2luZGV4ZXMvZ2VuZXJhdGlvblwiO1xuXG4vL1xuLy8gZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbi8vICAgbmFtZTogXCJjb2xsZWN0aW9uTWFyYmxlc1wiO1xuLy8gICBwb2xpY3k6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgcmVxdWlyZWRQZWVyQ291bnQ6IDA7XG4vLyAgIG1heFBlZXJDb3VudDogMztcbi8vICAgYmxvY2tUb0xpdmU6IDA7XG4vLyAgIG1lbWJlck9ubHlSZWFkOiB0cnVlO1xuLy8gICBtZW1iZXJPbmx5V3JpdGU6IHRydWU7XG4vLyAgIGVuZG9yc2VtZW50UG9saWN5OiB7XG4vLyAgICAgaWRlbnRpdGllczogW1xuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzFNU1BcIiB9IH0sXG4vLyAgICAgICB7IHJvbGU6IHsgbmFtZTogXCJtZW1iZXJcIjsgbXNwSWQ6IFwiT3JnMk1TUFwiIH0gfSxcbi8vICAgICBdO1xuLy8gICAgIHJ1bGU6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgfTtcbi8vIH07XG5cbmV4cG9ydCB0eXBlIEZhYnJpY1BvbGljeUlkZW50aXR5ID0ge1xuICByb2xlOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1zcElkOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k6IHtcbiAgICBpZGVudGl0aWVzOiBGYWJyaWNQb2xpY3lJZGVudGl0eVtdO1xuICAgIHJ1bGU6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFByaXZhdGVDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k/OiB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdGlvbkZvcihcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcG9saWN5OiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbixcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgcG9saWN5OiBwb2xpY3ksXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICBtc3BJZDogc3RyaW5nLFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gYCR7bXNwSWR9UHJpdmF0ZWAsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDAsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCcke21zcElkfS5tZW1iZXInKWAsXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZVxuICApO1xuXG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgT1IoJyR7bXNwSWR9LnBlZXInKWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgbXNwSWRzOiBzdHJpbmdbXSxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlciA9IDEsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyID0gMixcbiAgYmxvY2tUb0xpdmU6IG51bWJlciA9IDAsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuID0gdHJ1ZSxcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuID0gdHJ1ZVxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICBjb25zdCBjID0gY29sbGVjdGlvbkZvcihcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBgT1IoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ubWVtYmVyJ2ApLmpvaW4oXCIsXCIpfSlgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcbiAgYy5lbmRvcnNlbWVudFBvbGljeSA9IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IGBBTkQoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ucGVlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgfTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0Q29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkczogc3RyaW5nW10sXG4gIG92ZXJyaWRlczoge1xuICAgIHByaXZhdGVDb2xzPzogUGFydGlhbDxQcml2YXRlQ29sbGVjdGlvbj47XG4gICAgc2hhcmVkQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICB9ID0ge30sXG4gIG1pcnJvcjogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgbGV0IHsgcHJpdmF0ZUNvbHMsIHNoYXJlZENvbHMgfSA9IE1vZGVsLmNvbGxlY3Rpb25zRm9yKG0pO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVDb2xsZWN0aW9uKGFyZzogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHJldHVybiBhcmc7XG4gICAgICByZXR1cm4gYXJnKG0sIG1zcElkc1swXSkgYXMgc3RyaW5nO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGVDb2xzID0gcHJpdmF0ZUNvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcbiAgc2hhcmVkQ29scyA9IHNoYXJlZENvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcblxuICBjb25zdCBwcml2YXRlRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAwLFxuICAgICAgbWF4UGVlckNvdW50OiAwLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8ucHJpdmF0ZUNvbHMgfHwge31cbiAgKTtcbiAgY29uc3Qgc2hhcmVkRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAxLFxuICAgICAgbWF4UGVlckNvdW50OiAyLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8uc2hhcmVkQ29scyB8fCB7fVxuICApO1xuXG4gIGNvbnN0IG1pcnJvck1ldGEgPSBtaXJyb3IgPyBNb2RlbC5taXJyb3JlZEF0KG0pIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHByaXZhdGVzID0gbXNwSWRzXG4gICAgLm1hcCgobXNwSWQpID0+XG4gICAgICAocHJpdmF0ZUNvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgICBwcml2YXRlRGVmYXVsdHM7XG4gICAgICAgIHJldHVybiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgICAgICAgICBtc3BJZCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgICAgICBibG9ja1RvTGl2ZSxcbiAgICAgICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApXG4gICAgLmZsYXQoKTtcblxuICBpZiAobWlycm9yTWV0YSAmJiBtaXJyb3JNZXRhLm1zcElkKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPVxuICAgICAgdHlwZW9mIG1pcnJvck1ldGEucmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtaXJyb3JNZXRhLnJlc29sdmVyXG4gICAgICAgIDogbWlycm9yTWV0YS5yZXNvbHZlcihtLCBtaXJyb3JNZXRhLm1zcElkKTtcbiAgICBpZiAoXG4gICAgICByZXNvbHZlZCAmJlxuICAgICAgIXByaXZhdGVzLnNvbWUoXG4gICAgICAgIChwKSA9PiBwLm5hbWUgPT09IHJlc29sdmVkICYmIHAucG9saWN5LmluY2x1ZGVzKG1pcnJvck1ldGEubXNwSWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgcHJpdmF0ZXMucHVzaChcbiAgICAgICAgcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbWlycm9yTWV0YS5tc3BJZCxcbiAgICAgICAgICByZXNvbHZlZCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzaGFyZWQgPSAoc2hhcmVkQ29scyBhcyBzdHJpbmdbXSkubWFwKChwKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlLFxuICAgIH0gPSBzaGFyZWREZWZhdWx0cztcbiAgICByZXR1cm4gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgICAgIG1zcElkcyxcbiAgICAgIHAsXG4gICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICBtZW1iZXJPbmx5V3JpdGVcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVzLFxuICAgIHNoYXJlZCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbnMoXG4gIGNvbHM6IFByaXZhdGVDb2xsZWN0aW9uW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGZpbGVOYW1lID0gXCJjb2xsZWN0aW9uc19jb25maWdcIlxuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpIGFzIHN0cmluZztcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG4gIH1cblxuICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihwLCBgLi9NRVRBLUlORi8ke2ZpbGVOYW1lfS5qc29uYCkpO1xuICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoY29scywgdW5kZWZpbmVkLCAyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzKFxuICBkb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRvY3M/Lmxlbmd0aCkgcmV0dXJuO1xuICB3cml0ZURlc2lnbkRvY3MoZG9jcywgcCwgY29sbGVjdGlvbik7XG59XG4iLCJpbXBvcnQge1xuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBhZ2luYXRvcixcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFNlcmlhbGl6ZWRQYWdlLFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIE1bXSxcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGJvb2ttYXJrPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgcXVlcnk6IE1hbmdvUXVlcnkgfCBQcmVwYXJlZFN0YXRlbWVudDxhbnk+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBgUmF3IHF1ZXJ5IGFjY2VzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuIG9ubHkgcHJlcGFyZWQgc3RhdGVtZW50cyBhcmUgbmF0aXZlbHkgYXZhaWxhYmxlYFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBwYWdlKFxuICAgIHBhZ2U6IG51bWJlciA9IDEsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gc3VwZXIucGFnZShwYWdlLCAuLi5hcmdzKTsgLy8gdGhpcyB3aWxsIGZhaWwgZm9yIG5vbi1wcmVwYXJlZCBzdGF0ZW1lbnRzXG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgaXNTZXJpYWxpemVkUGFnZShvYmo6IFNlcmlhbGl6ZWRQYWdlPGFueT4gfCBhbnkpIHtcbiAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmVDb250ZXh0dWFsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBDb250ZXh0T2YsXG4gIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBGbGFnc09mLFxuICBPYnNlcnZlckhhbmRsZXIsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQYWdpbmF0b3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBSZXBvc2l0b3J5LFxuICBTZXJpYWxpemVkUGFnZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgRmFicmljIGNsaWVudCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBnZW5lcmljIFJlcG9zaXRvcnkgdG8gcHJlcGFyZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIENSVUQgb3BlcmF0aW9ucyBleGVjdXRlZCB2aWEgYSBGYWJyaWMgY2xpZW50IEFkYXB0ZXIsIHdpcmluZyBSZXBvc2l0b3J5RmxhZ3MgYW5kIEZhYnJpYy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gKiBAdGVtcGxhdGUgTSBleHRlbmRzIE1vZGVsIC0gVGhlIG1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHJlcG9zaXRvcnlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIE1hbmdvUXVlcnksIEZhYnJpY0ZsYWdzLCBDb250ZXh0PEZhYnJpY0ZsYWdzPj59IFthZGFwdGVyXSAtIE9wdGlvbmFsIGFkYXB0ZXIgaW5zdGFuY2UgdXNlZCB0byBleGVjdXRlIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSByZXBvc2l0b3J5XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItZmFicmljXCI7XG4gKlxuICogY2xhc3MgVXNlciBleHRlbmRzIE1vZGVsIHsgaWQhOiBzdHJpbmc7IG5hbWUhOiBzdHJpbmc7IH1cbiAqIGNvbnN0IHJlcG8gPSBuZXcgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxVc2VyPigpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgaWQ6IFwiMVwiLCBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgbG9hZGVkID0gYXdhaXQgcmVwby5yZWFkKFwiMVwiKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5SZXBvOiBjcmVhdGVQcmVmaXgobW9kZWwsIC4uLmFyZ3MpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcmVzdWx0XG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlciA9IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4+IGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBBPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBfb3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXJbXCJfb3ZlcnJpZGVzXCJdLCB7XG4gICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICBhbGxvd1Jhd1N0YXRlbWVudHM6IGZhbHNlLFxuICAgIGZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXM6IHRydWUsXG4gICAgZm9yY2VQcmVwYXJlQ29tcGxleFF1ZXJpZXM6IHRydWUsXG4gICAgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGU6IGZhbHNlLFxuICAgIHJlYnVpbGRXaXRoVHJhbnNpZW50OiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIGZvcmNlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eiwgZm9yY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8RmxhZ3NPZjxDb250ZXh0T2Y8QT4+Pik6IHRoaXMge1xuICAgIHJldHVybiBzdXBlclxuICAgICAgLm92ZXJyaWRlKE9iamVjdC5hc3NpZ24oe30sIGZsYWdzLCB0aGlzLl9vdmVycmlkZXMpKVxuICAgICAgLmZvcihmbGFncyBhcyBhbnkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBzdXBlci5PYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHBhZ2luYXRlQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbixcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2luYXRlQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luYXRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggcGFnZSBzaXplICR7cmVmLmxpbWl0fWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnaW5hdGVCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgb3JkZXIsXG4gICAgICB7IGxpbWl0OiByZWYubGltaXQsIG9mZnNldDogcmVmLm9mZnNldCwgYm9va21hcms6IHJlZi5ib29rbWFyayB9LFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBsaXN0QnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmxpc3RCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgbGlzdGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgJHtrZXkgYXMgc3RyaW5nfSAke29yZGVyfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmxpc3RCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgb3JkZXIsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZEJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIGFsbCAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZEJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kT25lQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmRPbmVCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBPbmUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggJHtrZXkgYXMgc3RyaW5nfSAke3ZhbHVlfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmRPbmVCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZChcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5IGRlZmF1bHQgcXVlcnkgYXR0cmlidXRlc2BcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmQubmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgb3JkZXIsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcGFnZShcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5IGRlZmF1bHQgcXVlcnkgYXR0cmlidXRlc2BcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2UubmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgcmVmLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHN0YXRlbWVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULCB0cnVlKVxuICAgICkuZm9yKHRoaXMuc3RhdGVtZW50KTtcbiAgICBsb2cudmVyYm9zZShgRXhlY3V0aW5nIHByZXBhcmVkIHN0YXRlbWVudCAke25hbWV9YCk7XG4gICAgY29uc3QgY2FsbEFyZ3MgPSBjdHhBcmdzLnNsaWNlKDAsIC0xKTtcbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKFxuICAgICAgdGhpcy5hZGFwdGVyLmRlY29kZShcbiAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgY3R4LFxuICAgICAgICAgIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsXG4gICAgICAgICAgW25hbWUsIEpTT04uc3RyaW5naWZ5KGNhbGxBcmdzKV0sXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0aGlzLmNsYXNzLm5hbWVcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+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+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cbiIsImltcG9ydCBGYWJyaWNDQVNlcnZpY2VzIGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQge1xuICBBZmZpbGlhdGlvblNlcnZpY2UsXG4gIElkZW50aXR5U2VydmljZSxcbiAgSUVucm9sbFJlc3BvbnNlLFxuICBJUmVnaXN0ZXJSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBDQUNvbmZpZywgQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvbW9kZWwvSWRlbnRpdHlcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4uL2NyeXB0b1wiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGVSZXNwb25zZSxcbiAgRmFicmljSWRlbnRpdHksXG4gIEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gIElkZW50aXR5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi9zaGFyZWQvZmFicmljLXR5cGVzXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcywgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIeXBlcmxlZGdlciBGYWJyaWMgQ0EgaWRlbnRpdHkgdHlwZXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgcmVjb2duaXplZCBieSBGYWJyaWMgQ0EgZm9yIHJlZ2lzdHJhdGlvbiBhbmQgaWRlbnRpdHkgbWFuYWdlbWVudC5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGVudW0gSEZDQUlkZW50aXR5VHlwZSB7XG4gIFBFRVIgPSBcInBlZXJcIixcbiAgT1JERVJFUiA9IFwib3JkZXJlclwiLFxuICBDTElFTlQgPSBcImNsaWVudFwiLFxuICBVU0VSID0gXCJ1c2VyXCIsXG4gIEFETUlOID0gXCJhZG1pblwiLFxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5L3ZhbHVlIGF0dHJpYnV0ZSB1c2VkIGR1cmluZyBDQSByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBlbnRyeSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIEZhYnJpYyBDQSBpZGVudGl0eSBkdXJpbmcgcmVnaXN0cmF0aW9uLCBvcHRpb25hbGx5IG1hcmtpbmcgaXQgZm9yIGluY2x1c2lvbiBpbiBlY2VydC5cbiAqIEBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VjZXJ0XSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGVucm9sbG1lbnQgY2VydGlmaWNhdGUgKEVDZXJ0KS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJS2V5VmFsdWVBdHRyaWJ1dGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGVjZXJ0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhbmRhcmQgRmFicmljIENBIGlkZW50aXR5IGF0dHJpYnV0ZSBrZXlzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB3ZWxsLWtub3duIEZhYnJpYyBDQSBhdHRyaWJ1dGUga2V5cyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBpZGVudGl0aWVzIGZvciBkZWxlZ2F0aW9ucyBhbmQgcGVybWlzc2lvbnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMge1xuICBIRlJFR0lTVFJBUlJPTEVTID0gXCJoZi5SZWdpc3RyYXIuUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJERUxFR0FURVJPTEVTID0gXCJoZi5SZWdpc3RyYXIuRGVsZWdhdGVSb2xlc1wiLFxuICBIRlJFR0lTVFJBUkFUVFJJQlVURVMgPSBcImhmLlJlZ2lzdHJhci5BdHRyaWJ1dGVzXCIsXG4gIEhGSU5URVJNRURJQVRFQ0EgPSBcImhmLkludGVybWVkaWF0ZUNBXCIsXG4gIEhGUkVWT0tFUiA9IFwiaGYuUmV2b2tlclwiLFxuICBIRkFGRklMSUFUSU9OTUdSID0gXCJoZi5BZmZpbGlhdGlvbk1nclwiLFxuICBIRkdFTkNSTCA9IFwiaGYuR2VuQ1JMXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNlcnZpY2Ugd3JhcHBlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEZhYnJpYyBDQS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGhpZ2gtbGV2ZWwgb3BlcmF0aW9ucyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhZ2FpbnN0IGEgSHlwZXJsZWRnZXIgRmFicmljIENlcnRpZmljYXRlIEF1dGhvcml0eSwgaW5jbHVkaW5nIHJlZ2lzdHJhdGlvbiwgZW5yb2xsbWVudCwgcmV2b2NhdGlvbiwgYW5kIGFkbWluaXN0cmF0aXZlIHF1ZXJpZXMuIEVuY2Fwc3VsYXRlcyBsb3dlci1sZXZlbCBGYWJyaWMgQ0EgY2xpZW50IGNhbGxzIHdpdGggY29uc2lzdGVudCBsb2dnaW5nIGFuZCBlcnJvciBtYXBwaW5nLlxuICogQHBhcmFtIHtDQUNvbmZpZ30gY2FDb25maWcgLSBDb25uZWN0aW9uIGFuZCBUTFMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldCBDQS5cbiAqIEBjbGFzcyBGYWJyaWNFbnJvbGxtZW50U2VydmljZVxuICogQGV4YW1wbGVcbiAqIC8vIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgdXNlclxuICogY29uc3Qgc3ZjID0gbmV3IEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlKHtcbiAqICAgdXJsOiAnaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1NCcsXG4gKiAgIGNhTmFtZTogJ09yZzFDQScsXG4gKiAgIHRsczogeyB0cnVzdGVkUm9vdHM6IFsnL3BhdGgvdG8vY2EucGVtJ10sIHZlcmlmeTogZmFsc2UgfSxcbiAqICAgY2FDZXJ0OiAnL3BhdGgvdG8vYWRtaW4vY2VydERpcicsXG4gKiAgIGNhS2V5OiAnL3BhdGgvdG8vYWRtaW4va2V5RGlyJ1xuICogfSk7XG4gKiBhd2FpdCBzdmMucmVnaXN0ZXIoeyB1c2VyTmFtZTogJ2FsaWNlJywgcGFzc3dvcmQ6ICdzM2NyM3QnIH0sIGZhbHNlLCAnb3JnMS5kZXBhcnRtZW50MScsIENBX1JPTEUuVVNFUik7XG4gKiBjb25zdCBpZCA9IGF3YWl0IHN2Yy5lbnJvbGwoJ2FsaWNlJywgJ3MzY3IzdCcpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBhdXRvbnVtYmVyXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBTdmMgYXMgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqICAgcGFydGljaXBhbnQgQ0EgYXMgRmFicmljIENBXG4gKiAgIEFwcC0+PlN2YzogcmVnaXN0ZXIoY3JlZGVudGlhbHMsIC4uLilcbiAqICAgU3ZjLT4+Q0E6IHJlZ2lzdGVyKHJlcXVlc3QsIGFkbWluVXNlcilcbiAqICAgQ0EtLT4+U3ZjOiBlbnJvbGxtZW50U2VjcmV0XG4gKiAgIFN2Yy0tPj5BcHA6IHNlY3JldFxuICogICBBcHAtPj5TdmM6IGVucm9sbChlbnJvbGxtZW50SWQsIHNlY3JldClcbiAqICAgU3ZjLT4+Q0E6IGVucm9sbCh7ZW5yb2xsbWVudElELCBzZWNyZXR9KVxuICogICBDQS0tPj5TdmM6IGNlcnRpZmljYXRlc1xuICogICBTdmMtLT4+QXBwOiBJZGVudGl0eVxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIHByaXZhdGUgY2E/OiBGYWJyaWNDQVNlcnZpY2VzO1xuXG4gIHByaXZhdGUgY2VydGlmaWNhdGVTZXJ2aWNlPzogYW55O1xuXG4gIHByaXZhdGUgYWZmaWxpYXRpb25TZXJ2aWNlPzogQWZmaWxpYXRpb25TZXJ2aWNlO1xuXG4gIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlPzogSWRlbnRpdHlTZXJ2aWNlO1xuXG4gIHByaXZhdGUgY2xpZW50PzogYW55O1xuXG4gIHByaXZhdGUgdXNlcj86IFVzZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYUNvbmZpZzogQ0FDb25maWcpIHtcbiAgICBDb3JlVXRpbHMuZ2V0Q3J5cHRvU3VpdGUoXG4gICAgICBjYUNvbmZpZy5oc21cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgICBsaWI6IGNhQ29uZmlnLmhzbS5saWJyYXJ5LFxuICAgICAgICAgICAgc2xvdDogY2FDb25maWcuaHNtLnNsb3QsXG4gICAgICAgICAgICBsYWJlbDogY2FDb25maWcuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgICBwaW46IFN0cmluZyhjYUNvbmZpZy5oc20ucGluKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIFVzZXIoKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgaWYgKHRoaXMudXNlcikgcmV0dXJuIHRoaXMudXNlcjtcbiAgICBjb25zdCB7IGNhTmFtZSwgY2FDZXJ0LCBjYUtleSwgdXJsLCBoc20gfSA9IHRoaXMuY2FDb25maWc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuVXNlcik7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSB1c2VyIGZvciAke2NhTmFtZX0gYXQgJHt1cmx9YCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtjYUNlcnR9YCk7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FDZXJ0KTtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFoc20pIHtcbiAgICAgIGlmICghY2FLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgY2FLZXkgY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9LiBQcm92aWRlIGEga2V5IGRpcmVjdG9yeSBvciBjb25maWd1cmUgSFNNIHN1cHBvcnQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGtleSBmcm9tICR7Y2FLZXl9YCk7XG4gICAgICBrZXkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBVc2luZyBIU00gY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9IHdpdGggbGlicmFyeSAke2hzbS5saWJyYXJ5fWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgTG9hZGluZyBBZG1pbiB1c2VyIGZvciBjYSAke2NhTmFtZX1gKTtcbiAgICB0aGlzLnVzZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Q0FVc2VyKFwiYWRtaW5cIiwga2V5LCBjZXJ0aWZpY2F0ZSwgY2FOYW1lLCB7XG4gICAgICBoc20sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMudXNlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDQSgpOiBQcm9taXNlPEZhYnJpY0NBU2VydmljZXM+IHtcbiAgICBpZiAodGhpcy5jYSkgcmV0dXJuIHRoaXMuY2E7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuQ0EpO1xuICAgIGNvbnN0IHsgdXJsLCB0bHMsIGNhTmFtZSB9ID0gdGhpcy5jYUNvbmZpZztcblxuICAgIC8vIEZPUiBTb21lIFJlYXNvbiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhpcyB3b3JrcyBmb3Igbm93XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHRydXN0ZWRSb290cywgdmVyaWZ5IH0gPSB0bHMgYXMgVExTT3B0aW9ucztcblxuICAgIGNvbnN0IHJvb3QgPSAodHJ1c3RlZFJvb3RzIGFzIHN0cmluZ1tdKVswXSBhcyBzdHJpbmc7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtyb290fS4gY3dkOiAke3Byb2Nlc3MuY3dkKCl9YCk7XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaWxlQ29udGVudChyb290KTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjYU5hbWV9IHVuZGVyICR7dXJsfWApO1xuICAgIHRoaXMuY2EgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY2E7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2xpZW50KCk6IFByb21pc2U8eyBuZXdDZXJ0aWZpY2F0ZVNlcnZpY2U6IGFueSB9PiB7XG4gICAgaWYgKHRoaXMuY2xpZW50KSByZXR1cm4gdGhpcy5jbGllbnQ7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgdGhpcy5jbGllbnQgPSAoY2EgYXMgYW55KVtcIl9GYWJyaWNDQVNlcnZpY2VzXCJdO1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDZXJ0aWZpY2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlKVxuICAgICAgdGhpcy5jZXJ0aWZpY2F0ZVNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DbGllbnQoKSkubmV3Q2VydGlmaWNhdGVTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIEFmZmlsaWF0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlKVxuICAgICAgdGhpcy5hZmZpbGlhdGlvblNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DQSgpKS5uZXdBZmZpbGlhdGlvblNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5hZmZpbGlhdGlvblNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgSWRlbnRpdGllcygpIHtcbiAgICBpZiAoIXRoaXMuaWRlbnRpdHlTZXJ2aWNlKVxuICAgICAgdGhpcy5pZGVudGl0eVNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DQSgpKS5uZXdJZGVudGl0eVNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eVNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIENBIGNlcnRpZmljYXRlIHNlcnZpY2UgdG8gbGlzdCBjZXJ0aWZpY2F0ZXMsIG9wdGlvbmFsbHkgbWFwcGluZyB0byBQRU0gc3RyaW5ncyBvbmx5LlxuICAgKiBAcGFyYW0ge0dldENlcnRpZmljYXRlc1JlcXVlc3R9IFtyZXF1ZXN0XSAtIE9wdGlvbmFsIGZpbHRlciByZXF1ZXN0IGZvciBjZXJ0aWZpY2F0ZSBsb29rdXAuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RvTWFwPXRydWVdIC0gV2hlbiB0cnVlLCByZXR1cm5zIGFycmF5IG9mIFBFTSBzdHJpbmdzOyBvdGhlcndpc2UgcmV0dXJucyBmdWxsIHJlc3BvbnNlIG9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmdbXSB8IENlcnRpZmljYXRlUmVzcG9uc2U+fSBBcnJheSBvZiBQRU0gc3RyaW5ncyBvciB0aGUgZnVsbCBjZXJ0aWZpY2F0ZSByZXNwb25zZS5cbiAgICovXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyhcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICBkb01hcCA9IHRydWVcbiAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IENlcnRpZmljYXRlUmVzcG9uc2U+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZVNlcnZpY2UgPSBhd2FpdCB0aGlzLkNlcnRpZmljYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENlcnRpZmljYXRlcyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgY2VydGlmaWNhdGVzJHtyZXF1ZXN0ID8gYCBmb3IgJHtyZXF1ZXN0LmlkfWAgOiBcIlwifSBmb3IgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZTogQ2VydGlmaWNhdGVSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IGNlcnRpZmljYXRlU2VydmljZS5nZXRDZXJ0aWZpY2F0ZXMocmVxdWVzdCB8fCB7fSwgdXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdCBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBpZGVudGl0eSBzZXJ2aWNlIHRvIGZldGNoIGFsbCBpZGVudGl0aWVzIGFuZCByZXR1cm5zIHRoZSBsaXN0IGFzIEZhYnJpY0lkZW50aXR5IG9iamVjdHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHlbXT59IFRoZSBsaXN0IG9mIGlkZW50aXRpZXMgcmVnaXN0ZXJlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyBnZXRJZGVudGl0aWVzKCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGlkZW50aXRpZXNTZXJ2aWNlID0gYXdhaXQgdGhpcy5JZGVudGl0aWVzKCk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIElkZW50aXRpZXMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IGlkZW50aXRpZXNTZXJ2aWNlLmdldEFsbChhd2FpdCB0aGlzLlVzZXIoKSlcbiAgICApLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5pZGVudGl0aWVzLmxlbmd0aH0gSWRlbnRpdGllczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmlkZW50aXRpZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGFmZmlsaWF0aW9ucyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgZm9yIHRoZSBsaXN0IG9mIGFmZmlsaWF0aW9ucyBhdmFpbGFibGUgdW5kZXIgdGhlIGNvbmZpZ3VyZWQgQ0EuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFmZmlsaWF0aW9ucyByZXN1bHQgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIGdldEFmZmlsaWF0aW9ucygpIHtcbiAgICBjb25zdCBhZmZpbGlhdGlvblNlcnZpY2UgPSBhd2FpdCB0aGlzLkFmZmlsaWF0aW9ucygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldEFmZmlsaWF0aW9ucyk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY2FDb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGFmZmlsaWF0aW9uU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpKVxuICAgICAgLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5hLmxlbmd0aH0gQWZmaWxpYXRpb25zOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKGVucm9sbG1lbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLm5ld0lkZW50aXR5U2VydmljZSgpLmdldE9uZShlbnJvbGxtZW50SWQsIHVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCByZWdpc3RyYXRpb246IHN0cmluZztcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWdpc3Rlcik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGVucm9sbG1lbnRJRDogdXNlck5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiBwYXNzd29yZCxcbiAgICAgICAgYWZmaWxpYXRpb246IGFmZmlsaWF0aW9uLFxuICAgICAgICB1c2VyUm9sZTogdXNlclJvbGUsXG4gICAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgICAgbWF4RW5yb2xsbWVudHM6IG1heEVucm9sbG1lbnRzLFxuICAgICAgfSBhcyBJUmVnaXN0ZXJSZXF1ZXN0O1xuICAgICAgcmVnaXN0cmF0aW9uID0gYXdhaXQgY2EucmVnaXN0ZXIocHJvcHMsIHVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZ1xuICApOiBJZGVudGl0eSB7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljRW5yb2xsbWVudFNlcnZpY2UsIHt9KS5mb3IoXG4gICAgICB0aGlzLmlkZW50aXR5RnJvbUVucm9sbG1lbnRcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBHZW5lcmF0aW5nIElkZW50aXR5IGZyb20gY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX0gaW4gbXNwICR7bXNwSWR9YFxuICAgICk7XG4gICAgY29uc3QgY2xpZW50SWQgPSBDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgaWQgPSBDcnlwdG9VdGlscy5lbmNvZGUoY2xpZW50SWQpO1xuICAgIGxvZy5kZWJ1ZyhgSWRlbnRpdHkgJHtjbGllbnRJZH0gYW5kIGVuY29kZWRJZCAke2lkfWApO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eSh7XG4gICAgICBpZDogaWQsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleToga2V5LnRvQnl0ZXMoKSxcbiAgICAgICAgcm9vdENlcnRpZmljYXRlOiByb290Q2VydGlmaWNhdGUsXG4gICAgICAgIGNyZWF0ZWRPbjogbm93LFxuICAgICAgICB1cGRhdGVkT246IG5vdyxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgIHVwZGF0ZWRPbjogbm93LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnJvbGwgYW4gaWRlbnRpdHkgd2l0aCB0aGUgQ0EgdXNpbmcgYSByZWdpc3RyYXRpb24gc2VjcmV0LlxuICAgKiBAc3VtbWFyeSBFeGNoYW5nZXMgdGhlIGVucm9sbG1lbnQgSUQgYW5kIHNlY3JldCBmb3IgY2VydGlmaWNhdGVzLCByZXR1cm5pbmcgYSBjb25zdHJ1Y3RlZCBJZGVudGl0eSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gZW5yb2xsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uIC0gRW5yb2xsbWVudCBzZWNyZXQgcmV0dXJuZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyBlbnJvbGwoZW5yb2xsbWVudElkOiBzdHJpbmcsIHJlZ2lzdHJhdGlvbjogc3RyaW5nKSB7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5lbnJvbGwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGxvZy5kZWJ1ZyhgRW5yb2xsaW5nICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlID0gYXdhaXQgY2EuZW5yb2xsKHtcbiAgICAgICAgZW5yb2xsbWVudElEOiBlbnJvbGxtZW50SWQsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHJlZ2lzdHJhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaWRlbnRpdHkgPSBGYWJyaWNFbnJvbGxtZW50U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNhQ29uZmlnLmNhTmFtZVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY2FDb25maWcuY2FOYW1lfSBhcyAke2lkZW50aXR5LmlkfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYW5kIGVucm9sbCBhIG5ldyBpZGVudGl0eSBpbiBvbmUgc3RlcC5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgbmV3IGVucm9sbG1lbnQgSUQgd2l0aCB0aGUgQ0EgYW5kIGltbWVkaWF0ZWx5IGV4Y2hhbmdlcyB0aGUgc2VjcmV0IHRvIGVucm9sbCwgcmV0dXJuaW5nIHRoZSBjcmVhdGVkIElkZW50aXR5LlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGZvciB0aGUgbmV3IGlkZW50aXR5IGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQW5kRW5yb2xsKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlclxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5yZWdpc3RlcihcbiAgICAgIG1vZGVsLFxuICAgICAgaXNTdXBlclVzZXIsXG4gICAgICBhZmZpbGlhdGlvbixcbiAgICAgIHVzZXJSb2xlLFxuICAgICAgYXR0cnMsXG4gICAgICBtYXhFbnJvbGxtZW50c1xuICAgICk7XG4gICAgY29uc3QgeyB1c2VyTmFtZSB9ID0gbW9kZWw7XG4gICAgcmV0dXJuIHRoaXMuZW5yb2xsKHVzZXJOYW1lIGFzIHN0cmluZywgcmVnaXN0cmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2VzIHRoZSBlbnJvbGxtZW50IG9mIGFuIGlkZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBlbnJvbGxtZW50IElELlxuICAgKlxuICAgKiBAcGFyYW0gZW5yb2xsbWVudElkIC0gVGhlIGVucm9sbG1lbnQgSUQgb2YgdGhlIGlkZW50aXR5IHRvIGJlIHJldm9rZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXN1bHQgb2YgdGhlIHJldm9jYXRpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAdGhyb3dzIHtOb3RGb3VuZEVycm9yfSBJZiB0aGUgZW5yb2xsbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZG9lcyBub3QgZXhpc3QuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0aGUgcmV2b2NhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKGVucm9sbG1lbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY2EucmV2b2tlKFxuICAgICAgICB7IGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsIHJlYXNvbjogXCJVc2VyIERlbGV0YXRpb25cIiB9LFxuICAgICAgICB1c2VyXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElSZWdpc3RlclJlcXVlc3QsIElLZXlWYWx1ZUF0dHJpYnV0ZSB9IGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBtaW4sXG4gIG1pbmxlbmd0aCxcbiAgTW9kZWwsXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIGV4dGVuZHMgTW9kZWwge1xuICBAcmVxdWlyZWQoKVxuICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIjtcbiAgQG1pbmxlbmd0aCgxKVxuICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50SUQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpXG4gIGVucm9sbG1lbnRTZWNyZXQhOiBzdHJpbmc7XG4gIEBtaW4oMClcbiAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXI7XG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBzdHJpbmc7XG5cbiAgYnVpbGQoKTogSVJlZ2lzdGVyUmVxdWVzdCB7XG4gICAgY29uc3QgZXJycyA9IHRoaXMuaGFzRXJyb3JzKCk7XG4gICAgaWYgKGVycnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJycy50b1N0cmluZygpKTtcbiAgICBjb25zdCByZXNwb25zZTogSVJlZ2lzdGVyUmVxdWVzdCA9IHtcbiAgICAgIGVucm9sbG1lbnRJRDogdGhpcy5lbnJvbGxtZW50SUQsXG4gICAgICBlbnJvbGxtZW50U2VjcmV0OiB0aGlzLmVucm9sbG1lbnRTZWNyZXQsXG4gICAgICByb2xlOiB0aGlzLnJvbGUsXG4gICAgICBhZmZpbGlhdGlvbjogdGhpcy5hZmZpbGlhdGlvbixcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgdGhpcy5tYXhFbnJvbGxtZW50cyAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHJlc3BvbnNlLm1heEVucm9sbG1lbnRzID0gdGhpcy5tYXhFbnJvbGxtZW50cztcbiAgICBpZiAodGhpcy5hdHRycykgcmVzcG9uc2UuYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIHNldEFmZmlsaWF0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFmZmlsaWF0aW9uID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRBdHRyKGF0dHI6IElLZXlWYWx1ZUF0dHJpYnV0ZSkge1xuICAgIHRoaXMuYXR0cnMgPSB0aGlzLmF0dHJzIHx8IFtdO1xuICAgIHRoaXMuYXR0cnMucHVzaChhdHRyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEF0dHJzKHZhbHVlOiBJS2V5VmFsdWVBdHRyaWJ1dGVbXSkge1xuICAgIHRoaXMuYXR0cnMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEVucm9sbG1lbnRJRCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnJvbGxtZW50SUQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEVucm9sbG1lbnRTZWNyZXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudFNlY3JldCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TWF4RW5yb2xsbWVudHModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMubWF4RW5yb2xsbWVudHMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFJvbGUodmFsdWU6IENBX1JPTEUgfCBzdHJpbmcpIHtcbiAgICB0aGlzLnJvbGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyLCBNaXJyb3JNZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5cbk1vZGVsLnByb3RvdHlwZS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTW9kZWwuaXNTaGFyZWQodGhpcy5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG59O1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTW9kZWwuaXNQcml2YXRlKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBTZWdyZWdhdGVkTW9kZWw8TT4ge1xuICByZXR1cm4gTW9kZWwuc2VncmVnYXRlKHRoaXMpO1xufTtcblxuKE1vZGVsIGFzIGFueSkuc2VncmVnYXRlID0gZnVuY3Rpb24gc2VncmVnYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNXG4pOiBTZWdyZWdhdGVkTW9kZWw8TT4ge1xuICBpZiAoIU1vZGVsLmlzVHJhbnNpZW50KG1vZGVsKSkgcmV0dXJuIHsgbW9kZWw6IG1vZGVsIH07XG4gIGNvbnN0IGRlY29yYXRlZFByb3BlcnRpZXMgPVxuICAgIE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSB8fCBbXTtcblxuICBjb25zdCB0cmFuc2llbnRQcm9wcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgREJLZXlzLlRSQU5TSUVOVFxuICApO1xuICBjb25zdCBwcml2YXRlUHJvcGVydGllcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgRmFicmljTW9kZWxLZXlzLlBSSVZBVEVcbiAgKTtcbiAgY29uc3Qgc2hhcmVkUHJvcGVydGllcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgRmFicmljTW9kZWxLZXlzLlNIQVJFRFxuICApO1xuXG4gIGNvbnN0IHJlc3VsdDogU2VncmVnYXRlZE1vZGVsPE0+ID0ge1xuICAgIG1vZGVsOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBwdWJsaWM6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHRyYW5zaWVudDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHJpdmF0ZXM6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHNoYXJlZDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gIH07XG5cbiAgY29uc3QgdHJhbnNpZW50S2V5cyA9IE9iamVjdC5rZXlzKHRyYW5zaWVudFByb3BzIHx8IHt9KTtcbiAgY29uc3QgcHJpdmF0ZUtleXMgPSBPYmplY3Qua2V5cyhwcml2YXRlUHJvcGVydGllcyB8fCB7fSk7XG4gIGNvbnN0IHNoYXJlZEtleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRQcm9wZXJ0aWVzIHx8IHt9KTtcblxuICAvLyBjb25zdCBwa0tleSA9IE1vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1vZGVsW2tleSBhcyBrZXlvZiBNXTtcbiAgICBjb25zdCBpc1RyYW5zaWVudCA9IHRyYW5zaWVudEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1B1YmxpYyA9ICFpc1RyYW5zaWVudDtcbiAgICBjb25zdCBpc1ByaXZhdGUgPSBwcml2YXRlS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIGNvbnN0IGlzU2hhcmVkID0gc2hhcmVkS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIC8vIGNvbnN0IGlzUHJpbWFyeUtleSA9IGtleSA9PT0gcGtLZXk7XG5cbiAgICBpZiAoaXNUcmFuc2llbnQgfHwgaXNQcml2YXRlIHx8IGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQudHJhbnNpZW50ID0gcmVzdWx0LnRyYW5zaWVudCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQudHJhbnNpZW50IGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICByZXN1bHQucHJpdmF0ZXMgPSByZXN1bHQucHJpdmF0ZXMgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnByaXZhdGVzIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNTaGFyZWQpIHtcbiAgICAgIHJlc3VsdC5zaGFyZWQgPSByZXN1bHQuc2hhcmVkIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5zaGFyZWQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgcmVzdWx0LnB1YmxpYyA9IChyZXN1bHQucHVibGljIHx8IHt9KSBhcyBhbnk7XG4gICAgICAocmVzdWx0LnB1YmxpYyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQubW9kZWwgPSBNb2RlbC5idWlsZChyZXN1bHQucHVibGljLCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgcmV0dXJuIHJlc3VsdCBhcyBTZWdyZWdhdGVkTW9kZWw8TT47XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1ByaXZhdGUgPSBmdW5jdGlvbiBpc1ByaXZhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIU1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgRmFicmljTW9kZWxLZXlzLlBSSVZBVEVcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmlzU2hhcmVkID0gZnVuY3Rpb24gaXNTaGFyZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIU1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgRmFicmljTW9kZWxLZXlzLlNIQVJFRFxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWQgPSBmdW5jdGlvbiBtaXJyb3JlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5vd25lck9mID0gZnVuY3Rpb24gb3duZXJPZjxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbW9kZWxbbWV0YSBhcyBrZXlvZiBNXSBhcyBzdHJpbmc7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5taXJyb3JlZEF0ID0gZnVuY3Rpb24gbWlycm9yZWRBdDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBNaXJyb3JNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIG1vZGVsID0gdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsO1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsIGFzIGFueSxcbiAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbGxlY3Rpb25zRm9yID0gZnVuY3Rpb24gY29sbGVjdGlvbnNGb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKToge1xuICBwcml2YXRlQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbiAgc2hhcmVkQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbn0ge1xuICBjb25zdCBwcml2YXRlS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlBSSVZBVEVdIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaGFyZWRLZXlzOiBzdHJpbmdbXSA9IFtGYWJyaWNNb2RlbEtleXMuU0hBUkVEXSBhcyBzdHJpbmdbXTtcblxuICBjb25zdCBwcml2YXRlS2V5ID0gTWV0YWRhdGEua2V5KC4uLnByaXZhdGVLZXlzKTtcbiAgY29uc3Qgc2hhcmVkS2V5ID0gTWV0YWRhdGEua2V5KC4uLnNoYXJlZEtleXMpO1xuXG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcblxuICBjb25zdCBwcml2YXRlTWV0YTogeyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSA9IE1ldGFkYXRhLmdldChcbiAgICBjb25zdHIgYXMgYW55LFxuICAgIHByaXZhdGVLZXlcbiAgKTtcbiAgY29uc3Qgc2hhcmVkTWV0YTogeyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSA9IE1ldGFkYXRhLmdldChcbiAgICBjb25zdHIgYXMgYW55LFxuICAgIHNoYXJlZEtleVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcHJpdmF0ZUNvbHM6IHByaXZhdGVNZXRhPy5jb2xsZWN0aW9ucyB8fCBbXSxcbiAgICBzaGFyZWRDb2xzOiBzaGFyZWRNZXRhPy5jb2xsZWN0aW9ucyB8fCBbXSxcbiAgfTtcbn0uYmluZChNb2RlbCk7XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIFJlcG8sXG4gIENvbnRleHQsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIENvbnRleHRPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIHRoZSBNU1AgSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0gaWRlbnRpdHkgLSBUaGUgaWRlbnRpdHkgdmFsdWUgd2hpY2ggY2FuIGJlIGEgc3RyaW5nIE1TUCBJRCBvciBDbGllbnRJZGVudGl0eSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBNU1AgSUQgYXMgYSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBub3QgYXZhaWxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TXNwSWQoXG4gIGlkZW50aXR5OiBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBpZGVudGl0eSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gaWRlbnRpdHkuZ2V0TVNQSUQoKTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIG1hcmtpbmcgbWV0aG9kcyB0aGF0IHJlcXVpcmUgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKiBDaGVja3MgdGhlIG93bmVyIG9mIHRoZSB0b2tlbiBiZWZvcmUgYWxsb3dpbmcgdGhlIG1ldGhvZCB0byBiZSBleGVjdXRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVG9rZW5Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHtcbiAqICAgQE93bmVyKClcbiAqICAgYXN5bmMgTWludChjdHg6IENvbnRleHQsIGFtb3VudDogbnVtYmVyKSB7XG4gKiAgICAgLy8gTWludCB0b2tlbiBsb2dpY1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBjaGVja3Mgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPd25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgdGhpczogRmFicmljRVJDMjBDb250cmFjdCxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSB7XG4gICAgICBjb25zdCBjdHg6IEhMQ29udGV4dCA9IGFyZ3NbMF07XG4gICAgICBjb25zdCBhY291bnRJZCA9IGN0eC5jbGllbnRJZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBhd2FpdCAodGhpcyBhcyBGYWJyaWNFUkMyMENvbnRyYWN0KVtcbiAgICAgICAgXCJ0b2tlblJlcG9zaXRvcnlcIlxuICAgICAgXS5zZWxlY3QoKTtcblxuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgc2VsZWN0LmV4ZWN1dGUoY3R4KTtcblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcIk5vIHRva2VucyBhdmFpYWxibGVcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVG8gbWFueSB0b2tlbiBhdmFpbGFibGUgOiAke3Rva2Vucy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnNbMF0ub3duZXIgIT0gYWNvdW50SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgICAgICBgVXNlciBub3QgYXV0aG9yaXplZCB0byBydW4gJHtwcm9wZXJ0eUtleX0gb24gdGhlIHRva2VuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3duZWRCeU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcblxuICBjb25zdCBhbGxvd0dlbmVyYXRpb25PdmVycmlkZSA9XG4gICAgY29udGV4dC5nZXQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGNvbnN0IG93bmVyID0gYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPyBtb2RlbFtrZXldIDogY3JlYXRvci5tc3BpZDtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApIHtcbiAgICAvLyBDYW4ndCBleHRyYWN0IGNvbGxlY3Rpb25zIHdpdGhvdXQgTVNQLCB3aWxsIGJlIGNhdWdodCBieSBsYXRlciBoYW5kbGVyc1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG1ldGFkYXRhIG9mIGRhdGFBcnJheSkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IG1ldGFkYXRhLmNvbGxlY3Rpb25zO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoY29sbGVjdGlvbiAmJiAhY29sbGVjdGlvbnMuaW5jbHVkZXMoY29sbGVjdGlvbikpIHtcbiAgICAgIGNvbGxlY3Rpb25zLnB1c2goY29sbGVjdGlvbik7XG4gICAgfVxuICB9XG4gIGFwcGx5U2VncmVnYXRpb25GbGFncyhtb2RlbCwgY29sbGVjdGlvbnMsIGNvbnRleHQpO1xuXG4gIC8vIFN0b3JlIHNlZ3JlZ2F0aW9uIG1ldGFkYXRhIG9uIHRoZSBhZGFwdGVyIChwZXJzaXN0cyBhY3Jvc3MgY29udGV4dCBjaGFpbnMpLlxuICAvLyBUaGUgU2VxdWVuY2UgY3JlYXRlcyBpdHMgb3duIGNvbnRleHQgdmlhIGxvZ0N0eCwgbG9zaW5nIGNvbnRleHQtc3RvcmVkIGZsYWdzLlxuICBjb25zdCBzZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBcInBrXCIpO1xuICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgc2VxTmFtZSxcbiAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgIGNvbGxlY3Rpb25zXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c10pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAvLyBWYWxpZGF0ZSBhbGwga2V5cyByZXNvbHZlIHRvIHRoZSBzYW1lIGNvbGxlY3Rpb25cbiAga2V5QXJyYXkuZm9yRWFjaCgoX2ssIGkpID0+IHtcbiAgICBjb25zdCBjID1cbiAgICAgIHR5cGVvZiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnNcbiAgICAgICAgOiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGMgIT09IGNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICApO1xuICB9KTtcblxuICBjb25zdCBrZXlTdHJpbmdzID0ga2V5QXJyYXkubWFwKChrZXkpID0+IFN0cmluZyhrZXkpKTtcbiAgLy8gU3RvcmUgdGhlIHNlZ3JlZ2F0ZWQgbW9kZWwg4oCUIHByZXBhcmUoKSB3aWxsIGZpbHRlciB0byBjb2xsZWN0aW9uLXNwZWNpZmljIGZpZWxkc1xuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLndyaXRlVG8oY29sbGVjdGlvbiwga2V5U3RyaW5ncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uUmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljRmxhZ3M+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogYXdhaXQgY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5OiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG9sZE1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIGtleUFycmF5LmZvckVhY2goKGssIGkpID0+IHtcbiAgICBjb25zdCBjID1cbiAgICAgIHR5cGVvZiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnNcbiAgICAgICAgOiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGMgIT09IGNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICApO1xuICB9KTtcblxuICBjb25zdCBrZXlTdHJpbmdzID0gKGtleUFycmF5IGFzIChrZXlvZiBNKVtdKS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgbW9kZWwg4oCUIHByZXBhcmUoKSB3aWxsIGZpbHRlciB0byBjb2xsZWN0aW9uLXNwZWNpZmljIGZpZWxkc1xuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLndyaXRlVG8oY29sbGVjdGlvbiwga2V5U3RyaW5ncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIFYgZXh0ZW5kcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWIHwgVltdLFxuICBrZXk6IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXSkgYXMgVltdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIHNlZ3JlZ2F0ZWQoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgdHlwZTogRmFicmljTW9kZWxLZXlzLlBSSVZBVEUgfCBGYWJyaWNNb2RlbEtleXMuU0hBUkVELFxuICBmaWx0ZXI/OiAocHJvcE5hbWU6IHN0cmluZykgPT4gYm9vbGVhblxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbm5lclNlZ3JlZ2F0ZWQodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgZnVuY3Rpb24gc2VncmVnYXRlZERlYyh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICAgIGNvbnN0IGtleSA9IE1ldGFkYXRhLmtleSh0eXBlLCBwcm9wZXJ0eUtleSk7XG4gICAgICBjb25zdCBjb25zdHI6IENvbnN0cnVjdG9yID0gdGFyZ2V0LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yO1xuXG4gICAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5KSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gbmV3IFNldChtZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIG1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5LCBtZXRhKTtcblxuICAgICAgY29uc3QgY29uc3RyTWV0YSA9IE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUpIHx8IHt9O1xuICAgICAgY29uc3QgY29uc3RyQ29sbGVjdGlvbnMgPSBuZXcgU2V0KGNvbnN0ck1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29uc3RyQ29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgY29uc3RyTWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb25zdHJDb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCB0eXBlLCBjb25zdHJNZXRhKTtcblxuICAgICAgY29uc3QgdHJhbnNpZW50TWV0YSA9XG4gICAgICAgIE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICAgICAgY29uc3QgdXBkYXRlZFRyYW5zaWVudE1ldGEgPSB7XG4gICAgICAgIC4uLnRyYW5zaWVudE1ldGEsXG4gICAgICAgIFtwcm9wZXJ0eUtleSBhcyBhbnldOiB7fSxcbiAgICAgIH07XG4gICAgICBNZXRhZGF0YS5zZXQoXG4gICAgICAgIGNvbnN0ciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgREJLZXlzLlRSQU5TSUVOVCxcbiAgICAgICAgdXBkYXRlZFRyYW5zaWVudE1ldGFcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjczogYW55W10gPSBbXTtcbiAgICBpZiAoIXByb3BlcnR5S2V5KSB7XG4gICAgICAvLyBkZWNvcmF0ZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyh0YXJnZXQgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgcHJvcGVydGllcz8uZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIocCkpIHtcbiAgICAgICAgICBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIHR5cGUpKCh0YXJnZXQgYXMgYW55KS5wcm90b3R5cGUsIHApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdyb3VwTmFtZSA9XG4gICAgICAgIHR5cGVvZiBjb2xsZWN0aW9uID09PSBcInN0cmluZ1wiID8gY29sbGVjdGlvbiA6IGNvbGxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICAgIC8vIFVzZSBkaWZmZXJlbnQgZ3JvdXAgbmFtZXMgZm9yIGV4dHJhY3Rpb24gdnMgZGF0YSBoYW5kbGVycyB0byBwcmV2ZW50IG1lcmdpbmdcbiAgICAgIGNvbnN0IGV4dHJhY3RHcm91cE5hbWUgPSBgJHtncm91cE5hbWV9OmV4dHJhY3RgO1xuICAgICAgY29uc3QgZGF0YUdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZGF0YWA7XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25NZXRhID0geyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9O1xuICAgICAgY29uc3QgZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0ID0ge1xuICAgICAgICBwcmlvcml0eTogU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFksXG4gICAgICAgIGdyb3VwOiBleHRyYWN0R3JvdXBOYW1lLFxuICAgICAgfTtcbiAgICAgIGRlY3MucHVzaChcbiAgICAgICAgcHJvcCgpLFxuICAgICAgICB0cmFuc2llbnQoKSxcbiAgICAgICAgc2VncmVnYXRlZERlYyxcbiAgICAgICAgLy8gRWFybHkgZXh0cmFjdGlvbiBoYW5kbGVycyAtIHJ1biBCRUZPUkUgcGsgZ2VuZXJhdGlvbiAocHJpb3JpdHkgNjApXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBjb2xsZWN0aW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiBjb250ZXh0IGZvciBzZXF1ZW5jZSByZXBsaWNhdGlvblxuICAgICAgICAvLyBXZSByZWdpc3RlciBmb3IgZWFjaCBvcGVyYXRpb24gZXhwbGljaXRseSB0byBlbnN1cmUgcHJvcGVyIGhhbmRsZXIgbG9va3VwXG4gICAgICAgIG9uKFxuICAgICAgICAgIERCT3BlcmF0aW9ucy5BTEwsXG4gICAgICAgICAgZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyBhcyBhbnksXG4gICAgICAgICAgZWFybHlFeHRyYWN0aW9uTWV0YSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnRcbiAgICAgICAgKSxcbiAgICAgICAgLy8gTWFpbiBoYW5kbGVycyBmb3Igc2VncmVnYXRlZCBkYXRhIG9wZXJhdGlvbnMgKHByaW9yaXR5IDk1KVxuICAgICAgICBvbkNyZWF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlLFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uUmVhZChcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uUmVhZCBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25VcGRhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblVwZGF0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25EZWxldGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkRlbGV0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY3MpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZURhdGEoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlciA9IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb25cbikge1xuICBmdW5jdGlvbiBwcml2YXRlRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHByaXZhdGVEYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHNoYXJlZERhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVjdXJzaXZlbHkgc29ydHMgb2JqZWN0IGtleXMgd2l0aG91dCByZW9yZGVyaW5nIGFycmF5c1xuICogQHBhcmFtIHthbnl9IG9iaiAtIFRoZSB2YWx1ZSB0byBwcm9jZXNzXG4gKiBAcmV0dXJuIHthbnl9IEEgY29weSB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cyBidXQgcHJlc2VydmVkIGFycmF5IG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqOiBhbnkpOiBhbnkge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKHNvcnRLZXlzT25seVJlY3Vyc2l2ZSk7XG4gIGlmIChvYmouY29uc3RydWN0b3IgIT09IE9iamVjdCkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgICAuc29ydCgpXG4gICAgLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXkpID0+IHtcbiAgICAgIGFjY1trZXldID0gc29ydEtleXNPbmx5UmVjdXJzaXZlKG9ialtrZXldKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmlzdGljIEpTT04gc2VyaWFsaXplciBmb3IgRmFicmljIG1vZGVsc1xuICogQHN1bW1hcnkgRW5zdXJlcyBzdGFibGUsIGRldGVybWluaXN0aWMgSlNPTiBvdXRwdXQgYnkgc29ydGluZyBvYmplY3Qga2V5cyByZWN1cnNpdmVseSBiZWZvcmUgc3RyaW5naWZpY2F0aW9uLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIEZhYnJpYyBlbmRvcnNlbWVudCBhbmQgaGFzaGluZy4gRXh0ZW5kcyBKU09OU2VyaWFsaXplciB0byBwbHVnIGludG8gZXhpc3RpbmcgRGVjYWYgbW9kZWwgc2VyaWFsaXphdGlvbiBmbG93LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgRGVjYWYgTW9kZWwgc3VidHlwZSBzZXJpYWxpemVkIGJ5IHRoaXMgaW5zdGFuY2VcbiAqIEBwYXJhbSB7dm9pZH0gW2NvbnN0cnVjdG9yXSBObyBwdWJsaWMgY29uc3RydWN0b3IgYXJndW1lbnRzXG4gKiBAY2xhc3MgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IERldGVybWluaXN0aWNTZXJpYWxpemVyPE15TW9kZWw+KCk7XG4gKiBjb25zdCBqc29uID0gc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwpO1xuICogY29uc3QgcmVidWlsdCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoanNvbik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBEUyBhcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogICBDYWxsZXItPj5EUzogc2VyaWFsaXplKG1vZGVsKVxuICogICBEUy0+PkRTOiBwcmVTZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHNvcnQta2V5cy1yZWN1cnNpdmVcbiAqICAgRFMtPj5EUzoganNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1xuICogICBEUy0tPj5DYWxsZXI6IHN0cmluZ1xuICogICBDYWxsZXItPj5EUzogZGVzZXJpYWxpemUoc3RyaW5nKVxuICogICBEUy0tPj5DYWxsZXI6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNKSB7XG4gICAgLy8gVE9ETzogbmVzdGVkIHByZXNlcmlhbGl6YXRpb24gKHNvIGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoZW4gZGVzZXJpYWxpemluZylcbiAgICAvLyBUT0RPOiBWZXJpZnkgd2h5IHRoZXJlIGlzIG5vIG1ldGFkYXRhXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgbGV0IG1ldGFkYXRhO1xuICAgIHRyeSB7XG4gICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIG1ldGFkYXRhID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBjb25zdCBwcmVTZXJpYWxpemUgPSBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoKG8pID0+IHByZVNlcmlhbGl6ZS5jYWxsKHNlbGYsIG8pKTtcbiAgICAgIHJldHVybiB0aGlzLnByZVNlcmlhbGl6ZS5jYWxsKHRoaXMsIG9iaik7XG4gICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgTW9kZWwucmVsYXRpb25zKG1vZGVsKS5mb3JFYWNoKChyKSA9PiB7XG4gICAgICB0b1NlcmlhbGl6ZVtyXSA9IHByZVNlcmlhbGl6ZSh0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlYnVpbGRzIGEgbW9kZWwgZnJvbSBhIHNlcmlhbGl6YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbHMgdG8gcGFyc2UgdGhlIHN0cmluZywgb3IgdG8gYnVpbGQgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZyk6IE0ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBkZXNlcmlhbGl6YXRpb25bTW9kZWxLZXlzLkFOQ0hPUl07XG4gICAgaWYgKCFjbGFzc05hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbDogTSA9IE1vZGVsLmJ1aWxkKGRlc2VyaWFsaXphdGlvbiwgY2xhc3NOYW1lKSBhcyB1bmtub3duIGFzIE07XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXJpYWxpemUgYSBtb2RlbCBpbnRvIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwgd2l0aCBwcmVTZXJpYWxpemUsIHNvcnRzIGtleXMgcmVjdXJzaXZlbHksIGFuZCBzdHJpbmdpZmllcyBkZXRlcm1pbmlzdGljYWxseSBmb3Igc3RhYmxlIG9yZGVyaW5nXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRGV0ZXJtaW5pc3RpYyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKFwianNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1wiKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHNvcnRLZXlzT25seVJlY3Vyc2l2ZSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCkpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQnVsa0NydWRPcGVyYXRpb25LZXlzLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIEZhYnJpYyBldmVudCBuYW1lIGZyb20gY29tcG9uZW50c1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBuYW1lIGJ5IGpvaW5pbmcgdGFibGUsIGV2ZW50LCBhbmQgb3B0aW9uYWwgb3duZXIgd2l0aCB1bmRlcnNjb3Jlc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlL2NvbGxlY3Rpb24gbmFtZVxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nfSBldmVudCAtIFRoZSBldmVudCB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gW293bmVyXSAtIE9wdGlvbmFsIG93bmVyIGlkZW50aWZpZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBldmVudCBuYW1lIGluIGZvcm1hdCBcInRhYmxlX2V2ZW50XCIgb3IgXCJ0YWJsZV9ldmVudF9vd25lclwiXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRmFicmljRXZlbnROYW1lKFxuICB0YWJsZTogc3RyaW5nLFxuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgb3duZXI/OiBzdHJpbmdcbikge1xuICBjb25zdCBwYXJhbXMgPSBbdGFibGUsIGV2ZW50XTtcbiAgaWYgKG93bmVyKSBwYXJhbXMucHVzaChvd25lcik7XG4gIHJldHVybiBwYXJhbXMuam9pbihcIl9cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIEZhYnJpYyBldmVudCBuYW1lIGludG8gaXRzIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IFNwbGl0cyBhbiBldmVudCBuYW1lIGJ5IHVuZGVyc2NvcmVzIGFuZCBleHRyYWN0cyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZXZlbnQgbmFtZSB0byBwYXJzZVxuICogQHJldHVybiB7e3RhYmxlOiBzdHJpbmcsIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLCBvd25lcjogc3RyaW5nfX0gVGhlIHBhcnNlZCBjb21wb25lbnRzIGFzIGEgc3RydWN0dXJlZCBvYmplY3RcbiAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBldmVudCBuYW1lIGZvcm1hdCBpcyBpbnZhbGlkXG4gKiBAZnVuY3Rpb24gcGFyc2VFdmVudE5hbWVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IFBhcnNlciBhcyBwYXJzZUV2ZW50TmFtZVxuICogICBDYWxsZXItPj5QYXJzZXI6IHBhcnNlRXZlbnROYW1lKG5hbWUpXG4gKiAgIFBhcnNlci0+PlBhcnNlcjogc3BsaXQgbmFtZSBieSBcIl9cIlxuICogICBhbHQgcGFydHMgbGVuZ3RoIGludmFsaWRcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gKiAgIGVsc2VcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB7IHRhYmxlLCBldmVudCwgb3duZXI/IH1cbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZShuYW1lOiBzdHJpbmcpOiB7XG4gIHRhYmxlPzogc3RyaW5nO1xuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZztcbiAgb3duZXI/OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KFwiX1wiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMylcbiAgICByZXR1cm4geyB0YWJsZTogdW5kZWZpbmVkLCBldmVudDogbmFtZSwgb3duZXI6IHVuZGVmaW5lZCB9O1xuICByZXR1cm4ge1xuICAgIHRhYmxlOiBwYXJ0c1swXSxcbiAgICBldmVudDogcGFydHNbMV0sXG4gICAgb3duZXI6IHBhcnRzWzJdLFxuICB9IGFzIHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICAgIG93bmVyPzogc3RyaW5nO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgc3RyaW5nRm9ybWF0IH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT3ZlcmZsb3dFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgYWRkaXRpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBBZGRzIHR3byBudW1iZXJzIGFuZCB2ZXJpZmllcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBGaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzdW0gb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uIGFkZFxuICogQHRocm93cyB7T3ZlcmZsb3dFcnJvcn0gb24gYWRkaXRpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhICsgYjtcbiAgaWYgKGEgIT09IGMgLSBiIHx8IGIgIT09IGMgLSBhKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYEFkZGl0aW9uIG92ZXJmbG93OiAke2F9ICsgJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPdmVyZmxvdy1zYWZlIHN1YnRyYWN0aW9uIG9wZXJhdGlvblxuICogQHN1bW1hcnkgU3VidHJhY3RzIGIgZnJvbSBhIGFuZCB2YWxpZGF0ZXMgbm8gb3ZlcmZsb3cgYnkgcmV2ZXJzZS1jaGVja2luZyB0aGUgb3BlcmFuZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gTWludWVuZFxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBTdWJ0cmFoZW5kXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaWZmZXJlbmNlIGEgLSBiXG4gKiBAZnVuY3Rpb24gc3ViXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBzdWJ0YWN0aW9uIG92ZXJmbG93XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWIoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBjID0gYSAtIGI7XG4gIGlmIChhICE9PSBjICsgYiB8fCBiICE9PSBhIC0gYykge1xuICAgIHRocm93IG5ldyBPdmVyZmxvd0Vycm9yKGBTdWJ0cmFjdGlvbiBvdmVyZmxvdzogJHthfSAtICR7Yn1gKTtcbiAgfVxuICByZXR1cm4gYztcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTYWZlIEludGVnZXIgUGFyc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHNhZmVQYXJzZUludFxuICpcbiAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gaWYgcGFyc2VJbnQgcmV0dXJucyBOYU5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2VJbnQoc3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gY2hlY2sgaWYgc3RyaW5nIG9ubHkgaGF2ZSBkaWdpdHNcbiAgY29uc3QgZGlnaXRSZWdleCA9IC9eXFxkKyQvO1xuICBpZiAoIWRpZ2l0UmVnZXgudGVzdChzdHJpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHN0cmluZ0Zvcm1hdChcIkZhaWxlZCB0byBwYXJzZTogezB9XCIsIFwic3RyaW5nIGNvbnRhaW5zIGRpZ2l0c1wiKVxuICAgICk7XG4gIH1cbiAgY29uc3QgcGFyc2VkaW50ID0gcGFyc2VJbnQoc3RyaW5nKTtcbiAgaWYgKGlzTmFOKHBhcnNlZGludCkpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgaXMgbm90IGEgcGFyc2FibGUgaW50ZWdlclwiKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZGludDtcbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHNvcnRLZXlzT25seVJlY3Vyc2l2ZSB9IGZyb20gXCIuL0RldGVybWluaXN0aWNTZXJpYWxpemVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcsIHRhYmxlTmFtZT86IHN0cmluZyk6IE0ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICAvLyBjb25zdCBjbGFzc05hbWUgPSB0YWJsZU5hbWU7XG4gICAgLy8gaWYgKCFjbGFzc05hbWUpXG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcblxuICAgIC8vIC8vIHRoaXMgd2lsbCByZXR1cm4gdW5kZWZpbmVkIHZhbHVlc1xuICAgIC8vIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcblxuICAgIC8vIC8vIFBvcHVsYXRlIE1vZGVsXG4gICAgLy8gY29uc3QgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbiA9IE9iamVjdC5rZXlzKG1vZGVsKS5yZWR1Y2UoXG4gICAgLy8gICAoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgIC8vICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9XG4gICAgLy8gICAgICAgZGVzZXJpYWxpemF0aW9uW1JlcG9zaXRvcnkuY29sdW1uKGFjY3VtLCBrZXkpXTtcbiAgICAvLyAgICAgcmV0dXJuIGFjY3VtO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIG1vZGVsXG4gICAgLy8gKTtcblxuICAgIC8vIGNvbnN0IHJlc3VsdCA9IE1vZGVsLmJ1aWxkKFxuICAgIC8vICAgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbixcbiAgICAvLyAgIGNsYXNzTmFtZVxuICAgIC8vICkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gZGVzZXJpYWxpemF0aW9uO1xuICB9XG5cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBwdXRBbmNob3IgPSB0cnVlKTogc3RyaW5nIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIGNvbnN0IHByZVNlcmlhbGl6YXRpb24gPSB0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgcHV0QW5jaG9yKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHNvcnRLZXlzT25seVJlY3Vyc2l2ZShwcmVTZXJpYWxpemF0aW9uKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBwdXRBbmNob3I6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgLy8gVE9ETzogbmVzdGVkIHByZXNlcmlhbGl6YXRpb24gKHNvIGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoZW4gZGVzZXJpYWxpemluZylcbiAgICAvLyBUT0RPOiBWZXJpZnkgd2h5IHRoZXJlIGlzIG5vIG1ldGFkYXRhXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgbGV0IG1ldGFkYXRhO1xuICAgIHRyeSB7XG4gICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIG1ldGFkYXRhID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAocHV0QW5jaG9yKVxuICAgICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgZnVuY3Rpb24gcHJlU2VyaWFsaXplKFxuICAgICAgdGhpczogU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8YW55PixcbiAgICAgIG9iajogYW55XG4gICAgKTogYW55IHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAocHJlU2VyaWFsaXplKTtcbiAgICAgIHJldHVybiB0aGlzLnByZVNlcmlhbGl6ZShvYmopO1xuICAgIH1cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplLmNhbGwodGhpcywgdG9TZXJpYWxpemVbcl0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBDbGllbnRCYXNlZFNlcnZpY2UsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCBGYWJyaWNDQVNlcnZpY2VzLCB7XG4gIEFmZmlsaWF0aW9uU2VydmljZSxcbiAgSUF0dHJpYnV0ZVJlcXVlc3QsXG4gIElkZW50aXR5U2VydmljZSxcbiAgSUVucm9sbFJlc3BvbnNlLFxuICBJSWRlbnRpdHlSZXF1ZXN0LFxuICBJUmVnaXN0ZXJSZXF1ZXN0LFxuICBJUmV2b2tlUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IENBQ29uZmlnLCBDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzLCBnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGVSZXNwb25zZSxcbiAgRmFicmljSWRlbnRpdHksXG4gIEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gIElkZW50aXR5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi9zaGFyZWQvZmFicmljLXR5cGVzXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IElLZXlWYWx1ZUF0dHJpYnV0ZSB9IGZyb20gXCIuL0ZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4uL2NyeXB0b1wiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljSWRlbnRpdHlTZXJ2aWNlIGV4dGVuZHMgQ2xpZW50QmFzZWRTZXJ2aWNlPFxuICBGYWJyaWNDQVNlcnZpY2VzLFxuICBDQUNvbmZpZ1xuPiB7XG4gIHByb3RlY3RlZCBfdXNlciE6IFVzZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcm9vdENsaWVudCgpOiB7IG5ld0NlcnRpZmljYXRlU2VydmljZTogYW55IH0ge1xuICAgIHJldHVybiAodGhpcy5jbGllbnQgYXMgYW55KVtcIl9GYWJyaWNDYVNlcnZpY2VzXCJdIGFzIGFueTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdXNlcigpOiBVc2VyIHtcbiAgICBpZiAoIXRoaXMuX3VzZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJGYWJyaWMgaWRlbnRpdHkgc2VydmljZSBub3QgcHJvcGVybHkgc2V0dXA6IG1pc3NpbmcgdXNlclwiXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBjZXJ0aWZpY2F0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENsaWVudC5uZXdDZXJ0aWZpY2F0ZVNlcnZpY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgYWZmaWxpYXRpb25zKCk6IEFmZmlsaWF0aW9uU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lm5ld0FmZmlsaWF0aW9uU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpZGVudGl0aWVzKCk6IElkZW50aXR5U2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lm5ld0lkZW50aXR5U2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFVzZXIoY2ZnOiBDQUNvbmZpZywgY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRVc2VyKTtcbiAgICBjb25zdCB7IGNhTmFtZSwgY2FDZXJ0LCBjYUtleSwgdXJsLCBoc20gfSA9IGNmZztcblxuICAgIGxvZy5pbmZvKGBDcmVhdGluZyBDQSB1c2VyIGZvciAke2NhTmFtZX0gYXQgJHt1cmx9YCk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke2NhQ2VydH1gKTtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUNlcnQpO1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWhzbSkge1xuICAgICAgaWYgKCFjYUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWlzc2luZyBjYUtleSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0uIFByb3ZpZGUgYSBrZXkgZGlyZWN0b3J5IG9yIGNvbmZpZ3VyZSBIU00gc3VwcG9ydC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0Ega2V5IGZyb20gJHtjYUtleX1gKTtcbiAgICAgIGtleSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFVzaW5nIEhTTSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0gd2l0aCBsaWJyYXJ5ICR7aHNtLmxpYnJhcnl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBMb2FkaW5nIEFkbWluIHVzZXIgZm9yIGNhICR7Y2FOYW1lfWApO1xuICAgIHRoaXMuX3VzZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Q0FVc2VyKFwiYWRtaW5cIiwga2V5LCBjZXJ0aWZpY2F0ZSwgY2FOYW1lLCB7XG4gICAgICBoc20sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8eyBjb25maWc6IENBQ29uZmlnOyBjbGllbnQ6IEZhYnJpY0NBU2VydmljZXMgfT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5JTklUSUFMSVpBVElPTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IFtjb25maWddID0gYXJncztcbiAgICBpZiAoIWNvbmZpZykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIEZhYnJpYyBDQSBjb25maWd1cmF0aW9uXCIpO1xuXG4gICAgY29uc3QgeyB1cmwsIHRscywgY2FOYW1lIH0gPSBjb25maWc7XG4gICAgbG9nLmluZm8oYEluaXRpYWxpemluZyBDQSBDbGllbnQgZm9yIENBICR7Y29uZmlnLmNhTmFtZX0gYXQgJHtjb25maWcudXJsfWApO1xuICAgIGNvbnN0IHsgdHJ1c3RlZFJvb3RzLCB2ZXJpZnkgfSA9IHRscyBhcyBUTFNPcHRpb25zO1xuXG4gICAgY29uc3Qgcm9vdCA9ICh0cnVzdGVkUm9vdHMgYXMgc3RyaW5nW10pWzBdIGFzIHN0cmluZztcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke3Jvb3R9LiBjd2Q6ICR7cHJvY2Vzcy5jd2QoKX1gKTtcblxuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpbGVDb250ZW50KHJvb3QpO1xuXG4gICAgbG9nLmRlYnVnKGBDQSBDZXJ0aWZpY2F0ZTogJHtjZXJ0aWZpY2F0ZS50b1N0cmluZygpfWApO1xuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuXG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuZ2V0VXNlcihjb25maWcsIGN0eCk7XG4gICAgbG9nLmRlYnVnKGBDQSB1c2VyIGxvYWRlZDogJHt1c2VyLmdldE5hbWUoKX1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnLFxuICAgICAgY2xpZW50LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT4pOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzKFxuICAgIHJlcXVlc3Q6IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICBkb01hcDogTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXM8TUFQIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICBkb01hcDogTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXM8TUFQIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QgfCBNQVAsXG4gICAgZG9NYXA6IE1BUCA9IHRydWUgYXMgTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+IHtcbiAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENvbnRleHQpIHtcbiAgICAgIGFyZ3MgPSBbcmVxdWVzdF07XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgICAgcmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgZG9NYXAgPSByZXF1ZXN0O1xuICAgICAgcmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb01hcCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGFyZ3MgPSBbZG9NYXAgYXMgTWF5YmVDb250ZXh0dWFsQXJnPGFueT4sIC4uLmFyZ3NdO1xuICAgICAgZG9NYXAgPSB0cnVlIGFzIE1BUDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZ2V0Q2VydGlmaWNhdGVzXG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBjZXJ0aWZpY2F0ZXMke3JlcXVlc3QgPyBgIGZvciAke3JlcXVlc3QuaWR9YCA6IFwiXCJ9IGZvciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZTogQ2VydGlmaWNhdGVSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IHRoaXMuY2VydGlmaWNhdGVzLmdldENlcnRpZmljYXRlcyhyZXF1ZXN0IHx8IHt9LCB0aGlzLnVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLnZlcmJvc2UoYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXNgKTtcbiAgICBsb2cuZGVidWcocmVzcG9uc2UuY2VydHMpO1xuICAgIHJldHVybiAoXG4gICAgICBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2VcbiAgICApIGFzIE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdO1xuICB9XG5cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcyhjdHg6IENvbnRleHQpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIElkZW50aXRpZXMgdW5kZXIgQ0EgJHt0aGlzLmNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5pZGVudGl0aWVzLmdldEFsbCh0aGlzLnVzZXIpKVxuICAgICAgLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5pZGVudGl0aWVzLmxlbmd0aH0gSWRlbnRpdGllc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5pZGVudGl0aWVzKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuaWRlbnRpdGllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmUgYWZmaWxpYXRpb25zIGZyb20gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBmb3IgdGhlIGxpc3Qgb2YgYWZmaWxpYXRpb25zIGF2YWlsYWJsZSB1bmRlciB0aGUgY29uZmlndXJlZCBDQS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWZmaWxpYXRpb25zIHJlc3VsdCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWZmaWxpYXRpb25zKGN0eDogQ29udGV4dCkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0QWZmaWxpYXRpb25zKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hZmZpbGlhdGlvbnMuZ2V0QWxsKHRoaXMudXNlcikpLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5hLmxlbmd0aH0gQWZmaWxpYXRpb25zYCk7XG4gICAgbG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLlJFQUQsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnJlYWRcbiAgICApO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIGlkZW50aXR5IHdpdGggZW5yb2xsbWVudCBJRCAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0T25lKGVucm9sbG1lbnRJZCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVnaXN0ZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJcbiAgICApO1xuXG4gICAgbGV0IHJlZ2lzdHJhdGlvbjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgZW5yb2xsbWVudElEOiB1c2VyTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHBhc3N3b3JkLFxuICAgICAgICBhZmZpbGlhdGlvbjogYWZmaWxpYXRpb24sXG4gICAgICAgIHVzZXJSb2xlOiB1c2VyUm9sZSxcbiAgICAgICAgYXR0cnM6IGF0dHJzLFxuICAgICAgICBtYXhFbnJvbGxtZW50czogbWF4RW5yb2xsbWVudHMsXG4gICAgICB9IGFzIElSZWdpc3RlclJlcXVlc3Q7XG4gICAgICByZWdpc3RyYXRpb24gPSBhd2FpdCB0aGlzLmNsaWVudC5yZWdpc3Rlcihwcm9wcywgdGhpcy51c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY3R4OiBDb250ZXh0XG4gICk6IElkZW50aXR5IHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmlkZW50aXR5RnJvbUVucm9sbG1lbnQpO1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEdlbmVyYXRpbmcgSWRlbnRpdHkgZnJvbSBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlfSBpbiBtc3AgJHttc3BJZH1gXG4gICAgKTtcbiAgICBjb25zdCBjbGllbnRJZCA9IENyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBpZCA9IENyeXB0b1V0aWxzLmVuY29kZShjbGllbnRJZCk7XG4gICAgbG9nLmRlYnVnKGBJZGVudGl0eSAke2NsaWVudElkfSBhbmQgZW5jb2RlZElkICR7aWR9YCk7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eSh7XG4gICAgICBpZDogaWQsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleToga2V5LnRvQnl0ZXMoKSxcbiAgICAgICAgcm9vdENlcnRpZmljYXRlOiByb290Q2VydGlmaWNhdGUsXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnJvbGwgYW4gaWRlbnRpdHkgd2l0aCB0aGUgQ0EgdXNpbmcgYSByZWdpc3RyYXRpb24gc2VjcmV0LlxuICAgKiBAc3VtbWFyeSBFeGNoYW5nZXMgdGhlIGVucm9sbG1lbnQgSUQgYW5kIHNlY3JldCBmb3IgY2VydGlmaWNhdGVzLCByZXR1cm5pbmcgYSBjb25zdHJ1Y3RlZCBJZGVudGl0eSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gZW5yb2xsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uIC0gRW5yb2xsbWVudCBzZWNyZXQgcmV0dXJuZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyBlbnJvbGwoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmVnaXN0cmF0aW9uOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcImVucm9sbFwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5lbnJvbGxcbiAgICApO1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgRW5yb2xsaW5nICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZW5yb2xsKHtcbiAgICAgICAgZW5yb2xsbWVudElEOiBlbnJvbGxtZW50SWQsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHJlZ2lzdHJhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNvbmZpZy5jYU5hbWV9IGFzICR7aWRlbnRpdHkuaWR9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IGlkZW50aXR5IGluIG9uZSBzdGVwLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBuZXcgZW5yb2xsbWVudCBJRCB3aXRoIHRoZSBDQSBhbmQgaW1tZWRpYXRlbHkgZXhjaGFuZ2VzIHRoZSBzZWNyZXQgdG8gZW5yb2xsLCByZXR1cm5pbmcgdGhlIGNyZWF0ZWQgSWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgZm9yIHRoZSBuZXcgaWRlbnRpdHkgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJBbmRFbnJvbGwoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVnaXN0ZXItZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnJlZ2lzdGVyQW5kRW5yb2xsXG4gICAgKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCB0aGlzLnJlZ2lzdGVyKFxuICAgICAgbW9kZWwsXG4gICAgICBpc1N1cGVyVXNlcixcbiAgICAgIGFmZmlsaWF0aW9uLFxuICAgICAgdXNlclJvbGUsXG4gICAgICBhdHRycyxcbiAgICAgIG1heEVucm9sbG1lbnRzLFxuICAgICAgY3R4XG4gICAgKTtcbiAgICBjb25zdCB7IHVzZXJOYW1lIH0gPSBtb2RlbDtcbiAgICByZXR1cm4gdGhpcy5lbnJvbGwodXNlck5hbWUgYXMgc3RyaW5nLCByZWdpc3RyYXRpb24sIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlLWVucm9sbCBhbiBleGlzdGluZyBpZGVudGl0eSB1c2luZyBpdHMgY3VycmVudCBlbnJvbGxtZW50LlxuICAgKiBAc3VtbWFyeSBSZW5ld3MgdGhlIGVucm9sbG1lbnQgY2VydGlmaWNhdGUgYnkgY2FsbGluZyB0aGUgQ0EgcmVlbnJvbGwuXG4gICAqIEBwYXJhbSB7VXNlcn0gY3VycmVudFVzZXIgLSBBbHJlYWR5IGVucm9sbGVkIHVzZXIsIG11c3QgaGF2ZSBhIHNpZ25pbmcgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgcmVuZXdlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBuZXcgY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyB1cGRhdGVJZGVudGl0eShcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICBpZGVudGl0eTogeyBjZXJ0aWZpY2F0ZTogc3RyaW5nOyBwcml2YXRlS2V5OiBzdHJpbmcgfSxcbiAgICBpZGVudGl0eVJlcXVlc3Q6IElJZGVudGl0eVJlcXVlc3QsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJlZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnVwZGF0ZUlkZW50aXR5XG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgUmVuZXdpbmcgaWRlbnRpdHkgZm9yICR7ZW5yb2xsbWVudElkfWApO1xuXG4gICAgICAvLyBVcGRhdGUgYXR0cmlidXRlcyBpbiB0aGUgQ0EgcmVnaXN0cnkgKGFkbWluIG9wZXJhdGlvbikuIFRoaXMgY2hhbmdlcyB0aGUgXCJzb3VyY2Ugb2YgdHJ1dGhcIi5cbiAgICAgIGNvbnN0IGlkZW50aXR5U2VydmljZSA9IHRoaXMuY2xpZW50Lm5ld0lkZW50aXR5U2VydmljZSgpO1xuXG4gICAgICBjb25zdCBjYVVzZXJJZGVudGl0eSA9IChhd2FpdCBpZGVudGl0eVNlcnZpY2UuZ2V0T25lKFxuICAgICAgICBlbnJvbGxtZW50SWQsXG4gICAgICAgIHRoaXMudXNlclxuICAgICAgKSkgYXMgeyByZXN1bHQ6IHsgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXSB9IH07XG5cbiAgICAgIGF3YWl0IGlkZW50aXR5U2VydmljZS51cGRhdGUoZW5yb2xsbWVudElkLCBpZGVudGl0eVJlcXVlc3QsIHRoaXMudXNlcik7IC8vIGFzIElTZXJ2aWNlUmVzcG9uc2UgJiB7IHJlc3VsdDogSUlkZW50aXR5UmVxdWVzdCB9O1xuXG4gICAgICAvLyBSZWVucm9sbCBhcyB0aGUgdXNlci4gUmVxdWVzdCBtdXN0IGJlIHNpZ25lZCB1c2luZyB0aGUgZXhpc3RpbmcgY2VydGlmaWNhdGUuXG4gICAgICBjb25zdCByZWVucm9sbFVzZXIgPSBVc2VyLmNyZWF0ZVVzZXIoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgXCJcIiwgLy8gZW5yb2xsbWVudFNlY3JldCBub3QgcmVxdWlyZWQgZm9yIHJlZW5yb2xsXG4gICAgICAgIHRoaXMudXNlci5nZXRNc3BpZCgpLFxuICAgICAgICBpZGVudGl0eS5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgaWRlbnRpdHkucHJpdmF0ZUtleVxuICAgICAgKTtcbiAgICAgIHJlZW5yb2xsVXNlci5zZXRDcnlwdG9TdWl0ZSh0aGlzLnVzZXIuZ2V0Q3J5cHRvU3VpdGUoKSk7XG5cbiAgICAgIGNvbnN0IGVucm9sbG1lbnRBdHRyczogSUF0dHJpYnV0ZVJlcXVlc3RbXSA9IChcbiAgICAgICAgY2FVc2VySWRlbnRpdHkucmVzdWx0LmF0dHJzIHx8IFtdXG4gICAgICApLm1hcCgoeyBuYW1lIH0pID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudCA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZW5yb2xsKFxuICAgICAgICByZWVucm9sbFVzZXIsXG4gICAgICAgIGVucm9sbG1lbnRBdHRyc1xuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVuZXdlZElkZW50aXR5ID0gRmFicmljSWRlbnRpdHlTZXJ2aWNlLmlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgICAgIGVucm9sbG1lbnQsXG4gICAgICAgIHRoaXMuY29uZmlnLmNhTmFtZSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuXG4gICAgICAvLyBSZXZva2UgdGhlIHByZXZpb3VzIGNlcnRpZmljYXRlIG9ubHksIHNvIHRoZSBvbGQgY2VydCBiZWNvbWVzIGludmFsaWQuXG4gICAgICBsb2cuZGVidWcoYFJldm9raW5nIHByZXZpb3VzIGNlcnRpZmljYXRlcyBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCB7IGFraSwgc2VyaWFsIH0gPSBnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydChpZGVudGl0eS5jZXJ0aWZpY2F0ZSk7XG4gICAgICBhd2FpdCB0aGlzLnJldm9rZShlbnJvbGxtZW50SWQsIHsgYWtpLCBzZXJpYWwgfSwgYXJncyk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgUmVuZXcgaWRlbnRpdHkgc3VjY2Vzc2Z1bCBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICByZXR1cm4gcmVuZXdlZElkZW50aXR5O1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2VzIHRoZSBlbnJvbGxtZW50IG9mIGFuIGlkZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBlbnJvbGxtZW50IElELlxuICAgKlxuICAgKiBAcGFyYW0gZW5yb2xsbWVudElkIC0gVGhlIGVucm9sbG1lbnQgSUQgb2YgdGhlIGlkZW50aXR5IHRvIGJlIHJldm9rZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXN1bHQgb2YgdGhlIHJldm9jYXRpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAdGhyb3dzIHtOb3RGb3VuZEVycm9yfSBJZiB0aGUgZW5yb2xsbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZG9lcyBub3QgZXhpc3QuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0aGUgcmV2b2NhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIHJldm9rZU9wdGlvbnM6IE9taXQ8SVJldm9rZVJlcXVlc3QsIFwiZW5yb2xsbWVudElEXCI+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SVNlcnZpY2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZXZva2VcIiwgdHJ1ZSkpLmZvcih0aGlzLnJldm9rZSk7XG4gICAgbG9nLnZlcmJvc2UoYFJldm9raW5nIGlkZW50aXR5IHdpdGggZW5yb2xsbWVudCBJRCAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9XG4gICAgICAgIEJvb2xlYW4ocmV2b2tlT3B0aW9ucy5zZXJpYWwpIHx8IEJvb2xlYW4ocmV2b2tlT3B0aW9ucy5ha2kpXG4gICAgICAgICAgPyBcIlJldm9rZSBVc2VyIENlcnRpZmljYXRlXCJcbiAgICAgICAgICA6IFwiVXNlciBEZWxldGlvblwiO1xuXG4gICAgICBjb25zdCByZXZva2VSZXF1ZXN0OiBJUmV2b2tlUmVxdWVzdCA9IHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgICAuLi5yZXZva2VPcHRpb25zLFxuICAgICAgICBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLFxuICAgICAgfTtcblxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5jbGllbnQucmV2b2tlKHJldm9rZVJlcXVlc3QsIHRoaXMudXNlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHJvbGUgdHlwZXMgdXNlZCBkdXJpbmcgZW5yb2xsbWVudCBhbmQgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3RhbmRhcmQgSHlwZXJsZWRnZXIgRmFicmljIENBIHJvbGVzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIGlkZW50aXRpZXMgd2hlbiByZWdpc3RlcmluZyB3aXRoIHRoZSBDQSBzZXJ2aWNlLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBDQV9ST0xFIHtcbiAgLyoqIEFkbWluaXN0cmF0b3Igcm9sZSB3aXRoIGVsZXZhdGVkIHByaXZpbGVnZXMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYW5kIGFmZmlsaWF0aW9ucyAqL1xuICBBRE1JTiA9IFwiYWRtaW5cIixcbiAgLyoqIFN0YW5kYXJkIHVzZXIgcm9sZSBmb3IgYXBwbGljYXRpb24gY2xpZW50cyBpbnRlcmFjdGluZyB3aXRoIHRoZSBuZXR3b3JrICovXG4gIFVTRVIgPSBcInVzZXJcIixcbiAgLyoqIENsaWVudCByb2xlIHR5cGljYWxseSB1c2VkIGZvciBTREstYmFzZWQgaW50ZXJhY3Rpb25zIGFuZCBzZXJ2aWNlIGFjY291bnRzICovXG4gIENMSUVOVCA9IFwiY2xpZW50XCIsXG59XG4iLCJpbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3M6IEZhYnJpY0NsaWVudEZsYWdzID0gT2JqZWN0LmFzc2lnbih7XG4gIGV2YWx1YXRlVGltZW91dDogNSxcbiAgZW5kb3JzZVRpbWVvdXQ6IDE1LFxuICBzdWJtaXRUaW1lb3V0OiA1LFxuICBjb21taXRUaW1lb3V0OiA2MCxcbiAgbGVnYWN5OiBmYWxzZSxcbiAgYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzOiBmYWxzZSxcbiAgYWxsb3dHYXRld2F5T3ZlcnJpZGU6IGZhbHNlLFxuICByZWJ1aWxkV2l0aFRyYW5zaWVudDogdHJ1ZSxcbiAgZW5jcnlwdFRyYW5zaWVudDogZmFsc2UsXG4gIHN5bnRoZXRpY0V2ZW50czogdHJ1ZSxcbn0pIGFzIGFueTtcbiIsImltcG9ydCB7IGlzQnJvd3NlciwgTWluaUxvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBJZGVudGl0eSwgU2lnbmVyLCBzaWduZXJzIH0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplSW1wb3J0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmNvbnN0IGxvZyA9IG5ldyBNaW5pTG9nZ2VyKFwiZmFicmljLWZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMb2FkcyBjb250ZW50IGZyb20gYSBmaWxlIG9yIHJldHVybnMgdGhlIGNvbnRlbnQgaWYgYWxyZWFkeSBsb2FkZWRcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgdGhlIGlucHV0IGlzIGFscmVhZHkgY29udGVudCBvciBhIHBhdGggdG8gYSBmaWxlLCBhbmQgbG9hZHMgdGhlIGZpbGUgaWYgbmVlZGVkXG4gKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnRPclBhdGggLSBUaGUgY29udGVudCBvciBwYXRoIHRvIGxvYWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbGVSZWFkZXIgLSBGdW5jdGlvbiB0byByZWFkIHRoZSBmaWxlIGlmIGNvbnRlbnRPclBhdGggaXMgYSBwYXRoXG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+fSBUaGUgY29udGVudFxuICogQGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250ZW50T2ZMb2FkRmlsZShcbiAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgZmlsZVJlYWRlcjogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBVaW50OEFycmF5IHwgQnVmZmVyPlxuKSB7XG4gIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gIGlmIChcbiAgICBjb250ZW50T3JQYXRoLm1hdGNoKFxuICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICApXG4gIClcbiAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbVxuICogQHN1bW1hcnkgTG9hZHMgYSBmaWxlIHVzaW5nIHRoZSBOb2RlLmpzIGZpbGUgc3lzdGVtIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IGNvbnRlbnRPclBhdGggLSBUaGUgY29udGVudCBvciBwYXRoIHRvIGxvYWRcbiAqIEByZXR1cm4ge1Byb21pc2U8QnVmZmVyPn0gVGhlIGZpbGUgY29udGVudCBhcyBhIEJ1ZmZlclxuICogQGZ1bmN0aW9uIHJlYWRGaWxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZShjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICBjb25zdCBmaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICB9O1xuXG4gIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHVzZXJcbiAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgdXNlciB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEZhYnJpYyBDQVxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lIC0gVGhlIHVzZXIgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHByaXZhdGVLZXkgLSBUaGUgcHJpdmF0ZSBrZXkgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0aWZpY2F0ZSAtIFRoZSBjZXJ0aWZpY2F0ZSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gVGhlIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBJRFxuICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgdXNlclxuICogQGZ1bmN0aW9uIGdldENBVXNlclxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q0FVc2VyKFxuICB1c2VyTmFtZTogc3RyaW5nLFxuICBwcml2YXRlS2V5OiBzdHJpbmcsXG4gIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gIG1zcElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlcj4ge1xuICBsb2cuZGVidWcoXG4gICAgYENyZWF0aW5nIGEgQ0EgJHttc3BJZH0gdXNlciAke3VzZXJOYW1lfSB3aXRoIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9YFxuICApO1xuICBjb25zdCB1c2VyID0gbmV3IFVzZXIodXNlck5hbWUpO1xuICBjb25zdCBjcnlwdG9TdWl0ZSA9IFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgdXNlci5zZXRDcnlwdG9TdWl0ZShjcnlwdG9TdWl0ZSk7XG4gIGNvbnN0IGltcG9ydGVkS2V5ID0gY3J5cHRvU3VpdGUuY3JlYXRlS2V5RnJvbVJhdyhwcml2YXRlS2V5KTtcbiAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGltcG9ydGVkS2V5LCBjZXJ0aWZpY2F0ZSwgbXNwSWQpO1xuICByZXR1cm4gdXNlcjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyBhbiBpZGVudGl0eSBmcm9tIGEgY2VydGlmaWNhdGUgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIGNlcnRpZmljYXRlIGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYW4gSWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcGFyYW0ge3N0cmluZ30gY2VydERpcmVjdG9yeVBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGVcbiAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgaWRlbnRpdHlcbiAqIEBmdW5jdGlvbiBnZXRJZGVudGl0eVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SWRlbnRpdHkoXG4gIG1zcElkOiBzdHJpbmcsXG4gIGNlcnREaXJlY3RvcnlQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3QgY2VydFBhdGggPSBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoY2VydFBhdGgpO1xuICAgIHJldHVybiBjcmVkZW50aWFscztcbiAgfTtcblxuICBjb25zdCBjcmVkZW50aWFsczogVWludDhBcnJheSA9IChhd2FpdCBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICBpZGVudGl0eUZpbGVSZWFkZXJcbiAgKSkgYXMgVWludDhBcnJheTtcblxuICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlIGluIGEgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBSZWFkcyBhIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgcGF0aCB0byB0aGUgZmlyc3QgZmlsZSBmb3VuZFxuICogQHBhcmFtIHtzdHJpbmd9IGRpclBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlyc3QgZmlsZVxuICogQGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWUoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlIGluIGEgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBSZWFkcyBhIGRpcmVjdG9yeSwgZmluZHMgdGhlIGZpcnN0IGZpbGUsIGFuZCByZXR1cm5zIGl0cyBjb250ZW50IGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgZmlsZVxuICogQGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChcbiAgZGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pKSkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyBhIHNpZ25lciBmcm9tIGEga2V5IGRpcmVjdG9yeVxuICogQHN1bW1hcnkgTG9hZHMgYSBwcml2YXRlIGtleSBmcm9tIGEgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGEgU2lnbmVyIGZvciBGYWJyaWMgdHJhbnNhY3Rpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxTaWduZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgc2lnbmVyXG4gKiBAZnVuY3Rpb24gZ2V0U2lnbmVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgY29uc3Qgc2lnbmVyRmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShrZXlQYXRoKTtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlS2V5UGVtID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgc2lnbmVyRmlsZVJlYWRlclxuICApKSBhcyBCdWZmZXI7XG4gIC8vIE5vZGUgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgLy8gcHJpdmF0ZUtleSA9IGNyZWF0ZVByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gIC8vIC0tXG5cbiAgLy8gd2ViIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCBleHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJpdmF0ZUtleSk7XG4gIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAvLyAtLVxuXG4gIHJldHVybiBzaWduZXJzLm5ld1ByaXZhdGVLZXlTaWduZXIoayBhcyBhbnkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyBhIHByaXZhdGUga2V5IGZyb20gYSBQRU0gYnVmZmVyXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5IHRvIGEgQ3J5cHRvS2V5IG9iamVjdFxuICogQHBhcmFtIHtCdWZmZXJ9IHBlbSAtIFRoZSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxDcnlwdG9LZXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ3J5cHRvS2V5XG4gKiBAZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEV4dHJhY3RQcml2YXRlS2V5XG4gKiAgIHBhcnRpY2lwYW50IFN1YnRsZUNyeXB0b1xuICpcbiAqICAgQ2FsbGVyLT4+RXh0cmFjdFByaXZhdGVLZXk6IGV4dHJhY3RQcml2YXRlS2V5KHBlbSlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogR2V0IFN1YnRsZUNyeXB0byBpbXBsZW1lbnRhdGlvblxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBQYXJzZSBQRU0gZm9ybWF0XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IENvbnZlcnQgdG8gYmluYXJ5IERFUlxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PlN1YnRsZUNyeXB0bzogaW1wb3J0S2V5KHBrY3M4LCBiaW5hcnlEZXIsIG9wdGlvbnMpXG4gKiAgIFN1YnRsZUNyeXB0by0tPj5FeHRyYWN0UHJpdmF0ZUtleTogQ3J5cHRvS2V5XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LS0+PkNhbGxlcjogQ3J5cHRvS2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleShwZW06IEJ1ZmZlcikge1xuICBjb25zdCBsaWJOYW1lID0gXCJjcnlwdG9cIjtcbiAgbGV0IHN1YnRsZTtcbiAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgc3VidGxlID0gKGdsb2JhbFRoaXMgYXMgYW55KS5jcnlwdG8uc3VidGxlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxpYiA9IChhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KGxpYk5hbWUpKSkgYXMgYW55O1xuICAgIHN1YnRsZSA9IGxpYi5zdWJ0bGUgfHwgbGliLndlYmNyeXB0by5zdWJ0bGU7XG4gIH1cblxuICBpZiAoIXN1YnRsZSkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgU3VidGxlQ3J5cHRvIG1vZHVsZVwiKTtcblxuICBmdW5jdGlvbiBzdHIyYWIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgY29uc3Qgc3RyID0gcGVtXG4gICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAucmVwbGFjZShcIi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIik7XG4gIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICBjb25zdCBiaW5hcnlEZXIgPSBzdHIyYWIoZGVjb2RlZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQWRhcHRlckZsYWdzLFxuICBDb25kaXRpb24sXG4gIENvbnRleHQsXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgT3BlcmF0b3IsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFF1ZXJ5Q2xhdXNlLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RTZWxlY3RvcixcbiAgU2VxdWVuY2UsXG4gIFN0YXRlbWVudCxcbiAgU3RhdGVtZW50RXhlY3V0b3IsXG4gIFZpZXdLaW5kLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICBDb3VjaERCT3BlcmF0b3IsXG4gIENvdWNoREJHcm91cE9wZXJhdG9yLFxuICBDb3VjaERCUXVlcnlMaW1pdCxcbiAgTWFuZ29RdWVyeSxcbiAgTWFuZ29PcGVyYXRvcixcbiAgTWFuZ29TZWxlY3RvcixcbiAgdHJhbnNsYXRlT3BlcmF0b3JzLFxuICBnZW5lcmF0ZURlc2lnbkRvY05hbWUsXG4gIGdlbmVyYXRlVmlld05hbWUsXG4gIGZpbmRWaWV3TWV0YWRhdGEsXG4gIENvdWNoREJWaWV3TWV0YWRhdGEsXG4gIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgdG9DYW1lbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxudHlwZSBGYWJyaWNWaWV3RGVzY3JpcHRvciA9IHtcbiAgZGRvYzogc3RyaW5nO1xuICB2aWV3OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG50eXBlIEZhYnJpY0FnZ3JlZ2F0ZUluZm8gPVxuICB8IHtcbiAgICAgIGtpbmQ6IFZpZXdLaW5kO1xuICAgICAgbWV0YTogQ291Y2hEQlZpZXdNZXRhZGF0YTtcbiAgICAgIGRlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgICAgY291bnREaXN0aW5jdD86IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwiYXZnXCI7XG4gICAgICBhdHRyaWJ1dGU6IHN0cmluZztcbiAgICAgIHN1bURlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgICAgY291bnREZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICB9O1xuXG5jb25zdCBlc2NhcGVSZWdFeHAgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG5cbmZ1bmN0aW9uIG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcXHUwMDAwXCI7XG4gIGNvbnN0IGNoYXJzID0gQXJyYXkuZnJvbSh2YWx1ZSk7XG4gIGZvciAobGV0IGkgPSBjaGFycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyc1tpXS5jb2RlUG9pbnRBdCgwKTtcbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAoY29kZSA8IDB4MTBmZmZmKSB7XG4gICAgICBjaGFyc1tpXSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUgKyAxKTtcbiAgICAgIHJldHVybiBjaGFycy5zbGljZSgwLCBpICsgMSkuam9pbihcIlwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3ZhbHVlfVxcdTAwMDBgO1xufVxuXG5mdW5jdGlvbiBwcmVmaXhSYW5nZShwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBwcmVmaXgsXG4gICAgZW5kOiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyhwcmVmaXgpLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50U3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIE0sXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gIFIsXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLCBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz4pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNxdWFzaChcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNxdWFzaGVkOiBQcmVwYXJlZFN0YXRlbWVudDxNPiB8IHVuZGVmaW5lZCA9IHN1cGVyLnNxdWFzaChcbiAgICAgIGN0eCBhcyBuZXZlclxuICAgICk7XG4gICAgaWYgKCFzcXVhc2hlZCkgcmV0dXJuIHNxdWFzaGVkO1xuXG4gICAgY29uc3QgeyBtZXRob2QsIHBhcmFtcywgYXJncyB9ID0gc3F1YXNoZWQ7XG4gICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0IH0gPSBwYXJhbXM7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiwgbGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiwgbGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCBtZXRob2QgJHttZXRob2R9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxdWFzaGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGVQcmVwYXJlZChcbiAgICAuLi5hcmd6OiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKHRoaXMuZnJvbVNlbGVjdG9yLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGNvbnN0IHsgbWV0aG9kLCBhcmdzIH0gPSB0aGlzLnByZXBhcmVkIGFzIFByZXBhcmVkU3RhdGVtZW50PGFueT47XG4gICAgcmV0dXJuIHJlcG8uc3RhdGVtZW50KG1ldGhvZCwgLi4uYXJncywgLi4uYXJneik7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwcmVwYXJlKFxuICAgIGN0eD86IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8U3RhdGVtZW50RXhlY3V0b3I8TSwgUj4+IHtcbiAgICBjdHggPVxuICAgICAgY3R4IHx8XG4gICAgICAoYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFBlcnNpc3RlbmNlS2V5cy5RVUVSWSxcbiAgICAgICAgdGhpcy5vdmVycmlkZXMgfHwge30sXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuaXNTaW1wbGVRdWVyeSgpICYmXG4gICAgICAoY3R4IGFzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KS5nZXQoXCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzXCIpXG4gICAgKSB7XG4gICAgICBjb25zdCBzcXVhc2hlZCA9IHRoaXMuc3F1YXNoKGN0eCBhcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPik7XG4gICAgICBpZiAoc3F1YXNoZWQpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlZCA9IHNxdWFzaGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge30gYXMgYW55O1xuXG4gICAgY29uc3QgcHJlcGFyZWQ6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gPSB7XG4gICAgICBjbGFzczogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBhcmdzLFxuICAgICAgcGFyYW1zLFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgbWV0aG9kOiBzdHJpbmdbXSA9IFtRdWVyeUNsYXVzZS5GSU5EX0JZXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnByZXBhcmVDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbiwgY3R4IGFzIG5ldmVyKTtcbiAgICAgIG1ldGhvZC5wdXNoKHBhcnNlZC5tZXRob2QpO1xuICAgICAgaWYgKHBhcnNlZC5hcmdzICYmIHBhcnNlZC5hcmdzLmxlbmd0aClcbiAgICAgICAgYXJncy5wdXNoKC4uLihwYXJzZWQuYXJncyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgbWV0aG9kLnB1c2goXG4gICAgICAgIFF1ZXJ5Q2xhdXNlLlNFTEVDVCxcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5qb2luKGAgJHtRdWVyeUNsYXVzZS5BTkQudG9Mb3dlckNhc2UoKX0gYClcbiAgICAgICk7XG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBtZXRob2QucHVzaChRdWVyeUNsYXVzZS5PUkRFUl9CWSwgdGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzBdIGFzIHN0cmluZyk7XG4gICAgICBhcmdzLnB1c2godGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzFdIGFzIGFueSk7XG4gICAgfVxuICAgIHByZXBhcmVkLm1ldGhvZCA9IHRvQ2FtZWxDYXNlKG1ldGhvZC5qb2luKFwiIFwiKSk7XG4gICAgcHJlcGFyZWQucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMucHJlcGFyZWQgPSBwcmVwYXJlZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgcmVjb3JkIGZyb20gQ291Y2hEQi9GYWJyaWNcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgdGhlIElEIGZyb20gYSBDb3VjaERCIGRvY3VtZW50IGFuZCByZXZlcnRzIGl0IHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcm9jZXNzUmVjb3JkKFxuICAgIHJlY29yZDogYW55LFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogTSB7XG4gICAgY29uc3QgcGtBdHRyID0gTW9kZWwucGsodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS5nZXQoXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIHBrQXR0ciBhcyBzdHJpbmcpXG4gICAgKT8udHlwZTtcblxuICAgIGlmIChyZWNvcmRbQ291Y2hEQktleXMuSURdKSB7XG4gICAgICBjb25zdCBbLCAuLi5rZXlBcmdzXSA9IHJlY29yZFtDb3VjaERCS2V5cy5JRF0uc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgICAgIGNvbnN0IGlkID0ga2V5QXJncy5qb2luKFwiX1wiKTtcbiAgICAgIHJlY29yZFtwa0F0dHJdID0gU2VxdWVuY2UucGFyc2VWYWx1ZSh0eXBlIGFzIGFueSwgaWQpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5wcm9jZXNzUmVjb3JkKHJlY29yZCwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnlcbiAgICogQHN1bW1hcnkgU2VuZHMgYSByYXcgTWFuZ28gcXVlcnkgdG8gRmFicmljIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0b3IgPSAocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlSW5mbztcbiAgICBpZiAoKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZSAmJiBhZ2dyZWdhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQWdncmVnYXRlPFI+KGFnZ3JlZ2F0b3IsIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhcbiAgICAgIHJhd0lucHV0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgY3R4XG4gICAgKTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3Rvcikge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gcmVzdWx0cy5tYXAoKHIpID0+IHRoaXMucHJvY2Vzc1JlY29yZChyLCBjdHgpKTtcbiAgICAgIGlmICghY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZ0ZXJRdWVyeUhhbmRsZXJzXCIpKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQgYXMgdW5rbm93biBhcyBSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFwcGx5QWZ0ZXJIYW5kbGVyc1RvUmVzdWx0KHByb2Nlc3NlZCwgY3R4KSkgYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBmcm9tIHRoZSBzdGF0ZW1lbnRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZCgpOiBNYW5nb1F1ZXJ5IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5idWlsZCk7XG4gICAgY29uc3QgYWdncmVnYXRlUXVlcnkgPSB0aGlzLmJ1aWxkQWdncmVnYXRlUXVlcnkoKTtcbiAgICBpZiAoYWdncmVnYXRlUXVlcnkpIHJldHVybiBhZ2dyZWdhdGVRdWVyeTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IE1hbmdvU2VsZWN0b3IgPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiBzZWxlY3RvcnMgfTtcbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcikgcXVlcnkuZmllbGRzID0gdGhpcy5zZWxlY3RTZWxlY3RvciBhcyBzdHJpbmdbXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBjb25kaXRpb246IE1hbmdvU2VsZWN0b3IgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBDb25kaXRpb24uYW5kKFxuICAgICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgICAgQ29uZGl0aW9uLmF0dHJpYnV0ZTxNPihDb3VjaERCS2V5cy5UQUJMRSBhcyBrZXlvZiBNKS5lcShcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IHNlbGVjdG9yS2V5cyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbikgYXMgTWFuZ29PcGVyYXRvcltdO1xuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RvcktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoQ291Y2hEQkdyb3VwT3BlcmF0b3IpLmluZGV4T2Yoc2VsZWN0b3JLZXlzWzBdKSAhPT0gLTFcbiAgICAgIClcbiAgICAgICAgc3dpdGNoIChzZWxlY3RvcktleXNbMF0pIHtcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdIGFzIE1hbmdvU2VsZWN0b3JcbiAgICAgICAgICAgICAgKS5yZWR1Y2UoKGFjY3VtOiBNYW5nb1NlbGVjdG9yW10sIHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIlRvbyBtYW55IGtleXMgaW4gcXVlcnkgc2VsZWN0b3IuIHNob3VsZCBiZSBvbmVcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0ga2V5c1swXTtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EKVxuICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaCguLi4odmFsW2tdIGFzIGFueVtdKSk7XG4gICAgICAgICAgICAgICAgZWxzZSBhY2N1bS5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgICAgICB9LCBbXSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBjb25kaXRpb247XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLk9SOiB7XG4gICAgICAgICAgICBjb25zdCBzOiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICBzW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMocXVlcnkuc2VsZWN0b3IpLm1hcCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbikuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChxdWVyeS5zZWxlY3RvcltrZXldKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBBICR7a2V5fSBxdWVyeSBwYXJhbSBpcyBhYm91dCB0byBiZSBvdmVycmlkZGVuOiAke3F1ZXJ5LnNlbGVjdG9yW2tleV19IGJ5ICR7dmFsfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jba2V5XSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBxdWVyeS5zb3J0ID0gcXVlcnkuc29ydCB8fCBbXTtcbiAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcXVlcnkuc2VsZWN0b3IgfHwgKHt9IGFzIE1hbmdvU2VsZWN0b3IpO1xuICAgICAgZm9yIChjb25zdCBbc2VsZWN0b3JLZXksIGRpcmVjdGlvbl0gb2YgdGhpcy5vcmRlckJ5U2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc2VsZWN0b3JLZXkgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPiA9IHt9O1xuICAgICAgICByZWNbc2VsZWN0b3JdID0gZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uO1xuICAgICAgICAocXVlcnkuc29ydCBhcyBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj5bXSkucHVzaChyZWMpO1xuICAgICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAgICAgKHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSXSA9XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGltaXRTZWxlY3Rvcikge1xuICAgICAgcXVlcnkubGltaXQgPSB0aGlzLmxpbWl0U2VsZWN0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgTm8gbGltaXQgc2VsZWN0b3IgZGVmaW5lZC4gVXNpbmcgZGVmYXVsdCBjb3VjaGRiIGxpbWl0IG9mICR7Q291Y2hEQlF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gQ291Y2hEQlF1ZXJ5TGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpIHF1ZXJ5LnNraXAgPSB0aGlzLm9mZnNldFNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBDb25kaXRpb24gb2JqZWN0IGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogTWFuZ29RdWVyeSB7XG4gICAgZnVuY3Rpb24gbWVyZ2UoXG4gICAgICBvcDogTWFuZ29PcGVyYXRvcixcbiAgICAgIG9iajE6IE1hbmdvU2VsZWN0b3IsXG4gICAgICBvYmoyOiBNYW5nb1NlbGVjdG9yXG4gICAgKTogTWFuZ29RdWVyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiB7fSBhcyBNYW5nb1NlbGVjdG9yIH07XG4gICAgICByZXN1bHQuc2VsZWN0b3Jbb3BdID0gW29iajEsIG9iajJdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuU1RBUlRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHJhbmdlID0gcHJlZml4UmFuZ2UoY29tcGFyaXNvbik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSX0VRXSA9IHJhbmdlLnN0YXJ0O1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuU01BTExFUl0gPSByYW5nZS5lbmQ7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuRU5EU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHtcbiAgICAgICAgW0NvdWNoREJPcGVyYXRvci5SRUdFWFBdOiBgJHtlc2NhcGVSZWdFeHAoY29tcGFyaXNvbil9JGAsXG4gICAgICB9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuQkVUV0VFTikge1xuICAgICAgY29uc3QgYXR0ciA9IGF0dHIxIGFzIHN0cmluZztcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb21wYXJpc29uKSB8fCBjb21wYXJpc29uLmxlbmd0aCAhPT0gMilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJCRVRXRUVOIG9wZXJhdG9yIHJlcXVpcmVzIFttaW4sIG1heF0gY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb21wYXJpc29uO1xuICAgICAgY29uc3Qgb3BCZXR3ZWVuOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wQmV0d2VlblthdHRyXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuQklHR0VSX0VRKVxuICAgICAgXSA9IG1pbjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5TTUFMTEVSX0VRKVxuICAgICAgXSA9IG1heDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcEJldHdlZW4gfTtcbiAgICB9XG5cbiAgICBsZXQgb3A6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgIGlmIChcbiAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICApID09PSAtMVxuICAgICkge1xuICAgICAgb3BbYXR0cjEgYXMgc3RyaW5nXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbYXR0cjEgYXMgc3RyaW5nXSBhcyBNYW5nb1NlbGVjdG9yKVt0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXSA9XG4gICAgICAgIGNvbXBhcmlzb247XG4gICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICBvcCA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvciBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIChhdHRyMSBhcyB1bmtub3duIGFzIHsgYXR0cjE6IHN0cmluZyB9KS5hdHRyMVxuICAgICAgXSA9IGNvbXBhcmlzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wMTogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgb3AyOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIG9wID0gbWVyZ2UodHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKSwgb3AxLCBvcDIpLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYW4gYWdncmVnYXRlIHF1ZXJ5IGlmIGFnZ3JlZ2F0aW9uIGlzIHJlcXVlc3RlZFxuICAgKiBAc3VtbWFyeSBDaGVja3MgZm9yIGFnZ3JlZ2F0ZSBvcGVyYXRpb25zIGFuZCByZXR1cm5zIGEgc3BlY2lhbCBNYW5nb1F1ZXJ5IGZvciB0aGVtXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWdncmVnYXRlUXVlcnkoKTogTWFuZ29RdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5hdmdTZWxlY3Rvcikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gU3RyaW5nKHRoaXMuYXZnU2VsZWN0b3IpO1xuICAgICAgY29uc3Qgc3VtSW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcInN1bVwiLCBhdHRyaWJ1dGUpO1xuICAgICAgY29uc3QgY291bnRJbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiY291bnRcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmICghc3VtSW5mbyB8fCAhY291bnRJbmZvKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICBgQXZnIG9wZXJhdGlvbiByZXF1aXJlcyBzdW0gYW5kIGNvdW50IHZpZXdzIGZvciBhdHRyaWJ1dGUgJHthdHRyaWJ1dGV9YFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoe1xuICAgICAgICBraW5kOiBcImF2Z1wiLFxuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIHN1bURlc2NyaXB0b3I6IHN1bUluZm8uZGVzY3JpcHRvcixcbiAgICAgICAgY291bnREZXNjcmlwdG9yOiBjb3VudEluZm8uZGVzY3JpcHRvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9XG4gICAgICAgIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yID09IG51bGxcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogU3RyaW5nKHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJkaXN0aW5jdFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaW5mby5jb3VudERpc3RpbmN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRvclVzZWQgPVxuICAgICAgdHlwZW9mIHRoaXMuY291bnRTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgdHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAhIXRoaXMubWluU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5tYXhTZWxlY3RvciB8fFxuICAgICAgISF0aGlzLnN1bVNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuZGlzdGluY3RTZWxlY3RvcjtcblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JDaGVja3M6IEFycmF5PFtWaWV3S2luZCwgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgIFtcbiAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAodGhpcy5jb3VudFNlbGVjdG9yID8/IHVuZGVmaW5lZCkgYXMgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWQsXG4gICAgICBdLFxuICAgICAgW1wibWF4XCIsIHRoaXMubWF4U2VsZWN0b3JdLFxuICAgICAgW1wibWluXCIsIHRoaXMubWluU2VsZWN0b3JdLFxuICAgICAgW1wic3VtXCIsIHRoaXMuc3VtU2VsZWN0b3JdLFxuICAgICAgW1wiZGlzdGluY3RcIiwgdGhpcy5kaXN0aW5jdFNlbGVjdG9yXSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBba2luZCwgc2VsZWN0b3JdIG9mIGFnZ3JlZ2F0b3JDaGVja3MpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHNlbGVjdG9yID8gU3RyaW5nKHNlbGVjdG9yKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3Ioa2luZCwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICB9XG5cbiAgICBpZiAoYWdncmVnYXRvclVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBgTm8gQ291Y2hEQiB2aWV3IG1ldGFkYXRhIGZvdW5kIGZvciB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgICApfSBhZ2dyZWdhdG9yYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBhZ2dyZWdhdGUgZGVzY3JpcHRvciBmb3IgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXG4gICAga2luZDogVmlld0tpbmQsXG4gICAgYXR0cmlidXRlPzogc3RyaW5nXG4gICk6IEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhcyA9IGZpbmRWaWV3TWV0YWRhdGEodGhpcy5mcm9tU2VsZWN0b3IsIGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgaWYgKCFtZXRhcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YSA9IG1ldGFzWzBdO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3Qgdmlld05hbWUgPSBnZW5lcmF0ZVZpZXdOYW1lKHRhYmxlTmFtZSwgbWV0YS5hdHRyaWJ1dGUsIGtpbmQsIG1ldGEpO1xuICAgIGNvbnN0IGRkb2MgPSBtZXRhLmRkb2MgfHwgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lKHRhYmxlTmFtZSwgdmlld05hbWUpO1xuICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICByZWR1Y2U6IG1ldGEucmVkdWNlICE9PSB1bmRlZmluZWQgPyB0cnVlIDogIW1ldGEucmV0dXJuRG9jcyxcbiAgICB9O1xuICAgIGlmIChraW5kID09PSBcImRpc3RpbmN0XCIgfHwga2luZCA9PT0gXCJncm91cEJ5XCIpIG9wdGlvbnMuZ3JvdXAgPSB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kLFxuICAgICAgbWV0YSxcbiAgICAgIGRlc2NyaXB0b3I6IHtcbiAgICAgICAgZGRvYyxcbiAgICAgICAgdmlldzogdmlld05hbWUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIHNwZWNpYWwgYWdncmVnYXRlIE1hbmdvUXVlcnkgbWFya2VyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3Rvcjoge30sXG4gICAgICBhZ2dyZWdhdGU6IHRydWUsXG4gICAgICBhZ2dyZWdhdGVJbmZvOiBpbmZvLFxuICAgIH0gYXMgTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIgY2FzdCB0byBGYWJyaWNDbGllbnRBZGFwdGVyIGZvciB2aWV3IGFjY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRGYWJyaWNBZGFwdGVyKCk6IEZhYnJpY0NsaWVudEFkYXB0ZXIge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYW4gYWdncmVnYXRlIHF1ZXJ5IHZpYSBhZGFwdGVyJ3MgdmlldyBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKCF0aGlzLmlzVmlld0FnZ3JlZ2F0ZShpbmZvKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXZlcmFnZTxSPihpbmZvLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5kZG9jLFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci52aWV3LFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5vcHRpb25zLFxuICAgICAgY3R4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVmlld1Jlc3BvbnNlPFI+KGluZm8sIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhdmVyYWdlIGNhbGN1bGF0aW9uIGZyb20gc3VtIGFuZCBjb3VudCB2aWV3c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVBdmVyYWdlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoaW5mby5raW5kICE9PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJBdmVyYWdlIGRlc2NyaXB0b3IgaXMgbm90IHZhbGlkXCIpO1xuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCBbc3VtRGVzYywgY291bnREZXNjXSA9IFtpbmZvLnN1bURlc2NyaXB0b3IsIGluZm8uY291bnREZXNjcmlwdG9yXTtcbiAgICBjb25zdCBbc3VtUmVzcG9uc2UsIGNvdW50UmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIHN1bURlc2MuZGRvYyxcbiAgICAgICAgc3VtRGVzYy52aWV3LFxuICAgICAgICBzdW1EZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBjb3VudERlc2MuZGRvYyxcbiAgICAgICAgY291bnREZXNjLnZpZXcsXG4gICAgICAgIGNvdW50RGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgXSk7XG4gICAgY29uc3Qgc3VtID0gc3VtUmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRSZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgaWYgKCFjb3VudCkgcmV0dXJuIDAgYXMgdW5rbm93biBhcyBSO1xuICAgIHJldHVybiAoc3VtIC8gY291bnQpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHRoZSB2aWV3IHJlc3BvbnNlIGJhc2VkIG9uIGFnZ3JlZ2F0ZSBraW5kXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICByZXNwb25zZTogVmlld1Jlc3BvbnNlXG4gICk6IFIge1xuICAgIGlmIChpbmZvLmtpbmQgPT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgXCJBdmVyYWdlIHJlc3VsdHMgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIHByb2Nlc3Npbmcgcm93c1wiXG4gICAgICApO1xuICAgIGNvbnN0IHJvd3MgPSByZXNwb25zZS5yb3dzIHx8IFtdO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgbWV0YSA9IHZpZXdJbmZvLm1ldGE7XG4gICAgaWYgKHZpZXdJbmZvLmNvdW50RGlzdGluY3QpIHtcbiAgICAgIHJldHVybiAocm93cy5sZW5ndGggfHwgMCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAodmlld0luZm8ua2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IHZpZXdJbmZvLmtpbmQgPT09IFwiZ3JvdXBCeVwiKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LmtleSA/PyByb3cudmFsdWUpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKG1ldGEucmV0dXJuRG9jcykge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy52YWx1ZSA/PyByb3cuZG9jID8/IHJvdykgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gKHZpZXdJbmZvLmtpbmQgPT09IFwiY291bnRcIiA/IDAgOiBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiAocm93c1swXS52YWx1ZSA/PyByb3dzWzBdLmtleSA/PyBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgaW5mbyBpcyBhIHZpZXctYmFzZWQgYWdncmVnYXRlXG4gICAqL1xuICBwcml2YXRlIGlzVmlld0FnZ3JlZ2F0ZShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IGluZm8gaXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHtcbiAgICByZXR1cm4gaW5mby5raW5kICE9PSBcImF2Z1wiO1xuICB9XG59XG4iLCJpbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgdHlwZSBNYW5nb1F1ZXJ5LFxuICB0eXBlIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCAqIGFzIGdycGMgZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7XG4gIE1vZGVsLFxuICB0eXBlIE1vZGVsQ29uc3RydWN0b3IsXG4gIHR5cGUgU2VyaWFsaXplcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVidWcsIGZpbmFsLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIFBlZXJDb25maWcsXG4gIHR5cGUgU2VncmVnYXRlZE1vZGVsLFxuICB0eXBlIE1zcERldGFpbHMsXG59IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNvbm5lY3QsXG4gIHR5cGUgQ29ubmVjdE9wdGlvbnMsXG4gIEdhdGV3YXksXG4gIE5ldHdvcmssXG4gIFByb3Bvc2FsT3B0aW9ucyxcbiAgQ29udHJhY3QgYXMgQ29udHJha3QsXG4gIHR5cGUgU2lnbmVyLFxuICBHYXRld2F5RXJyb3IsXG4gIEVuZG9yc2VFcnJvcixcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgR2F0ZXdheSBhcyBMZWdhY3lHYXRld2F5LCBXYWxsZXRzIH0gZnJvbSBcImZhYnJpYy1uZXR3b3JrXCI7XG5pbXBvcnQgdHlwZSB7IEVuZG9yc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7XG4gIGdldElkZW50aXR5LFxuICBnZXRTaWduZXIsXG4gIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50LFxuICByZWFkRmlsZSBhcyByZWFkRnNGaWxlLFxufSBmcm9tIFwiLi9mYWJyaWMtZnNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgdHlwZSBQcmltYXJ5S2V5VHlwZSxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIEFkYXB0ZXIsXG4gIHR5cGUgQWRhcHRlckZsYWdzLFxuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE1pZ3JhdGlvbkVycm9yLFxuICBPYnNlcnZlckVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBTdGF0ZW1lbnQsXG4gIHR5cGUgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFBhZ2luYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBDb250ZXh0dWFsQXJncyxcbiAgdHlwZSBQcmVwYXJlZE1vZGVsLFxuICBBbGxPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIgfSBmcm9tIFwiLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2xpZW50U2VyaWFsaXplciB9IGZyb20gXCIuLi9zaGFyZWQvQ2xpZW50U2VyaWFsaXplclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RGlzcGF0Y2ggfSBmcm9tIFwiLi9GYWJyaWNDbGllbnREaXNwYXRjaFwiO1xuLy8gaW1wb3J0IHsgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbSB9IGZyb20gXCIuL2ZhYnJpYy1oc21cIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFN0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFN0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UGFnaW5hdG9yIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgRW5kb3JzZW1lbnRFcnJvcixcbiAgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcixcbiAgTXZjY1JlYWRDb25mbGljdEVycm9yLFxuICBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IsXG4gIFRyYW5zYWN0aW9uVGltZW91dEVycm9yLFxufSBmcm9tIFwiLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuL2NyeXB0b1wiO1xuaW1wb3J0IHsgZXh0cmFjdElkcyB9IGZyb20gXCIuL2lkcy9pZC1leHRyYWN0aW9uXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi9zaGFyZWQvaW5kZXhcIjtcblxudHlwZSBMZWdhY3lQZWVyVGFyZ2V0ID0ge1xuICBtc3BJZDogc3RyaW5nO1xuICBwZWVyRW5kcG9pbnQ6IHN0cmluZztcbiAgcGVlckhvc3RBbGlhcz86IHN0cmluZztcbiAgdGxzQ2VydD86IHN0cmluZyB8IEJ1ZmZlcjtcbn07XG5cbnR5cGUgTGVnYWN5UGVlcldpdGhOYW1lID0gTGVnYWN5UGVlclRhcmdldCAmIHsgbmFtZTogc3RyaW5nIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzXG4gKiBAc3VtbWFyeSBUaGUgRmFicmljQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyIHRvIHByb3ZpZGUgYSBzZWFtbGVzcyBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzLlxuICogSXQgaGFuZGxlcyBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIHRyYW5zYWN0aW9uIHN1Ym1pc3Npb24sIGFuZCBDUlVEIG9wZXJhdGlvbnMgYWdhaW5zdCBGYWJyaWMgY2hhaW5jb2RlLlxuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHRlbXBsYXRlIEZhYnJpY0ZsYWdzIC0gRmxhZ3Mgc3BlY2lmaWMgdG8gRmFicmljIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBDb250ZXh0PEZhYnJpY0ZsYWdzPiAtIENvbnRleHQgdHlwZSBjb250YWluaW5nIEZhYnJpYy1zcGVjaWZpYyBmbGFnc1xuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGFsaWFzIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gKiBjb25zdCBjb25maWc6IFBlZXJDb25maWcgPSB7XG4gKiAgIG1zcElkOiAnT3JnMU1TUCcsXG4gKiAgIHBlZXJFbmRwb2ludDogJ2xvY2FsaG9zdDo3MDUxJyxcbiAqICAgY2hhbm5lbE5hbWU6ICdteWNoYW5uZWwnLFxuICogICBjaGFpbmNvZGVOYW1lOiAnbXljYycsXG4gKiAgIGNvbnRyYWN0TmFtZTogJ215Y29udHJhY3QnLFxuICogICB0bHNDZXJ0UGF0aDogJy9wYXRoL3RvL3Rscy9jZXJ0JyxcbiAqICAgY2VydERpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9jZXJ0L2RpcicsXG4gKiAgIGtleURpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9rZXkvZGlyJ1xuICogfTtcbiAqXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IEZhYnJpY0FkYXB0ZXIoY29uZmlnLCAnb3JnMS1hZGFwdGVyJyk7XG4gKlxuICogLy8gVXNlIHRoZSBhZGFwdGVyIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJ3VzZXIxJywgbXlTZXJpYWxpemVyKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgc2VyaWFsaXplcilcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHN1Ym1pdFRyYW5zYWN0aW9uKE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbc2VyaWFsaXplZE1vZGVsXSwgdHJhbnNpZW50KVxuICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWxOYW1lKVxuICogICBOZXR3b3JrLT4+Q29udHJhY3Q6IGdldENvbnRyYWN0KGNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSlcbiAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IGRlY29kZShyZXN1bHQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRlY29kZWRSZXN1bHQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2xpZW50OiBkZXNlcmlhbGl6ZWRSZXN1bHRcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBQZWVyQ29uZmlnLFxuICBDbGllbnQsXG4gIE1hbmdvUXVlcnksXG4gIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgdGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIFVpbnQ4QXJyYXkgdG8gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICBwcml2YXRlIHN0YXRpYyBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXIoKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0NsaWVudEFkYXB0ZXIuc2VyaWFsaXplcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBhZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGVlckNvbmZpZywgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRGYWJyaWNDbGllbnRGbGFncywgY29uZmlnKSxcbiAgICAgIEZhYnJpY0ZsYXZvdXIsXG4gICAgICBhbGlhc1xuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz5cbiAgKTogU3RhdGVtZW50PE0sIEZhYnJpY0NsaWVudEFkYXB0ZXIsIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50U3RhdGVtZW50KHRoaXMsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsPihcbiAgICBxdWVyeTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IE1hbmdvUXVlcnksXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQYWdpbmF0b3I8TSwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRQYWdpbmF0b3IodGhpcywgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZhYnJpY0NsaWVudEZsYWdzPiB7XG4gICAgY29uc3QgbWVyZ2VkRmxhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZywgZmxhZ3MpO1xuICAgIGNvbnN0IGYgPSBPYmplY3QuYXNzaWduKFxuICAgICAgYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgbWVyZ2VkRmxhZ3MsIC4uLmFyZ3MpXG4gICAgKTtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBBbGxPcGVyYXRpb25LZXlzLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgQ29uc3RydWN0b3I8TT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxhbnk+PlxuICApOiBQcm9taXNlPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY29udGV4dCk7XG4gICAgbG9nLnNpbGx5KFxuICAgICAgYGNyZWF0aW5nIG5ldyBjb250ZXh0IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uIG9uICR7bW9kZWwgPyAoQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbC5tYXAoKG0pID0+IE1vZGVsLnRhYmxlTmFtZShtKSkgOiBNb2RlbC50YWJsZU5hbWUobW9kZWwpKSA6IFwibm9cIn0gdGFibGUgJHtvdmVycmlkZXMgJiYgT2JqZWN0LmtleXMob3ZlcnJpZGVzKSA/IE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoIDogXCJub1wifSB3aXRoIGZsYWcgb3ZlcnJpZGVzYFxuICAgICk7XG4gICAgbGV0IGN0eCA9IGFyZ3MucG9wKCk7XG4gICAgaWYgKHR5cGVvZiBjdHggIT09IFwidW5kZWZpbmVkXCIgJiYgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSkge1xuICAgICAgYXJncy5wdXNoKGN0eCk7XG4gICAgICBjdHggPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGVzID0gY3R4XG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGN0eC50b092ZXJyaWRlcygpLCBvdmVycmlkZXMpXG4gICAgICA6IG92ZXJyaWRlcztcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3MoXG4gICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSBcInN0cmluZ1wiID8gb3BlcmF0aW9uIDogb3BlcmF0aW9uLm5hbWUsXG4gICAgICBtb2RlbCxcbiAgICAgIG92ZXJyaWRlcyBhcyBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICAgIC4uLlsuLi5hcmdzLCBjdHhdLmZpbHRlcihCb29sZWFuKVxuICAgICk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBpZiAoIShjdHggaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRPcCA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGN0eC5nZXRPclVuZGVmaW5lZChcImFmZmVjdGVkVGFibGVzXCIpO1xuICAgICAgaWYgKFxuICAgICAgICAhY3VycmVudE9wIHx8XG4gICAgICAgIGN1cnJlbnRPcCAhPT0gb3BlcmF0aW9uIHx8XG4gICAgICAgIChtb2RlbCAmJiBtb2RlbCAhPT0gY3VycmVudE1vZGVsKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcblxuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN0eC5hY2N1bXVsYXRlKGZsYWdzKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgIC4uLmZsYWdzLFxuICAgIH0pIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVjb2RlcyBhIFVpbnQ4QXJyYXkgdG8gYSBzdHJpbmdcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBGYWJyaWMgdG8gYSBzdHJpbmcgdXNpbmcgVVRGLTggZW5jb2RpbmdcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhIC0gVGhlIGJpbmFyeSBkYXRhIHRvIGRlY29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHN0cmluZ1xuICAgKi9cbiAgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxcbiAgICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgICAgIGFueSxcbiAgICAgIEFkYXB0ZXI8UGVlckNvbmZpZywgQ2xpZW50LCBNYW5nb1F1ZXJ5LCBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgICA+LFxuICA+KCk6IENvbnN0cnVjdG9yPFI+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50UmVwb3NpdG9yeSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFI+O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBbQ29uc3RydWN0b3I8TT4sIFByaW1hcnlLZXlUeXBlLCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5hbnlbXSwgQ29udGV4dF0ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbY2xhenosIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSByZWNvcmRzIGZvciBjcmVhdGlvblxuICAgKiBAc3VtbWFyeSBBZGRzIG5lY2Vzc2FyeSBDb3VjaERCIGZpZWxkcyB0byBtdWx0aXBsZSByZWNvcmRzIGJlZm9yZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkcyAtIFRoZSBJRHMgb2YgdGhlIHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gcHJlcGFyZVxuICAgKiBAcmV0dXJuIEEgdHVwbGUgY29udGFpbmluZyB0aGUgdGFibGVOYW1lLCBpZHMsIGFuZCBwcmVwYXJlZCByZWNvcmRzXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGlkcyBhbmQgbW9kZWxzIGFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKGlkLCBjb3VudCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVBbGxQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWRzLCByZWNvcmRzLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIC8vSEVSRSFcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB0cmFuc2llbnQgPSBjdHhBcmdzLnNoaWZ0KCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy5jcmVhdGVBbGxcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cuaW5mbyhgYWRkaW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICBbXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0pID0+IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobSwgY2xhenoubmFtZSkpXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgdHJhbnNpZW50UGF5bG9hZCBhcyBhbnksXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuXG4gICAgbGV0IHJlczogUmVjb3JkPHN0cmluZywgYW55PltdO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBjdHgsXG4gICAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICAgIHJlc1swXVtNb2RlbC5wayhjbGF6eikgYXMgc3RyaW5nXSB8fCBpZHNbMF1cbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICBNb2RlbC5tZXJnZShPYmplY3QuYXNzaWduKHt9LCBtIGFzIGFueSwgdHJhbnNpZW50W2ldIHx8IHt9KSwgcmVzW2ldKVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRzXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byByZWFkIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gcmVhZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWRBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmluZm8oYHJlYWRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdXBkYXRlIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IG1vZGVscyAtIEFycmF5IG9mIHVwZGF0ZWQgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLnVwZGF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgdXBkYXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgIFtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKSlcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWRzWzBdKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnRbaV0gfHwge30pLCByZXNbaV0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50Pn0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge1NlcmlhbGl6ZXI8YW55Pn0gc2VyaWFsaXplciAtIFNlcmlhbGl6ZXIgZm9yIHRoZSBtb2RlbCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZHNbMF1cbiAgICApO1xuICAgIGlmIChzaG91bGRIeWRyYXRlKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJlYWRBbGwoY2xhenosIGlkcywgLi4uY3R4QXJncyk7XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYGRlbGV0aW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoaWRzKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2hvdWxkSHlkcmF0ZVxuICAgICAgICA/IHJlc3VsdFxuICAgICAgICA6IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzKSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBwZXJzaXN0ZW5jZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIGludG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRhdGFiYXNlIHN0b3JhZ2UsXG4gICAqIGhhbmRsaW5nIGNvbHVtbiBtYXBwaW5nIGFuZCBzZXBhcmF0aW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIGRhdGFcbiAgICovXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogU2VncmVnYXRlZE1vZGVsPE0+ICYgUHJlcGFyZWRNb2RlbCB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdCA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG4gICAgaWYgKChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0pIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7KG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwbGl0Lm1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KG1vZGVsKTtcbiAgICBpZiAobWlycm9yTWV0YSkge1xuICAgICAgY29uc3QgbWlycm9yTXNwID0gbWlycm9yTWV0YS5tc3BJZDtcbiAgICAgIGlmICghbWlycm9yTXNwKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gbWlycm9yIE1TUCBjb3VsZCBiZSBmb3VuZGApO1xuICAgICAgbGV0IG1zcHMgPSB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSB8fCBbXTtcbiAgICAgIG1zcHMgPSBBcnJheS5pc0FycmF5KG1zcHMpID8gbXNwcyA6IFttc3BzXTtcbiAgICAgIGNvbnN0IG1lcmdlZCA9IFsuLi5uZXcgU2V0KFsuLi5tc3BzLCBtaXJyb3JNc3BdKV07XG4gICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgIGVuZG9yc2luZ09yZ3M6IG1lcmdlZCxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogbWVyZ2VkLFxuICAgICAgICBsZWdhY3k6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiBzcGxpdC5tb2RlbCxcbiAgICAgIG1vZGVsOiBzcGxpdC5tb2RlbCxcbiAgICAgIGlkOiBtb2RlbFtNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPildIGFzIHN0cmluZyxcbiAgICAgIHRyYW5zaWVudDogc3BsaXQudHJhbnNpZW50LFxuICAgICAgcHJpdmF0ZXM6IHNwbGl0LnByaXZhdGVzLFxuICAgICAgc2hhcmVkOiBzcGxpdC5zaGFyZWQsXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IE0ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmV2ZXJ0KTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2llbnQgJiZcbiAgICAgIHRoaXMuc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgICAgIGN0eCxcbiAgICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdHlwZW9mIHYgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIC5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKGtleSBpbiBvYmogJiYgKG9iaiBhcyBhbnkpW2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgb3ZlcndyaXRpbmcgZXhpc3RpbmcgJHtrZXl9LiBpZiB0aGlzIGlzIG5vdCBhIGRlZmF1bHQgdmFsdWUsIHRoaXMgbWF5IHBvc2UgYSBwcm9ibGVtYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAob2JqIGFzIE0pW2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPikob2JqKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgb3BlcmF0aW9uPzogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghY3R4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBjaGlsZFJlYnVpbGQgPVxuICAgICAgdHlwZW9mIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4oXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY2hpbGRSZWJ1aWxkKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByZXNvbHZlZE9wID0gdGhpcy5yZXNvbHZlT3BlcmF0aW9uKGN0eCwgb3BlcmF0aW9uKTtcbiAgICBpZiAoIXJlc29sdmVkT3ApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBvcCA9IHJlc29sdmVkT3AudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBvcC5pbmNsdWRlcyhcInJlYWRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwiZmluZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJxdWVyeVwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJzdGF0ZW1lbnRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwicGFnZVwiKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVPcGVyYXRpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAob3BlcmF0aW9uKSByZXR1cm4gb3BlcmF0aW9uO1xuICAgIGlmICh0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcIm9wZXJhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBoYXNUcmFuc2llbnQ6IGJvb2xlYW4sXG4gICAgaWQ/OiBQcmltYXJ5S2V5VHlwZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWhhc1RyYW5zaWVudCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICAgIGNvbnN0IGNvbXBvc2VkID0gTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcbiAgICBjb25zdCBnZW5lcmF0ZWQgPSBNb2RlbC5nZW5lcmF0ZWQoY2xhenosIHBrKTtcbiAgICBjb25zdCBoYXNJZCA9IGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IG51bGw7XG4gICAgaWYgKCFoYXNJZCAmJiBjb21wb3NlZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFoYXNJZCAmJiBnZW5lcmF0ZWQpIHtcbiAgICAgIGN0eC5sb2dnZXIud2FybihcbiAgICAgICAgYENhbm5vdCByZWZyZXNoIHJlY29yZCB3aXRoIHByaXZhdGUgZ2VuZXJhdGVkIHByaW1hcnkga2V5YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0lkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRpcmVjdCA9XG4gICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIHx8XG4gICAgICAoY3R4LmdldE9yVW5kZWZpbmVkKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCk7XG4gICAgaWYgKGRpcmVjdCAmJiBkaXJlY3QubGVuZ3RoKSByZXR1cm4gZGlyZWN0O1xuICAgIHJldHVybiAoXG4gICAgICAoY3R4LmdldEZyb21DaGlsZHJlbihcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpIHx8XG4gICAgICAoY3R4LmdldEZyb21DaGlsZHJlbihcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29uZmlnLmFsbG93R2F0ZXdheU92ZXJyaWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIGEgcmVjb3JkIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBvdmVycmlkZSBhc3luYyBjcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy5jcmVhdGVcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLnZlcmJvc2UoYGFkZGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBbdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCwgY2xhenoubmFtZSldLFxuICAgICAgdHJhbnNpZW50UGF5bG9hZCBhcyBhbnksXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwsIHRyYW5zaWVudCB8fCB7fSksXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjbGF6elxuICAgICAgICAgICksXG4gICAgICAgICAgaWRcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG5cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgaGVhbHRoY2hlY2s8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cudmVyYm9zZShgcmVhZGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwiaGVhbHRoY2hlY2tcIixcbiAgICAgIFtdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byByZWFkIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgcmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICB9XG5cbiAgdXBkYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAvLyByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0cmFuc2llbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMudXBkYXRlXG4gICAgKTtcbiAgICBsb2cuaW5mbyhgQ0xJRU5UIFVQREFURSBjbGFzcyA6ICR7dHlwZW9mIGNsYXp6fWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLnZlcmJvc2UoYHVwZGF0aW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lIHx8IGNsYXp6KV0sIC8vIFRPRE8gc2hvdWxkIGJlIHJlY2V2aW5nIGNsYXNzIGJ1dCBpcyByZWNlaXZpbmcgc3RyaW5nXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBkZWxldGUgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgTW9kZWwuaXNUcmFuc2llbnQoY2xhenopIHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHNob3VsZEh5ZHJhdGUgPSB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgY2xhenosXG4gICAgICBjdHgsXG4gICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgaWRcbiAgICApO1xuICAgIGlmIChzaG91bGRIeWRyYXRlKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJlYWQoY2xhenosIGlkLCBjdHgpO1xuICAgIH1cblxuICAgIGxvZy52ZXJib3NlKGBkZWxldGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgW2lkLnRvU3RyaW5nKCldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gc2hvdWxkSHlkcmF0ZVxuICAgICAgPyByZXN1bHRcbiAgICAgIDogdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHBlcmZvcm0gYSBxdWVyeSB1c2luZyBNYW5nbyBRdWVyeSBzeW50YXhcbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgcmV0dXJuIHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBRdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJvY2VzcyAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzdWx0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gICAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+RmFicmljQWRhcHRlcjogcmF3KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBKU09OLnN0cmluZ2lmeShyYXdJbnB1dClcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZXZhbHVhdGVUcmFuc2FjdGlvbihcInF1ZXJ5XCIsIFtpbnB1dF0pXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShcInF1ZXJ5XCIsIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBKU09OLnBhcnNlKGRlY29kZShyZXN1bHQpKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdCBiYXNlZCBvbiB0eXBlXG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IHByb2Nlc3NlZCByZXN1bHRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIGFzeW5jIHJhdzxWLCBEIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnksXG4gICAgZG9jc09ubHk6IEQgPSB0cnVlIGFzIEQsXG4gICAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxWPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IGNsYXp6Lm5hbWU7XG4gICAgbG9nLmluZm8oYFBlcmZvcm1pbmcgcmF3IHN0YXRlbWVudCBvbiB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShjbGF6eil9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwicmF3XCIsXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeShyYXdJbnB1dCksIGRvY3NPbmx5XSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRhYmxlTmFtZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgcmVzdWx0OiAke2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VSZWNvcmQgPSAocmVjb3JkOiBSZWNvcmQ8YW55LCBhbnk+KSA9PiB7XG4gICAgICBpZiAoTW9kZWwuaXNNb2RlbChyZWNvcmQpKSByZXR1cm4gTW9kZWwuYnVpbGQocmVjb3JkKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkgcmV0dXJuIHJlc3VsdCBhcyBWO1xuICAgICAgY29uc3QgZWwgPSByZXN1bHRbMF07XG4gICAgICBpZiAoTW9kZWwuaXNNb2RlbChlbCkpXG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBvbmUgaXMgYSBtb2RlbCwgYWxsIGFyZSBtb2RlbHNcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoKGVsKSA9PiBNb2RlbC5idWlsZChlbCkpIGFzIFY7XG4gICAgICByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlUmVjb3JkKHJlc3VsdCBhcyBhbnkpIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgQ291Y2hEQiB2aWV3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcXVlcnkgYSBkZXNpZ24gZG9jdW1lbnQgdmlld1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB2aWV3IHJlc3BvbnNlIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRkb2MgLSBEZXNpZ24gZG9jdW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmlld05hbWUgLSBWaWV3IG5hbWVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVmlldyBxdWVyeSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Li4uQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+fSBhcmdzIC0gT3B0aW9uYWwgY29udGV4dHVhbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+fSBUaGUgdmlldyByZXNwb25zZVxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgdmlldzxSPihcbiAgICBkZG9jOiBzdHJpbmcsXG4gICAgdmlld05hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFZpZXdSZXNwb25zZTxSPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudmlldyk7XG4gICAgbG9nLmluZm8oYFF1ZXJ5aW5nIHZpZXcgJHtkZG9jfS8ke3ZpZXdOYW1lfWApO1xuICAgIGxldCB0cmFuc2FjdGlvblJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgY3R4LFxuICAgICAgICBcInZpZXdcIixcbiAgICAgICAgW2Rkb2MsIHZpZXdOYW1lLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKV0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBWaWV3UmVzcG9uc2U8Uj47XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUodHJhbnNhY3Rpb25SZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHZpZXcgcmVzdWx0OiAke2V9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgY3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciB0aGUgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNhY2hlZCBjbGllbnQgb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgbm9uZSBleGlzdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDbGllbnQ+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZ1JQQyBjbGllbnRcbiAgICovXG4gIG92ZXJyaWRlIGdldENsaWVudCgpOiBDbGllbnQge1xuICAgIGlmICghdGhpcy5fY2xpZW50KVxuICAgICAgdGhpcy5fY2xpZW50ID0gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDbGllbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBHYXRld2F5IGluc3RhbmNlIGZvciB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBHYXRld2F5IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IGNsaWVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIEdhdGV3YXkoY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPik6IFByb21pc2U8R2F0ZXdheT4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoY3R4LCB0aGlzLmNvbmZpZywgdGhpcy5jbGllbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGAke2NsYXNzTmFtZX1Db250cmFjdGA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBDb250cmFjdCBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBDb250cmFjdCBpbnN0YW5jZSB1c2luZyB0aGUgY3VycmVudCBHYXRld2F5XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29udHJha3Q+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ29udHJhY3QgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBDb250cmFjdChcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGNvbnRyYWN0TmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPENvbnRyYWt0PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0Q29udHJhY3QoXG4gICAgICBhd2FpdCB0aGlzLkdhdGV3YXkoY3R4KSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgY29udHJhY3ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgU3VibWl0cyBvciBldmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VibWl0IC0gV2hldGhlciB0byBzdWJtaXQgKHRydWUpIG9yIGV2YWx1YXRlIChmYWxzZSkgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gICAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gICAqXG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3QoKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZ2V0Q29udHJhY3QoKVxuICAgKiAgIGFsdCBzdWJtaXQgdHJhbnNhY3Rpb25cbiAgICogICAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogc3VibWl0KGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIGVsc2UgZXZhbHVhdGUgdHJhbnNhY3Rpb25cbiAgICogICAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZXZhbHVhdGUoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZW5kXG4gICAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICAgKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAgICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY2xvc2UoKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHRyYW5zYWN0aW9uKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgc3VibWl0ID0gdHJ1ZSxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBzdHJpbmdbXSxcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudHJhbnNhY3Rpb24pO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCB0aGlzLkdhdGV3YXkoY3R4KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udHJhY3QgPSBhd2FpdCB0aGlzLkNvbnRyYWN0KFxuICAgICAgICBjdHgsXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYCR7c3VibWl0ID8gXCJTdWJtaXRcIiA6IFwiRXZhbHVhdGVcIn10aW5nIHRyYW5zYWN0aW9uICR7dGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKSB8fCB0aGlzLmNvbmZpZy5jb250cmFjdE5hbWV9LiR7YXBpfWBcbiAgICAgICk7XG4gICAgICBsb2cuZGVidWcoYGFyZ3M6ICR7YXJncz8ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpLmpvaW4oXCJcXG5cIikgfHwgXCJub25lXCJ9YCk7XG4gICAgICBjb25zdCBtZXRob2QgPSBzdWJtaXQgPyBjb250cmFjdC5zdWJtaXQgOiBjb250cmFjdC5ldmFsdWF0ZTtcblxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyA9IGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/Lmxlbmd0aFxuICAgICAgICA/IGVuZG9yc2luZ09yZ2FuaXphdGlvbnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm9wb3NhbE9wdGlvbnM6IFByb3Bvc2FsT3B0aW9ucyA9IHtcbiAgICAgICAgYXJndW1lbnRzOiBhcmdzIHx8IFtdLFxuICAgICAgICB0cmFuc2llbnREYXRhOiBPYmplY3QuZW50cmllcyh0cmFuc2llbnREYXRhKS5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIHR5cGVvZiB0cmFuc2llbnREYXRhXG4gICAgICAgICksXG4gICAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM6IGN0eC5nZXRPclVuZGVmaW5lZChcImFsbG93TWFudWFsRW5kb3JzaW5nT3Jnc1wiKVxuICAgICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9ucyB8fCB1bmRlZmluZWRcbiAgICAgICAgICA6IHVuZGVmaW5lZCwgLy8gbXNwSWQgbGlzdFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IG1ldGhvZC5jYWxsKGNvbnRyYWN0LCBhcGksIHByb3Bvc2FsT3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY29ubmVjdGlvbmApO1xuICAgICAgZ2F0ZXdheS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVXNlTGVnYWN5R2F0ZXdheShjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhY3R4LmdldE9yVW5kZWZpbmVkKFwibGVnYWN5XCIpICYmICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVMZWdhY3lBcmdzKGFyZ3M/OiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKGFyZ3MgfHwgW10pLm1hcCgoYXJnKSA9PlxuICAgICAgdHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIiA/IGFyZyA6IEpTT04uc3RyaW5naWZ5KGFyZylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExlZ2FjeVRyYW5zaWVudChcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICApOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRyYW5zaWVudERhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpO1xuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgbWFwW2tleV0gPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlTGVnYWN5TXNwQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gdGhpcy5jb25maWcubGVnYWN5TXNwQ291bnQgPz8gMTtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIoY29uZmlndXJlZCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSB8fCBwYXJzZWQgPCAxKSByZXR1cm4gMTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihwYXJzZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwaWNrTGVnYWN5Q2FuZGlkYXRlcyhcbiAgICBjYW5kaWRhdGVzOiBNc3BEZXRhaWxzW10sXG4gICAgbGltaXQ6IG51bWJlclxuICApOiBNc3BEZXRhaWxzW10ge1xuICAgIGlmICghY2FuZGlkYXRlcy5sZW5ndGggfHwgbGltaXQgPD0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IFsuLi5jYW5kaWRhdGVzXTtcbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLm1pbihsaW1pdCwgYXZhaWxhYmxlLmxlbmd0aCk7XG4gICAgY29uc3QgcGlja2VkOiBNc3BEZXRhaWxzW10gPSBbXTtcbiAgICB3aGlsZSAocGlja2VkLmxlbmd0aCA8IHRhcmdldCAmJiBhdmFpbGFibGUubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpZHggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICAgIGNvbnN0IFtzZWxlY3Rpb25dID0gYXZhaWxhYmxlLnNwbGljZShpZHgsIDEpO1xuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBwaWNrZWQucHVzaChzZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGlja2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExlZ2FjeVBlZXJDb25maWdzKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogTGVnYWN5UGVlclRhcmdldFtdIHtcbiAgICBjb25zdCBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdID0gW1xuICAgICAge1xuICAgICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICAgIHBlZXJFbmRwb2ludDogdGhpcy5jb25maWcucGVlckVuZHBvaW50LFxuICAgICAgICBwZWVySG9zdEFsaWFzOiB0aGlzLmNvbmZpZy5wZWVySG9zdEFsaWFzLFxuICAgICAgICB0bHNDZXJ0OiB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgbGV0IGVuZG9yc2luZ09yZ3MgPSB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSB8fCBbXTtcbiAgICBlbmRvcnNpbmdPcmdzID0gQXJyYXkuaXNBcnJheShlbmRvcnNpbmdPcmdzKVxuICAgICAgPyBlbmRvcnNpbmdPcmdzXG4gICAgICA6IFtlbmRvcnNpbmdPcmdzXTtcbiAgICBjb25zdCBlbmRvcnNlcnMgPVxuICAgICAgZW5kb3JzaW5nT3Jncy5maWx0ZXIoKG9yZyk6IG9yZyBpcyBzdHJpbmcgPT4gQm9vbGVhbihvcmcpKSB8fCBbXTtcbiAgICBjb25zdCBleHRyYXMgPSBlbmRvcnNlcnMuZmlsdGVyKChvcmcpID0+IG9yZyAhPT0gdGhpcy5jb25maWcubXNwSWQpO1xuICAgIGlmICghZXh0cmFzLmxlbmd0aCkgcmV0dXJuIHBlZXJzO1xuXG4gICAgY29uc3QgbWFwID0gdGhpcy5jb25maWcubXNwTWFwO1xuICAgIGNvbnN0IGxlZ2FjeUNvdW50ID0gdGhpcy5yZXNvbHZlTGVnYWN5TXNwQ291bnQoKTtcbiAgICBmb3IgKGNvbnN0IG1zcCBvZiBleHRyYXMpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBtYXA/Llttc3BdO1xuICAgICAgaWYgKCFjYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy5waWNrTGVnYWN5Q2FuZGlkYXRlcyhjYW5kaWRhdGVzLCBsZWdhY3lDb3VudCk7XG4gICAgICBpZiAoIXNlbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBObyB2YWxpZCBwZWVyIG1hcHBpbmcgYXZhaWxhYmxlIGZvciBNU1AgJHttc3B9LiBQcm92aWRlIGl0IHZpYSBjb25maWcubXNwTWFwYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaG9pY2Ugb2Ygc2VsZWN0aW9ucykge1xuICAgICAgICBpZiAoIWNob2ljZS5lbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgcGVlciBtYXBwaW5nIGZvciBNU1AgJHttc3B9OiBtaXNzaW5nIGVuZHBvaW50YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcGVlcnMucHVzaCh7XG4gICAgICAgICAgbXNwSWQ6IG1zcCxcbiAgICAgICAgICBwZWVyRW5kcG9pbnQ6IGNob2ljZS5lbmRwb2ludCxcbiAgICAgICAgICBwZWVySG9zdEFsaWFzOiBjaG9pY2UuYWxpYXMsXG4gICAgICAgICAgdGxzQ2VydDogY2hvaWNlLnRsc0NlcnQgfHwgdGhpcy5jb25maWcudGxzQ2VydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBmY246IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICB0cmFuc2llbnRNYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQsXG4gICAgcGVlckNvbmZpZ3M6IExlZ2FjeVBlZXJUYXJnZXRbXSxcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKTtcbiAgICBjb25zdCBwZWVycyA9IHRoaXMubm9ybWFsaXplTGVnYWN5UGVlcnMocGVlckNvbmZpZ3MpO1xuICAgIGNvbnN0IGlkZW50aXR5TWF0ZXJpYWwgPSBhd2FpdCB0aGlzLnJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsKCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgV2FsbGV0cy5uZXdJbk1lbW9yeVdhbGxldCgpO1xuICAgIGNvbnN0IGlkZW50aXR5TGFiZWwgPSBgJHt0aGlzLmNvbmZpZy5tc3BJZH0tbGVnYWN5YDtcbiAgICBhd2FpdCB3YWxsZXQucHV0KGlkZW50aXR5TGFiZWwsIHtcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBpZGVudGl0eU1hdGVyaWFsLnByaXZhdGVLZXksXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgdHlwZTogXCJYLjUwOVwiLFxuICAgIH0gYXMgSWRlbnRpdHkpO1xuXG4gICAgY29uc3QgY29ubmVjdGlvblByb2ZpbGUgPSBhd2FpdCB0aGlzLmJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnMpO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBuZXcgTGVnYWN5R2F0ZXdheSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGdhdGV3YXkuY29ubmVjdChjb25uZWN0aW9uUHJvZmlsZSwge1xuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHlMYWJlbCxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICBkaXNjb3Zlcnk6IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFzTG9jYWxob3N0OiB0aGlzLnNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdChwZWVycyksXG4gICAgICAgIH0sXG4gICAgICAgIHRsc0luZm86IHtcbiAgICAgICAgICBjZXJ0aWZpY2F0ZTogaWRlbnRpdHlNYXRlcmlhbC5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgICBrZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZXR3b3JrID0gYXdhaXQgZ2F0ZXdheS5nZXROZXR3b3JrKHRoaXMuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgY29uc3QgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KFxuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBjb250cmFjdC5jcmVhdGVUcmFuc2FjdGlvbihmY24pO1xuXG4gICAgICBpZiAodHJhbnNpZW50TWFwKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zaWVudCh0cmFuc2llbnRNYXApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRvcnNlcnMgPSBwZWVyc1xuICAgICAgICAubWFwKChwZWVyKSA9PiBuZXR3b3JrLmdldENoYW5uZWwoKS5nZXRFbmRvcnNlcihwZWVyLm5hbWUpKVxuICAgICAgICAuZmlsdGVyKChlbmRvcnNlcik6IGVuZG9yc2VyIGlzIEVuZG9yc2VyID0+IEJvb2xlYW4oZW5kb3JzZXIpKTtcbiAgICAgIGlmIChlbmRvcnNlcnMubGVuZ3RoKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldEVuZG9yc2luZ1BlZXJzKGVuZG9yc2Vycyk7XG4gICAgICB9XG5cbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgTGVnYWN5IHN1Ym1pdHRpbmcgJHt0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpIHx8IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZX0uJHtmY259IHZpYSBwZWVycyAke3BlZXJzLm1hcCgocCkgPT4gcC5wZWVyRW5kcG9pbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbi5zdWJtaXQoLi4uYXJncyk7XG4gICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGdhdGV3YXkuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTGVnYWN5UGVlcnMoXG4gICAgcGVlcnM6IExlZ2FjeVBlZXJUYXJnZXRbXVxuICApOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBMZWdhY3lQZWVyV2l0aE5hbWU+KCk7XG4gICAgY29uc3QgYWRkUGVlciA9IChwZWVyOiBMZWdhY3lQZWVyVGFyZ2V0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtwZWVyLnBlZXJFbmRwb2ludH18JHtwZWVyLnBlZXJIb3N0QWxpYXMgfHwgXCJcIn1gO1xuICAgICAgaWYgKGRlZHVwZWQuaGFzKGtleSkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5hbWUgPSBgcGVlci0ke3BlZXIubXNwSWR9LSR7ZGVkdXBlZC5zaXplfWA7XG4gICAgICBkZWR1cGVkLnNldChrZXksIHtcbiAgICAgICAgLi4ucGVlcixcbiAgICAgICAgbmFtZSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwZWVycy5mb3JFYWNoKGFkZFBlZXIpO1xuICAgIGFkZFBlZXIoe1xuICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICBwZWVySG9zdEFsaWFzOiB0aGlzLmNvbmZpZy5wZWVySG9zdEFsaWFzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZGVkdXBlZC52YWx1ZXMoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsKCk6IFByb21pc2U8e1xuICAgIGNlcnRpZmljYXRlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZUtleTogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoXG4gICAgKTtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICB0aGlzLmNvbmZpZy5rZXlDZXJ0T3JEaXJlY3RvcnlQYXRoXG4gICAgKTtcbiAgICByZXR1cm4geyBjZXJ0aWZpY2F0ZSwgcHJpdmF0ZUtleSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlKHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSkge1xuICAgIGNvbnN0IHBlZXJFbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgY2hhbm5lbFBlZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3Qgb3JnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgcGVlciBvZiBwZWVycykge1xuICAgICAgY29uc3QgdGxzUGVtID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICAgIHBlZXIudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0XG4gICAgICApO1xuICAgICAgY29uc3QgaG9zdG5hbWUgPVxuICAgICAgICBwZWVyLnBlZXJIb3N0QWxpYXMgfHwgdGhpcy5leHRyYWN0SG9zdChwZWVyLnBlZXJFbmRwb2ludCk7XG4gICAgICBwZWVyRW50cmllc1twZWVyLm5hbWVdID0ge1xuICAgICAgICB1cmw6IHRoaXMuZW5zdXJlR3JwY1VybChwZWVyLnBlZXJFbmRwb2ludCksXG4gICAgICAgIHRsc0NBQ2VydHM6IHsgcGVtOiB0bHNQZW0gfSxcbiAgICAgICAgZ3JwY09wdGlvbnM6IHtcbiAgICAgICAgICBcInNzbC10YXJnZXQtbmFtZS1vdmVycmlkZVwiOiBob3N0bmFtZSxcbiAgICAgICAgICBob3N0bmFtZU92ZXJyaWRlOiBob3N0bmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjaGFubmVsUGVlcnNbcGVlci5uYW1lXSA9IHtcbiAgICAgICAgZW5kb3JzaW5nUGVlcjogdHJ1ZSxcbiAgICAgICAgY2hhaW5jb2RlUXVlcnk6IHRydWUsXG4gICAgICAgIGxlZGdlclF1ZXJ5OiB0cnVlLFxuICAgICAgICBldmVudFNvdXJjZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdID0gb3Jnc1twZWVyLm1zcElkXSB8fCB7XG4gICAgICAgIG1zcGlkOiBwZWVyLm1zcElkLFxuICAgICAgICBwZWVyczogW10sXG4gICAgICB9O1xuICAgICAgb3Jnc1twZWVyLm1zcElkXS5wZWVycy5wdXNoKHBlZXIubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IFwibGVnYWN5LW1hbnVhbFwiLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgICAgY2xpZW50OiB7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB9LFxuICAgICAgb3JnYW5pemF0aW9uczogb3JncyxcbiAgICAgIHBlZXJzOiBwZWVyRW50cmllcyxcbiAgICAgIG9yZGVyZXJzOiB7fSxcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIFt0aGlzLmNvbmZpZy5jaGFubmVsXToge1xuICAgICAgICAgIHBlZXJzOiBjaGFubmVsUGVlcnMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdChwZWVyczogTGVnYWN5UGVlcldpdGhOYW1lW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVlcnMuZXZlcnkoKHBlZXIpID0+IHRoaXMuaXNMb2NhbEVuZHBvaW50KHBlZXIucGVlckVuZHBvaW50KSk7XG4gIH1cblxuICBwcml2YXRlIGlzTG9jYWxFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZXh0cmFjdEhvc3QoZW5kcG9pbnQpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGhvc3QgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdCA9PT0gXCIxMjcuMC4wLjFcIjtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEhvc3QoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2FuaXRpemVkID0gZW5kcG9pbnQucmVwbGFjZSgvXmdycGNzPzpcXC9cXC8vLCBcIlwiKTtcbiAgICByZXR1cm4gc2FuaXRpemVkLnNwbGl0KFwiOlwiKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlR3JwY1VybChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoL15ncnBjcz86XFwvXFwvL2kudGVzdChlbmRwb2ludCkpIHJldHVybiBlbmRwb2ludDtcbiAgICByZXR1cm4gYGdycGNzOi8vJHtlbmRwb2ludH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkUGVtSW5wdXQoc291cmNlPzogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIGNlcnRpZmljYXRlIG9yIGtleSBtYXRlcmlhbFwiKTtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHJldHVybiBzb3VyY2UudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgIGNvbnN0IHRyaW1tZWQgPSBzb3VyY2UudHJpbSgpO1xuICAgIGlmICgvLS0tLS1CRUdJTiBbQS1aIF0rLS0tLS0vLnRlc3QodHJpbW1lZCkpIHJldHVybiB0cmltbWVkO1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChzb3VyY2UpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgaWYgKHN0YXRzPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCByZWFkRnNGaWxlKHNvdXJjZSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvclxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IgfCBzdHJpbmcpOiBFIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5wYXJzZUVycm9yPEU+KGVycik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBBcnJheTxzdHJpbmc+LFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBpZiAodGhpcy5zaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eCkpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUFyZ3MgPSB0aGlzLnByZXBhcmVMZWdhY3lBcmdzKGFyZ3MpO1xuICAgICAgY29uc3QgdHJhbnNpZW50TWFwID0gdGhpcy5idWlsZExlZ2FjeVRyYW5zaWVudCh0cmFuc2llbnREYXRhKTtcbiAgICAgIGNvbnN0IHBlZXJDb25maWdzID0gdGhpcy5idWlsZExlZ2FjeVBlZXJDb25maWdzKGN0eCk7XG4gICAgICByZXR1cm4gdGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgICAgIGN0eCxcbiAgICAgICAgYXBpLFxuICAgICAgICBsZWdhY3lBcmdzLFxuICAgICAgICB0cmFuc2llbnRNYXAsXG4gICAgICAgIHBlZXJDb25maWdzLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgdHJ1ZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgZmFsc2UsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGFzc05hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTaHV0cyBkb3duIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDbG9zZXMgdGhlIGFjdGl2ZSBkaXNwYXRjaCAod2hpY2ggaW4gdHVybiBjbG9zZXMgYW55IGdhdGV3YXlcbiAgICogZXZlbnQgc3Vic2NyaXB0aW9uKSB2aWEgdGhlIGJhc2UgY2xhc3MsIHRoZW4gY2xvc2VzIHRoZSBnUlBDIGNsaWVudC5cbiAgICogV29ya3MgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgc3ludGhldGljRXZlbnRzYCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgY29ubmVjdGlvbnMgYXJlIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24oLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJhc2UgY2xhc3MgaGFuZGxlcyBkaXNwYXRjaC5jbG9zZSgpIGludGVybmFsbHkuXG4gICAgYXdhaXQgc3VwZXIuc2h1dGRvd24oLi4uYXJncyk7XG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY2xpZW50YCk7XG4gICAgICB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIGNoYWluY29kZSBjb250cmFjdCBmcm9tIHRoZSBzcGVjaWZpZWQgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q29udHJha3R9IFRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldENvbnRyYWN0KFxuICAgIGdhdGV3YXk6IEdhdGV3YXksXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNvbnRyYWN0TmFtZT86IHN0cmluZ1xuICApOiBDb250cmFrdCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q29udHJhY3QpO1xuICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLmdldE5ldHdvcmsoZ2F0ZXdheSwgY29uZmlnLmNoYW5uZWwpO1xuICAgIGxldCBjb250cmFjdDogQ29udHJha3Q7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFJldHJpZXZpbmcgY2hhaW5jb2RlICR7Y29uZmlnLmNoYWluY29kZU5hbWV9IGNvbnRyYWN0ICR7Y29udHJhY3ROYW1lIHx8IGNvbmZpZy5jb250cmFjdE5hbWV9IGZyb20gbmV0d29yayAke2NvbmZpZy5jaGFubmVsfWBcbiAgICAgICk7XG4gICAgICBjb250cmFjdE5hbWUgPSBjb250cmFjdE5hbWUgPyBjb250cmFjdE5hbWUgOiBjb25maWcuY29udHJhY3ROYW1lO1xuICAgICAgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KGNvbmZpZy5jaGFpbmNvZGVOYW1lLCBjb250cmFjdE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3Q7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBOZXR3b3JrIGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRvIGEgc3BlY2lmaWMgY2hhbm5lbCBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgKiBAcmV0dXJuIHtOZXR3b3JrfSBUaGUgTmV0d29yayBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldE5ldHdvcmsoZ2F0ZXdheTogR2F0ZXdheSwgY2hhbm5lbE5hbWU6IHN0cmluZyk6IE5ldHdvcmsge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0TmV0d29yayk7XG4gICAgbGV0IG5ldHdvcms6IE5ldHdvcms7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byBjaGFubmVsICR7Y2hhbm5lbE5hbWV9YCk7XG4gICAgICBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKGNoYW5uZWxOYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IHVzaW5nIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBbY2xpZW50XSAtIE9wdGlvbmFsIGdSUEMgY2xpZW50LCB3aWxsIGJlIGNyZWF0ZWQgaWYgbm90IHByb3ZpZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0R2F0ZXdheShcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjbGllbnQ/OiBDbGllbnRcbiAgKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldENvbm5lY3Rpb24oXG4gICAgICBjbGllbnQgfHwgKGF3YWl0IHRoaXMuZ2V0Q2xpZW50KGNvbmZpZykpLFxuICAgICAgY29uZmlnLFxuICAgICAgY3R4XG4gICAgKSkgYXMgR2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBjbGllbnQgd2l0aCBUTFMgY3JlZGVudGlhbHMgZm9yIHNlY3VyZSBjb21tdW5pY2F0aW9uXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDbGllbnR9IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgc3RhdGljIGdldENsaWVudChjb25maWc6IFBlZXJDb25maWcpOiBDbGllbnQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENsaWVudCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIFRMUyBjcmVkZW50aWFscyBmb3IgbXNwICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGxldCBwYXRoT3JDZXJ0OiBzdHJpbmcgfCBCdWZmZXIgPSBjb25maWcudGxzQ2VydCBhcyBzdHJpbmcgfCBCdWZmZXI7XG5cbiAgICBpZiAodHlwZW9mIHBhdGhPckNlcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGF0aE9yQ2VydC5tYXRjaChcbiAgICAgICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKHBhdGhPckNlcnQsIFwidXRmOFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKGZzLnJlYWRGaWxlU3luYyhwYXRoT3JDZXJ0LCBcInV0ZjhcIikpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgdGhlIHRscyBjZXJ0aWZpY2F0ZSBmcm9tICR7cGF0aE9yQ2VydH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRsc0NyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2wocGF0aE9yQ2VydCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIEdhdGV3YXkgQ2xpZW50IGZvciB1cmwgJHtjb25maWcucGVlckVuZHBvaW50fWApO1xuICAgIHJldHVybiBuZXcgQ2xpZW50KGNvbmZpZy5wZWVyRW5kcG9pbnQsIHRsc0NyZWRlbnRpYWxzLCB7XG4gICAgICBcImdycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgICBcImdycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgY29ubmVjdGlvbiB3aXRoIGlkZW50aXR5IGFuZCBzaWduZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIFRoZSBnUlBDIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbm5lY3RlZCBHYXRld2F5XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBJZGVudGl0eVxuICAgKiAgIHBhcnRpY2lwYW50IFNpZ25lclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICpcbiAgICogICBDYWxsZXItPj5GYWJyaWNBZGFwdGVyOiBnZXRDb25uZWN0aW9uKGNsaWVudCwgY29uZmlnKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5JZGVudGl0eTogZ2V0SWRlbnRpdHkobXNwSWQsIGNlcnREaXJlY3RvcnlQYXRoKVxuICAgKiAgIElkZW50aXR5LS0+PkZhYnJpY0FkYXB0ZXI6IGlkZW50aXR5XG4gICAqICAgRmFicmljQWRhcHRlci0+PlNpZ25lcjogZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGgpXG4gICAqICAgU2lnbmVyLS0+PkZhYnJpY0FkYXB0ZXI6IHNpZ25lclxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBDcmVhdGUgQ29ubmVjdE9wdGlvbnNcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdChvcHRpb25zKVxuICAgKiAgIEdhdGV3YXktLT4+RmFicmljQWRhcHRlcjogZ2F0ZXdheVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2FsbGVyOiBnYXRld2F5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q29ubmVjdGlvbihcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldENvbm5lY3Rpb24pO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIFBlZXIgSWRlbnRpdHkgZm9yICR7Y29uZmlnLm1zcElkfSB1bmRlciAke2NvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aH1gXG4gICAgKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IGdldElkZW50aXR5KFxuICAgICAgY29uZmlnLm1zcElkLFxuICAgICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHByZXBhcmluZyB0cmFuc2FjdGlvbiBzaWduZXIgZm9yICR7Q3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoaWRlbnRpdHkuY3JlZGVudGlhbHMudG9TdHJpbmcoKSl9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IEZhYnJpYyBJRCBmcm9tIGNlcnRpZmljYXRlYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25lcjogU2lnbmVyO1xuICAgIGNvbnN0IGNsb3NlID0gKCkgPT4ge307XG4gICAgaWYgKCFjb25maWcuaHNtKSB7XG4gICAgICBzaWduZXIgPSBhd2FpdCBnZXRTaWduZXIoY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc3QgaHNtID0gbmV3IEhTTVNpZ25lckZhY3RvcnlDdXN0b20oY29uZmlnLmhzbS5saWJyYXJ5KTtcbiAgICAgIC8vIGNvbnN0IGlkZW50aWZpZXIgPSBoc20uZ2V0U0tJRnJvbUNlcnRpZmljYXRlUGF0aChcbiAgICAgIC8vICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICAgLy8gKTtcbiAgICAgIC8vIGNvbnN0IHBrY3MxMVNpZ25lciA9IGhzbS5uZXdTaWduZXIoe1xuICAgICAgLy8gICBsYWJlbDogY29uZmlnLmhzbS50b2tlbkxhYmVsIGFzIHN0cmluZyxcbiAgICAgIC8vICAgcGluOiBTdHJpbmcoY29uZmlnLmhzbS5waW4pIGFzIHN0cmluZyxcbiAgICAgIC8vICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIC8vICAgLy8gdXNlclR5cGU6IDEgLypDS1VfVVNFUiAqLyxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gc2lnbmVyID0gcGtjczExU2lnbmVyLnNpZ25lcjtcbiAgICAgIC8vIGNsb3NlID0gcGtjczExU2lnbmVyLmNsb3NlO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJIU00gTk9UIElNUExFTUVOVEVEXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBjbGllbnQsXG4gICAgICBpZGVudGl0eTogaWRlbnRpdHksXG4gICAgICBzaWduZXI6IHNpZ25lcixcbiAgICAgIC8vIERlZmF1bHQgdGltZW91dHMgZm9yIGRpZmZlcmVudCBnUlBDIGNhbGxzXG4gICAgICBldmFsdWF0ZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImV2YWx1YXRlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBlbmRvcnNlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZW5kb3JzZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMTUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIHN1Ym1pdE9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcInN1Ym1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgY29tbWl0U3RhdHVzT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiY29tbWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxIG1pbnV0ZVxuICAgICAgfSxcbiAgICB9IGFzIENvbm5lY3RPcHRpb25zO1xuXG4gICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBjb25uZWN0KG9wdGlvbnMpO1xuXG4gICAgLy8gVE9ETzogcmVwbGFjZT9cbiAgICBpZiAoY29uZmlnLmhzbSkge1xuICAgICAgZ2F0ZXdheS5jbG9zZSA9IG5ldyBQcm94eShnYXRld2F5LmNsb3NlLCB7XG4gICAgICAgIGFwcGx5KHRhcmdldDogKCkgPT4gdm9pZCwgdGhpc0FyZzogYW55LCBhcmdBcnJheTogYW55W10pOiBhbnkge1xuICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdBcnJheSk7XG4gICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBuZXcgRmFicmljQ2xpZW50RGlzcGF0Y2ggaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29yay5cbiAgICogQHJldHVybnMge0Rpc3BhdGNofSBBIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHJlbWFya3MgVGhlIERpc3BhdGNoIGluc3RhbmNlIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGxvZ2ljIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBGYWJyaWMgbmV0d29yaywgc3VjaCBhcyBzdWJtaXR0aW5nIHRyYW5zYWN0aW9ucyBvciBxdWVyeWluZyBkYXRhLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBmYWJyaWNEaXNwYXRjaCA9IGZhYnJpY0NsaWVudEFkYXB0ZXIuRGlzcGF0Y2goKTtcbiAgICogZmFicmljRGlzcGF0Y2guc3VibWl0VHJhbnNhY3Rpb24oJ2NyZWF0ZVByb2R1Y3QnLCB7IG5hbWU6ICdQcm9kdWN0IEEnLCBwcmljZTogMTAwIH0pO1xuICAgKi9cbiAgb3ZlcnJpZGUgRGlzcGF0Y2goKTogRmFicmljQ2xpZW50RGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0odGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3IgdXNpbmcgdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oXG4gICAgZXJyOiBFcnJvciB8IHN0cmluZyB8IEdhdGV3YXlFcnJvclxuICApOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcblxuICAgIGxldCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEdhdGV3YXlFcnJvciAmJiBlcnIuZGV0YWlscy5sZW5ndGggJiYgZXJyLmNvZGUgPT09IDEwKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXJyIGluc3RhbmNlb2YgRW5kb3JzZUVycm9yICYmXG4gICAgICBlcnIuZGV0YWlscy5sZW5ndGggJiZcbiAgICAgIGVyci5jb2RlID09PSAxMCAmJlxuICAgICAgZXJyLmRldGFpbHNbMF0ubWVzc2FnZT8uaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKVxuICAgICkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJNVkNDX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IE12Y2NSZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiREVBRExJTkVfRVhDRUVERURcIikpXG4gICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uVGltZW91dEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJFTkRPUlNFTUVOVF9QT0xJQ1lfRkFJTFVSRVwiKSlcbiAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiUEhBTlRPTV9SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICBzd2l0Y2ggKChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50RXJyb3IoZXJyKSBhcyBFO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoVmFsaWRhdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTm90Rm91bmRFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbmZsaWN0RXJyb3IubmFtZSkpIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhCYWRSZXF1ZXN0RXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhRdWVyeUVycm9yLm5hbWUpKSByZXR1cm4gbmV3IFF1ZXJ5RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUGFnaW5nRXJyb3IubmFtZSkpIHJldHVybiBuZXcgUGFnaW5nRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhNaWdyYXRpb25FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBNaWdyYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhPYnNlcnZlckVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE9ic2VydmVyRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQXV0aG9yaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoRm9yYmlkZGVuRXJyb3IubmFtZSkpIHJldHVybiBuZXcgRm9yYmlkZGVuRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29ubmVjdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIEU7XG4gIH1cbn1cblxuRmFicmljQ2xpZW50QWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoRmFicmljRmxhdm91cik7XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRGlzcGF0Y2gsXG4gIEV2ZW50SWRzLFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBDb250ZXh0LFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQZWVyQ29uZmlnIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlRXZlbnQsXG4gIENsb3NlYWJsZUFzeW5jSXRlcmFibGUsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IHBhcnNlRXZlbnROYW1lIH0gZnJvbSBcIi4uL3NoYXJlZC9ldmVudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXZlbnQgZGlzcGF0Y2hlciBmb3IgSHlwZXJsZWRnZXIgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGFuZCBwcm9jZXNzZXMgZXZlbnRzIGVtaXR0ZWQgYnkgRmFicmljIGNoYWluY29kZSwgZGlzcGF0Y2hpbmcgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICogQGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBjbGllbnQgPSBhd2FpdCBGYWJyaWNBZGFwdGVyLmdldENsaWVudChwZWVyQ29uZmlnKTtcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudCk7XG4gKlxuICogLy8gQ29uZmlndXJlIHRoZSBkaXNwYXRjaCB3aXRoIHBlZXIgY29uZmlndXJhdGlvblxuICogZGlzcGF0Y2guY29uZmlndXJlKHBlZXJDb25maWcpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBhIHNwZWNpZmljIHRhYmxlIGFuZCBldmVudFxuICogZGlzcGF0Y2gub2JzZXJ2ZSgndXNlcnMnLCAnY3JlYXRlJywgKGlkKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBVc2VyIGNyZWF0ZWQ6ICR7aWR9YCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBTdGFydCBsaXN0ZW5pbmcgZm9yIGV2ZW50c1xuICogYXdhaXQgZGlzcGF0Y2guc3RhcnQoKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBjb25maWd1cmUocGVlckNvbmZpZylcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IG9ic2VydmUodGFibGUsIGV2ZW50LCBjYWxsYmFjaylcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IHN0YXJ0KClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaW5pdGlhbGl6ZSgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+R2F0ZXdheTogZ2V0R2F0ZXdheShjb25maWcsIGNsaWVudClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbClcbiAqICAgTmV0d29yay0+Pk5ldHdvcms6IGdldENoYWluY29kZUV2ZW50cyhjaGFpbmNvZGVOYW1lKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICogICBsb29wIEZvciBlYWNoIGV2ZW50XG4gKiAgICAgQ2hhaW5jb2RlLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZVBheWxvYWQocGF5bG9hZClcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZClcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0tPj5DbGllbnQ6IGNhbGxiYWNrKGlkKVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoIGV4dGVuZHMgRGlzcGF0Y2g8RmFicmljQ2xpZW50QWRhcHRlcj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGxpc3RlbmluZyBzdGFjayBmb3IgY2hhaW5jb2RlIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5pbmdTdGFjaz86IENsb3NlYWJsZUFzeW5jSXRlcmFibGU8Q2hhaW5jb2RlRXZlbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIGV2ZW50IHBheWxvYWRzIGZyb20gYnl0ZXMgdG8gc3RyaW5nc1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBkaXNwYXRjaGVyIGZvciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2xpZW50OiBDbGllbnQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbG9zZXMgdGhlIGV2ZW50IGxpc3RlbmluZyBjb25uZWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN0b3BzIGxpc3RlbmluZyBmb3IgY2hhaW5jb2RlIGV2ZW50cyBhbmQgcmVsZWFzZXMgcmVzb3VyY2VzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY2xvc2UoXG4gICAgLi4uY3R4QXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzOiBsb2dnZWRBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChjdHhBcmdzLCBQZXJzaXN0ZW5jZUtleXMuU0hVVERPV04sIHRydWUpXG4gICAgKS5mb3IodGhpcy5jbG9zZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLmNsb3NlKC4uLmxvZ2dlZEFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNsb3NlIEZhYnJpYyBwcm94aWVzIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGlmICh0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmxpc3RlbmluZ1N0YWNrLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNsb3NlIEZhYnJpYyBldmVudCBsaXN0ZW5lcmAsIGUgYXMgRXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBldmVudCBwYXlsb2FkIGZyb20gYmluYXJ5IGZvcm1hdFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyBKU09OIHRvIGFuIG9iamVjdCB3aXRoIGFuIGlkIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ganNvbkJ5dGVzIC0gVGhlIGJpbmFyeSBwYXlsb2FkIGZyb20gdGhlIGNoYWluY29kZSBldmVudFxuICAgKiBAcmV0dXJuIHt7IGlkOiBzdHJpbmcgfX0gVGhlIHBhcnNlZCBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBJRFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVBheWxvYWQoanNvbkJ5dGVzOiBVaW50OEFycmF5KTogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSB7XG4gICAgY29uc3QganNvbiA9IHRoaXMuZGVjb2Rlci5kZWNvZGUoanNvbkJ5dGVzKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggdG8gYW4gYWRhcHRlciB0byBtb25pdG9yIGl0cyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIG9ic2VydmVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG92ZXJyaWRlIG9ic2VydmUob2JzZXJ2ZXI6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pik6ICgpID0+IHZvaWQge1xuICAgIGlmICghKG9ic2VydmVyIGluc3RhbmNlb2YgRmFicmljQ2xpZW50QWRhcHRlcikpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJPbmx5IEZhYnJpY0NsaWVudEFkYXB0ZXIgY2FuIGJlIG9ic2VydmVkIGJ5IGRpc3BhdGNoXCJcbiAgICAgICk7XG4gICAgc3VwZXIub2JzZXJ2ZShvYnNlcnZlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHthbnl9IHBheWxvYWQgLSBUaGUgZXZlbnQgcGF5bG9hZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gQWRhcHRlci5sb2dDdHg8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+KFxuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMsXG4gICAgICBldmVudCxcbiAgICAgIGZhbHNlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2g7IHNraXBwaW5nIG9ic2VydmVyIHVwZGF0ZSBmb3IgJHt0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBtb2RlbCA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCl9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZWZyZXNoKG1vZGVsLCBldmVudCwgaWQsIC4uLmN0eEFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBkaXNwYXRjaDogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGNoYWluY29kZSBldmVudHNcbiAgICogQHN1bW1hcnkgTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gdGhlIGNoYWluY29kZSBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV2ZW50IGhhbmRsaW5nIHN0b3BzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRTdGFja1xuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50UGFyc2VyXG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJzXG4gICAqXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50U3RhY2s6IGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIGxpc3RlbmluZ1N0YWNrKVxuICAgKiAgIEV2ZW50U3RhY2stLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFBhcnNlcjogcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSlcbiAgICogICBFdmVudFBhcnNlci0tPj5GYWJyaWNEaXNwYXRjaDogeyB0YWJsZSwgZXZlbnQsIG93bmVyIH1cbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBDaGVjayBpZiBldmVudCBpcyBmb3IgdGhpcyBNU1BcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZVBheWxvYWQoZXZ0LnBheWxvYWQpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5PYnNlcnZlcnM6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIHBheWxvYWQuaWQpXG4gICAqICAgT2JzZXJ2ZXJzLS0+PkZhYnJpY0Rpc3BhdGNoOiBDYWxsYmFja3MgZXhlY3V0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVFdmVudHMoXG4gICAgY3R4QXJnPzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmluZ1N0YWNrKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBFdmVudCBzdGFjayBub3QgaW5pdGlhbGl6ZWQuIEVuc3VyZSB0aGF0IFwic3RhcnRMaXN0ZW5pbmdcIiBpcyBjYWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdGhpcyBvcGVyYXRpb24uYFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5hZGFwdGVyIHx8ICF0aGlzLmFkYXB0ZXIuY29uZmlnKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgZm91bmQuIHNob3VsZCBiZSBpbXBvc3NpYmxlYCk7XG5cbiAgICBjb25zdCBjdHggPVxuICAgICAgY3R4QXJnIHx8XG4gICAgICAoYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgKHRoaXMubW9kZWxzICYmIHRoaXMubW9kZWxzWzBdKSB8fCAoTW9kZWwgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcilcbiAgICAgICkpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmhhbmRsZUV2ZW50cyk7XG5cbiAgICBsb2cuaW5mbyhcbiAgICAgIGBMaXN0ZW5pbmcgZm9yIGluY29taW5nIGV2ZW50cyBvbiBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCIuLi5gXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiB0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGUsIGV2ZW50LCBvd25lciB9ID0gcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnPy5tc3BFdmVudE9ubHkgJiZcbiAgICAgICAgICBvd25lciAmJlxuICAgICAgICAgIG93bmVyICE9PSB0aGlzLmFkYXB0ZXIuY29uZmlnPy5tc3BJZFxuICAgICAgICApXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IHsgaWQ6IHN0cmluZzsgcmVzdWx0PzogYW55IH0gPSB0aGlzLnBhcnNlUGF5bG9hZChcbiAgICAgICAgICBldnQucGF5bG9hZFxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldE1vZGVsID0gdGFibGVcbiAgICAgICAgICAgID8gTW9kZWwuZ2V0KHRhYmxlKVxuICAgICAgICAgICAgOiBNb2RlbC5nZXQodGhpcy5tb2RlbHNbMF0ubmFtZSk7XG4gICAgICAgICAgY29uc3QgbW9kZWxSZWYgPSB0YXJnZXRNb2RlbCA/PyAodGFibGUgfHwgdGhpcy5tb2RlbHNbMF0/Lm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXJncyA9IHBheWxvYWQucmVzdWx0ID8gW3BheWxvYWQucmVzdWx0LCBjdHhdIDogW2N0eF07XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICBtb2RlbFJlZiBhcyBDb25zdHJ1Y3RvciB8IHN0cmluZyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgcGF5bG9hZC5pZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAuLi4ob2JzZXJ2ZXJBcmdzIGFzIENvbnRleHR1YWxBcmdzPGFueT4pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdXBkYXRlIG9ic2VydmFibGVzIGZvciB0YWJsZSAke3RhYmxlfSBldmVudCAke2V2ZW50fSBpZDogJHtwYXlsb2FkLmlkfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBldmVudCBmb3IgY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoY3R4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lclxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIGV2ZW50IGRpc3BhdGNoaW5nIGZvciB0aGUgb2JzZXJ2ZWQgYWRhcHRlci4gV2hlblxuICAgKiBgc3ludGhldGljRXZlbnRzYCBpcyB0cnVlICh0aGUgZGVmYXVsdCkgbm8gZ2F0ZXdheSBjb25uZWN0aW9uIGlzIG9wZW5lZDtcbiAgICogaW5zdGVhZCBldmVyeSBDUlVEIG9wZXJhdGlvbiBpcyB3cmFwcGVkIHdpdGggYSBQcm94eSB0aGF0IGZpcmVzXG4gICAqIGB1cGRhdGVPYnNlcnZlcnNgIGZvciAqKmFsbCoqIG1vZGVscy4gV2hlbiBgc3ludGhldGljRXZlbnRzYCBpcyBmYWxzZSB0aGVcbiAgICogZXhpc3RpbmcgZ2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGVcbiAgICogbG9jYWwgUHJveHkgZmFsbGJhY2sgaXMgbGltaXRlZCB0byBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVscyBvbmx5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvciBjb25maWcgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICBjb25zdCBzeW50aGV0aWNFdmVudHMgPSB0aGlzLmFkYXB0ZXIuY29uZmlnLnN5bnRoZXRpY0V2ZW50cyAhPT0gZmFsc2U7XG5cbiAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cykge1xuICAgICAgLy8gR2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIChub24tc3ludGhldGljIHBhdGgpXG4gICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFwiZGlzcGF0Y2hcIixcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgTW9kZWwgYXMgYW55XG4gICAgICApO1xuICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5pbml0aWFsaXplKTtcbiAgICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZyBhcyBQZWVyQ29uZmlnLFxuICAgICAgICB0aGlzLmNsaWVudFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSBhd2FpdCBuZXR3b3JrLmdldENoYWluY29kZUV2ZW50cyhcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lXG4gICAgICApO1xuICAgICAgdGhpcy5oYW5kbGVFdmVudHMoY3R4KTtcbiAgICB9XG5cbiAgICAvLyBQcm94eSBDUlVEIG1ldGhvZHMuXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IHRydWUgIOKGkiBub3RpZnkgZm9yIEFMTCBtb2RlbHMgKHJlcGxhY2VzIGdhdGV3YXkgZXZlbnRzIGVudGlyZWx5KVxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSBmYWxzZSDihpIgbm90aWZ5IG9ubHkgZm9yIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzXG4gICAgLy8gICAodGhlIGdhdGV3YXkgc3Vic2NyaXB0aW9uIGhhbmRsZXMgcHVibGljIG1vZGVscylcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKHRvV3JhcCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyBhZGFwdGVyIHByb3ZpZGVkIGZvciB0aGUgZmFsbGJhY2sgb2YgZnVsbHkgc2VncmVnYXRlZCBtb2RlbHNgXG4gICAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlclt0b1dyYXBdKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWV0aG9kICR7dG9XcmFwfSBub3QgZm91bmQgaW4gJHt0aGlzLmFkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuYWRhcHRlciwgdG9XcmFwKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gdGhpcy5hZGFwdGVyO1xuICAgICAgd2hpbGUgKCFkZXNjcmlwdG9yICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHRvV3JhcCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0aG9kICR7dG9XcmFwfSB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidWxrVG9TaW5nbGUobWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5VUERBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkRFTEVURTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmFkYXB0ZXJbdG9XcmFwXSA9IG5ldyBQcm94eSh0aGlzLmFkYXB0ZXJbdG9XcmFwXSwge1xuICAgICAgICBhcHBseTogYXN5bmMgKFxuICAgICAgICAgIHRhcmdldDogYW55LFxuICAgICAgICAgIHRoaXNBcmc6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgICAgICAgYXJnQXJyYXk6IGFueVtdXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIC8vIFJ1biB0aGUgb3JpZ2luYWwgbWV0aG9kIHVuY2hhbmdlZCBzbyB0cmFuc2llbnQgZGF0YSBpcyBwcmVzZXJ2ZWRcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuXG4gICAgICAgICAgY29uc3QgY2xheno6IENvbnN0cnVjdG9yPGFueT4gPSBhcmdBcnJheVswXTtcbiAgICAgICAgICAvLyBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyBmYWxzZSwgcHVibGljIG1vZGVscyBlbWl0IGEgY2hhaW5jb2RlIGV2ZW50XG4gICAgICAgICAgLy8gb24gdGhlIGNvbnRyYWN0IHNpZGU7IHNraXAgdGhlIGxvY2FsIGZhbGxiYWNrIHRvIGF2b2lkXG4gICAgICAgICAgLy8gZG91YmxlLW5vdGlmaWNhdGlvbi4gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgdHJ1ZSB3ZSBoYW5kbGUgYWxsIG1vZGVscy5cbiAgICAgICAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cyAmJiAhTW9kZWwuaXNUcmFuc2llbnQoY2xhenopKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgICAgLy8gQ29udGV4dCBpcyBhbHdheXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhcmdBcnJheVxuICAgICAgICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzLCBjdHggfSA9IHRoaXNBcmdbXCJsb2dDdHhcIl0oXG4gICAgICAgICAgICBhcmdBcnJheS5zbGljZShhcmdBcnJheS5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaWRzID0gYXJnQXJyYXlbMV07XG4gICAgICAgICAgY29uc3QgcmVzdWx0QXJnczogYW55W10gPSBbY2xhenosIGJ1bGtUb1NpbmdsZSh0b1dyYXApLCBpZHNdO1xuXG4gICAgICAgICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcIm9ic2VydmVGdWxsUmVzdWx0XCIpKSB7XG4gICAgICAgICAgICByZXN1bHRBcmdzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICAuLi4ocmVzdWx0QXJncyBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB0aGlzLnVwZGF0ZU9ic2VydmVycz4pLFxuICAgICAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgICAgICkuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHt0b1dyYXB9IG9uICR7Y2xhenoubmFtZSB8fCBjbGF6en0gZm9yICR7aWRzfTogJHtlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5pZiAoRmFicmljQ2xpZW50QWRhcHRlcilcbiAgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBGYWJyaWNDbGllbnREaXNwYXRjaDtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsiZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlIiwiZmlsZVBhdGgiLCJmcyIsInJlcXVpcmUiLCJwYXRoIiwiZGlybmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJnZW5lcmF0ZU1vZGVsSW5kZXhlcyIsIm0iLCJnZW5lcmF0ZUluZGV4ZXMiLCJnZW5lcmF0ZU1vZGVsRGVzaWduRG9jcyIsImFjY3VtIiwidmlld3MiLCJnZW5lcmF0ZVZpZXdzIiwic3RvcmFnZSIsImZvckVhY2giLCJkb2MiLCJfaWQiLCJyZWFkTW9kZWxGaWxlIiwiZmlsZSIsImV4cG9ydHMiLCJqb2luIiwicHJvY2VzcyIsImN3ZCIsInBhcmVudFBhdGgiLCJuYW1lIiwidmFsdWVzIiwiT2JqZWN0IiwiZmlsdGVyIiwiZSIsIk1vZGVsIiwiYXN5bmMiLCJyZWFkTW9kZWxGb2xkZXJzIiwiZm9sZGVycyIsInJlc3VsdCIsImZvbGRlciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicmVjdXJzaXZlIiwiZiIsImlzRmlsZSIsImVuZHNXaXRoIiwicHVzaCIsIndyaXRlSW5kZXhlcyIsImluZGV4ZXMiLCJwIiwiY29sbGVjdGlvbiIsImluZGV4IiwicmVzb2x2ZSIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwid3JpdGVEZXNpZ25Eb2NzIiwiZGVzaWduRG9jcyIsImxlbmd0aCIsImRvY0lkIiwicmVwbGFjZSIsInBheWxvYWQiLCJfcmV2IiwiY29sbGVjdGlvbkZvciIsImNvbGxlY3Rpb25OYW1lIiwicG9saWN5IiwicmVxdWlyZWRQZWVyQ291bnQiLCJtYXhQZWVyQ291bnQiLCJibG9ja1RvTGl2ZSIsIm1lbWJlck9ubHlSZWFkIiwibWVtYmVyT25seVdyaXRlIiwicHJpdmF0ZUNvbGxlY3Rpb25Gb3IiLCJtc3BJZCIsImMiLCJlbmRvcnNlbWVudFBvbGljeSIsInNpZ25hdHVyZVBvbGljeSIsInNoYXJlZENvbGxlY3Rpb25Gb3IiLCJtc3BJZHMiLCJtYXAiLCJleHRyYWN0Q29sbGVjdGlvbnMiLCJvdmVycmlkZXMiLCJtaXJyb3IiLCJwcml2YXRlQ29scyIsInNoYXJlZENvbHMiLCJjb2xsZWN0aW9uc0ZvciIsInJlc29sdmVDb2xsZWN0aW9uIiwiYXJnIiwiSW50ZXJuYWxFcnJvciIsInByaXZhdGVEZWZhdWx0cyIsImFzc2lnbiIsInNoYXJlZERlZmF1bHRzIiwibWlycm9yTWV0YSIsIm1pcnJvcmVkQXQiLCJwcml2YXRlcyIsImZsYXQiLCJyZXNvbHZlZCIsInJlc29sdmVyIiwic29tZSIsImluY2x1ZGVzIiwic2hhcmVkIiwid3JpdGVDb2xsZWN0aW9ucyIsImNvbHMiLCJmaWxlTmFtZSIsIndyaXRlQ29sbGVjdGlvbkRlc2lnbkRvY3MiLCJkb2NzIiwiRmFicmljQ2xpZW50UGFnaW5hdG9yIiwiUGFnaW5hdG9yIiwiY29uc3RydWN0b3IiLCJhZGFwdGVyIiwicXVlcnkiLCJzaXplIiwiY2xhenoiLCJzdXBlciIsInByZXBhcmUiLCJyYXdTdGF0ZW1lbnQiLCJVbnN1cHBvcnRlZEVycm9yIiwicGFnZSIsImFyZ3MiLCJpc1NlcmlhbGl6ZWRQYWdlIiwib2JqIiwiQXJyYXkiLCJpc0FycmF5IiwiZGF0YSIsIkZhYnJpY0NsaWVudFJlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiZm9yY2UiLCJ0aGlzIiwiX292ZXJyaWRlcyIsImlnbm9yZVZhbGlkYXRpb24iLCJpZ25vcmVIYW5kbGVycyIsImFsbG93UmF3U3RhdGVtZW50cyIsImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXMiLCJmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllcyIsImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlIiwicmVidWlsZFdpdGhUcmFuc2llbnQiLCJvdmVycmlkZSIsImZsYWdzIiwiZm9yIiwiT2JzZXJ2ZXJIYW5kbGVyIiwicGFnaW5hdGVCeSIsImtleSIsIm9yZGVyIiwicmVmIiwib2Zmc2V0IiwibGltaXQiLCJsb2ciLCJjdHhBcmdzIiwibG9nQ3R4IiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiUEFHRV9CWSIsInZlcmJvc2UiLCJ0YWJsZU5hbWUiLCJjbGFzcyIsInN0YXRlbWVudCIsImJvb2ttYXJrIiwibGlzdEJ5IiwiTElTVF9CWSIsImZpbmRCeSIsInZhbHVlIiwiRklORF9CWSIsImZpbmRPbmVCeSIsIkZJTkRfT05FX0JZIiwiZmluZCIsIk9yZGVyRGlyZWN0aW9uIiwiQVNDIiwiRklORCIsImRpcmVjdGlvbiIsIlBBR0UiLCJjdHgiLCJQZXJzaXN0ZW5jZUtleXMiLCJTVEFURU1FTlQiLCJjYWxsQXJncyIsInNsaWNlIiwicGFyc2UiLCJkZWNvZGUiLCJldmFsdWF0ZVRyYW5zYWN0aW9uIiwiaHlkcmF0ZWQiLCJyIiwiQ291Y2hEQktleXMiLCJUQUJMRSIsImQiLCJhcHBseUFmdGVyUmVhZCIsImdldE9yVW5kZWZpbmVkIiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiQUZURVIiLCJQcm9taXNlIiwiYWxsIiwiZW50cnkiLCJjb3VudE9mIiwiQ09VTlRfT0YiLCJzdG10QXJncyIsIm1heE9mIiwiTUFYX09GIiwibWluT2YiLCJNSU5fT0YiLCJhdmdPZiIsIkFWR19PRiIsInN1bU9mIiwiU1VNX09GIiwiZGlzdGluY3RPZiIsIkRJU1RJTkNUX09GIiwiZ3JvdXBPZiIsIkdST1VQX09GIiwiaGVhbHRoY2hlY2siLCJjcmVhdGUiLCJtb2RlbCIsImRlYnVnIiwiZW5zdXJlTGVnYWN5TWlycm9yRmxhZyIsInByZXBhcmVkIiwicmVjb3JkIiwiaWQiLCJ0cmFuc2llbnQiLCJyZXZlcnQiLCJ1cGRhdGUiLCJjcmVhdGVBbGxQcmVmaXgiLCJtb2RlbHMiLCJDUkVBVEUiLCJnZXQiLCJpZ25vcmVWYWxpZGF0ZSIsIk9OIiwiaWdub3JlZFByb3BzIiwiZXJyb3JzIiwiaGFzRXJyb3JzIiwiZXJyb3JNZXNzYWdlcyIsInJlZHVjZUVycm9yc1RvUHJpbnQiLCJWYWxpZGF0aW9uRXJyb3IiLCJjcmVhdGVBbGwiLCJpZHMiLCJwYXlsb2FkcyIsInRyYW5zaWVudHMiLCJjcmVhdGVkIiwiaSIsInJlYWRBbGwiLCJrZXlzIiwicmVjb3JkcyIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJ1IiwiYWNjdW11bGF0ZSIsImxlZ2FjeSIsIkVSQzIwVG9rZW4iLCJCYXNlTW9kZWwiLCJfX2RlY29yYXRlIiwicGsiLCJ0eXBlIiwiU3RyaW5nIiwicHJvdG90eXBlIiwiY29sdW1uIiwicmVxdWlyZWQiLCJ0YWJsZSIsIkVSQzIwV2FsbGV0IiwiQWxsb3dhbmNlIiwiQ2xpZW50U2VyaWFsaXplciIsIkpTT05TZXJpYWxpemVyIiwicHJlU2VyaWFsaXplIiwibW9kZWxOYW1lIiwidG9TZXJpYWxpemUiLCJtZXRhZGF0YSIsIk1ldGFkYXRhIiwiU2VyaWFsaXphdGlvbkVycm9yIiwiTW9kZWxLZXlzIiwiQU5DSE9SIiwiZGVzZXJpYWxpemUiLCJzdHIiLCJkZXNlcmlhbGl6YXRpb24iLCJjbGFzc05hbWUiLCJFcnJvciIsImJ1aWxkIiwic2VyaWFsaXplIiwiRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5Iiwic2VyaWFsaXplciIsImRlY29kZXIiLCJUZXh0RGVjb2RlciIsInVwZGF0ZU9ic2VydmVycyIsImV2ZW50Iiwib2JzZXJ2ZXJIYW5kbGVyIiwiY291bnQiLCJwYXJzZWRJZCIsIlNlcXVlbmNlIiwicGFyc2VWYWx1ZSIsInNlcXVlbmNlRm9yIiwidG9rZW5OYW1lIiwic3ltYm9sIiwiZGVjaW1hbHMiLCJOdW1iZXIiLCJ0b3RhbFN1cHBseSIsInRvdGFsIiwiYmFsYW5jZU9mIiwib3duZXIiLCJiYWxhbmNlIiwidHJhbnNmZXIiLCJ0byIsInRyYW5zZmVycmVkIiwic3VibWl0VHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsInRyYW5zZmVyRnJvbSIsImZyb20iLCJjb250ZXh0QXJncyIsIkNvbnRleHQiLCJhcHByb3ZlIiwic3BlbmRlciIsImFwcHJvdmVkIiwiYWxsb3dhbmNlIiwiaW5pdGlhbGl6ZSIsInRva2VuIiwiaW5pdGlsaWF6ZWQiLCJjaGVja0luaXRpYWxpemVkIiwibWludCIsImFtb3VudCIsImJ1cm4iLCJidXJuRnJvbSIsImFjY291bnQiLCJjbGllbnRBY2NvdW50QmFsYW5jZSIsInNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSIsImNsaWVudEFjY291bnRJRCIsImV4dHJhY3RJZHMiLCJjb21wb3NlZCIsInBrUHJvcHMiLCJleHRyYWN0SWQiLCJjb21wb3NlQXR0cmlidXRlVmFsdWUiLCJJZGVudGl0eUNyZWRlbnRpYWxzIiwiZGVzY3JpcHRpb24iLCJGYWJyaWNNb2RlbEtleXMiLCJJZGVudGl0eVR5cGUiLCJGYWJyaWNGbGF2b3VyIiwiSWRlbnRpdHkiLCJYNTA5Iiwib25lVG9PbmUiLCJDYXNjYWRlIiwiQ0FTQ0FERSIsImRlbGV0ZSIsIkNvcmVVdGlscyIsImxvZ2dlciIsIk1pbmlMb2dnZXIiLCJjb250ZW50T2ZMb2FkRmlsZSIsImNvbnRlbnRPclBhdGgiLCJmaWxlUmVhZGVyIiwiVWludDhBcnJheSIsIm1hdGNoIiwicmVhZEZpbGUiLCJwcm9taXNlcyIsIm5vcm1hbGl6ZUltcG9ydCIsImltcG9ydCIsImdldENBVXNlciIsInVzZXJOYW1lIiwicHJpdmF0ZUtleSIsImNlcnRpZmljYXRlIiwib3B0aW9ucyIsInN0cmluZ0Zvcm1hdCIsInVzZXIiLCJVc2VyIiwiY29uZmlnIiwiaHNtIiwic29mdHdhcmUiLCJsaWIiLCJsaWJyYXJ5Iiwic2xvdCIsImxhYmVsIiwidG9rZW5MYWJlbCIsInBpbiIsImNyeXB0b1N1aXRlIiwiZ2V0Q3J5cHRvU3VpdGUiLCJzZXRDcnlwdG9TdWl0ZSIsImVucm9sbG1lbnRLZXkiLCJnZXRIU01FbnJvbGxtZW50S2V5IiwiZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5Iiwic2V0RW5yb2xsbWVudCIsIm5ld0NyeXB0b1N1aXRlIiwiY3JlYXRlS2V5RnJvbVJhdyIsInNraSIsImtleUlkSGV4IiwidHJpbSIsIkJ1ZmZlciIsImdldENlcnRpZmljYXRlU0tJIiwiZ2V0S2V5IiwiaXNQcml2YXRlIiwieDUwOSIsIlg1MDlDZXJ0aWZpY2F0ZSIsImp3ayIsInB1YmxpY0tleSIsImV4cG9ydCIsImZvcm1hdCIsInByZWZpeCIsIngiLCJ5IiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsImNvbmNhdCIsImRpZ2VzdCIsImdldElkZW50aXR5IiwiY2VydERpcmVjdG9yeVBhdGgiLCJpZGVudGl0eUZpbGVSZWFkZXIiLCJjZXJ0UGF0aCIsImdldEZpcnN0RGlyRmlsZU5hbWUiLCJjcmVkZW50aWFscyIsImRpclBhdGgiLCJyZWFkZGlyIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQiLCJnZXRGaWxlQ29udGVudCIsImdldFNpZ25lciIsImtleURpcmVjdG9yeVBhdGgiLCJzaWduZXJGaWxlUmVhZGVyIiwia2V5UGF0aCIsInByaXZhdGVLZXlQZW0iLCJleHRyYWN0UHJpdmF0ZUtleSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImsiLCJzaWduZXJzIiwibmV3UHJpdmF0ZUtleVNpZ25lciIsInBlbSIsImxpYk5hbWUiLCJzdWJ0bGUiLCJnbG9iYWxUaGlzIiwid2luZG93IiwiQ3J5cHRvIiwid2ViY3J5cHRvIiwic3RyMmFiIiwiYnVmIiwiQXJyYXlCdWZmZXIiLCJidWZWaWV3Iiwic3RyTGVuIiwiY2hhckNvZGVBdCIsInJlcGxhY2VBbGwiLCJkZWNvZGVkIiwiYmluYXJ5RGVyIiwiaW1wb3J0S2V5IiwibmFtZWRDdXJ2ZSIsImdldEFraUFuZFNlcmlhbEZyb21DZXJ0IiwiY2VydCIsIng1MDlDZXJ0aWZpY2F0ZSIsIlg1MDlDZXJ0IiwiYWtpRXh0IiwiZXh0ZW5zaW9ucyIsImFraSIsInRvVXBwZXJDYXNlIiwic3RhcnRzV2l0aCIsInNlcmlhbCIsInNlcmlhbE51bWJlciIsImNyeXB0b1Byb3ZpZGVyIiwic2V0IiwiQkFTRV9BTFBIQUJFVCIsIkNSWVBUTyIsIkJhc2VFbmNvZGVyIiwiYWxwaGFiZXQiLCJiYXNlTWFwIiwiaiIsImNoYXJBdCIsInhjIiwiYmFzZSIsImxlYWRlciIsImZhY3RvciIsIk1hdGgiLCJpRmFjdG9yIiwiZW5jb2RlIiwic291cmNlIiwiaXNWaWV3IiwiYnVmZmVyIiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJ6ZXJvZXMiLCJwYmVnaW4iLCJwZW5kIiwiYjU4IiwiY2FycnkiLCJpdDEiLCJpdDIiLCJyZXBlYXQiLCJkZWNvZGVVbnNhZmUiLCJwc3oiLCJiMjU2IiwiaXQzIiwiaXQ0IiwidmNoIiwiQ3J5cHRvVXRpbHMiLCJiNThlbmNvZGVyIiwiQkFTRTU4IiwiZmFicmljSWRGcm9tQ2VydGlmaWNhdGUiLCJzdWJqZWN0IiwiaXNzdWVyIiwic3RyaW5nVG9BcnJheUJ1ZmZlciIsImV4dHJhY3RLZXkiLCJ1c2FnZXMiLCJSZWdFeHAiLCJleHRyYWN0UHVibGljS2V5Iiwic2lnbiIsImJ1ZmYiLCJoYXNoIiwiYiIsInBhZFN0YXJ0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwiZW5jcnlwdCIsImdldFN1YnRsZUNyeXB0byIsImlzQnJvd3NlciIsImRlY3J5cHQiLCJnZXRNYXN0ZXIiLCJ0ZXh0RW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZ2VuR2VuZXNpcyIsInJhbmRvbVVVSUQiLCJpbXBvcnRlZEtleSIsIktFWV9BTEdPUllUSE0iLCJpdiIsImdldERlcml2YXRpb25LZXkiLCJzYWx0Iiwic2FsdEJ1ZmZlciIsInNhbHRIYXNoZWQiLCJwYXJhbXMiLCJIQVNIIiwiaXRlcmF0aW9ucyIsIklURVJBVElPTlMiLCJkZXJpdmF0aW9uIiwiZGVyaXZlQml0cyIsIktFWUxFTkdUSCIsIml2bGVuIiwia2V5bGVuIiwiZGVyaXZlZEtleSIsImltcG9ydGVkRW5jcnlwdGlvbktleSIsIkFMR09SWVRITSIsImVuY3J5cHRQaW4iLCJ0ZXh0Iiwia2V5T2JqZWN0IiwidGV4dEJ1ZmZlciIsImVuY3J5cHRlZFRleHQiLCJkZWNyeXB0UGluIiwidGV4dERlY29kZXIiLCJkZWNyeXB0ZWRUZXh0IiwiT3ZlcmZsb3dFcnJvciIsIm1zZyIsIkJhbGFuY2VFcnJvciIsIkFsbG93YW5jZUVycm9yIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJNaXNzaW5nQ29udGV4dEVycm9yIiwiVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MiLCJCYXNlRXJyb3IiLCJOb3RJbml0aWFsaXplZEVycm9yIiwiTWlzc2luZ1BLQ1NTMTFMaWIiLCJFbmRvcnNlbWVudEVycm9yIiwibWVzc2FnZSIsIk12Y2NSZWFkQ29uZmxpY3RFcnJvciIsIlBoYW50b21SZWFkQ29uZmxpY3RFcnJvciIsIkVuZG9yc2VtZW50UG9saWN5RXJyb3IiLCJUcmFuc2FjdGlvbkxpbWl0c0Vycm9yIiwiY29kZSIsIlRyYW5zYWN0aW9uVGltZW91dEVycm9yIiwiVHJhbnNhY3Rpb25CdWZmZXJTaXplRXJyb3IiLCJIRkNBSWRlbnRpdHlUeXBlIiwiSEZDQUlkZW50aXR5QXR0cmlidXRlcyIsIkZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIiwiTG9nZ2VkQ2xhc3MiLCJjYUNvbmZpZyIsImNhTmFtZSIsImNhQ2VydCIsImNhS2V5IiwidXJsIiwiQ0EiLCJjYSIsInRscyIsInRydXN0ZWRSb290cyIsInJvb3QiLCJGYWJyaWNDQVNlcnZpY2VzIiwiQ2xpZW50IiwiY2xpZW50IiwiQ2VydGlmaWNhdGUiLCJjZXJ0aWZpY2F0ZVNlcnZpY2UiLCJuZXdDZXJ0aWZpY2F0ZVNlcnZpY2UiLCJBZmZpbGlhdGlvbnMiLCJhZmZpbGlhdGlvblNlcnZpY2UiLCJuZXdBZmZpbGlhdGlvblNlcnZpY2UiLCJJZGVudGl0aWVzIiwiaWRlbnRpdHlTZXJ2aWNlIiwibmV3SWRlbnRpdHlTZXJ2aWNlIiwiZ2V0Q2VydGlmaWNhdGVzIiwicmVxdWVzdCIsImRvTWFwIiwicmVzcG9uc2UiLCJjZXJ0cyIsIlBFTSIsImdldElkZW50aXRpZXMiLCJpZGVudGl0aWVzU2VydmljZSIsImdldEFsbCIsImlkZW50aXRpZXMiLCJwYXJzZUVycm9yIiwicmVnZXhwIiwiZXhlYyIsIkNvbmZsaWN0RXJyb3IiLCJnZXRBZmZpbGlhdGlvbnMiLCJhIiwicmVhZCIsImVucm9sbG1lbnRJZCIsImdldE9uZSIsIk5vdEZvdW5kRXJyb3IiLCJzdWNjZXNzIiwicmVnaXN0ZXIiLCJpc1N1cGVyVXNlciIsImFmZmlsaWF0aW9uIiwidXNlclJvbGUiLCJhdHRycyIsIm1heEVucm9sbG1lbnRzIiwicmVnaXN0cmF0aW9uIiwicGFzc3dvcmQiLCJwcm9wcyIsImVucm9sbG1lbnRJRCIsImVucm9sbG1lbnRTZWNyZXQiLCJpbmZvIiwiaWRlbnRpdHlGcm9tRW5yb2xsbWVudCIsImVucm9sbG1lbnQiLCJyb290Q2VydGlmaWNhdGUiLCJMb2dnaW5nIiwiY2xpZW50SWQiLCJub3ciLCJEYXRlIiwidG9CeXRlcyIsImNyZWF0ZWRPbiIsInVwZGF0ZWRPbiIsImVucm9sbCIsImlkZW50aXR5IiwicmVnaXN0ZXJBbmRFbnJvbGwiLCJyZXZva2UiLCJyZWFzb24iLCJSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciIsImVycnMiLCJyb2xlIiwic2V0QWZmaWxpYXRpb24iLCJhZGRBdHRyIiwiYXR0ciIsInNldEF0dHJzIiwic2V0RW5yb2xsbWVudElEIiwic2V0RW5yb2xsbWVudFNlY3JldCIsInNldE1heEVucm9sbG1lbnRzIiwic2V0Um9sZSIsIm1pbmxlbmd0aCIsIm1pbiIsIkVSQzIwRXZlbnRzIiwiRmFicmljQmFzZU1vZGVsIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0IiwidmVyc2lvbiIsInVzZXMiLCJGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsIiwiY3JlYXRlZEJ5IiwidXBkYXRlZEJ5IiwiaXNTaGFyZWQiLCJzZWdyZWdhdGUiLCJpc1RyYW5zaWVudCIsImRlY29yYXRlZFByb3BlcnRpZXMiLCJnZXRBdHRyaWJ1dGVzIiwidHJhbnNpZW50UHJvcHMiLCJEQktleXMiLCJUUkFOU0lFTlQiLCJwcml2YXRlUHJvcGVydGllcyIsIlBSSVZBVEUiLCJzaGFyZWRQcm9wZXJ0aWVzIiwiU0hBUkVEIiwicHVibGljIiwidHJhbnNpZW50S2V5cyIsInByaXZhdGVLZXlzIiwic2hhcmVkS2V5cyIsImlzUHVibGljIiwiYmluZCIsIm1pcnJvcmVkIiwiRkFCUklDIiwiTUlSUk9SIiwib3duZXJPZiIsIm1ldGEiLCJPV05FRF9CWSIsInNoYXJlZEtleSIsImNvbnN0ciIsInByaXZhdGVNZXRhIiwic2hhcmVkTWV0YSIsImNvbGxlY3Rpb25zIiwiZXh0cmFjdE1zcElkIiwiZ2V0TVNQSUQiLCJPd25lciIsInRhcmdldCIsInByb3BlcnR5S2V5IiwiZGVzY3JpcHRvciIsIm9yaWdpbmFsTWV0aG9kIiwiYWNvdW50SWQiLCJjbGllbnRJZGVudGl0eSIsImdldElEIiwic2VsZWN0IiwidG9rZW5zIiwiZXhlY3V0ZSIsImFwcGx5Iiwib3duZWRCeU9uQ3JlYXRlIiwiY29udGV4dCIsInN0dWIiLCJjcmVhdG9yIiwiZ2V0Q3JlYXRvciIsIm1zcGlkIiwic2V0T3duZWRCeUtleVZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJvd25lZEJ5IiwiYXR0cmlidXRlIiwiZ2VuZXJhdGVkIiwicmVhZG9ubHkiLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIkRlY29yYXRpb24iLCJkZWZpbmUiLCJkZWNvcmF0b3IiLCJ0cmFuc2FjdGlvbklkT25DcmVhdGUiLCJnZXRUeElEIiwidHJhbnNhY3Rpb25JZCIsIm9uVXBkYXRlIiwiVFJBTlNBQ1RJT05fSUQiLCJldmFsTWlycm9yTWV0YWRhdGEiLCJjcmVhdGVNaXJyb3JIYW5kbGVyIiwiZmFicmljQ3R4Iiwic291cmNlTW9kZWwiLCJwdXQiLCJyZXBvIiwibWlycm9yQ29sbGVjdGlvbiIsInVwZGF0ZU1pcnJvckhhbmRsZXIiLCJhcHBseVVwZGF0ZVZhbGlkYXRpb24iLCJtZXJnZUZvclVwZGF0ZSIsImRlbGV0ZU1pcnJvckhhbmRsZXIiLCJwa1Byb3AiLCJzZWdyZWdhdGVkIiwibWlycm9yV3JpdGVHdWFyZCIsIm1zcCIsImNvbmRpdGlvbiIsInJlYWRNaXJyb3JIYW5kbGVyIiwibWF0Y2hlcyIsInJlYWRGcm9tIiwibXNwSWRPckNvbmRpdGlvbiIsImlzQ29uZGl0aW9uT25seSIsIkJvb2xlYW4iLCJjb25kIiwib25SZWFkIiwicHJpb3JpdHkiLCJvbkRlbGV0ZSIsIk1vZGVsQ29sbGVjdGlvbiIsIm9yZ05hbWUiLCJ0b1Bhc2NhbENhc2UiLCJOYW1lc3BhY2VDb2xsZWN0aW9uIiwibmFtZXNwYWNlIiwiSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbiIsIlNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZIiwiYXBwbHlTZWdyZWdhdGlvbkZsYWdzIiwiaXNGdWxseVNlZ3JlZ2F0ZWQiLCJoYXNQdWJsaWNQcm9wZXJ0aWVzIiwibWFya0Z1bGx5U2VncmVnYXRlZCIsImFwcGx5TWlycm9yRmxhZ3MiLCJhdHRyaWJ1dGVzIiwidHJhbnNpZW50TWV0YSIsImV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMiLCJkYXRhQXJyYXkiLCJjb2xsZWN0aW9uUmVzb2x2ZXIiLCJzZXFOYW1lIiwic2VxdWVuY2VOYW1lIiwic2V0U2VxdWVuY2VTZWdyZWdhdGlvbiIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJrZXlBcnJheSIsIl9rIiwia2V5U3RyaW5ncyIsIndyaXRlVG8iLCJzZWdyZWdhdGVkRGF0YU9uUmVhZCIsInNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUiLCJvbGRNb2RlbCIsInNlZ3JlZ2F0ZWREYXRhT25EZWxldGUiLCJpbm5lclNlZ3JlZ2F0ZWQiLCJzZWdyZWdhdGVkRGVjIiwiU2V0IiwiYWRkIiwiY29uc3RyTWV0YSIsImNvbnN0ckNvbGxlY3Rpb25zIiwidXBkYXRlZFRyYW5zaWVudE1ldGEiLCJkZWNzIiwicHJvcGVydGllcyIsImdyb3VwTmFtZSIsImV4dHJhY3RHcm91cE5hbWUiLCJkYXRhR3JvdXBOYW1lIiwiZWFybHlFeHRyYWN0aW9uTWV0YSIsImVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCIsImdyb3VwIiwicHJvcCIsIm9uIiwiREJPcGVyYXRpb25zIiwiQUxMIiwicHJpdmF0ZURhdGEiLCJzaGFyZWREYXRhIiwic29ydEtleXNPbmx5UmVjdXJzaXZlIiwic29ydCIsInJlZHVjZSIsImFjYyIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiZXJyb3IiLCJzZWxmIiwibyIsImNhbGwiLCJyZWxhdGlvbnMiLCJnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSIsInBhcnNlRXZlbnROYW1lIiwicGFydHMiLCJzcGxpdCIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIlNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIiwicHV0QW5jaG9yIiwicHJlU2VyaWFsaXphdGlvbiIsIkZhYnJpY0lkZW50aXR5U2VydmljZSIsIkNsaWVudEJhc2VkU2VydmljZSIsInJvb3RDbGllbnQiLCJfdXNlciIsImNlcnRpZmljYXRlcyIsImFmZmlsaWF0aW9ucyIsImdldFVzZXIiLCJjZmciLCJJTklUSUFMSVpBVElPTiIsImdldE5hbWUiLCJ1cGRhdGVJZGVudGl0eSIsImlkZW50aXR5UmVxdWVzdCIsImNhVXNlcklkZW50aXR5IiwicmVlbnJvbGxVc2VyIiwiY3JlYXRlVXNlciIsImdldE1zcGlkIiwiZW5yb2xsbWVudEF0dHJzIiwib3B0aW9uYWwiLCJyZWVucm9sbCIsInJlbmV3ZWRJZGVudGl0eSIsInJldm9rZU9wdGlvbnMiLCJyZXZva2VSZXF1ZXN0IiwiQ0FfUk9MRSIsIkRlZmF1bHRGYWJyaWNDbGllbnRGbGFncyIsImV2YWx1YXRlVGltZW91dCIsImVuZG9yc2VUaW1lb3V0Iiwic3VibWl0VGltZW91dCIsImNvbW1pdFRpbWVvdXQiLCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3MiLCJhbGxvd0dhdGV3YXlPdmVycmlkZSIsImVuY3J5cHRUcmFuc2llbnQiLCJzeW50aGV0aWNFdmVudHMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwidG9Mb3dlckNhc2UiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJwcm9jZXNzZWQiLCJhcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdCIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwiZmllbGRzIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJ3YXJuIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsInBvcCIsInRvT3ZlcnJpZGVzIiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJjdXJyZW50T3AiLCJjdXJyZW50TW9kZWwiLCJyZXBvc2l0b3J5IiwiY3JlYXRlUHJlZml4IiwidXBkYXRlQWxsUHJlZml4Iiwic2hpZnQiLCJoYXNUcmFuc2llbnQiLCJuZWVkc0Z1bGxQYXlsb2FkIiwic2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uIiwidHJhbnNpZW50UGF5bG9hZCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIkNSRUFURV9BTEwiLCJnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zIiwicmVzIiwic2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUiLCJSRUFEX0FMTCIsIlVQREFURV9BTEwiLCJkZWxldGVBbGwiLCJzaG91bGRIeWRyYXRlIiwiREVMRVRFX0FMTCIsIk1FVEFEQVRBIiwibWlycm9yTXNwIiwibXNwcyIsIm1lcmdlZCIsImVuZG9yc2luZ09yZ3MiLCJlbmRvcnNpbmdPcmdhbml6YXRpb25zIiwic2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQiLCJ2IiwiY2hpbGRSZWJ1aWxkIiwiZ2V0RnJvbUNoaWxkcmVuIiwicmVzb2x2ZWRPcCIsInJlc29sdmVPcGVyYXRpb24iLCJoYXNJZCIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsImdldENvbnRyYWN0TmFtZSIsIkNvbnRyYWN0IiwiY29udHJhY3ROYW1lIiwiZ2V0Q29udHJhY3QiLCJ0cmFuc2FjdGlvbiIsImFwaSIsInN1Ym1pdCIsInRyYW5zaWVudERhdGEiLCJnYXRld2F5IiwiY29udHJhY3QiLCJldmFsdWF0ZSIsInByb3Bvc2FsT3B0aW9ucyIsImFyZ3VtZW50cyIsImNsb3NlIiwic2hvdWxkVXNlTGVnYWN5R2F0ZXdheSIsInByZXBhcmVMZWdhY3lBcmdzIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwiYnVpbGRMZWdhY3lQZWVyQ29uZmlncyIsInBlZXJzIiwicGVlckVuZHBvaW50IiwicGVlckhvc3RBbGlhcyIsInRsc0NlcnQiLCJlbmRvcnNlcnMiLCJvcmciLCJleHRyYXMiLCJtc3BNYXAiLCJsZWdhY3lDb3VudCIsInNlbGVjdGlvbnMiLCJjaG9pY2UiLCJlbmRwb2ludCIsInN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyIsImZjbiIsInRyYW5zaWVudE1hcCIsInBlZXJDb25maWdzIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwibmV0d29yayIsImdldE5ldHdvcmsiLCJjaGFubmVsIiwiY2hhaW5jb2RlTmFtZSIsImNyZWF0ZVRyYW5zYWN0aW9uIiwic2V0VHJhbnNpZW50IiwicGVlciIsImdldENoYW5uZWwiLCJnZXRFbmRvcnNlciIsImVuZG9yc2VyIiwic2V0RW5kb3JzaW5nUGVlcnMiLCJkaXNjb25uZWN0IiwiZGVkdXBlZCIsIk1hcCIsImFkZFBlZXIiLCJoYXMiLCJyZWFkUGVtSW5wdXQiLCJjZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCIsImtleUNlcnRPckRpcmVjdG9yeVBhdGgiLCJwZWVyRW50cmllcyIsImNoYW5uZWxQZWVycyIsIm9yZ3MiLCJ0bHNQZW0iLCJob3N0bmFtZSIsImV4dHJhY3RIb3N0IiwiZW5zdXJlR3JwY1VybCIsInRsc0NBQ2VydHMiLCJncnBjT3B0aW9ucyIsImhvc3RuYW1lT3ZlcnJpZGUiLCJlbmRvcnNpbmdQZWVyIiwiY2hhaW5jb2RlUXVlcnkiLCJsZWRnZXJRdWVyeSIsImV2ZW50U291cmNlIiwib3JnYW5pemF0aW9uIiwib3JnYW5pemF0aW9ucyIsIm9yZGVyZXJzIiwiY2hhbm5lbHMiLCJldmVyeSIsImlzTG9jYWxFbmRwb2ludCIsImhvc3QiLCJzYW5pdGl6ZWQiLCJpc0J1ZmZlciIsInRyaW1tZWQiLCJzdGF0cyIsInN0YXQiLCJjYXRjaCIsImlzRGlyZWN0b3J5IiwicmVhZEZzRmlsZSIsImVyciIsImxlZ2FjeUFyZ3MiLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBp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
|
|
3790
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY29udHJhY3RzL2VyYzIwL21vZGVscy50cyIsIi4uL3NyYy9zaGFyZWQvQ2xpZW50U2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvZXJjMjAvRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnRzIiwiLi4vc3JjL2NsaWVudC9pZHMvaWQtZXh0cmFjdGlvbi50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvSWRlbnRpdHlDcmVkZW50aWFscy50cyIsIi4uL3NyYy9zaGFyZWQvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eS50cyIsIi4uL3NyYy9jbGllbnQvdXRpbHMudHMiLCIuLi9zcmMvY2xpZW50L2NyeXB0by50cyIsIi4uL3NyYy9zaGFyZWQvZXJyb3JzLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgSW5kZXggPSBDcmVhdGVJbmRleFJlcXVlc3Q7XG5cbmZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG4gIGNvbnN0IGRpcm5hbWU6IHN0cmluZyA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGRpcm5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGRpcm5hbWUpO1xuICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vZGVsSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPlxuKTogSW5kZXhbXSB7XG4gIHJldHVybiBnZW5lcmF0ZUluZGV4ZXMoW21dKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBhY2N1bT86IFJlY29yZDxzdHJpbmcsIENvdWNoREJEZXNpZ25Eb2M+XG4pOiBDb3VjaERCRGVzaWduRG9jW10ge1xuICBjb25zdCB2aWV3cyA9IGdlbmVyYXRlVmlld3MoW21dKTtcbiAgY29uc3Qgc3RvcmFnZTogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz4gPSBhY2N1bSB8fCB7fTtcbiAgdmlld3MuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgc3RvcmFnZVtkb2MuX2lkXSA9IGRvYztcbiAgfSk7XG4gIHJldHVybiB2aWV3cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNb2RlbEZpbGUoZmlsZTogYW55KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZXhwb3J0cyA9IHJlcXVpcmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGZpbGUucGFyZW50UGF0aCwgZmlsZS5uYW1lKSk7XG5cbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhleHBvcnRzKS5maWx0ZXIoKGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbSA9IG5ldyAoZSBhcyBDb25zdHJ1Y3RvcikoKTtcbiAgICAgIHJldHVybiBtIGluc3RhbmNlb2YgTW9kZWw7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kZWxGb2xkZXJzKFxuICAuLi5mb2xkZXJzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTxNb2RlbENvbnN0cnVjdG9yPGFueT5bXT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IGZpbGVzID0gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhmb2xkZXIsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGY6IGFueSkgPT4gZi5pc0ZpbGUoKSAmJiBmLm5hbWUuZW5kc1dpdGgoXCJqc1wiKSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5yZWFkTW9kZWxGaWxlKGZpbGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW5kZXhlcyhcbiAgaW5kZXhlczogSW5kZXhbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1pbmRleGVzLyR7aW5kZXgubmFtZX0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGluZGV4LCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlc2lnbkRvY3MoXG4gIGRlc2lnbkRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIGlmICghZGVzaWduRG9jcy5sZW5ndGgpIHJldHVybjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBkZXNpZ25Eb2NzLmZvckVhY2goKGRvYykgPT4ge1xuICAgIGNvbnN0IGRvY0lkID0gZG9jLl9pZC5yZXBsYWNlKC9eX2Rlc2lnblxcLy8sIFwiXCIpO1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1kZXNpZ25fZG9jcy8ke2RvY0lkfS5qc29uYFxuICAgICAgKVxuICAgICk7XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IC4uLmRvYyB9O1xuICAgIGRlbGV0ZSBwYXlsb2FkLl9yZXY7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQ291Y2hEQkRlc2lnbkRvYyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgd3JpdGVEZXNpZ25Eb2NzIH0gZnJvbSBcIi4uL2luZGV4ZXMvZ2VuZXJhdGlvblwiO1xuXG4vL1xuLy8gZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbi8vICAgbmFtZTogXCJjb2xsZWN0aW9uTWFyYmxlc1wiO1xuLy8gICBwb2xpY3k6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgcmVxdWlyZWRQZWVyQ291bnQ6IDA7XG4vLyAgIG1heFBlZXJDb3VudDogMztcbi8vICAgYmxvY2tUb0xpdmU6IDA7XG4vLyAgIG1lbWJlck9ubHlSZWFkOiB0cnVlO1xuLy8gICBtZW1iZXJPbmx5V3JpdGU6IHRydWU7XG4vLyAgIGVuZG9yc2VtZW50UG9saWN5OiB7XG4vLyAgICAgaWRlbnRpdGllczogW1xuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzFNU1BcIiB9IH0sXG4vLyAgICAgICB7IHJvbGU6IHsgbmFtZTogXCJtZW1iZXJcIjsgbXNwSWQ6IFwiT3JnMk1TUFwiIH0gfSxcbi8vICAgICBdO1xuLy8gICAgIHJ1bGU6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgfTtcbi8vIH07XG5cbmV4cG9ydCB0eXBlIEZhYnJpY1BvbGljeUlkZW50aXR5ID0ge1xuICByb2xlOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1zcElkOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k6IHtcbiAgICBpZGVudGl0aWVzOiBGYWJyaWNQb2xpY3lJZGVudGl0eVtdO1xuICAgIHJ1bGU6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFByaXZhdGVDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k/OiB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdGlvbkZvcihcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcG9saWN5OiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbixcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgcG9saWN5OiBwb2xpY3ksXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICBtc3BJZDogc3RyaW5nLFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gYCR7bXNwSWR9UHJpdmF0ZWAsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDAsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCcke21zcElkfS5tZW1iZXInKWAsXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZVxuICApO1xuXG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgT1IoJyR7bXNwSWR9LnBlZXInKWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgbXNwSWRzOiBzdHJpbmdbXSxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlciA9IDEsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyID0gMixcbiAgYmxvY2tUb0xpdmU6IG51bWJlciA9IDAsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuID0gdHJ1ZSxcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuID0gdHJ1ZVxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICBjb25zdCBjID0gY29sbGVjdGlvbkZvcihcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBgT1IoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ubWVtYmVyJ2ApLmpvaW4oXCIsXCIpfSlgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcbiAgYy5lbmRvcnNlbWVudFBvbGljeSA9IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IGBBTkQoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ucGVlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgfTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0Q29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkczogc3RyaW5nW10sXG4gIG92ZXJyaWRlczoge1xuICAgIHByaXZhdGVDb2xzPzogUGFydGlhbDxQcml2YXRlQ29sbGVjdGlvbj47XG4gICAgc2hhcmVkQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICB9ID0ge30sXG4gIG1pcnJvcjogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgbGV0IHsgcHJpdmF0ZUNvbHMsIHNoYXJlZENvbHMgfSA9IE1vZGVsLmNvbGxlY3Rpb25zRm9yKG0pO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVDb2xsZWN0aW9uKGFyZzogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHJldHVybiBhcmc7XG4gICAgICByZXR1cm4gYXJnKG0sIG1zcElkc1swXSkgYXMgc3RyaW5nO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGVDb2xzID0gcHJpdmF0ZUNvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcbiAgc2hhcmVkQ29scyA9IHNoYXJlZENvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcblxuICBjb25zdCBwcml2YXRlRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAwLFxuICAgICAgbWF4UGVlckNvdW50OiAwLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8ucHJpdmF0ZUNvbHMgfHwge31cbiAgKTtcbiAgY29uc3Qgc2hhcmVkRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAxLFxuICAgICAgbWF4UGVlckNvdW50OiAyLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8uc2hhcmVkQ29scyB8fCB7fVxuICApO1xuXG4gIGNvbnN0IG1pcnJvck1ldGEgPSBtaXJyb3IgPyBNb2RlbC5taXJyb3JlZEF0KG0pIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHByaXZhdGVzID0gbXNwSWRzXG4gICAgLm1hcCgobXNwSWQpID0+XG4gICAgICAocHJpdmF0ZUNvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgICBwcml2YXRlRGVmYXVsdHM7XG4gICAgICAgIHJldHVybiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgICAgICAgICBtc3BJZCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgICAgICBibG9ja1RvTGl2ZSxcbiAgICAgICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApXG4gICAgLmZsYXQoKTtcblxuICBpZiAobWlycm9yTWV0YSAmJiBtaXJyb3JNZXRhLm1zcElkKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPVxuICAgICAgdHlwZW9mIG1pcnJvck1ldGEucmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtaXJyb3JNZXRhLnJlc29sdmVyXG4gICAgICAgIDogbWlycm9yTWV0YS5yZXNvbHZlcihtLCBtaXJyb3JNZXRhLm1zcElkKTtcbiAgICBpZiAoXG4gICAgICByZXNvbHZlZCAmJlxuICAgICAgIXByaXZhdGVzLnNvbWUoXG4gICAgICAgIChwKSA9PiBwLm5hbWUgPT09IHJlc29sdmVkICYmIHAucG9saWN5LmluY2x1ZGVzKG1pcnJvck1ldGEubXNwSWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgcHJpdmF0ZXMucHVzaChcbiAgICAgICAgcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbWlycm9yTWV0YS5tc3BJZCxcbiAgICAgICAgICByZXNvbHZlZCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzaGFyZWQgPSAoc2hhcmVkQ29scyBhcyBzdHJpbmdbXSkubWFwKChwKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlLFxuICAgIH0gPSBzaGFyZWREZWZhdWx0cztcbiAgICByZXR1cm4gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgICAgIG1zcElkcyxcbiAgICAgIHAsXG4gICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICBtZW1iZXJPbmx5V3JpdGVcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVzLFxuICAgIHNoYXJlZCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbnMoXG4gIGNvbHM6IFByaXZhdGVDb2xsZWN0aW9uW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGZpbGVOYW1lID0gXCJjb2xsZWN0aW9uc19jb25maWdcIlxuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpIGFzIHN0cmluZztcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG4gIH1cblxuICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihwLCBgLi9NRVRBLUlORi8ke2ZpbGVOYW1lfS5qc29uYCkpO1xuICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoY29scywgdW5kZWZpbmVkLCAyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzKFxuICBkb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRvY3M/Lmxlbmd0aCkgcmV0dXJuO1xuICB3cml0ZURlc2lnbkRvY3MoZG9jcywgcCwgY29sbGVjdGlvbik7XG59XG4iLCJpbXBvcnQge1xuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBhZ2luYXRvcixcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFNlcmlhbGl6ZWRQYWdlLFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIE1bXSxcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGJvb2ttYXJrPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgcXVlcnk6IE1hbmdvUXVlcnkgfCBQcmVwYXJlZFN0YXRlbWVudDxhbnk+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBgUmF3IHF1ZXJ5IGFjY2VzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuIG9ubHkgcHJlcGFyZWQgc3RhdGVtZW50cyBhcmUgbmF0aXZlbHkgYXZhaWxhYmxlYFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBwYWdlKFxuICAgIHBhZ2U6IG51bWJlciA9IDEsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gc3VwZXIucGFnZShwYWdlLCAuLi5hcmdzKTsgLy8gdGhpcyB3aWxsIGZhaWwgZm9yIG5vbi1wcmVwYXJlZCBzdGF0ZW1lbnRzXG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgaXNTZXJpYWxpemVkUGFnZShvYmo6IFNlcmlhbGl6ZWRQYWdlPGFueT4gfCBhbnkpIHtcbiAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmVDb250ZXh0dWFsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBDb250ZXh0T2YsXG4gIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBGbGFnc09mLFxuICBPYnNlcnZlckhhbmRsZXIsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQYWdpbmF0b3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBSZXBvc2l0b3J5LFxuICBTZXJpYWxpemVkUGFnZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgRmFicmljIGNsaWVudCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBnZW5lcmljIFJlcG9zaXRvcnkgdG8gcHJlcGFyZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIENSVUQgb3BlcmF0aW9ucyBleGVjdXRlZCB2aWEgYSBGYWJyaWMgY2xpZW50IEFkYXB0ZXIsIHdpcmluZyBSZXBvc2l0b3J5RmxhZ3MgYW5kIEZhYnJpYy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gKiBAdGVtcGxhdGUgTSBleHRlbmRzIE1vZGVsIC0gVGhlIG1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHJlcG9zaXRvcnlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIE1hbmdvUXVlcnksIEZhYnJpY0ZsYWdzLCBDb250ZXh0PEZhYnJpY0ZsYWdzPj59IFthZGFwdGVyXSAtIE9wdGlvbmFsIGFkYXB0ZXIgaW5zdGFuY2UgdXNlZCB0byBleGVjdXRlIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSByZXBvc2l0b3J5XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItZmFicmljXCI7XG4gKlxuICogY2xhc3MgVXNlciBleHRlbmRzIE1vZGVsIHsgaWQhOiBzdHJpbmc7IG5hbWUhOiBzdHJpbmc7IH1cbiAqIGNvbnN0IHJlcG8gPSBuZXcgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxVc2VyPigpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgaWQ6IFwiMVwiLCBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgbG9hZGVkID0gYXdhaXQgcmVwby5yZWFkKFwiMVwiKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5SZXBvOiBjcmVhdGVQcmVmaXgobW9kZWwsIC4uLmFyZ3MpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcmVzdWx0XG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlciA9IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4+IGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBBPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBfb3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXJbXCJfb3ZlcnJpZGVzXCJdLCB7XG4gICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICBhbGxvd1Jhd1N0YXRlbWVudHM6IGZhbHNlLFxuICAgIGZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXM6IHRydWUsXG4gICAgZm9yY2VQcmVwYXJlQ29tcGxleFF1ZXJpZXM6IHRydWUsXG4gICAgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGU6IGZhbHNlLFxuICAgIHJlYnVpbGRXaXRoVHJhbnNpZW50OiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIGZvcmNlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eiwgZm9yY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8RmxhZ3NPZjxDb250ZXh0T2Y8QT4+Pik6IHRoaXMge1xuICAgIHJldHVybiBzdXBlclxuICAgICAgLm92ZXJyaWRlKE9iamVjdC5hc3NpZ24oe30sIGZsYWdzLCB0aGlzLl9vdmVycmlkZXMpKVxuICAgICAgLmZvcihmbGFncyBhcyBhbnkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBzdXBlci5PYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHBhZ2luYXRlQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbixcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2luYXRlQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luYXRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggcGFnZSBzaXplICR7cmVmLmxpbWl0fWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnaW5hdGVCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgb3JkZXIsXG4gICAgICB7IGxpbWl0OiByZWYubGltaXQsIG9mZnNldDogcmVmLm9mZnNldCwgYm9va21hcms6IHJlZi5ib29rbWFyayB9LFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBsaXN0QnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmxpc3RCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgbGlzdGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgJHtrZXkgYXMgc3RyaW5nfSAke29yZGVyfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmxpc3RCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgb3JkZXIsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZEJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIGFsbCAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZEJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kT25lQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmRPbmVCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBPbmUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggJHtrZXkgYXMgc3RyaW5nfSAke3ZhbHVlfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmRPbmVCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZChcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5IGRlZmF1bHQgcXVlcnkgYXR0cmlidXRlc2BcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmQubmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgb3JkZXIsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcGFnZShcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5IGRlZmF1bHQgcXVlcnkgYXR0cmlidXRlc2BcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2UubmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgcmVmLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHN0YXRlbWVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULCB0cnVlKVxuICAgICkuZm9yKHRoaXMuc3RhdGVtZW50KTtcbiAgICBsb2cudmVyYm9zZShgRXhlY3V0aW5nIHByZXBhcmVkIHN0YXRlbWVudCAke25hbWV9YCk7XG4gICAgY29uc3QgY2FsbEFyZ3MgPSBjdHhBcmdzLnNsaWNlKDAsIC0xKTtcbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKFxuICAgICAgdGhpcy5hZGFwdGVyLmRlY29kZShcbiAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgY3R4LFxuICAgICAgICAgIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsXG4gICAgICAgICAgW25hbWUsIEpTT04uc3RyaW5naWZ5KGNhbGxBcmdzKV0sXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0aGlzLmNsYXNzLm5hbWVcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+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+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cbiIsImltcG9ydCBGYWJyaWNDQVNlcnZpY2VzIGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQge1xuICBBZmZpbGlhdGlvblNlcnZpY2UsXG4gIElkZW50aXR5U2VydmljZSxcbiAgSUVucm9sbFJlc3BvbnNlLFxuICBJUmVnaXN0ZXJSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBDQUNvbmZpZywgQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvbW9kZWwvSWRlbnRpdHlcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4uL2NyeXB0b1wiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGVSZXNwb25zZSxcbiAgRmFicmljSWRlbnRpdHksXG4gIEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gIElkZW50aXR5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi9zaGFyZWQvZmFicmljLXR5cGVzXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcywgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIeXBlcmxlZGdlciBGYWJyaWMgQ0EgaWRlbnRpdHkgdHlwZXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgcmVjb2duaXplZCBieSBGYWJyaWMgQ0EgZm9yIHJlZ2lzdHJhdGlvbiBhbmQgaWRlbnRpdHkgbWFuYWdlbWVudC5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGVudW0gSEZDQUlkZW50aXR5VHlwZSB7XG4gIFBFRVIgPSBcInBlZXJcIixcbiAgT1JERVJFUiA9IFwib3JkZXJlclwiLFxuICBDTElFTlQgPSBcImNsaWVudFwiLFxuICBVU0VSID0gXCJ1c2VyXCIsXG4gIEFETUlOID0gXCJhZG1pblwiLFxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5L3ZhbHVlIGF0dHJpYnV0ZSB1c2VkIGR1cmluZyBDQSByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBlbnRyeSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIEZhYnJpYyBDQSBpZGVudGl0eSBkdXJpbmcgcmVnaXN0cmF0aW9uLCBvcHRpb25hbGx5IG1hcmtpbmcgaXQgZm9yIGluY2x1c2lvbiBpbiBlY2VydC5cbiAqIEBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VjZXJ0XSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGVucm9sbG1lbnQgY2VydGlmaWNhdGUgKEVDZXJ0KS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJS2V5VmFsdWVBdHRyaWJ1dGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGVjZXJ0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhbmRhcmQgRmFicmljIENBIGlkZW50aXR5IGF0dHJpYnV0ZSBrZXlzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB3ZWxsLWtub3duIEZhYnJpYyBDQSBhdHRyaWJ1dGUga2V5cyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBpZGVudGl0aWVzIGZvciBkZWxlZ2F0aW9ucyBhbmQgcGVybWlzc2lvbnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMge1xuICBIRlJFR0lTVFJBUlJPTEVTID0gXCJoZi5SZWdpc3RyYXIuUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJERUxFR0FURVJPTEVTID0gXCJoZi5SZWdpc3RyYXIuRGVsZWdhdGVSb2xlc1wiLFxuICBIRlJFR0lTVFJBUkFUVFJJQlVURVMgPSBcImhmLlJlZ2lzdHJhci5BdHRyaWJ1dGVzXCIsXG4gIEhGSU5URVJNRURJQVRFQ0EgPSBcImhmLkludGVybWVkaWF0ZUNBXCIsXG4gIEhGUkVWT0tFUiA9IFwiaGYuUmV2b2tlclwiLFxuICBIRkFGRklMSUFUSU9OTUdSID0gXCJoZi5BZmZpbGlhdGlvbk1nclwiLFxuICBIRkdFTkNSTCA9IFwiaGYuR2VuQ1JMXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNlcnZpY2Ugd3JhcHBlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEZhYnJpYyBDQS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGhpZ2gtbGV2ZWwgb3BlcmF0aW9ucyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhZ2FpbnN0IGEgSHlwZXJsZWRnZXIgRmFicmljIENlcnRpZmljYXRlIEF1dGhvcml0eSwgaW5jbHVkaW5nIHJlZ2lzdHJhdGlvbiwgZW5yb2xsbWVudCwgcmV2b2NhdGlvbiwgYW5kIGFkbWluaXN0cmF0aXZlIHF1ZXJpZXMuIEVuY2Fwc3VsYXRlcyBsb3dlci1sZXZlbCBGYWJyaWMgQ0EgY2xpZW50IGNhbGxzIHdpdGggY29uc2lzdGVudCBsb2dnaW5nIGFuZCBlcnJvciBtYXBwaW5nLlxuICogQHBhcmFtIHtDQUNvbmZpZ30gY2FDb25maWcgLSBDb25uZWN0aW9uIGFuZCBUTFMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldCBDQS5cbiAqIEBjbGFzcyBGYWJyaWNFbnJvbGxtZW50U2VydmljZVxuICogQGV4YW1wbGVcbiAqIC8vIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgdXNlclxuICogY29uc3Qgc3ZjID0gbmV3IEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlKHtcbiAqICAgdXJsOiAnaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1NCcsXG4gKiAgIGNhTmFtZTogJ09yZzFDQScsXG4gKiAgIHRsczogeyB0cnVzdGVkUm9vdHM6IFsnL3BhdGgvdG8vY2EucGVtJ10sIHZlcmlmeTogZmFsc2UgfSxcbiAqICAgY2FDZXJ0OiAnL3BhdGgvdG8vYWRtaW4vY2VydERpcicsXG4gKiAgIGNhS2V5OiAnL3BhdGgvdG8vYWRtaW4va2V5RGlyJ1xuICogfSk7XG4gKiBhd2FpdCBzdmMucmVnaXN0ZXIoeyB1c2VyTmFtZTogJ2FsaWNlJywgcGFzc3dvcmQ6ICdzM2NyM3QnIH0sIGZhbHNlLCAnb3JnMS5kZXBhcnRtZW50MScsIENBX1JPTEUuVVNFUik7XG4gKiBjb25zdCBpZCA9IGF3YWl0IHN2Yy5lbnJvbGwoJ2FsaWNlJywgJ3MzY3IzdCcpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBhdXRvbnVtYmVyXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBTdmMgYXMgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqICAgcGFydGljaXBhbnQgQ0EgYXMgRmFicmljIENBXG4gKiAgIEFwcC0+PlN2YzogcmVnaXN0ZXIoY3JlZGVudGlhbHMsIC4uLilcbiAqICAgU3ZjLT4+Q0E6IHJlZ2lzdGVyKHJlcXVlc3QsIGFkbWluVXNlcilcbiAqICAgQ0EtLT4+U3ZjOiBlbnJvbGxtZW50U2VjcmV0XG4gKiAgIFN2Yy0tPj5BcHA6IHNlY3JldFxuICogICBBcHAtPj5TdmM6IGVucm9sbChlbnJvbGxtZW50SWQsIHNlY3JldClcbiAqICAgU3ZjLT4+Q0E6IGVucm9sbCh7ZW5yb2xsbWVudElELCBzZWNyZXR9KVxuICogICBDQS0tPj5TdmM6IGNlcnRpZmljYXRlc1xuICogICBTdmMtLT4+QXBwOiBJZGVudGl0eVxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIHByaXZhdGUgY2E/OiBGYWJyaWNDQVNlcnZpY2VzO1xuXG4gIHByaXZhdGUgY2VydGlmaWNhdGVTZXJ2aWNlPzogYW55O1xuXG4gIHByaXZhdGUgYWZmaWxpYXRpb25TZXJ2aWNlPzogQWZmaWxpYXRpb25TZXJ2aWNlO1xuXG4gIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlPzogSWRlbnRpdHlTZXJ2aWNlO1xuXG4gIHByaXZhdGUgY2xpZW50PzogYW55O1xuXG4gIHByaXZhdGUgdXNlcj86IFVzZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYUNvbmZpZzogQ0FDb25maWcpIHtcbiAgICBDb3JlVXRpbHMuZ2V0Q3J5cHRvU3VpdGUoXG4gICAgICBjYUNvbmZpZy5oc21cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgICBsaWI6IGNhQ29uZmlnLmhzbS5saWJyYXJ5LFxuICAgICAgICAgICAgc2xvdDogY2FDb25maWcuaHNtLnNsb3QsXG4gICAgICAgICAgICBsYWJlbDogY2FDb25maWcuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgICBwaW46IFN0cmluZyhjYUNvbmZpZy5oc20ucGluKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIFVzZXIoKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgaWYgKHRoaXMudXNlcikgcmV0dXJuIHRoaXMudXNlcjtcbiAgICBjb25zdCB7IGNhTmFtZSwgY2FDZXJ0LCBjYUtleSwgdXJsLCBoc20gfSA9IHRoaXMuY2FDb25maWc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuVXNlcik7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSB1c2VyIGZvciAke2NhTmFtZX0gYXQgJHt1cmx9YCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtjYUNlcnR9YCk7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FDZXJ0KTtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFoc20pIHtcbiAgICAgIGlmICghY2FLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgY2FLZXkgY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9LiBQcm92aWRlIGEga2V5IGRpcmVjdG9yeSBvciBjb25maWd1cmUgSFNNIHN1cHBvcnQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGtleSBmcm9tICR7Y2FLZXl9YCk7XG4gICAgICBrZXkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBVc2luZyBIU00gY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9IHdpdGggbGlicmFyeSAke2hzbS5saWJyYXJ5fWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgTG9hZGluZyBBZG1pbiB1c2VyIGZvciBjYSAke2NhTmFtZX1gKTtcbiAgICB0aGlzLnVzZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Q0FVc2VyKFwiYWRtaW5cIiwga2V5LCBjZXJ0aWZpY2F0ZSwgY2FOYW1lLCB7XG4gICAgICBoc20sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMudXNlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDQSgpOiBQcm9taXNlPEZhYnJpY0NBU2VydmljZXM+IHtcbiAgICBpZiAodGhpcy5jYSkgcmV0dXJuIHRoaXMuY2E7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuQ0EpO1xuICAgIGNvbnN0IHsgdXJsLCB0bHMsIGNhTmFtZSB9ID0gdGhpcy5jYUNvbmZpZztcblxuICAgIC8vIEZPUiBTb21lIFJlYXNvbiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhpcyB3b3JrcyBmb3Igbm93XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHRydXN0ZWRSb290cywgdmVyaWZ5IH0gPSB0bHMgYXMgVExTT3B0aW9ucztcblxuICAgIGNvbnN0IHJvb3QgPSAodHJ1c3RlZFJvb3RzIGFzIHN0cmluZ1tdKVswXSBhcyBzdHJpbmc7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtyb290fS4gY3dkOiAke3Byb2Nlc3MuY3dkKCl9YCk7XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaWxlQ29udGVudChyb290KTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjYU5hbWV9IHVuZGVyICR7dXJsfWApO1xuICAgIHRoaXMuY2EgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY2E7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2xpZW50KCk6IFByb21pc2U8eyBuZXdDZXJ0aWZpY2F0ZVNlcnZpY2U6IGFueSB9PiB7XG4gICAgaWYgKHRoaXMuY2xpZW50KSByZXR1cm4gdGhpcy5jbGllbnQ7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgdGhpcy5jbGllbnQgPSAoY2EgYXMgYW55KVtcIl9GYWJyaWNDQVNlcnZpY2VzXCJdO1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDZXJ0aWZpY2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlKVxuICAgICAgdGhpcy5jZXJ0aWZpY2F0ZVNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DbGllbnQoKSkubmV3Q2VydGlmaWNhdGVTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIEFmZmlsaWF0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlKVxuICAgICAgdGhpcy5hZmZpbGlhdGlvblNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DQSgpKS5uZXdBZmZpbGlhdGlvblNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5hZmZpbGlhdGlvblNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgSWRlbnRpdGllcygpIHtcbiAgICBpZiAoIXRoaXMuaWRlbnRpdHlTZXJ2aWNlKVxuICAgICAgdGhpcy5pZGVudGl0eVNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DQSgpKS5uZXdJZGVudGl0eVNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eVNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIENBIGNlcnRpZmljYXRlIHNlcnZpY2UgdG8gbGlzdCBjZXJ0aWZpY2F0ZXMsIG9wdGlvbmFsbHkgbWFwcGluZyB0byBQRU0gc3RyaW5ncyBvbmx5LlxuICAgKiBAcGFyYW0ge0dldENlcnRpZmljYXRlc1JlcXVlc3R9IFtyZXF1ZXN0XSAtIE9wdGlvbmFsIGZpbHRlciByZXF1ZXN0IGZvciBjZXJ0aWZpY2F0ZSBsb29rdXAuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RvTWFwPXRydWVdIC0gV2hlbiB0cnVlLCByZXR1cm5zIGFycmF5IG9mIFBFTSBzdHJpbmdzOyBvdGhlcndpc2UgcmV0dXJucyBmdWxsIHJlc3BvbnNlIG9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmdbXSB8IENlcnRpZmljYXRlUmVzcG9uc2U+fSBBcnJheSBvZiBQRU0gc3RyaW5ncyBvciB0aGUgZnVsbCBjZXJ0aWZpY2F0ZSByZXNwb25zZS5cbiAgICovXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyhcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICBkb01hcCA9IHRydWVcbiAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IENlcnRpZmljYXRlUmVzcG9uc2U+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZVNlcnZpY2UgPSBhd2FpdCB0aGlzLkNlcnRpZmljYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENlcnRpZmljYXRlcyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgY2VydGlmaWNhdGVzJHtyZXF1ZXN0ID8gYCBmb3IgJHtyZXF1ZXN0LmlkfWAgOiBcIlwifSBmb3IgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZTogQ2VydGlmaWNhdGVSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IGNlcnRpZmljYXRlU2VydmljZS5nZXRDZXJ0aWZpY2F0ZXMocmVxdWVzdCB8fCB7fSwgdXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdCBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBpZGVudGl0eSBzZXJ2aWNlIHRvIGZldGNoIGFsbCBpZGVudGl0aWVzIGFuZCByZXR1cm5zIHRoZSBsaXN0IGFzIEZhYnJpY0lkZW50aXR5IG9iamVjdHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHlbXT59IFRoZSBsaXN0IG9mIGlkZW50aXRpZXMgcmVnaXN0ZXJlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyBnZXRJZGVudGl0aWVzKCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGlkZW50aXRpZXNTZXJ2aWNlID0gYXdhaXQgdGhpcy5JZGVudGl0aWVzKCk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIElkZW50aXRpZXMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IGlkZW50aXRpZXNTZXJ2aWNlLmdldEFsbChhd2FpdCB0aGlzLlVzZXIoKSlcbiAgICApLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5pZGVudGl0aWVzLmxlbmd0aH0gSWRlbnRpdGllczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmlkZW50aXRpZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGFmZmlsaWF0aW9ucyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgZm9yIHRoZSBsaXN0IG9mIGFmZmlsaWF0aW9ucyBhdmFpbGFibGUgdW5kZXIgdGhlIGNvbmZpZ3VyZWQgQ0EuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFmZmlsaWF0aW9ucyByZXN1bHQgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIGdldEFmZmlsaWF0aW9ucygpIHtcbiAgICBjb25zdCBhZmZpbGlhdGlvblNlcnZpY2UgPSBhd2FpdCB0aGlzLkFmZmlsaWF0aW9ucygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldEFmZmlsaWF0aW9ucyk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY2FDb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGFmZmlsaWF0aW9uU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpKVxuICAgICAgLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5hLmxlbmd0aH0gQWZmaWxpYXRpb25zOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKGVucm9sbG1lbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLm5ld0lkZW50aXR5U2VydmljZSgpLmdldE9uZShlbnJvbGxtZW50SWQsIHVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCByZWdpc3RyYXRpb246IHN0cmluZztcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWdpc3Rlcik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGVucm9sbG1lbnRJRDogdXNlck5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiBwYXNzd29yZCxcbiAgICAgICAgYWZmaWxpYXRpb246IGFmZmlsaWF0aW9uLFxuICAgICAgICB1c2VyUm9sZTogdXNlclJvbGUsXG4gICAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgICAgbWF4RW5yb2xsbWVudHM6IG1heEVucm9sbG1lbnRzLFxuICAgICAgfSBhcyBJUmVnaXN0ZXJSZXF1ZXN0O1xuICAgICAgcmVnaXN0cmF0aW9uID0gYXdhaXQgY2EucmVnaXN0ZXIocHJvcHMsIHVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZ1xuICApOiBJZGVudGl0eSB7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljRW5yb2xsbWVudFNlcnZpY2UsIHt9KS5mb3IoXG4gICAgICB0aGlzLmlkZW50aXR5RnJvbUVucm9sbG1lbnRcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBHZW5lcmF0aW5nIElkZW50aXR5IGZyb20gY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX0gaW4gbXNwICR7bXNwSWR9YFxuICAgICk7XG4gICAgY29uc3QgY2xpZW50SWQgPSBDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgaWQgPSBDcnlwdG9VdGlscy5lbmNvZGUoY2xpZW50SWQpO1xuICAgIGxvZy5kZWJ1ZyhgSWRlbnRpdHkgJHtjbGllbnRJZH0gYW5kIGVuY29kZWRJZCAke2lkfWApO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eSh7XG4gICAgICBpZDogaWQsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleToga2V5LnRvQnl0ZXMoKSxcbiAgICAgICAgcm9vdENlcnRpZmljYXRlOiByb290Q2VydGlmaWNhdGUsXG4gICAgICAgIGNyZWF0ZWRPbjogbm93LFxuICAgICAgICB1cGRhdGVkT246IG5vdyxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgIHVwZGF0ZWRPbjogbm93LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnJvbGwgYW4gaWRlbnRpdHkgd2l0aCB0aGUgQ0EgdXNpbmcgYSByZWdpc3RyYXRpb24gc2VjcmV0LlxuICAgKiBAc3VtbWFyeSBFeGNoYW5nZXMgdGhlIGVucm9sbG1lbnQgSUQgYW5kIHNlY3JldCBmb3IgY2VydGlmaWNhdGVzLCByZXR1cm5pbmcgYSBjb25zdHJ1Y3RlZCBJZGVudGl0eSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gZW5yb2xsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uIC0gRW5yb2xsbWVudCBzZWNyZXQgcmV0dXJuZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyBlbnJvbGwoZW5yb2xsbWVudElkOiBzdHJpbmcsIHJlZ2lzdHJhdGlvbjogc3RyaW5nKSB7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5lbnJvbGwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGxvZy5kZWJ1ZyhgRW5yb2xsaW5nICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlID0gYXdhaXQgY2EuZW5yb2xsKHtcbiAgICAgICAgZW5yb2xsbWVudElEOiBlbnJvbGxtZW50SWQsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHJlZ2lzdHJhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaWRlbnRpdHkgPSBGYWJyaWNFbnJvbGxtZW50U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNhQ29uZmlnLmNhTmFtZVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY2FDb25maWcuY2FOYW1lfSBhcyAke2lkZW50aXR5LmlkfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYW5kIGVucm9sbCBhIG5ldyBpZGVudGl0eSBpbiBvbmUgc3RlcC5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgbmV3IGVucm9sbG1lbnQgSUQgd2l0aCB0aGUgQ0EgYW5kIGltbWVkaWF0ZWx5IGV4Y2hhbmdlcyB0aGUgc2VjcmV0IHRvIGVucm9sbCwgcmV0dXJuaW5nIHRoZSBjcmVhdGVkIElkZW50aXR5LlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGZvciB0aGUgbmV3IGlkZW50aXR5IGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQW5kRW5yb2xsKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlclxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5yZWdpc3RlcihcbiAgICAgIG1vZGVsLFxuICAgICAgaXNTdXBlclVzZXIsXG4gICAgICBhZmZpbGlhdGlvbixcbiAgICAgIHVzZXJSb2xlLFxuICAgICAgYXR0cnMsXG4gICAgICBtYXhFbnJvbGxtZW50c1xuICAgICk7XG4gICAgY29uc3QgeyB1c2VyTmFtZSB9ID0gbW9kZWw7XG4gICAgcmV0dXJuIHRoaXMuZW5yb2xsKHVzZXJOYW1lIGFzIHN0cmluZywgcmVnaXN0cmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2VzIHRoZSBlbnJvbGxtZW50IG9mIGFuIGlkZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBlbnJvbGxtZW50IElELlxuICAgKlxuICAgKiBAcGFyYW0gZW5yb2xsbWVudElkIC0gVGhlIGVucm9sbG1lbnQgSUQgb2YgdGhlIGlkZW50aXR5IHRvIGJlIHJldm9rZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXN1bHQgb2YgdGhlIHJldm9jYXRpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAdGhyb3dzIHtOb3RGb3VuZEVycm9yfSBJZiB0aGUgZW5yb2xsbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZG9lcyBub3QgZXhpc3QuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0aGUgcmV2b2NhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKGVucm9sbG1lbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY2EucmV2b2tlKFxuICAgICAgICB7IGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsIHJlYXNvbjogXCJVc2VyIERlbGV0YXRpb25cIiB9LFxuICAgICAgICB1c2VyXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElSZWdpc3RlclJlcXVlc3QsIElLZXlWYWx1ZUF0dHJpYnV0ZSB9IGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBtaW4sXG4gIG1pbmxlbmd0aCxcbiAgTW9kZWwsXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIGV4dGVuZHMgTW9kZWwge1xuICBAcmVxdWlyZWQoKVxuICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIjtcbiAgQG1pbmxlbmd0aCgxKVxuICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50SUQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpXG4gIGVucm9sbG1lbnRTZWNyZXQhOiBzdHJpbmc7XG4gIEBtaW4oMClcbiAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXI7XG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBzdHJpbmc7XG5cbiAgYnVpbGQoKTogSVJlZ2lzdGVyUmVxdWVzdCB7XG4gICAgY29uc3QgZXJycyA9IHRoaXMuaGFzRXJyb3JzKCk7XG4gICAgaWYgKGVycnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJycy50b1N0cmluZygpKTtcbiAgICBjb25zdCByZXNwb25zZTogSVJlZ2lzdGVyUmVxdWVzdCA9IHtcbiAgICAgIGVucm9sbG1lbnRJRDogdGhpcy5lbnJvbGxtZW50SUQsXG4gICAgICBlbnJvbGxtZW50U2VjcmV0OiB0aGlzLmVucm9sbG1lbnRTZWNyZXQsXG4gICAgICByb2xlOiB0aGlzLnJvbGUsXG4gICAgICBhZmZpbGlhdGlvbjogdGhpcy5hZmZpbGlhdGlvbixcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgdGhpcy5tYXhFbnJvbGxtZW50cyAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHJlc3BvbnNlLm1heEVucm9sbG1lbnRzID0gdGhpcy5tYXhFbnJvbGxtZW50cztcbiAgICBpZiAodGhpcy5hdHRycykgcmVzcG9uc2UuYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIHNldEFmZmlsaWF0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFmZmlsaWF0aW9uID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRBdHRyKGF0dHI6IElLZXlWYWx1ZUF0dHJpYnV0ZSkge1xuICAgIHRoaXMuYXR0cnMgPSB0aGlzLmF0dHJzIHx8IFtdO1xuICAgIHRoaXMuYXR0cnMucHVzaChhdHRyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEF0dHJzKHZhbHVlOiBJS2V5VmFsdWVBdHRyaWJ1dGVbXSkge1xuICAgIHRoaXMuYXR0cnMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEVucm9sbG1lbnRJRCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnJvbGxtZW50SUQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEVucm9sbG1lbnRTZWNyZXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudFNlY3JldCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TWF4RW5yb2xsbWVudHModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMubWF4RW5yb2xsbWVudHMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFJvbGUodmFsdWU6IENBX1JPTEUgfCBzdHJpbmcpIHtcbiAgICB0aGlzLnJvbGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyLCBNaXJyb3JNZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5cbk1vZGVsLnByb3RvdHlwZS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTW9kZWwuaXNTaGFyZWQodGhpcy5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG59O1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTW9kZWwuaXNQcml2YXRlKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBTZWdyZWdhdGVkTW9kZWw8TT4ge1xuICByZXR1cm4gTW9kZWwuc2VncmVnYXRlKHRoaXMpO1xufTtcblxuKE1vZGVsIGFzIGFueSkuc2VncmVnYXRlID0gZnVuY3Rpb24gc2VncmVnYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNXG4pOiBTZWdyZWdhdGVkTW9kZWw8TT4ge1xuICBpZiAoIU1vZGVsLmlzVHJhbnNpZW50KG1vZGVsKSkgcmV0dXJuIHsgbW9kZWw6IG1vZGVsIH07XG4gIGNvbnN0IGRlY29yYXRlZFByb3BlcnRpZXMgPVxuICAgIE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSB8fCBbXTtcblxuICBjb25zdCB0cmFuc2llbnRQcm9wcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgREJLZXlzLlRSQU5TSUVOVFxuICApO1xuICBjb25zdCBwcml2YXRlUHJvcGVydGllcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgRmFicmljTW9kZWxLZXlzLlBSSVZBVEVcbiAgKTtcbiAgY29uc3Qgc2hhcmVkUHJvcGVydGllcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgRmFicmljTW9kZWxLZXlzLlNIQVJFRFxuICApO1xuXG4gIGNvbnN0IHJlc3VsdDogU2VncmVnYXRlZE1vZGVsPE0+ID0ge1xuICAgIG1vZGVsOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBwdWJsaWM6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHRyYW5zaWVudDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHJpdmF0ZXM6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHNoYXJlZDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gIH07XG5cbiAgY29uc3QgdHJhbnNpZW50S2V5cyA9IE9iamVjdC5rZXlzKHRyYW5zaWVudFByb3BzIHx8IHt9KTtcbiAgY29uc3QgcHJpdmF0ZUtleXMgPSBPYmplY3Qua2V5cyhwcml2YXRlUHJvcGVydGllcyB8fCB7fSk7XG4gIGNvbnN0IHNoYXJlZEtleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRQcm9wZXJ0aWVzIHx8IHt9KTtcblxuICAvLyBjb25zdCBwa0tleSA9IE1vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1vZGVsW2tleSBhcyBrZXlvZiBNXTtcbiAgICBjb25zdCBpc1RyYW5zaWVudCA9IHRyYW5zaWVudEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1B1YmxpYyA9ICFpc1RyYW5zaWVudDtcbiAgICBjb25zdCBpc1ByaXZhdGUgPSBwcml2YXRlS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIGNvbnN0IGlzU2hhcmVkID0gc2hhcmVkS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIC8vIGNvbnN0IGlzUHJpbWFyeUtleSA9IGtleSA9PT0gcGtLZXk7XG5cbiAgICBpZiAoaXNUcmFuc2llbnQgfHwgaXNQcml2YXRlIHx8IGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQudHJhbnNpZW50ID0gcmVzdWx0LnRyYW5zaWVudCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQudHJhbnNpZW50IGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICByZXN1bHQucHJpdmF0ZXMgPSByZXN1bHQucHJpdmF0ZXMgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnByaXZhdGVzIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNTaGFyZWQpIHtcbiAgICAgIHJlc3VsdC5zaGFyZWQgPSByZXN1bHQuc2hhcmVkIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5zaGFyZWQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgcmVzdWx0LnB1YmxpYyA9IChyZXN1bHQucHVibGljIHx8IHt9KSBhcyBhbnk7XG4gICAgICAocmVzdWx0LnB1YmxpYyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQubW9kZWwgPSBNb2RlbC5idWlsZChyZXN1bHQucHVibGljLCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgcmV0dXJuIHJlc3VsdCBhcyBTZWdyZWdhdGVkTW9kZWw8TT47XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1ByaXZhdGUgPSBmdW5jdGlvbiBpc1ByaXZhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIU1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgRmFicmljTW9kZWxLZXlzLlBSSVZBVEVcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmlzU2hhcmVkID0gZnVuY3Rpb24gaXNTaGFyZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIU1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgRmFicmljTW9kZWxLZXlzLlNIQVJFRFxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWQgPSBmdW5jdGlvbiBtaXJyb3JlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5vd25lck9mID0gZnVuY3Rpb24gb3duZXJPZjxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbW9kZWxbbWV0YSBhcyBrZXlvZiBNXSBhcyBzdHJpbmc7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5taXJyb3JlZEF0ID0gZnVuY3Rpb24gbWlycm9yZWRBdDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBNaXJyb3JNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIG1vZGVsID0gdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsO1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsIGFzIGFueSxcbiAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbGxlY3Rpb25zRm9yID0gZnVuY3Rpb24gY29sbGVjdGlvbnNGb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKToge1xuICBwcml2YXRlQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbiAgc2hhcmVkQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbn0ge1xuICBjb25zdCBwcml2YXRlS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlBSSVZBVEVdIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaGFyZWRLZXlzOiBzdHJpbmdbXSA9IFtGYWJyaWNNb2RlbEtleXMuU0hBUkVEXSBhcyBzdHJpbmdbXTtcblxuICBjb25zdCBwcml2YXRlS2V5ID0gTWV0YWRhdGEua2V5KC4uLnByaXZhdGVLZXlzKTtcbiAgY29uc3Qgc2hhcmVkS2V5ID0gTWV0YWRhdGEua2V5KC4uLnNoYXJlZEtleXMpO1xuXG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcblxuICBjb25zdCBwcml2YXRlTWV0YTogeyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSA9IE1ldGFkYXRhLmdldChcbiAgICBjb25zdHIgYXMgYW55LFxuICAgIHByaXZhdGVLZXlcbiAgKTtcbiAgY29uc3Qgc2hhcmVkTWV0YTogeyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSA9IE1ldGFkYXRhLmdldChcbiAgICBjb25zdHIgYXMgYW55LFxuICAgIHNoYXJlZEtleVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcHJpdmF0ZUNvbHM6IHByaXZhdGVNZXRhPy5jb2xsZWN0aW9ucyB8fCBbXSxcbiAgICBzaGFyZWRDb2xzOiBzaGFyZWRNZXRhPy5jb2xsZWN0aW9ucyB8fCBbXSxcbiAgfTtcbn0uYmluZChNb2RlbCk7XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIFJlcG8sXG4gIENvbnRleHQsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIENvbnRleHRPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIHRoZSBNU1AgSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0gaWRlbnRpdHkgLSBUaGUgaWRlbnRpdHkgdmFsdWUgd2hpY2ggY2FuIGJlIGEgc3RyaW5nIE1TUCBJRCBvciBDbGllbnRJZGVudGl0eSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBNU1AgSUQgYXMgYSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBub3QgYXZhaWxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TXNwSWQoXG4gIGlkZW50aXR5OiBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBpZGVudGl0eSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gaWRlbnRpdHkuZ2V0TVNQSUQoKTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIG1hcmtpbmcgbWV0aG9kcyB0aGF0IHJlcXVpcmUgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKiBDaGVja3MgdGhlIG93bmVyIG9mIHRoZSB0b2tlbiBiZWZvcmUgYWxsb3dpbmcgdGhlIG1ldGhvZCB0byBiZSBleGVjdXRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVG9rZW5Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHtcbiAqICAgQE93bmVyKClcbiAqICAgYXN5bmMgTWludChjdHg6IENvbnRleHQsIGFtb3VudDogbnVtYmVyKSB7XG4gKiAgICAgLy8gTWludCB0b2tlbiBsb2dpY1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBjaGVja3Mgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPd25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgdGhpczogRmFicmljRVJDMjBDb250cmFjdCxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSB7XG4gICAgICBjb25zdCBjdHg6IEhMQ29udGV4dCA9IGFyZ3NbMF07XG4gICAgICBjb25zdCBhY291bnRJZCA9IGN0eC5jbGllbnRJZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBhd2FpdCAodGhpcyBhcyBGYWJyaWNFUkMyMENvbnRyYWN0KVtcbiAgICAgICAgXCJ0b2tlblJlcG9zaXRvcnlcIlxuICAgICAgXS5zZWxlY3QoKTtcblxuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgc2VsZWN0LmV4ZWN1dGUoY3R4KTtcblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcIk5vIHRva2VucyBhdmFpYWxibGVcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVG8gbWFueSB0b2tlbiBhdmFpbGFibGUgOiAke3Rva2Vucy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnNbMF0ub3duZXIgIT0gYWNvdW50SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgICAgICBgVXNlciBub3QgYXV0aG9yaXplZCB0byBydW4gJHtwcm9wZXJ0eUtleX0gb24gdGhlIHRva2VuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3duZWRCeU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcblxuICBjb25zdCBhbGxvd0dlbmVyYXRpb25PdmVycmlkZSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlO1xuXG4gIGNvbnN0IGNyZWF0b3IgPSBhd2FpdCBzdHViLmdldENyZWF0b3IoKTtcbiAgbGV0IG93bmVyID0gY3JlYXRvci5tc3BpZDtcbiAgY29udGV4dC5sb2cuaW5mbyhcbiAgICBgRXhwZWN0ZWQgbXNwaWQgdG8gYmUgJHttb2RlbFtrZXldfSB8ICR7b3duZXJ9LiBcXG4gVXNpbmcgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGU6ICR7YWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGV9YFxuICApO1xuXG4gIGlmIChhbGxvd0dlbmVyYXRpb25PdmVycmlkZSkgb3duZXIgPSBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG93bmVyO1xuXG4gIGNvbnN0IHNldE93bmVkQnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgc2V0T3duZWRCeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBvd25lcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBnZW5lcmF0ZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUob3duZWRCeU9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb3duZWRCeSxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2FjdGlvbklkT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuICBtb2RlbFtrZXldID0gc3R1Yi5nZXRUeElEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBvbkNyZWF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBvblVwZGF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoXG4gICAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgICAgRmFicmljTW9kZWxLZXlzLkZBQlJJQyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRFxuICAgICAgICAgICksXG4gICAgICAgICAgYXR0cmlidXRlXG4gICAgICAgIClcbiAgICAgICkob2JqLCBhdHRyaWJ1dGUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlRSQU5TQUNUSU9OX0lEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB0cmFuc2FjdGlvbklkLFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgTWlycm9yQ29uZGl0aW9uID0gKG1zcDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uO1xuICByZXNvbHZlcjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nO1xuICBtc3BJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2YWxNaXJyb3JNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcmVzb2x2ZXI6IHVuZGVmaW5lZCB8IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgY3R4OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+XG4pIHtcbiAgbGV0IGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlc29sdmVyO1xuICBpZiAodHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBjdHguZ2V0KFwic3R1YlwiKS5nZXRDcmVhdG9yKCkudG9TdHJpbmcoKTtcbiAgICAgIGlmIChyZXNvbHZlciAmJiB0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgY29sbGVjdGlvbiA9IGF3YWl0IHJlc29sdmVyKG1vZGVsLCBvd25lciwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgY29sbGVjdGlvbiBtaXJyb3IgbmFtZTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29sbGVjdGlvbiB8fCB0eXBlb2YgY29sbGVjdGlvbiAhPT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyBjb2xsZWN0aW9uIGZvdW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcbiAgcmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgLy8gUHV0IG1pcnJvciBmbGFncyBkaXJlY3RseSBvbiBjb250ZXh0IHNvIGFkYXB0ZXIucHJlcGFyZSgpIGFuZCBhZGFwdGVyLmNyZWF0ZSgpIGNhbiBzZWUgdGhlbVxuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgbWlycm9yQ29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGNvbnN0IG1pcnJvciA9IGF3YWl0IHJlcG8uY3JlYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGNyZWF0ZWQgd2l0aCAke01vZGVsLnBrKG1vZGVsKSBhcyBzdHJpbmd9OiAke21pcnJvcltNb2RlbC5wayhtb2RlbCldfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIG1pcnJvciBmbGFncyBmcm9tIGNvbnRleHRcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgICBhcHBseVVwZGF0ZVZhbGlkYXRpb246IGZhbHNlLFxuICAgICAgICBtZXJnZUZvclVwZGF0ZTogZmFsc2UsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGF3YWl0IHJlcG8udXBkYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHVwZGF0ZWQ6ICR7KG1vZGVsIGFzIGFueSlbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcCA9IE1vZGVsLnBrKG1vZGVsKSBhcyBrZXlvZiBNO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbcGtQcm9wXTtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uLFxuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVwby5kZWxldGUoaWQgYXMgYW55LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1heSBhbHJlYWR5IGJlIGRlbGV0ZWQgYnkgYWRhcHRlci5kZWxldGVTZWdyZWdhdGVkQ29sbGVjdGlvbnNcbiAgICB9XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBkZWxldGVkOiAke1N0cmluZyhpZCl9YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwic2VncmVnYXRlZFwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlycm9yV3JpdGVHdWFyZDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAga2V5OiBrZXlvZiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgaWYgKG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSkpIHtcbiAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgYE9yZ2FuaXphdGlvbiAke21zcH0gaXMgbm90IGF1dGhvcml6ZWQgdG8gbW9kaWZ5IG1pcnJvcmVkIGRhdGFgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAoIW1zcCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3QgbWF0Y2hlcyA9IG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciByZWFkOiBNU1AgJHttc3B9IG1hdGNoZXMsIHJvdXRpbmcgcmVhZHMgdG8gbWlycm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufWBcbiAgICApO1xuICAgIC8vIFJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvciBjb2xsZWN0aW9uXG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xuICB9XG4gIC8vIFdoZW4gTVNQIGRvZXMgTk9UIG1hdGNoLCBub3JtYWwgcmVhZCBmbG93IOKAlCBhbGwgZGF0YSBpcyBpbiBwdWJsaWMgc3RhdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvcihcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nLFxuICBtc3BJZE9yQ29uZGl0aW9uPzogc3RyaW5nIHwgTWlycm9yQ29uZGl0aW9uLFxuICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbikge1xuICBjb25zdCBpc0NvbmRpdGlvbk9ubHkgPVxuICAgIHR5cGVvZiBtc3BJZE9yQ29uZGl0aW9uICE9PSBcInN0cmluZ1wiICYmIEJvb2xlYW4obXNwSWRPckNvbmRpdGlvbik7XG4gIGNvbnN0IG1zcElkID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IChtc3BJZE9yQ29uZGl0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbmQgPSBpc0NvbmRpdGlvbk9ubHlcbiAgICA/IChtc3BJZE9yQ29uZGl0aW9uIGFzIE1pcnJvckNvbmRpdGlvbilcbiAgICA6IGNvbmRpdGlvbjtcblxuICBmdW5jdGlvbiBtaXJyb3IoXG4gICAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvblxuICApIHtcbiAgICBjb25zdCBtZXRhOiBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKSxcbiAgICAgICAgbWV0YVxuICAgICAgKSxcbiAgICAgIC8vIFJlYWQgaGFuZGxlciBydW5zIGVhcmx5IChwcmlvcml0eSAzMCkgdG8gc2V0IHVwIGNvbnRleHQgYmVmb3JlIGFueSByZWFkc1xuICAgICAgb25SZWFkKHJlYWRNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMzAgfSksXG4gICAgICAvLyBXcml0ZSBndWFyZHMg4oCUIHJlamVjdCBtYXRjaGluZyBNU1BzIGJlZm9yZSBhbnkgcHJvY2Vzc2luZ1xuICAgICAgb25DcmVhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25VcGRhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25EZWxldGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgLy8gTWlycm9yIHN5bmMgaGFuZGxlcnMg4oCUIHdyaXRlIGZ1bGwgbW9kZWwgYWZ0ZXIgb3RoZXIgaGFuZGxlcnMgKHByaW9yaXR5IDEwMClcbiAgICAgIG9uQ3JlYXRlKGNyZWF0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSksXG4gICAgICBvblVwZGF0ZSh1cGRhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25EZWxldGUoZGVsZXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWlycm9yLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb24sIG1zcElkLCBjb25kXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwPzogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBNb2RlbENvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHtjb25zdHIubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYCR7dG9QYXNjYWxDYXNlKGNvbnN0ci5uYW1lKX0ke29yZ05hbWUgPyB0b1Bhc2NhbENhc2Uob3JnTmFtZSkgOiBcIlwifWA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTmFtZXNwYWNlQ29sbGVjdGlvbihuYW1lc3BhY2U6IHN0cmluZyk6IENvbGxlY3Rpb25SZXNvbHZlciB7XG4gIHJldHVybiA8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LCBtc3BJZD86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG9yZ05hbWUgPVxuICAgICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIW9yZ05hbWUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgICApO1xuICAgIHJldHVybiBgJHtuYW1lc3BhY2V9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JnTmFtZSA9XG4gICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICk7XG4gIHJldHVybiBgX18ke3RvUGFzY2FsQ2FzZShvcmdOYW1lKX1Qcml2YXRlQ29sbGVjdGlvbmA7XG59O1xuXG5leHBvcnQgdHlwZSBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhID0ge1xuICBjb2xsZWN0aW9uczogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpb3JpdHkgZm9yIGVhcmx5IGNvbGxlY3Rpb24gZXh0cmFjdGlvbiAoYmVmb3JlIHBrIGdlbmVyYXRpb24gYXQgcHJpb3JpdHkgNjApXG4gKiBAc3VtbWFyeSBUaGlzIHByaW9yaXR5IGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBiZWZvcmUgYW55IHNlcXVlbmNlXG4gKiBvcGVyYXRpb25zIG9jY3VyLCBhbGxvd2luZyBzZXF1ZW5jZXMgdG8gYmUgcmVwbGljYXRlZCB0byBwcml2YXRlL3NoYXJlZCBjb2xsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZID0gMzU7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IE0sXG4gIGNvbGxlY3Rpb25zOiBzdHJpbmdbXSxcbiAgY3R4OiBhbnlcbikge1xuICAvLyBSZWdpc3RlciBjb2xsZWN0aW9ucyBlYXJseSB1c2luZyByZWFkRnJvbSAtIHRoaXMgYWxsb3dzIHNlcXVlbmNlIGNvZGVcbiAgLy8gdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8gZHVyaW5nIHBrIGdlbmVyYXRpb25cbiAgaWYgKGNvbGxlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAoY3R4IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbnMpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgbW9kZWwgaXMgZnVsbHkgc2VncmVnYXRlZCAoYWxsIG5vbi1wayBwcm9wZXJ0aWVzIGFyZSBwcml2YXRlL3NoYXJlZC90cmFuc2llbnQpLlxuICAvLyBVc2UgTW9kZWwuc2VncmVnYXRlKCkgd2hpY2ggaXMgdGhlIGNhbm9uaWNhbCB3YXkgdG8gZGV0ZXJtaW5lIHdoYXQncyB0cmFuc2llbnQsXG4gIC8vIHJhdGhlciB0aGFuIHJlYWRpbmcgREJLZXlzLlRSQU5TSUVOVCBtZXRhZGF0YSB3aGljaCBtYXkgbm90IGFjY3VtdWxhdGUgY29ycmVjdGx5XG4gIC8vIHdoZW4gY2xhc3MtbGV2ZWwgQHByaXZhdGVEYXRhIGFwcGxpZXMgZGVjb3JhdG9ycyBpdGVyYXRpdmVseS5cbiAgaWYgKCFjdHguaXNGdWxseVNlZ3JlZ2F0ZWQgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgaWYgKCFoYXNQdWJsaWNQcm9wZXJ0aWVzKGNsYXp6LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSkge1xuICAgICAgY3R4Lm1hcmtGdWxseVNlZ3JlZ2F0ZWQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5TWlycm9yRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtc3A6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHRcbikge1xuICBpZiAoIW1zcCkgcmV0dXJuO1xuICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChjbGF6eik7XG4gIGlmICghbWlycm9yTWV0YSkgcmV0dXJuO1xuICBjb25zdCBtYXRjaGVzID1cbiAgICBtc3AgPT09IG1pcnJvck1ldGEubXNwSWQgfHxcbiAgICAobWlycm9yTWV0YS5jb25kaXRpb24gJiYgbWlycm9yTWV0YS5jb25kaXRpb24obXNwKSk7XG4gIGlmICghbWF0Y2hlcykgcmV0dXJuO1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKFxuICAgIG5ldyBjbGF6eigpLFxuICAgIG1pcnJvck1ldGEucmVzb2x2ZXIsXG4gICAgY3R4XG4gICk7XG4gIC8vIE1pcnJvciBNU1AgbWF0Y2hlcyDigJQgcm91dGUgcmVhZHMgZXhjbHVzaXZlbHkgdGhyb3VnaCB0aGUgbWlycm9yXG4gIC8vIGNvbGxlY3Rpb24uIENsZWFyIGFueSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29sbGVjdGlvbnMgc28gcXVlcmllc1xuICAvLyBnbyBPTkxZIHRvIHRoZSBtaXJyb3IsIG5vdCB0byB0aGUgcmVndWxhciBwcml2YXRlL3NoYXJlZCBvbmVzLlxuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFwiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFN0YWNrXCIsIHVuZGVmaW5lZCk7XG4gIGN0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGN0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzUHVibGljUHJvcGVydGllczxNIGV4dGVuZHMgTW9kZWw+KGNsYXp6OiBDb25zdHJ1Y3RvcjxNPik6IGJvb2xlYW4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyhjbGF6eikgfHwgW107XG4gIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICBjb25zdCB0cmFuc2llbnRNZXRhID0gTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gIGNvbnN0IHByaXZhdGVNZXRhID1cbiAgICBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpKSB8fCB7fTtcbiAgY29uc3Qgc2hhcmVkTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpKSB8fCB7fTtcblxuICByZXR1cm4gYXR0cmlidXRlcy5zb21lKChhdHRyKSA9PiB7XG4gICAgaWYgKGF0dHIgPT09IHBrKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gdHJhbnNpZW50TWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHByaXZhdGVNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gc2hhcmVkTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRWFybHkgaGFuZGxlciB0byBleHRyYWN0IGFuZCByZWdpc3RlciBjb2xsZWN0aW9ucyBpbiBjb250ZXh0XG4gKiBAc3VtbWFyeSBSdW5zIHdpdGggcHJpb3JpdHkgPCA0MCB0byBleHRyYWN0IGNvbGxlY3Rpb24gbmFtZXMgYmVmb3JlIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKS5cbiAqIFRoaXMgYWxsb3dzIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8uXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnRleHRPZjxSZXBvc2l0b3J5PE0sIGFueT4+fSBjb250ZXh0IC0gVGhlIGV4ZWN1dGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1NlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW119IGRhdGEgLSBUaGUgc2VncmVnYXRlZCBkYXRhIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBrZXlzIC0gVGhlIHByb3BlcnR5IGtleShzKSBiZWluZyBzZWdyZWdhdGVkXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgU3RyaW5nKGlkVmFsdWUpLFxuICAgICAgICBTdHJpbmcoaylcbiAgICAgICk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID0gTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/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/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcbiAgLy8gTm9kZSBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICAvLyBwcml2YXRlS2V5ID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgLy8gLS1cblxuICAvLyB3ZWIgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgY29uc3QgayA9IChwcml2YXRlS2V5IGFzIGFueSlba2V5c1swXV07XG4gIC8vIC0tXG5cbiAgcmV0dXJuIHNpZ25lcnMubmV3UHJpdmF0ZUtleVNpZ25lcihrIGFzIGFueSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIFBFTSBidWZmZXJcbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gYSBDcnlwdG9LZXkgb2JqZWN0XG4gKiBAcGFyYW0ge0J1ZmZlcn0gcGVtIC0gVGhlIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPENyeXB0b0tleT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDcnlwdG9LZXlcbiAqIEBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRXh0cmFjdFByaXZhdGVLZXlcbiAqICAgcGFydGljaXBhbnQgU3VidGxlQ3J5cHRvXG4gKlxuICogICBDYWxsZXItPj5FeHRyYWN0UHJpdmF0ZUtleTogZXh0cmFjdFByaXZhdGVLZXkocGVtKVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBHZXQgU3VidGxlQ3J5cHRvIGltcGxlbWVudGF0aW9uXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IFBhcnNlIFBFTSBmb3JtYXRcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogQ29udmVydCB0byBiaW5hcnkgREVSXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+U3VidGxlQ3J5cHRvOiBpbXBvcnRLZXkocGtjczgsIGJpbmFyeURlciwgb3B0aW9ucylcbiAqICAgU3VidGxlQ3J5cHRvLS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDcnlwdG9LZXlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktLT4+Q2FsbGVyOiBDcnlwdG9LZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gIGNvbnN0IGxpYk5hbWUgPSBcImNyeXB0b1wiO1xuICBsZXQgc3VidGxlO1xuICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICBzdWJ0bGUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNyeXB0by5zdWJ0bGU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgc3VidGxlID0gbGliLnN1YnRsZSB8fCBsaWIud2ViY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gIGZ1bmN0aW9uIHN0cjJhYihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBjb25zdCBzdHIgPSBwZW1cbiAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKTtcbiAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyRmxhZ3MsXG4gIENvbmRpdGlvbixcbiAgQ29udGV4dCxcbiAgR3JvdXBPcGVyYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUXVlcnlDbGF1c2UsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFNlbGVjdG9yLFxuICBTZXF1ZW5jZSxcbiAgU3RhdGVtZW50LFxuICBTdGF0ZW1lbnRFeGVjdXRvcixcbiAgVmlld0tpbmQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIENvdWNoREJPcGVyYXRvcixcbiAgQ291Y2hEQkdyb3VwT3BlcmF0b3IsXG4gIENvdWNoREJRdWVyeUxpbWl0LFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1NlbGVjdG9yLFxuICB0cmFuc2xhdGVPcGVyYXRvcnMsXG4gIGdlbmVyYXRlRGVzaWduRG9jTmFtZSxcbiAgZ2VuZXJhdGVWaWV3TmFtZSxcbiAgZmluZFZpZXdNZXRhZGF0YSxcbiAgQ291Y2hEQlZpZXdNZXRhZGF0YSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG50eXBlIEZhYnJpY1ZpZXdEZXNjcmlwdG9yID0ge1xuICBkZG9jOiBzdHJpbmc7XG4gIHZpZXc6IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbnR5cGUgRmFicmljQWdncmVnYXRlSW5mbyA9XG4gIHwge1xuICAgICAga2luZDogVmlld0tpbmQ7XG4gICAgICBtZXRhOiBDb3VjaERCVmlld01ldGFkYXRhO1xuICAgICAgZGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERpc3RpbmN0PzogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogXCJhdmdcIjtcbiAgICAgIGF0dHJpYnV0ZTogc3RyaW5nO1xuICAgICAgc3VtRGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgIH07XG5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcblxuZnVuY3Rpb24gbmV4dExleGljb2dyYXBoaWNTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlxcdTAwMDBcIjtcbiAgY29uc3QgY2hhcnMgPSBBcnJheS5mcm9tKHZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IGNoYXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXJzW2ldLmNvZGVQb2ludEF0KDApO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChjb2RlIDwgMHgxMGZmZmYpIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSArIDEpO1xuICAgICAgcmV0dXJuIGNoYXJzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9XFx1MDAwMGA7XG59XG5cbmZ1bmN0aW9uIHByZWZpeFJhbmdlKHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHByZWZpeCxcbiAgICBlbmQ6IG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHByZWZpeCksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgTSxcbiAgRmFicmljQ2xpZW50QWRhcHRlcixcbiAgUixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3F1YXNoKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3F1YXNoZWQ6IFByZXBhcmVkU3RhdGVtZW50PE0+IHwgdW5kZWZpbmVkID0gc3VwZXIuc3F1YXNoKFxuICAgICAgY3R4IGFzIG5ldmVyXG4gICAgKTtcbiAgICBpZiAoIXNxdWFzaGVkKSByZXR1cm4gc3F1YXNoZWQ7XG5cbiAgICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zLCBhcmdzIH0gPSBzcXVhc2hlZDtcbiAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQgfSA9IHBhcmFtcztcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG1ldGhvZCAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3F1YXNoZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVByZXBhcmVkKFxuICAgIC4uLmFyZ3o6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5mcm9tU2VsZWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgY29uc3QgeyBtZXRob2QsIGFyZ3MgfSA9IHRoaXMucHJlcGFyZWQgYXMgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PjtcbiAgICByZXR1cm4gcmVwby5zdGF0ZW1lbnQobWV0aG9kLCAuLi5hcmdzLCAuLi5hcmd6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHByZXBhcmUoXG4gICAgY3R4PzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxTdGF0ZW1lbnRFeGVjdXRvcjxNLCBSPj4ge1xuICAgIGN0eCA9XG4gICAgICBjdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlFVRVJZLFxuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fCB7fSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICkpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1NpbXBsZVF1ZXJ5KCkgJiZcbiAgICAgIChjdHggYXMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pLmdldChcImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXNcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHNxdWFzaGVkID0gdGhpcy5zcXVhc2goY3R4IGFzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTtcbiAgICAgIGlmIChzcXVhc2hlZCkge1xuICAgICAgICB0aGlzLnByZXBhcmVkID0gc3F1YXNoZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7fSBhcyBhbnk7XG5cbiAgICBjb25zdCBwcmVwYXJlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiA9IHtcbiAgICAgIGNsYXNzOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGFyZ3MsXG4gICAgICBwYXJhbXMsXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBtZXRob2Q6IHN0cmluZ1tdID0gW1F1ZXJ5Q2xhdXNlLkZJTkRfQlldO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucHJlcGFyZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uLCBjdHggYXMgbmV2ZXIpO1xuICAgICAgbWV0aG9kLnB1c2gocGFyc2VkLm1ldGhvZCk7XG4gICAgICBpZiAocGFyc2VkLmFyZ3MgJiYgcGFyc2VkLmFyZ3MubGVuZ3RoKVxuICAgICAgICBhcmdzLnB1c2goLi4uKHBhcnNlZC5hcmdzIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpXG4gICAgICBtZXRob2QucHVzaChcbiAgICAgICAgUXVlcnlDbGF1c2UuU0VMRUNULFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLmpvaW4oYCAke1F1ZXJ5Q2xhdXNlLkFORC50b0xvd2VyQ2FzZSgpfSBgKVxuICAgICAgKTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIG1ldGhvZC5wdXNoKFF1ZXJ5Q2xhdXNlLk9SREVSX0JZLCB0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMF0gYXMgc3RyaW5nKTtcbiAgICAgIGFyZ3MucHVzaCh0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMV0gYXMgYW55KTtcbiAgICB9XG4gICAgcHJlcGFyZWQubWV0aG9kID0gdG9DYW1lbENhc2UobWV0aG9kLmpvaW4oXCIgXCIpKTtcbiAgICBwcmVwYXJlZC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5wcmVwYXJlZCA9IHByZXBhcmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQgZnJvbSBDb3VjaERCL0ZhYnJpY1xuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyB0aGUgSUQgZnJvbSBhIENvdWNoREIgZG9jdW1lbnQgYW5kIHJldmVydHMgaXQgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByb2Nlc3NSZWNvcmQoXG4gICAgcmVjb3JkOiBhbnksXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBNIHtcbiAgICBjb25zdCBwa0F0dHIgPSBNb2RlbC5wayh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLmdldChcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5JRCwgcGtBdHRyIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuXG4gICAgaWYgKHJlY29yZFtDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcmVjb3JkW0NvdWNoREJLZXlzLklEXS5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmVjb3JkW3BrQXR0cl0gPSBTZXF1ZW5jZS5wYXJzZVZhbHVlKHR5cGUgYXMgYW55LCBpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NSZWNvcmQocmVjb3JkLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeVxuICAgKiBAc3VtbWFyeSBTZW5kcyBhIHJhdyBNYW5nbyBxdWVyeSB0byBGYWJyaWMgYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgYWdncmVnYXRvciA9IChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGVJbmZvO1xuICAgIGlmICgocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlICYmIGFnZ3JlZ2F0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBZ2dyZWdhdGU8Uj4oYWdncmVnYXRvciwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgcmF3SW5wdXQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBjdHhcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIGN0eCkpO1xuICAgICAgaWYgKCFjdHguZ2V0T3JVbmRlZmluZWQoXCJhZnRlclF1ZXJ5SGFuZGxlcnNcIikpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZCBhcyB1bmtub3duIGFzIFI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQocHJvY2Vzc2VkLCBjdHgpKSBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkKCk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCBhZ2dyZWdhdGVRdWVyeSA9IHRoaXMuYnVpbGRBZ2dyZWdhdGVRdWVyeSgpO1xuICAgIGlmIChhZ2dyZWdhdGVRdWVyeSkgcmV0dXJuIGFnZ3JlZ2F0ZVF1ZXJ5O1xuICAgIGNvbnN0IHNlbGVjdG9yczogTWFuZ29TZWxlY3RvciA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBmb3IgKGNvbnN0IFtzZWxlY3RvcktleSwgZGlyZWN0aW9uXSBvZiB0aGlzLm9yZGVyQnlTZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcktleSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+ID0ge307XG4gICAgICAgIHJlY1tzZWxlY3Rvcl0gPSBkaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb247XG4gICAgICAgIChxdWVyeS5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPltdKS5wdXNoKHJlYyk7XG4gICAgICAgIGlmICghcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdKSB7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3Igc3RydWN0dXJlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5TVEFSVFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVmaXhSYW5nZShjb21wYXJpc29uKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJfRVFdID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5TTUFMTEVSXSA9IHJhbmdlLmVuZDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5FTkRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge1xuICAgICAgICBbQ291Y2hEQk9wZXJhdG9yLlJFR0VYUF06IGAke2VzY2FwZVJlZ0V4cChjb21wYXJpc29uKX0kYCxcbiAgICAgIH0gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5CRVRXRUVOKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cjEgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBhcmlzb24pIHx8IGNvbXBhcmlzb24ubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkJFVFdFRU4gb3BlcmF0b3IgcmVxdWlyZXMgW21pbiwgbWF4XSBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbXBhcmlzb247XG4gICAgICBjb25zdCBvcEJldHdlZW46IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BCZXR3ZWVuW2F0dHJdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5CSUdHRVJfRVEpXG4gICAgICBdID0gbWluO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLlNNQUxMRVJfRVEpXG4gICAgICBdID0gbWF4O1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wQmV0d2VlbiB9O1xuICAgIH1cblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhbiBhZ2dyZWdhdGUgcXVlcnkgaWYgYWdncmVnYXRpb24gaXMgcmVxdWVzdGVkXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBmb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMgYW5kIHJldHVybnMgYSBzcGVjaWFsIE1hbmdvUXVlcnkgZm9yIHRoZW1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZ2dyZWdhdGVRdWVyeSgpOiBNYW5nb1F1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmF2Z1NlbGVjdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBTdHJpbmcodGhpcy5hdmdTZWxlY3Rvcik7XG4gICAgICBjb25zdCBzdW1JbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwic3VtXCIsIGF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBjb3VudEluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJjb3VudFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCFzdW1JbmZvIHx8ICFjb3VudEluZm8pXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgIGBBdmcgb3BlcmF0aW9uIHJlcXVpcmVzIHN1bSBhbmQgY291bnQgdmlld3MgZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeSh7XG4gICAgICAgIGtpbmQ6IFwiYXZnXCIsXG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgc3VtRGVzY3JpcHRvcjogc3VtSW5mby5kZXNjcmlwdG9yLFxuICAgICAgICBjb3VudERlc2NyaXB0b3I6IGNvdW50SW5mby5kZXNjcmlwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID1cbiAgICAgICAgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgPT0gbnVsbFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IpO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImRpc3RpbmN0XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmNvdW50RGlzdGluY3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yVXNlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICEhdGhpcy5taW5TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLm1heFNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuc3VtU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5kaXN0aW5jdFNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWdncmVnYXRvckNoZWNrczogQXJyYXk8W1ZpZXdLaW5kLCBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW1xuICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICh0aGlzLmNvdW50U2VsZWN0b3IgPz8gdW5kZWZpbmVkKSBhcyBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICAgIF0sXG4gICAgICBbXCJtYXhcIiwgdGhpcy5tYXhTZWxlY3Rvcl0sXG4gICAgICBbXCJtaW5cIiwgdGhpcy5taW5TZWxlY3Rvcl0sXG4gICAgICBbXCJzdW1cIiwgdGhpcy5zdW1TZWxlY3Rvcl0sXG4gICAgICBbXCJkaXN0aW5jdFwiLCB0aGlzLmRpc3RpbmN0U2VsZWN0b3JdLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBzZWxlY3Rvcl0gb2YgYWdncmVnYXRvckNoZWNrcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZWN0b3IgPyBTdHJpbmcoc2VsZWN0b3IpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihraW5kLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgIH1cblxuICAgIGlmIChhZ2dyZWdhdG9yVXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIHZpZXcgbWV0YWRhdGEgZm91bmQgZm9yIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICAgICl9IGFnZ3JlZ2F0b3JgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yIGZvciBhIHZpZXctYmFzZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcbiAgICBraW5kOiBWaWV3S2luZCxcbiAgICBhdHRyaWJ1dGU/OiBzdHJpbmdcbiAgKTogRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGFzID0gZmluZFZpZXdNZXRhZGF0YSh0aGlzLmZyb21TZWxlY3Rvciwga2luZCwgYXR0cmlidXRlKTtcbiAgICBpZiAoIW1ldGFzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhID0gbWV0YXNbMF07XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGdlbmVyYXRlVmlld05hbWUodGFibGVOYW1lLCBtZXRhLmF0dHJpYnV0ZSwga2luZCwgbWV0YSk7XG4gICAgY29uc3QgZGRvYyA9IG1ldGEuZGRvYyB8fCBnZW5lcmF0ZURlc2lnbkRvY05hbWUodGFibGVOYW1lLCB2aWV3TmFtZSk7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHJlZHVjZTogbWV0YS5yZWR1Y2UgIT09IHVuZGVmaW5lZCA/IHRydWUgOiAhbWV0YS5yZXR1cm5Eb2NzLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCBraW5kID09PSBcImdyb3VwQnlcIikgb3B0aW9ucy5ncm91cCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQsXG4gICAgICBtZXRhLFxuICAgICAgZGVzY3JpcHRvcjoge1xuICAgICAgICBkZG9jLFxuICAgICAgICB2aWV3OiB2aWV3TmFtZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgc3BlY2lhbCBhZ2dyZWdhdGUgTWFuZ29RdWVyeSBtYXJrZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlUXVlcnkoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiB7fSxcbiAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgIGFnZ3JlZ2F0ZUluZm86IGluZm8sXG4gICAgfSBhcyBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBjYXN0IHRvIEZhYnJpY0NsaWVudEFkYXB0ZXIgZm9yIHZpZXcgYWNjZXNzXG4gICAqL1xuICBwcml2YXRlIGdldEZhYnJpY0FkYXB0ZXIoKTogRmFicmljQ2xpZW50QWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgdmlhIGFkYXB0ZXIncyB2aWV3IG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWdncmVnYXRlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoIXRoaXMuaXNWaWV3QWdncmVnYXRlKGluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdmVyYWdlPFI+KGluZm8sIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLmRkb2MsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLnZpZXcsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLm9wdGlvbnMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oaW5mbywgcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGF2ZXJhZ2UgY2FsY3VsYXRpb24gZnJvbSBzdW0gYW5kIGNvdW50IHZpZXdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUF2ZXJhZ2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmIChpbmZvLmtpbmQgIT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkF2ZXJhZ2UgZGVzY3JpcHRvciBpcyBub3QgdmFsaWRcIik7XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IFtzdW1EZXNjLCBjb3VudERlc2NdID0gW2luZm8uc3VtRGVzY3JpcHRvciwgaW5mby5jb3VudERlc2NyaXB0b3JdO1xuICAgIGNvbnN0IFtzdW1SZXNwb25zZSwgY291bnRSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgc3VtRGVzYy5kZG9jLFxuICAgICAgICBzdW1EZXNjLnZpZXcsXG4gICAgICAgIHN1bURlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIGNvdW50RGVzYy5kZG9jLFxuICAgICAgICBjb3VudERlc2MudmlldyxcbiAgICAgICAgY291bnREZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICBdKTtcbiAgICBjb25zdCBzdW0gPSBzdW1SZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgY29uc3QgY291bnQgPSBjb3VudFJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gMCBhcyB1bmtub3duIGFzIFI7XG4gICAgcmV0dXJuIChzdW0gLyBjb3VudCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgdGhlIHZpZXcgcmVzcG9uc2UgYmFzZWQgb24gYWdncmVnYXRlIGtpbmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIHJlc3BvbnNlOiBWaWV3UmVzcG9uc2VcbiAgKTogUiB7XG4gICAgaWYgKGluZm8ua2luZCA9PT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBcIkF2ZXJhZ2UgcmVzdWx0cyBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgcHJvY2Vzc2luZyByb3dzXCJcbiAgICAgICk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3BvbnNlLnJvd3MgfHwgW107XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCBtZXRhID0gdmlld0luZm8ubWV0YTtcbiAgICBpZiAodmlld0luZm8uY291bnREaXN0aW5jdCkge1xuICAgICAgcmV0dXJuIChyb3dzLmxlbmd0aCB8fCAwKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICh2aWV3SW5mby5raW5kID09PSBcImRpc3RpbmN0XCIgfHwgdmlld0luZm8ua2luZCA9PT0gXCJncm91cEJ5XCIpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cua2V5ID8/IHJvdy52YWx1ZSkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAobWV0YS5yZXR1cm5Eb2NzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LnZhbHVlID8/IHJvdy5kb2MgPz8gcm93KSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodmlld0luZm8ua2luZCA9PT0gXCJjb3VudFwiID8gMCA6IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIChyb3dzWzBdLnZhbHVlID8/IHJvd3NbMF0ua2V5ID8/IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbmZvIGlzIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGVcbiAgICovXG4gIHByaXZhdGUgaXNWaWV3QWdncmVnYXRlKFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogaW5mbyBpcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4ge1xuICAgIHJldHVybiBpbmZvLmtpbmQgIT09IFwiYXZnXCI7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICB0eXBlIE1hbmdvUXVlcnksXG4gIHR5cGUgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIHR5cGUgTW9kZWxDb25zdHJ1Y3RvcixcbiAgdHlwZSBTZXJpYWxpemVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZWJ1ZywgZmluYWwsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgUGVlckNvbmZpZyxcbiAgdHlwZSBTZWdyZWdhdGVkTW9kZWwsXG4gIHR5cGUgTXNwRGV0YWlscyxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY29ubmVjdCxcbiAgdHlwZSBDb25uZWN0T3B0aW9ucyxcbiAgR2F0ZXdheSxcbiAgTmV0d29yayxcbiAgUHJvcG9zYWxPcHRpb25zLFxuICBDb250cmFjdCBhcyBDb250cmFrdCxcbiAgdHlwZSBTaWduZXIsXG4gIEdhdGV3YXlFcnJvcixcbiAgRW5kb3JzZUVycm9yLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBHYXRld2F5IGFzIExlZ2FjeUdhdGV3YXksIFdhbGxldHMgfSBmcm9tIFwiZmFicmljLW5ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgRW5kb3JzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWRlbnRpdHksXG4gIGdldFNpZ25lcixcbiAgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQsXG4gIHJlYWRGaWxlIGFzIHJlYWRGc0ZpbGUsXG59IGZyb20gXCIuL2ZhYnJpYy1mc1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICB0eXBlIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRmxhZ3MsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFN0YXRlbWVudCxcbiAgdHlwZSBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUGFnaW5hdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIENvbnRleHR1YWxBcmdzLFxuICB0eXBlIFByZXBhcmVkTW9kZWwsXG4gIEFsbE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDbGllbnRTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnREaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudERpc3BhdGNoXCI7XG4vLyBpbXBvcnQgeyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tIH0gZnJvbSBcIi4vZmFicmljLWhzbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50U3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBFbmRvcnNlbWVudEVycm9yLFxuICBFbmRvcnNlbWVudFBvbGljeUVycm9yLFxuICBNdmNjUmVhZENvbmZsaWN0RXJyb3IsXG4gIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcixcbiAgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IsXG59IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4vY3J5cHRvXCI7XG5pbXBvcnQgeyBleHRyYWN0SWRzIH0gZnJvbSBcIi4vaWRzL2lkLWV4dHJhY3Rpb25cIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuXG50eXBlIExlZ2FjeVBlZXJUYXJnZXQgPSB7XG4gIG1zcElkOiBzdHJpbmc7XG4gIHBlZXJFbmRwb2ludDogc3RyaW5nO1xuICBwZWVySG9zdEFsaWFzPzogc3RyaW5nO1xuICB0bHNDZXJ0Pzogc3RyaW5nIHwgQnVmZmVyO1xufTtcblxudHlwZSBMZWdhY3lQZWVyV2l0aE5hbWUgPSBMZWdhY3lQZWVyVGFyZ2V0ICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3NcbiAqIEBzdW1tYXJ5IFRoZSBGYWJyaWNBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXIgdG8gcHJvdmlkZSBhIHNlYW1sZXNzIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3MuXG4gKiBJdCBoYW5kbGVzIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgdHJhbnNhY3Rpb24gc3VibWlzc2lvbiwgYW5kIENSVUQgb3BlcmF0aW9ucyBhZ2FpbnN0IEZhYnJpYyBjaGFpbmNvZGUuXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAdGVtcGxhdGUgRmFicmljRmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8RmFicmljRmxhZ3M+IC0gQ29udGV4dCB0eXBlIGNvbnRhaW5pbmcgRmFicmljLXNwZWNpZmljIGZsYWdzXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gYWxpYXMgLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGNvbmZpZzogUGVlckNvbmZpZyA9IHtcbiAqICAgbXNwSWQ6ICdPcmcxTVNQJyxcbiAqICAgcGVlckVuZHBvaW50OiAnbG9jYWxob3N0OjcwNTEnLFxuICogICBjaGFubmVsTmFtZTogJ215Y2hhbm5lbCcsXG4gKiAgIGNoYWluY29kZU5hbWU6ICdteWNjJyxcbiAqICAgY29udHJhY3ROYW1lOiAnbXljb250cmFjdCcsXG4gKiAgIHRsc0NlcnRQYXRoOiAnL3BhdGgvdG8vdGxzL2NlcnQnLFxuICogICBjZXJ0RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2NlcnQvZGlyJyxcbiAqICAga2V5RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2tleS9kaXInXG4gKiB9O1xuICpcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgRmFicmljQWRhcHRlcihjb25maWcsICdvcmcxLWFkYXB0ZXInKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlcjEnLCBteVNlcmlhbGl6ZXIpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBzZXJpYWxpemVyKVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc3VibWl0VHJhbnNhY3Rpb24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtzZXJpYWxpemVkTW9kZWxdLCB0cmFuc2llbnQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbE5hbWUpXG4gKiAgIE5ldHdvcmstPj5Db250cmFjdDogZ2V0Q29udHJhY3QoY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKVxuICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZGVjb2RlKHJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVjb2RlZFJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IGRlc2VyaWFsaXplZFJlc3VsdFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFBlZXJDb25maWcsXG4gIENsaWVudCxcbiAgTWFuZ29RdWVyeSxcbiAgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyB0ZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgVWludDhBcnJheSB0byBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljQ2xpZW50QWRhcHRlcik7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljQ2xpZW50QWRhcHRlci5zZXJpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQZWVyQ29uZmlnLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzLCBjb25maWcpLFxuICAgICAgRmFicmljRmxhdm91cixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBTdGF0ZW1lbnQ8TSwgRmFicmljQ2xpZW50QWRhcHRlciwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQodGhpcywgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10gfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBtZXJnZWRGbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCBmbGFncyk7XG4gICAgY29uc3QgZiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBtZXJnZWRGbGFncywgLi4uYXJncylcbiAgICApO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IEFsbE9wZXJhdGlvbktleXMsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PGFueT4+XG4gICk6IFByb21pc2U8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuc2lsbHkoXG4gICAgICBgY3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbCA/IChBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsLm1hcCgobSkgPT4gTW9kZWwudGFibGVOYW1lKG0pKSA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCkpIDogXCJub1wifSB0YWJsZSAke292ZXJyaWRlcyAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpID8gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggOiBcIm5vXCJ9IHdpdGggZmxhZyBvdmVycmlkZXNgXG4gICAgKTtcbiAgICBsZXQgY3R4ID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIGN0eCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICBhcmdzLnB1c2goY3R4KTtcbiAgICAgIGN0eCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMgPSBjdHhcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY3R4LnRvT3ZlcnJpZGVzKCksIG92ZXJyaWRlcylcbiAgICAgIDogb3ZlcnJpZGVzO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhcbiAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBvcGVyYXRpb24gOiBvcGVyYXRpb24ubmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgb3ZlcnJpZGVzIGFzIFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgICAgLi4uWy4uLmFyZ3MsIGN0eF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE9wID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpO1xuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZmZWN0ZWRUYWJsZXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgICFjdXJyZW50T3AgfHxcbiAgICAgICAgY3VycmVudE9wICE9PSBvcGVyYXRpb24gfHxcbiAgICAgICAgKG1vZGVsICYmIG1vZGVsICE9PSBjdXJyZW50TW9kZWwpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuXG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4LmFjY3VtdWxhdGUoZmxhZ3MpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgLi4uZmxhZ3MsXG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIEZhYnJpYyB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBkZWNvZGUoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxQZWVyQ29uZmlnLCBDbGllbnQsIE1hbmdvUXVlcnksIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFtDb25zdHJ1Y3RvcjxNPiwgUHJpbWFyeUtleVR5cGUsIFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFueVtdLCBDb250ZXh0XSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIHJlY29yZHMgZm9yIGNyZWF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmVjZXNzYXJ5IENvdWNoREIgZmllbGRzIHRvIG11bHRpcGxlIHJlY29yZHMgYmVmb3JlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIElEcyBvZiB0aGUgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSB0YWJsZU5hbWUsIGlkcywgYW5kIHByZXBhcmVkIHJlY29yZHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgaWRzIGFuZCBtb2RlbHMgYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgLy9IRVJFIVxuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy5pbmZvKGBhZGRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIFtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKSlcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgICAgY2xhenosXG4gICAgICAgIGN0eCxcbiAgICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgICAgcmVzWzBdW01vZGVsLnBrKGNsYXp6KSBhcyBzdHJpbmddIHx8IGlkc1swXVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnRbaV0gfHwge30pLCByZXNbaV0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byByZWFkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgcmVhZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMudXBkYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtb2RlbHMubWFwKChtKSA9PiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpKVxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcblxuICAgIGxldCByZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudFtpXSB8fCB7fSksIHJlc1tpXSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcjxhbnk+fSBzZXJpYWxpemVyIC0gU2VyaWFsaXplciBmb3IgdGhlIG1vZGVsIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkc1swXVxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZEFsbChjbGF6eiwgaWRzLCAuLi5jdHhBcmdzKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXMpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBTZWdyZWdhdGVkTW9kZWw8TT4gJiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BsaXQubW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQobW9kZWwpO1xuICAgIGlmIChtaXJyb3JNZXRhKSB7XG4gICAgICBjb25zdCBtaXJyb3JNc3AgPSBtaXJyb3JNZXRhLm1zcElkO1xuICAgICAgaWYgKCFtaXJyb3JNc3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBtaXJyb3IgTVNQIGNvdWxkIGJlIGZvdW5kYCk7XG4gICAgICBsZXQgbXNwcyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgICAgbXNwcyA9IEFycmF5LmlzQXJyYXkobXNwcykgPyBtc3BzIDogW21zcHNdO1xuICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLm1zcHMsIG1pcnJvck1zcF0pXTtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgZW5kb3JzaW5nT3JnczogbWVyZ2VkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBtZXJnZWQsXG4gICAgICAgIGxlZ2FjeTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNwbGl0Lm1vZGVsLFxuICAgICAgbW9kZWw6IHNwbGl0Lm1vZGVsLFxuICAgICAgaWQ6IG1vZGVsW01vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KV0gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgICBwcml2YXRlczogc3BsaXQucHJpdmF0ZXMsXG4gICAgICBzaGFyZWQ6IHNwbGl0LnNoYXJlZCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGlmIChcbiAgICAgIHRyYW5zaWVudCAmJlxuICAgICAgdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICAgICAgY3R4LFxuICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB0eXBlb2YgdiAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iaiAmJiAob2JqIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBvdmVyd3JpdGluZyBleGlzdGluZyAke2tleX0uIGlmIHRoaXMgaXMgbm90IGEgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtYXkgcG9zZSBhIHByb2JsZW1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNoaWxkUmVidWlsZCA9XG4gICAgICB0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjaGlsZFJlYnVpbGQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlc29sdmVkT3AgPSB0aGlzLnJlc29sdmVPcGVyYXRpb24oY3R4LCBvcGVyYXRpb24pO1xuICAgIGlmICghcmVzb2x2ZWRPcCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG9wID0gcmVzb2x2ZWRPcC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wLmluY2x1ZGVzKFwicmVhZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJmaW5kXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInF1ZXJ5XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInN0YXRlbWVudFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJwYWdlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChvcGVyYXRpb24pIHJldHVybiBvcGVyYXRpb247XG4gICAgaWYgKHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwib3BlcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGhhc1RyYW5zaWVudDogYm9vbGVhbixcbiAgICBpZD86IFByaW1hcnlLZXlUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGFzVHJhbnNpZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWQgPSBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGdlbmVyYXRlZCA9IE1vZGVsLmdlbmVyYXRlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGhhc0lkID0gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbDtcbiAgICBpZiAoIWhhc0lkICYmIGNvbXBvc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWhhc0lkICYmIGdlbmVyYXRlZCkge1xuICAgICAgY3R4LmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlZnJlc2ggcmVjb3JkIHdpdGggcHJpdmF0ZSBnZW5lcmF0ZWQgcHJpbWFyeSBrZXlgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlyZWN0ID1cbiAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgfHxcbiAgICAgIChjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZGlyZWN0ICYmIGRpcmVjdC5sZW5ndGgpIHJldHVybiBkaXJlY3Q7XG4gICAgcmV0dXJuIChcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZVxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyBoZWFsdGhjaGVjazxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJoZWFsdGhjaGVja1wiLFxuICAgICAgW10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIC8vIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyB1cGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy51cGRhdGVcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDTElFTlQgVVBEQVRFIGNsYXNzIDogJHt0eXBlb2YgY2xhenp9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUgfHwgY2xhenopXSwgLy8gVE9ETyBzaG91bGQgYmUgcmVjZXZpbmcgY2xhc3MgYnV0IGlzIHJlY2VpdmluZyBzdHJpbmdcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXIgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZFxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZChjbGF6eiwgaWQsIGN0eCk7XG4gICAgfVxuXG4gICAgbG9nLnZlcmJvc2UoYGRlbGV0aW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICA/IHJlc3VsdFxuICAgICAgOiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcGVyZm9ybSBhIHF1ZXJ5IHVzaW5nIE1hbmdvIFF1ZXJ5IHN5bnRheFxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiByYXcocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBldmFsdWF0ZVRyYW5zYWN0aW9uKFwicXVlcnlcIiwgW2lucHV0XSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKFwicXVlcnlcIiwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04ucGFyc2UoZGVjb2RlKHJlc3VsdCkpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0IGJhc2VkIG9uIHR5cGVcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogcHJvY2Vzc2VkIHJlc3VsdFxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgcmF3PFYsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY2xhenoubmFtZTtcbiAgICBsb2cuaW5mbyhgUGVyZm9ybWluZyByYXcgc3RhdGVtZW50IG9uIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKGNsYXp6KX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJyYXdcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KSwgZG9jc09ubHldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pID0+IHtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKHJlY29yZCkpIHJldHVybiBNb2RlbC5idWlsZChyZWNvcmQpO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgICBjb25zdCBlbCA9IHJlc3VsdFswXTtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKGVsKSlcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IG9uZSBpcyBhIG1vZGVsLCBhbGwgYXJlIG1vZGVsc1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZWwpID0+IE1vZGVsLmJ1aWxkKGVsKSkgYXMgVjtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVzdWx0IGFzIGFueSkgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBDb3VjaERCIHZpZXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBxdWVyeSBhIGRlc2lnbiBkb2N1bWVudCB2aWV3XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHZpZXcgcmVzcG9uc2UgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGRvYyAtIERlc2lnbiBkb2N1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSAtIFZpZXcgbmFtZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBWaWV3IHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIHsuLi5Db250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj59IGFyZ3MgLSBPcHRpb25hbCBjb250ZXh0dWFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZpZXdSZXNwb25zZTxSPj59IFRoZSB2aWV3IHJlc3BvbnNlXG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyB2aWV3PFI+KFxuICAgIGRkb2M6IHN0cmluZyxcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy52aWV3KTtcbiAgICBsb2cuaW5mbyhgUXVlcnlpbmcgdmlldyAke2Rkb2N9LyR7dmlld05hbWV9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwidmlld1wiLFxuICAgICAgICBbZGRvYywgdmlld05hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFZpZXdSZXNwb25zZTxSPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmlldyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIHRoZSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2FjaGVkIGNsaWVudCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENsaWVudD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IENsaWVudCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpXG4gICAgICB0aGlzLl9jbGllbnQgPSBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENsaWVudCh0aGlzLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IEdhdGV3YXkgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgR2F0ZXdheShjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTogUHJvbWlzZTxHYXRld2F5PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShjdHgsIHRoaXMuY29uZmlnLCB0aGlzLmNsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRyYWN0TmFtZShjbGFzc05hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfUNvbnRyYWN0YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IEdhdGV3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250cmFrdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIENvbnRyYWN0KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDb250cmFjdChcbiAgICAgIGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBjb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIG9yIGV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWJtaXQgLSBXaGV0aGVyIHRvIHN1Ym1pdCAodHJ1ZSkgb3IgZXZhbHVhdGUgKGZhbHNlKSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBnZXRDb250cmFjdCgpXG4gICAqICAgYWx0IHN1Ym1pdCB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZWxzZSBldmFsdWF0ZSB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbmRcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjbG9zZSgpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBzdWJtaXQgPSB0cnVlLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IHN0cmluZ1tdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50cmFuc2FjdGlvbik7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGF3YWl0IHRoaXMuQ29udHJhY3QoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKVxuICAgICAgKTtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgJHtzdWJtaXQgPyBcIlN1Ym1pdFwiIDogXCJFdmFsdWF0ZVwifXRpbmcgdHJhbnNhY3Rpb24gJHt0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpIHx8IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZX0uJHthcGl9YFxuICAgICAgKTtcbiAgICAgIGxvZy5kZWJ1ZyhgYXJnczogJHthcmdzPy5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSkuam9pbihcIlxcblwiKSB8fCBcIm5vbmVcIn1gKTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1Ym1pdCA/IGNvbnRyYWN0LnN1Ym1pdCA6IGNvbnRyYWN0LmV2YWx1YXRlO1xuXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zID0gZW5kb3JzaW5nT3JnYW5pemF0aW9ucz8ubGVuZ3RoXG4gICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Bvc2FsT3B0aW9uczogUHJvcG9zYWxPcHRpb25zID0ge1xuICAgICAgICBhcmd1bWVudHM6IGFyZ3MgfHwgW10sXG4gICAgICAgIHRyYW5zaWVudERhdGE6IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgdHlwZW9mIHRyYW5zaWVudERhdGFcbiAgICAgICAgKSxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzXCIpXG4gICAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICAgIDogdW5kZWZpbmVkLCAvLyBtc3BJZCBsaXN0XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmNhbGwoY29udHJhY3QsIGFwaSwgcHJvcG9zYWxPcHRpb25zKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjb25uZWN0aW9uYCk7XG4gICAgICBnYXRld2F5LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJsZWdhY3lcIikgJiYgISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxlZ2FjeUFyZ3MoYXJncz86IGFueVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5VHJhbnNpZW50KFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICk6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNpZW50RGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSk7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICBtYXBba2V5XSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMZWdhY3lNc3BDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZy5sZWdhY3lNc3BDb3VudCA/PyAxO1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihjb25maWd1cmVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHBhcnNlZCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tMZWdhY3lDYW5kaWRhdGVzKFxuICAgIGNhbmRpZGF0ZXM6IE1zcERldGFpbHNbXSxcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IE1zcERldGFpbHNbXSB7XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYXZhaWxhYmxlID0gWy4uLmNhbmRpZGF0ZXNdO1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWluKGxpbWl0LCBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICBjb25zdCBwaWNrZWQ6IE1zcERldGFpbHNbXSA9IFtdO1xuICAgIHdoaWxlIChwaWNrZWQubGVuZ3RoIDwgdGFyZ2V0ICYmIGF2YWlsYWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgICAgY29uc3QgW3NlbGVjdGlvbl0gPSBhdmFpbGFibGUuc3BsaWNlKGlkeCwgMSk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHBpY2tlZC5wdXNoKHNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBMZWdhY3lQZWVyVGFyZ2V0W10ge1xuICAgIGNvbnN0IHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgICAgIHRsc0NlcnQ6IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBsZXQgZW5kb3JzaW5nT3JncyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgIGVuZG9yc2luZ09yZ3MgPSBBcnJheS5pc0FycmF5KGVuZG9yc2luZ09yZ3MpXG4gICAgICA/IGVuZG9yc2luZ09yZ3NcbiAgICAgIDogW2VuZG9yc2luZ09yZ3NdO1xuICAgIGNvbnN0IGVuZG9yc2VycyA9XG4gICAgICBlbmRvcnNpbmdPcmdzLmZpbHRlcigob3JnKTogb3JnIGlzIHN0cmluZyA9PiBCb29sZWFuKG9yZykpIHx8IFtdO1xuICAgIGNvbnN0IGV4dHJhcyA9IGVuZG9yc2Vycy5maWx0ZXIoKG9yZykgPT4gb3JnICE9PSB0aGlzLmNvbmZpZy5tc3BJZCk7XG4gICAgaWYgKCFleHRyYXMubGVuZ3RoKSByZXR1cm4gcGVlcnM7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLmNvbmZpZy5tc3BNYXA7XG4gICAgY29uc3QgbGVnYWN5Q291bnQgPSB0aGlzLnJlc29sdmVMZWdhY3lNc3BDb3VudCgpO1xuICAgIGZvciAoY29uc3QgbXNwIG9mIGV4dHJhcykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG1hcD8uW21zcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnBpY2tMZWdhY3lDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIGxlZ2FjeUNvdW50KTtcbiAgICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHZhbGlkIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBwZWVyIG1hcHBpbmcgZm9yIE1TUCAke21zcH06IG1pc3NpbmcgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwZWVycy5wdXNoKHtcbiAgICAgICAgICBtc3BJZDogbXNwLFxuICAgICAgICAgIHBlZXJFbmRwb2ludDogY2hvaWNlLmVuZHBvaW50LFxuICAgICAgICAgIHBlZXJIb3N0QWxpYXM6IGNob2ljZS5hbGlhcyxcbiAgICAgICAgICB0bHNDZXJ0OiBjaG9pY2UudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGVlcnM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGZjbjogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdLFxuICAgIHRyYW5zaWVudE1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCxcbiAgICBwZWVyQ29uZmlnczogTGVnYWN5UGVlclRhcmdldFtdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMpO1xuICAgIGNvbnN0IHBlZXJzID0gdGhpcy5ub3JtYWxpemVMZWdhY3lQZWVycyhwZWVyQ29uZmlncyk7XG4gICAgY29uc3QgaWRlbnRpdHlNYXRlcmlhbCA9IGF3YWl0IHRoaXMucmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBXYWxsZXRzLm5ld0luTWVtb3J5V2FsbGV0KCk7XG4gICAgY29uc3QgaWRlbnRpdHlMYWJlbCA9IGAke3RoaXMuY29uZmlnLm1zcElkfS1sZWdhY3lgO1xuICAgIGF3YWl0IHdhbGxldC5wdXQoaWRlbnRpdHlMYWJlbCwge1xuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB0eXBlOiBcIlguNTA5XCIsXG4gICAgfSBhcyBJZGVudGl0eSk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uUHJvZmlsZSA9IGF3YWl0IHRoaXMuYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVycyk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBMZWdhY3lHYXRld2F5KCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2F0ZXdheS5jb25uZWN0KGNvbm5lY3Rpb25Qcm9maWxlLCB7XG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUxhYmVsLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXNMb2NhbGhvc3Q6IHRoaXMuc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGxzSW5mbzoge1xuICAgICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICAgIGtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5jb25maWcuY2hhbm5lbCk7XG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoXG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGNvbnRyYWN0LmNyZWF0ZVRyYW5zYWN0aW9uKGZjbik7XG5cbiAgICAgIGlmICh0cmFuc2llbnRNYXApIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpZW50KHRyYW5zaWVudE1hcCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZG9yc2VycyA9IHBlZXJzXG4gICAgICAgIC5tYXAoKHBlZXIpID0+IG5ldHdvcmsuZ2V0Q2hhbm5lbCgpLmdldEVuZG9yc2VyKHBlZXIubmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGVuZG9yc2VyKTogZW5kb3JzZXIgaXMgRW5kb3JzZXIgPT4gQm9vbGVhbihlbmRvcnNlcikpO1xuICAgICAgaWYgKGVuZG9yc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0RW5kb3JzaW5nUGVlcnMoZW5kb3JzZXJzKTtcbiAgICAgIH1cblxuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBMZWdhY3kgc3VibWl0dGluZyAke3RoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSkgfHwgdGhpcy5jb25maWcuY29udHJhY3ROYW1lfS4ke2Zjbn0gdmlhIHBlZXJzICR7cGVlcnMubWFwKChwKSA9PiBwLnBlZXJFbmRwb2ludCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uLnN1Ym1pdCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2F0ZXdheS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMZWdhY3lQZWVycyhcbiAgICBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdXG4gICk6IExlZ2FjeVBlZXJXaXRoTmFtZVtdIHtcbiAgICBjb25zdCBkZWR1cGVkID0gbmV3IE1hcDxzdHJpbmcsIExlZ2FjeVBlZXJXaXRoTmFtZT4oKTtcbiAgICBjb25zdCBhZGRQZWVyID0gKHBlZXI6IExlZ2FjeVBlZXJUYXJnZXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BlZXIucGVlckVuZHBvaW50fXwke3BlZXIucGVlckhvc3RBbGlhcyB8fCBcIlwifWA7XG4gICAgICBpZiAoZGVkdXBlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9IGBwZWVyLSR7cGVlci5tc3BJZH0tJHtkZWR1cGVkLnNpemV9YDtcbiAgICAgIGRlZHVwZWQuc2V0KGtleSwge1xuICAgICAgICAuLi5wZWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHBlZXJzLmZvckVhY2goYWRkUGVlcik7XG4gICAgYWRkUGVlcih7XG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkZWR1cGVkLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTogUHJvbWlzZTx7XG4gICAgY2VydGlmaWNhdGU6IHN0cmluZztcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBwcml2YXRlS2V5IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKSB7XG4gICAgY29uc3QgcGVlckVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBjaGFubmVsUGVlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBvcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBjb25zdCB0bHNQZW0gPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgICAgcGVlci50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0bmFtZSA9XG4gICAgICAgIHBlZXIucGVlckhvc3RBbGlhcyB8fCB0aGlzLmV4dHJhY3RIb3N0KHBlZXIucGVlckVuZHBvaW50KTtcbiAgICAgIHBlZXJFbnRyaWVzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIHVybDogdGhpcy5lbnN1cmVHcnBjVXJsKHBlZXIucGVlckVuZHBvaW50KSxcbiAgICAgICAgdGxzQ0FDZXJ0czogeyBwZW06IHRsc1BlbSB9LFxuICAgICAgICBncnBjT3B0aW9uczoge1xuICAgICAgICAgIFwic3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlXCI6IGhvc3RuYW1lLFxuICAgICAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IGhvc3RuYW1lLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWxQZWVyc1twZWVyLm5hbWVdID0ge1xuICAgICAgICBlbmRvcnNpbmdQZWVyOiB0cnVlLFxuICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZSxcbiAgICAgICAgbGVkZ2VyUXVlcnk6IHRydWUsXG4gICAgICAgIGV2ZW50U291cmNlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0gPSBvcmdzW3BlZXIubXNwSWRdIHx8IHtcbiAgICAgICAgbXNwaWQ6IHBlZXIubXNwSWQsXG4gICAgICAgIHBlZXJzOiBbXSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdLnBlZXJzLnB1c2gocGVlci5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogXCJsZWdhY3ktbWFudWFsXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBjbGllbnQ6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIH0sXG4gICAgICBvcmdhbml6YXRpb25zOiBvcmdzLFxuICAgICAgcGVlcnM6IHBlZXJFbnRyaWVzLFxuICAgICAgb3JkZXJlcnM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmNoYW5uZWxdOiB7XG4gICAgICAgICAgcGVlcnM6IGNoYW5uZWxQZWVycyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZWVycy5ldmVyeSgocGVlcikgPT4gdGhpcy5pc0xvY2FsRW5kcG9pbnQocGVlci5wZWVyRW5kcG9pbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2NhbEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5leHRyYWN0SG9zdChlbmRwb2ludCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0ID09PSBcIjEyNy4wLjAuMVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG9zdChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbmRwb2ludC5yZXBsYWNlKC9eZ3JwY3M/OlxcL1xcLy8sIFwiXCIpO1xuICAgIHJldHVybiBzYW5pdGl6ZWQuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVHcnBjVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICgvXmdycGNzPzpcXC9cXC8vaS50ZXN0KGVuZHBvaW50KSkgcmV0dXJuIGVuZHBvaW50O1xuICAgIHJldHVybiBgZ3JwY3M6Ly8ke2VuZHBvaW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQZW1JbnB1dChzb3VyY2U/OiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgY2VydGlmaWNhdGUgb3Iga2V5IG1hdGVyaWFsXCIpO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc291cmNlKSkgcmV0dXJuIHNvdXJjZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG4gICAgaWYgKC8tLS0tLUJFR0lOIFtBLVogXSstLS0tLS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHNvdXJjZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHJlYWRGc0ZpbGUoc291cmNlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLnBhcnNlRXJyb3I8RT4oZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGlmICh0aGlzLnNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4KSkge1xuICAgICAgY29uc3QgbGVnYWN5QXJncyA9IHRoaXMucHJlcGFyZUxlZ2FjeUFyZ3MoYXJncyk7XG4gICAgICBjb25zdCB0cmFuc2llbnRNYXAgPSB0aGlzLmJ1aWxkTGVnYWN5VHJhbnNpZW50KHRyYW5zaWVudERhdGEpO1xuICAgICAgY29uc3QgcGVlckNvbmZpZ3MgPSB0aGlzLmJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4KTtcbiAgICAgIHJldHVybiB0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICAgICAgY3R4LFxuICAgICAgICBhcGksXG4gICAgICAgIGxlZ2FjeUFyZ3MsXG4gICAgICAgIHRyYW5zaWVudE1hcCxcbiAgICAgICAgcGVlckNvbmZpZ3MsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICB0cnVlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgYWN0aXZlIGRpc3BhdGNoICh3aGljaCBpbiB0dXJuIGNsb3NlcyBhbnkgZ2F0ZXdheVxuICAgKiBldmVudCBzdWJzY3JpcHRpb24pIHZpYSB0aGUgYmFzZSBjbGFzcywgdGhlbiBjbG9zZXMgdGhlIGdSUEMgY2xpZW50LlxuICAgKiBXb3JrcyBjb3JyZWN0bHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBzeW50aGV0aWNFdmVudHNgIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaHV0ZG93biguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGRpc3BhdGNoLmNsb3NlKCkgaW50ZXJuYWxseS5cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93biguLi5hcmdzKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IENvbnRyYWt0IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjb25maWcuY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjb25maWcuY2hhaW5jb2RlTmFtZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWUgfHwgY29uZmlnLmNvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y29uZmlnLmNoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0TmFtZSA9IGNvbnRyYWN0TmFtZSA/IGNvbnRyYWN0TmFtZSA6IGNvbmZpZy5jb250cmFjdE5hbWU7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY29uZmlnLmNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvciB1c2luZyB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nIHwgR2F0ZXdheUVycm9yXG4gICk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuXG4gICAgbGV0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2F0ZXdheUVycm9yICYmIGVyci5kZXRhaWxzLmxlbmd0aCAmJiBlcnIuY29kZSA9PT0gMTApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlcnIgaW5zdGFuY2VvZiBFbmRvcnNlRXJyb3IgJiZcbiAgICAgIGVyci5kZXRhaWxzLmxlbmd0aCAmJlxuICAgICAgZXJyLmNvZGUgPT09IDEwICYmXG4gICAgICBlcnIuZGV0YWlsc1swXS5tZXNzYWdlPy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpXG4gICAgKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIk1WQ0NfUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgTXZjY1JlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJERUFETElORV9FWENFRURFRFwiKSlcbiAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkVORE9SU0VNRU5UX1BPTElDWV9GQUlMVVJFXCIpKVxuICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudFBvbGljeUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJQSEFOVE9NX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgIHN3aXRjaCAoKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRFcnJvcihlcnIpIGFzIEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhWYWxpZGF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxufVxuXG5GYWJyaWNDbGllbnRBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENvbnRleHR1YWxBcmdzLFxuICBEaXNwYXRjaCxcbiAgRXZlbnRJZHMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVFdmVudCxcbiAgQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZSxcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgcGFyc2VFdmVudE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL2V2ZW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBkaXNwYXRjaGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgYW5kIHByb2Nlc3NlcyBldmVudHMgZW1pdHRlZCBieSBGYWJyaWMgY2hhaW5jb2RlLCBkaXNwYXRjaGluZyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IEZhYnJpY0FkYXB0ZXIuZ2V0Q2xpZW50KHBlZXJDb25maWcpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KTtcbiAqXG4gKiAvLyBDb25maWd1cmUgdGhlIGRpc3BhdGNoIHdpdGggcGVlciBjb25maWd1cmF0aW9uXG4gKiBkaXNwYXRjaC5jb25maWd1cmUocGVlckNvbmZpZyk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgc3BlY2lmaWMgdGFibGUgYW5kIGV2ZW50XG4gKiBkaXNwYXRjaC5vYnNlcnZlKCd1c2VycycsICdjcmVhdGUnLCAoaWQpID0+IHtcbiAqICAgY29uc29sZS5sb2coYFVzZXIgY3JlYXRlZDogJHtpZH1gKTtcbiAqIH0pO1xuICpcbiAqIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gKiBhd2FpdCBkaXNwYXRjaC5zdGFydCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudClcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IGNvbmZpZ3VyZShwZWVyQ29uZmlnKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogb2JzZXJ2ZSh0YWJsZSwgZXZlbnQsIGNhbGxiYWNrKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogc3RhcnQoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBpbml0aWFsaXplKClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5HYXRld2F5OiBnZXRHYXRld2F5KGNvbmZpZywgY2xpZW50KVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsKVxuICogICBOZXR3b3JrLT4+TmV0d29yazogZ2V0Q2hhaW5jb2RlRXZlbnRzKGNoYWluY29kZU5hbWUpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gKiAgIGxvb3AgRm9yIGVhY2ggZXZlbnRcbiAqICAgICBDaGFpbmNvZGUtLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLS0+PkNsaWVudDogY2FsbGJhY2soaWQpXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDbGllbnRBZGFwdGVyPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgbGlzdGVuaW5nIHN0YWNrIGZvciBjaGFpbmNvZGUgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbmluZ1N0YWNrPzogQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZTxDaGFpbmNvZGVFdmVudD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgZXZlbnQgcGF5bG9hZHMgZnJvbSBieXRlcyB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGRpc3BhdGNoZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjbGllbnQ6IENsaWVudCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZXZlbnQgbGlzdGVuaW5nIGNvbm5lY3Rpb25cbiAgICogQHN1bW1hcnkgU3RvcHMgbGlzdGVuaW5nIGZvciBjaGFpbmNvZGUgZXZlbnRzIGFuZCByZWxlYXNlcyByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjbG9zZShcbiAgICAuLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3M6IGxvZ2dlZEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGN0eEFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNsb3NlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuY2xvc2UoLi4ubG9nZ2VkQXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIHByb3hpZXMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlzdGVuaW5nU3RhY2suY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGV2ZW50IHBheWxvYWQgZnJvbSBiaW5hcnkgZm9ybWF0XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSBjb250YWluaW5nIEpTT04gdG8gYW4gb2JqZWN0IHdpdGggYW4gaWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBqc29uQnl0ZXMgLSBUaGUgYmluYXJ5IHBheWxvYWQgZnJvbSB0aGUgY2hhaW5jb2RlIGV2ZW50XG4gICAqIEByZXR1cm4ge3sgaWQ6IHN0cmluZyB9fSBUaGUgcGFyc2VkIHBheWxvYWQgY29udGFpbmluZyB0aGUgcmVjb3JkIElEXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGF5bG9hZChqc29uQnl0ZXM6IFVpbnQ4QXJyYXkpOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5kZWNvZGVyLmRlY29kZShqc29uQnl0ZXMpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb3ZlcnJpZGUgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICBzdXBlci5vYnNlcnZlKG9ic2VydmVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZCAtIFRoZSBldmVudCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBBZGFwdGVyLmxvZ0N0eDxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4oXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyxcbiAgICAgIGV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3R5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKX06JHtldmVudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgY2hhaW5jb2RlIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlbnQgaGFuZGxpbmcgc3RvcHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFN0YWNrXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRQYXJzZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAgICpcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRTdGFjazogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgbGlzdGVuaW5nU3RhY2spXG4gICAqICAgRXZlbnRTdGFjay0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKVxuICAgKiAgIEV2ZW50UGFyc2VyLS0+PkZhYnJpY0Rpc3BhdGNoOiB7IHRhYmxlLCBldmVudCwgb3duZXIgfVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IENoZWNrIGlmIGV2ZW50IGlzIGZvciB0aGlzIE1TUFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChldnQucGF5bG9hZClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+Pk9ic2VydmVyczogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgcGF5bG9hZC5pZClcbiAgICogICBPYnNlcnZlcnMtLT4+RmFicmljRGlzcGF0Y2g6IENhbGxiYWNrcyBleGVjdXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUV2ZW50cyhcbiAgICBjdHhBcmc/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubGlzdGVuaW5nU3RhY2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEV2ZW50IHN0YWNrIG5vdCBpbml0aWFsaXplZC4gRW5zdXJlIHRoYXQgXCJzdGFydExpc3RlbmluZ1wiIGlzIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzIG9wZXJhdGlvbi5gXG4gICAgICApO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMuYWRhcHRlci5jb25maWcpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBmb3VuZC4gc2hvdWxkIGJlIGltcG9zc2libGVgKTtcblxuICAgIGNvbnN0IGN0eCA9XG4gICAgICBjdHhBcmcgfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAodGhpcy5tb2RlbHMgJiYgdGhpcy5tb2RlbHNbMF0pIHx8IChNb2RlbCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yKVxuICAgICAgKSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcblxuICAgIGxvZy5pbmZvKFxuICAgICAgYExpc3RlbmluZyBmb3IgaW5jb21pbmcgZXZlbnRzIG9uIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIi4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgZXZlbnQsIG93bmVyIH0gPSBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcEV2ZW50T25seSAmJlxuICAgICAgICAgIG93bmVyICYmXG4gICAgICAgICAgb3duZXIgIT09IHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcElkXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSA9IHRoaXMucGFyc2VQYXlsb2FkKFxuICAgICAgICAgIGV2dC5wYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YWJsZVxuICAgICAgICAgICAgPyBNb2RlbC5nZXQodGFibGUpXG4gICAgICAgICAgICA6IE1vZGVsLmdldCh0aGlzLm1vZGVsc1swXS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFJlZiA9IHRhcmdldE1vZGVsID8/ICh0YWJsZSB8fCB0aGlzLm1vZGVsc1swXT8ubmFtZSk7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBcmdzID0gcGF5bG9hZC5yZXN1bHQgPyBbcGF5bG9hZC5yZXN1bHQsIGN0eF0gOiBbY3R4XTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIG1vZGVsUmVmIGFzIENvbnN0cnVjdG9yIHwgc3RyaW5nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkLmlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgIC4uLihvYnNlcnZlckFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8YW55PilcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB1cGRhdGUgb2JzZXJ2YWJsZXMgZm9yIHRhYmxlICR7dGFibGV9IGV2ZW50ICR7ZXZlbnR9IGlkOiAke3BheWxvYWQuaWR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGV2ZW50IGZvciBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCI6ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgZXZlbnQgZGlzcGF0Y2hpbmcgZm9yIHRoZSBvYnNlcnZlZCBhZGFwdGVyLiBXaGVuXG4gICAqIGBzeW50aGV0aWNFdmVudHNgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSBubyBnYXRld2F5IGNvbm5lY3Rpb24gaXMgb3BlbmVkO1xuICAgKiBpbnN0ZWFkIGV2ZXJ5IENSVUQgb3BlcmF0aW9uIGlzIHdyYXBwZWQgd2l0aCBhIFByb3h5IHRoYXQgZmlyZXNcbiAgICogYHVwZGF0ZU9ic2VydmVyc2AgZm9yICoqYWxsKiogbW9kZWxzLiBXaGVuIGBzeW50aGV0aWNFdmVudHNgIGlzIGZhbHNlIHRoZVxuICAgKiBleGlzdGluZyBnYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZVxuICAgKiBsb2NhbCBQcm94eSBmYWxsYmFjayBpcyBsaW1pdGVkIHRvIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzIG9ubHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9yIGNvbmZpZyBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50cyA9IHRoaXMuYWRhcHRlci5jb25maWcuc3ludGhldGljRXZlbnRzICE9PSBmYWxzZTtcblxuICAgIGlmICghc3ludGhldGljRXZlbnRzKSB7XG4gICAgICAvLyBHYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gKG5vbi1zeW50aGV0aWMgcGF0aClcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBNb2RlbCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICAgIHRoaXMuY2xpZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IENSVUQgbWV0aG9kcy5cbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gdHJ1ZSAg4oaSIG5vdGlmeSBmb3IgQUxMIG1vZGVscyAocmVwbGFjZXMgZ2F0ZXdheSBldmVudHMgZW50aXJlbHkpXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IGZhbHNlIOKGkiBub3RpZnkgb25seSBmb3IgZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHNcbiAgICAvLyAgICh0aGUgZ2F0ZXdheSBzdWJzY3JpcHRpb24gaGFuZGxlcyBwdWJsaWMgbW9kZWxzKVxuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGFkYXB0ZXIgcHJvdmlkZWQgZm9yIHRoZSBmYWxsYmFjayBvZiBmdWxseSBzZWdyZWdhdGVkIG1vZGVsc2BcbiAgICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyW3RvV3JhcF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHt0b1dyYXB9IG5vdCBmb3VuZCBpbiAke3RoaXMuYWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5hZGFwdGVyLCB0b1dyYXApO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSB0aGlzLmFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgdG9XcmFwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHt0b1dyYXB9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIHRoaXMuYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KHRoaXMuYWRhcHRlclt0b1dyYXBdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAoXG4gICAgICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICAgICAgdGhpc0FyZzogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gUnVuIHRoZSBvcmlnaW5hbCBtZXRob2QgdW5jaGFuZ2VkIHNvIHRyYW5zaWVudCBkYXRhIGlzIHByZXNlcnZlZFxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG5cbiAgICAgICAgICBjb25zdCBjbGF6ejogQ29uc3RydWN0b3I8YW55PiA9IGFyZ0FycmF5WzBdO1xuICAgICAgICAgIC8vIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIGZhbHNlLCBwdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnRcbiAgICAgICAgICAvLyBvbiB0aGUgY29udHJhY3Qgc2lkZTsgc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtbm90aWZpY2F0aW9uLiBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyB0cnVlIHdlIGhhbmRsZSBhbGwgbW9kZWxzLlxuICAgICAgICAgIGlmICghc3ludGhldGljRXZlbnRzICYmICFNb2RlbC5pc1RyYW5zaWVudChjbGF6eikpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAvLyBDb250ZXh0IGlzIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50IG9mIGFyZ0FycmF5XG4gICAgICAgICAgY29uc3QgeyBsb2csIGN0eEFyZ3MsIGN0eCB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShcbiAgICAgICAgICAgIGFyZ0FycmF5LnNsaWNlKGFyZ0FycmF5Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpZHMgPSBhcmdBcnJheVsxXTtcbiAgICAgICAgICBjb25zdCByZXN1bHRBcmdzOiBhbnlbXSA9IFtjbGF6eiwgYnVsa1RvU2luZ2xlKHRvV3JhcCksIGlkc107XG5cbiAgICAgICAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIC4uLihyZXN1bHRBcmdzIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMudXBkYXRlT2JzZXJ2ZXJzPiksXG4gICAgICAgICAgICAuLi5jdHhBcmdzXG4gICAgICAgICAgKS5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RvV3JhcH0gb24gJHtjbGF6ei5uYW1lIHx8IGNsYXp6fSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmlmIChGYWJyaWNDbGllbnRBZGFwdGVyKVxuICBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IEZhYnJpY0NsaWVudERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UiLCJmaWxlUGF0aCIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTW9kZWxJbmRleGVzIiwibSIsImdlbmVyYXRlSW5kZXhlcyIsImdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzIiwiYWNjdW0iLCJ2aWV3cyIsImdlbmVyYXRlVmlld3MiLCJzdG9yYWdlIiwiZm9yRWFjaCIsImRvYyIsIl9pZCIsInJlYWRNb2RlbEZpbGUiLCJmaWxlIiwiZXhwb3J0cyIsImpvaW4iLCJwcm9jZXNzIiwiY3dkIiwicGFyZW50UGF0aCIsIm5hbWUiLCJ2YWx1ZXMiLCJPYmplY3QiLCJmaWx0ZXIiLCJlIiwiTW9kZWwiLCJhc3luYyIsInJlYWRNb2RlbEZvbGRlcnMiLCJmb2xkZXJzIiwicmVzdWx0IiwiZm9sZGVyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJyZWN1cnNpdmUiLCJmIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJwdXNoIiwid3JpdGVJbmRleGVzIiwiaW5kZXhlcyIsInAiLCJjb2xsZWN0aW9uIiwiaW5kZXgiLCJyZXNvbHZlIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJ3cml0ZURlc2lnbkRvY3MiLCJkZXNpZ25Eb2NzIiwibGVuZ3RoIiwiZG9jSWQiLCJyZXBsYWNlIiwicGF5bG9hZCIsIl9yZXYiLCJjb2xsZWN0aW9uRm9yIiwiY29sbGVjdGlvbk5hbWUiLCJwb2xpY3kiLCJyZXF1aXJlZFBlZXJDb3VudCIsIm1heFBlZXJDb3VudCIsImJsb2NrVG9MaXZlIiwibWVtYmVyT25seVJlYWQiLCJtZW1iZXJPbmx5V3JpdGUiLCJwcml2YXRlQ29sbGVjdGlvbkZvciIsIm1zcElkIiwiYyIsImVuZG9yc2VtZW50UG9saWN5Iiwic2lnbmF0dXJlUG9saWN5Iiwic2hhcmVkQ29sbGVjdGlvbkZvciIsIm1zcElkcyIsIm1hcCIsImV4dHJhY3RDb2xsZWN0aW9ucyIsIm92ZXJyaWRlcyIsIm1pcnJvciIsInByaXZhdGVDb2xzIiwic2hhcmVkQ29scyIsImNvbGxlY3Rpb25zRm9yIiwicmVzb2x2ZUNvbGxlY3Rpb24iLCJhcmciLCJJbnRlcm5hbEVycm9yIiwicHJpdmF0ZURlZmF1bHRzIiwiYXNzaWduIiwic2hhcmVkRGVmYXVsdHMiLCJtaXJyb3JNZXRhIiwibWlycm9yZWRBdCIsInByaXZhdGVzIiwiZmxhdCIsInJlc29sdmVkIiwicmVzb2x2ZXIiLCJzb21lIiwiaW5jbHVkZXMiLCJzaGFyZWQiLCJ3cml0ZUNvbGxlY3Rpb25zIiwiY29scyIsImZpbGVOYW1lIiwid3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyIsImRvY3MiLCJGYWJyaWNDbGllbnRQYWdpbmF0b3IiLCJQYWdpbmF0b3IiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJxdWVyeSIsInNpemUiLCJjbGF6eiIsInN1cGVyIiwicHJlcGFyZSIsInJhd1N0YXRlbWVudCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwYWdlIiwiYXJncyIsImlzU2VyaWFsaXplZFBhZ2UiLCJvYmoiLCJBcnJheSIsImlzQXJyYXkiLCJkYXRhIiwiRmFicmljQ2xpZW50UmVwb3NpdG9yeSIsIlJlcG9zaXRvcnkiLCJmb3JjZSIsInRoaXMiLCJfb3ZlcnJpZGVzIiwiaWdub3JlVmFsaWRhdGlvbiIsImlnbm9yZUhhbmRsZXJzIiwiYWxsb3dSYXdTdGF0ZW1lbnRzIiwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllcyIsImZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzIiwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUiLCJyZWJ1aWxkV2l0aFRyYW5zaWVudCIsIm92ZXJyaWRlIiwiZmxhZ3MiLCJmb3IiLCJPYnNlcnZlckhhbmRsZXIiLCJwYWdpbmF0ZUJ5Iiwia2V5Iiwib3JkZXIiLCJyZWYiLCJvZmZzZXQiLCJsaW1pdCIsImxvZyIsImN0eEFyZ3MiLCJsb2dDdHgiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJQQUdFX0JZIiwidmVyYm9zZSIsInRhYmxlTmFtZSIsImNsYXNzIiwic3RhdGVtZW50IiwiYm9va21hcmsiLCJsaXN0QnkiLCJMSVNUX0JZIiwiZmluZEJ5IiwidmFsdWUiLCJGSU5EX0JZIiwiZmluZE9uZUJ5IiwiRklORF9PTkVfQlkiLCJmaW5kIiwiT3JkZXJEaXJlY3Rpb24iLCJBU0MiLCJGSU5EIiwiZGlyZWN0aW9uIiwiUEFHRSIsImN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlNUQVRFTUVOVCIsImNhbGxBcmdzIiwic2xpY2UiLCJwYXJzZSIsImRlY29kZSIsImV2YWx1YXRlVHJhbnNhY3Rpb24iLCJoeWRyYXRlZCIsInIiLCJDb3VjaERCS2V5cyIsIlRBQkxFIiwiZCIsImFwcGx5QWZ0ZXJSZWFkIiwiZ2V0T3JVbmRlZmluZWQiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJBRlRFUiIsIlByb21pc2UiLCJhbGwiLCJlbnRyeSIsImNvdW50T2YiLCJDT1VOVF9PRiIsInN0bXRBcmdzIiwibWF4T2YiLCJNQVhfT0YiLCJtaW5PZiIsIk1JTl9PRiIsImF2Z09mIiwiQVZHX09GIiwic3VtT2YiLCJTVU1fT0YiLCJkaXN0aW5jdE9mIiwiRElTVElOQ1RfT0YiLCJncm91cE9mIiwiR1JPVVBfT0YiLCJoZWFsdGhjaGVjayIsImNyZWF0ZSIsIm1vZGVsIiwiZGVidWciLCJlbnN1cmVMZWdhY3lNaXJyb3JGbGFnIiwicHJlcGFyZWQiLCJyZWNvcmQiLCJpZCIsInRyYW5zaWVudCIsInJldmVydCIsInVwZGF0ZSIsImNyZWF0ZUFsbFByZWZpeCIsIm1vZGVscyIsIkNSRUFURSIsImdldCIsImlnbm9yZVZhbGlkYXRlIiwiT04iLCJpZ25vcmVkUHJvcHMiLCJlcnJvcnMiLCJoYXNFcnJvcnMiLCJlcnJvck1lc3NhZ2VzIiwicmVkdWNlRXJyb3JzVG9QcmludCIsIlZhbGlkYXRpb25FcnJvciIsImNyZWF0ZUFsbCIsImlkcyIsInBheWxvYWRzIiwidHJhbnNpZW50cyIsImNyZWF0ZWQiLCJpIiwicmVhZEFsbCIsImtleXMiLCJyZWNvcmRzIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsInUiLCJhY2N1bXVsYXRlIiwibGVnYWN5IiwiRVJDMjBUb2tlbiIsIkJhc2VNb2RlbCIsIl9fZGVjb3JhdGUiLCJwayIsInR5cGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJjb2x1bW4iLCJyZXF1aXJlZCIsInRhYmxlIiwiRVJDMjBXYWxsZXQiLCJBbGxvd2FuY2UiLCJDbGllbnRTZXJpYWxpemVyIiwiSlNPTlNlcmlhbGl6ZXIiLCJwcmVTZXJpYWxpemUiLCJtb2RlbE5hbWUiLCJ0b1NlcmlhbGl6ZSIsIm1ldGFkYXRhIiwiTWV0YWRhdGEiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJNb2RlbEtleXMiLCJBTkNIT1IiLCJkZXNlcmlhbGl6ZSIsInN0ciIsImRlc2VyaWFsaXphdGlvbiIsImNsYXNzTmFtZSIsIkVycm9yIiwiYnVpbGQiLCJzZXJpYWxpemUiLCJGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkiLCJzZXJpYWxpemVyIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXBkYXRlT2JzZXJ2ZXJzIiwiZXZlbnQiLCJvYnNlcnZlckhhbmRsZXIiLCJjb3VudCIsInBhcnNlZElkIiwiU2VxdWVuY2UiLCJwYXJzZVZhbHVlIiwic2VxdWVuY2VGb3IiLCJ0b2tlbk5hbWUiLCJzeW1ib2wiLCJkZWNpbWFscyIsIk51bWJlciIsInRvdGFsU3VwcGx5IiwidG90YWwiLCJiYWxhbmNlT2YiLCJvd25lciIsImJhbGFuY2UiLCJ0cmFuc2ZlciIsInRvIiwidHJhbnNmZXJyZWQiLCJzdWJtaXRUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwidHJhbnNmZXJGcm9tIiwiZnJvbSIsImNvbnRleHRBcmdzIiwiQ29udGV4dCIsImFwcHJvdmUiLCJzcGVuZGVyIiwiYXBwcm92ZWQiLCJhbGxvd2FuY2UiLCJpbml0aWFsaXplIiwidG9rZW4iLCJpbml0aWxpYXplZCIsImNoZWNrSW5pdGlhbGl6ZWQiLCJtaW50IiwiYW1vdW50IiwiYnVybiIsImJ1cm5Gcm9tIiwiYWNjb3VudCIsImNsaWVudEFjY291bnRCYWxhbmNlIiwic2VyaWFsaXplZEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiZXh0cmFjdElkcyIsImNvbXBvc2VkIiwicGtQcm9wcyIsImV4dHJhY3RJZCIsImNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSIsIklkZW50aXR5Q3JlZGVudGlhbHMiLCJkZXNjcmlwdGlvbiIsIkZhYnJpY01vZGVsS2V5cyIsIklkZW50aXR5VHlwZSIsIkZhYnJpY0ZsYXZvdXIiLCJJZGVudGl0eSIsIlg1MDkiLCJvbmVUb09uZSIsIkNhc2NhZGUiLCJDQVNDQURFIiwiZGVsZXRlIiwiQ29yZVV0aWxzIiwibG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbnRlbnRPZkxvYWRGaWxlIiwiY29udGVudE9yUGF0aCIsImZpbGVSZWFkZXIiLCJVaW50OEFycmF5IiwibWF0Y2giLCJyZWFkRmlsZSIsInByb21pc2VzIiwibm9ybWFsaXplSW1wb3J0IiwiaW1wb3J0IiwiZ2V0Q0FVc2VyIiwidXNlck5hbWUiLCJwcml2YXRlS2V5IiwiY2VydGlmaWNhdGUiLCJvcHRpb25zIiwic3RyaW5nRm9ybWF0IiwidXNlciIsIlVzZXIiLCJjb25maWciLCJoc20iLCJzb2Z0d2FyZSIsImxpYiIsImxpYnJhcnkiLCJzbG90IiwibGFiZWwiLCJ0b2tlbkxhYmVsIiwicGluIiwiY3J5cHRvU3VpdGUiLCJnZXRDcnlwdG9TdWl0ZSIsInNldENyeXB0b1N1aXRlIiwiZW5yb2xsbWVudEtleSIsImdldEhTTUVucm9sbG1lbnRLZXkiLCJnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkiLCJzZXRFbnJvbGxtZW50IiwibmV3Q3J5cHRvU3VpdGUiLCJjcmVhdGVLZXlGcm9tUmF3Iiwic2tpIiwia2V5SWRIZXgiLCJ0cmltIiwiQnVmZmVyIiwiZ2V0Q2VydGlmaWNhdGVTS0kiLCJnZXRLZXkiLCJpc1ByaXZhdGUiLCJ4NTA5IiwiWDUwOUNlcnRpZmljYXRlIiwiandrIiwicHVibGljS2V5IiwiZXhwb3J0IiwiZm9ybWF0IiwicHJlZml4IiwieCIsInkiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiY29uY2F0IiwiZGlnZXN0IiwiZ2V0SWRlbnRpdHkiLCJjZXJ0RGlyZWN0b3J5UGF0aCIsImlkZW50aXR5RmlsZVJlYWRlciIsImNlcnRQYXRoIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZSIsImNyZWRlbnRpYWxzIiwiZGlyUGF0aCIsInJlYWRkaXIiLCJnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCIsImdldEZpbGVDb250ZW50IiwiZ2V0U2lnbmVyIiwia2V5RGlyZWN0b3J5UGF0aCIsInNpZ25lckZpbGVSZWFkZXIiLCJrZXlQYXRoIiwicHJpdmF0ZUtleVBlbSIsImV4dHJhY3RQcml2YXRlS2V5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiayIsInNpZ25lcnMiLCJuZXdQcml2YXRlS2V5U2lnbmVyIiwicGVtIiwibGliTmFtZSIsInN1YnRsZSIsImdsb2JhbFRoaXMiLCJ3aW5kb3ciLCJDcnlwdG8iLCJ3ZWJjcnlwdG8iLCJzdHIyYWIiLCJidWYiLCJBcnJheUJ1ZmZlciIsImJ1ZlZpZXciLCJzdHJMZW4iLCJjaGFyQ29kZUF0IiwicmVwbGFjZUFsbCIsImRlY29kZWQiLCJiaW5hcnlEZXIiLCJpbXBvcnRLZXkiLCJuYW1lZEN1cnZlIiwiZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQiLCJjZXJ0IiwieDUwOUNlcnRpZmljYXRlIiwiWDUwOUNlcnQiLCJha2lFeHQiLCJleHRlbnNpb25zIiwiYWtpIiwidG9VcHBlckNhc2UiLCJzdGFydHNXaXRoIiwic2VyaWFsIiwic2VyaWFsTnVtYmVyIiwiY3J5cHRvUHJvdmlkZXIiLCJzZXQiLCJCQVNFX0FMUEhBQkVUIiwiQ1JZUFRPIiwiQmFzZUVuY29kZXIiLCJhbHBoYWJldCIsImJhc2VNYXAiLCJqIiwiY2hhckF0IiwieGMiLCJiYXNlIiwibGVhZGVyIiwiZmFjdG9yIiwiTWF0aCIsImlGYWN0b3IiLCJlbmNvZGUiLCJzb3VyY2UiLCJpc1ZpZXciLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInplcm9lcyIsInBiZWdpbiIsInBlbmQiLCJiNTgiLCJjYXJyeSIsIml0MSIsIml0MiIsInJlcGVhdCIsImRlY29kZVVuc2FmZSIsInBzeiIsImIyNTYiLCJpdDMiLCJpdDQiLCJ2Y2giLCJDcnlwdG9VdGlscyIsImI1OGVuY29kZXIiLCJCQVNFNTgiLCJmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZSIsInN1YmplY3QiLCJpc3N1ZXIiLCJzdHJpbmdUb0FycmF5QnVmZmVyIiwiZXh0cmFjdEtleSIsInVzYWdlcyIsIlJlZ0V4cCIsImV4dHJhY3RQdWJsaWNLZXkiLCJzaWduIiwiYnVmZiIsImhhc2giLCJiIiwicGFkU3RhcnQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJlbmNyeXB0IiwiZ2V0U3VidGxlQ3J5cHRvIiwiaXNCcm93c2VyIiwiZGVjcnlwdCIsImdldE1hc3RlciIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJnZW5HZW5lc2lzIiwicmFuZG9tVVVJRCIsImltcG9ydGVkS2V5IiwiS0VZX0FMR09SWVRITSIsIml2IiwiZ2V0RGVyaXZhdGlvbktleSIsInNhbHQiLCJzYWx0QnVmZmVyIiwic2FsdEhhc2hlZCIsInBhcmFtcyIsIkhBU0giLCJpdGVyYXRpb25zIiwiSVRFUkFUSU9OUyIsImRlcml2YXRpb24iLCJkZXJpdmVCaXRzIiwiS0VZTEVOR1RIIiwiaXZsZW4iLCJrZXlsZW4iLCJkZXJpdmVkS2V5IiwiaW1wb3J0ZWRFbmNyeXB0aW9uS2V5IiwiQUxHT1JZVEhNIiwiZW5jcnlwdFBpbiIsInRleHQiLCJrZXlPYmplY3QiLCJ0ZXh0QnVmZmVyIiwiZW5jcnlwdGVkVGV4dCIsImRlY3J5cHRQaW4iLCJ0ZXh0RGVjb2RlciIsImRlY3J5cHRlZFRleHQiLCJPdmVyZmxvd0Vycm9yIiwibXNnIiwiQmFsYW5jZUVycm9yIiwiQWxsb3dhbmNlRXJyb3IiLCJSZWdpc3RyYXRpb25FcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIk1pc3NpbmdDb250ZXh0RXJyb3IiLCJVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyIsIkJhc2VFcnJvciIsIk5vdEluaXRpYWxpemVkRXJyb3IiLCJNaXNzaW5nUEtDU1MxMUxpYiIsIkVuZG9yc2VtZW50RXJyb3IiLCJtZXNzYWdlIiwiTXZjY1JlYWRDb25mbGljdEVycm9yIiwiUGhhbnRvbVJlYWRDb25mbGljdEVycm9yIiwiRW5kb3JzZW1lbnRQb2xpY3lFcnJvciIsIlRyYW5zYWN0aW9uTGltaXRzRXJyb3IiLCJjb2RlIiwiVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IiLCJUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciIsIkhGQ0FJZGVudGl0eVR5cGUiLCJIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIiwiRmFicmljRW5yb2xsbWVudFNlcnZpY2UiLCJMb2dnZWRDbGFzcyIsImNhQ29uZmlnIiwiY2FOYW1lIiwiY2FDZXJ0IiwiY2FLZXkiLCJ1cmwiLCJDQSIsImNhIiwidGxzIiwidHJ1c3RlZFJvb3RzIiwicm9vdCIsIkZhYnJpY0NBU2VydmljZXMiLCJDbGllbnQiLCJjbGllbnQiLCJDZXJ0aWZpY2F0ZSIsImNlcnRpZmljYXRlU2VydmljZSIsIm5ld0NlcnRpZmljYXRlU2VydmljZSIsIkFmZmlsaWF0aW9ucyIsImFmZmlsaWF0aW9uU2VydmljZSIsIm5ld0FmZmlsaWF0aW9uU2VydmljZSIsIklkZW50aXRpZXMiLCJpZGVudGl0eVNlcnZpY2UiLCJuZXdJZGVudGl0eVNlcnZpY2UiLCJnZXRDZXJ0aWZpY2F0ZXMiLCJyZXF1ZXN0IiwiZG9NYXAiLCJyZXNwb25zZSIsImNlcnRzIiwiUEVNIiwiZ2V0SWRlbnRpdGllcyIsImlkZW50aXRpZXNTZXJ2aWNlIiwiZ2V0QWxsIiwiaWRlbnRpdGllcyIsInBhcnNlRXJyb3IiLCJyZWdleHAiLCJleGVjIiwiQ29uZmxpY3RFcnJvciIsImdldEFmZmlsaWF0aW9ucyIsImEiLCJyZWFkIiwiZW5yb2xsbWVudElkIiwiZ2V0T25lIiwiTm90Rm91bmRFcnJvciIsInN1Y2Nlc3MiLCJyZWdpc3RlciIsImlzU3VwZXJVc2VyIiwiYWZmaWxpYXRpb24iLCJ1c2VyUm9sZSIsImF0dHJzIiwibWF4RW5yb2xsbWVudHMiLCJyZWdpc3RyYXRpb24iLCJwYXNzd29yZCIsInByb3BzIiwiZW5yb2xsbWVudElEIiwiZW5yb2xsbWVudFNlY3JldCIsImluZm8iLCJpZGVudGl0eUZyb21FbnJvbGxtZW50IiwiZW5yb2xsbWVudCIsInJvb3RDZXJ0aWZpY2F0ZSIsIkxvZ2dpbmciLCJjbGllbnRJZCIsIm5vdyIsIkRhdGUiLCJ0b0J5dGVzIiwiY3JlYXRlZE9uIiwidXBkYXRlZE9uIiwiZW5yb2xsIiwiaWRlbnRpdHkiLCJyZWdpc3RlckFuZEVucm9sbCIsInJldm9rZSIsInJlYXNvbiIsIlJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIiwiZXJycyIsInJvbGUiLCJzZXRBZmZpbGlhdGlvbiIsImFkZEF0dHIiLCJhdHRyIiwic2V0QXR0cnMiLCJzZXRFbnJvbGxtZW50SUQiLCJzZXRFbnJvbGxtZW50U2VjcmV0Iiwic2V0TWF4RW5yb2xsbWVudHMiLCJzZXRSb2xlIiwibWlubGVuZ3RoIiwibWluIiwiRVJDMjBFdmVudHMiLCJGYWJyaWNCYXNlTW9kZWwiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ2ZXJzaW9uIiwidXNlcyIsIkZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwiLCJjcmVhdGVkQnkiLCJ1cGRhdGVkQnkiLCJpc1NoYXJlZCIsInNlZ3JlZ2F0ZSIsImlzVHJhbnNpZW50IiwiZGVjb3JhdGVkUHJvcGVydGllcyIsImdldEF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRQcm9wcyIsIkRCS2V5cyIsIlRSQU5TSUVOVCIsInByaXZhdGVQcm9wZXJ0aWVzIiwiUFJJVkFURSIsInNoYXJlZFByb3BlcnRpZXMiLCJTSEFSRUQiLCJwdWJsaWMiLCJ0cmFuc2llbnRLZXlzIiwicHJpdmF0ZUtleXMiLCJzaGFyZWRLZXlzIiwiaXNQdWJsaWMiLCJiaW5kIiwibWlycm9yZWQiLCJGQUJSSUMiLCJNSVJST1IiLCJvd25lck9mIiwibWV0YSIsIk9XTkVEX0JZIiwic2hhcmVkS2V5IiwiY29uc3RyIiwicHJpdmF0ZU1ldGEiLCJzaGFyZWRNZXRhIiwiY29sbGVjdGlvbnMiLCJleHRyYWN0TXNwSWQiLCJnZXRNU1BJRCIsIk93bmVyIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZXNjcmlwdG9yIiwib3JpZ2luYWxNZXRob2QiLCJhY291bnRJZCIsImNsaWVudElkZW50aXR5IiwiZ2V0SUQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwiYXBwbHkiLCJvd25lZEJ5T25DcmVhdGUiLCJjb250ZXh0Iiwic3R1YiIsImNyZWF0b3IiLCJnZXRDcmVhdG9yIiwibXNwaWQiLCJzZXRPd25lZEJ5S2V5VmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIm93bmVkQnkiLCJhdHRyaWJ1dGUiLCJnZW5lcmF0ZWQiLCJyZWFkb25seSIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIiwiRGVjb3JhdGlvbiIsImRlZmluZSIsImRlY29yYXRvciIsInRyYW5zYWN0aW9uSWRPbkNyZWF0ZSIsImdldFR4SUQiLCJ0cmFuc2FjdGlvbklkIiwib25VcGRhdGUiLCJUUkFOU0FDVElPTl9JRCIsImV2YWxNaXJyb3JNZXRhZGF0YSIsImNyZWF0ZU1pcnJvckhhbmRsZXIiLCJmYWJyaWNDdHgiLCJzb3VyY2VNb2RlbCIsInB1dCIsInJlcG8iLCJtaXJyb3JDb2xsZWN0aW9uIiwidXBkYXRlTWlycm9ySGFuZGxlciIsImFwcGx5VXBkYXRlVmFsaWRhdGlvbiIsIm1lcmdlRm9yVXBkYXRlIiwiZGVsZXRlTWlycm9ySGFuZGxlciIsInBrUHJvcCIsInNlZ3JlZ2F0ZWQiLCJtaXJyb3JXcml0ZUd1YXJkIiwibXNwIiwiY29uZGl0aW9uIiwicmVhZE1pcnJvckhhbmRsZXIiLCJtYXRjaGVzIiwicmVhZEZyb20iLCJtc3BJZE9yQ29uZGl0aW9uIiwiaXNDb25kaXRpb25Pbmx5IiwiQm9vbGVhbiIsImNvbmQiLCJvblJlYWQiLCJwcmlvcml0eSIsIm9uRGVsZXRlIiwiTW9kZWxDb2xsZWN0aW9uIiwib3JnTmFtZSIsInRvUGFzY2FsQ2FzZSIsIk5hbWVzcGFjZUNvbGxlY3Rpb24iLCJuYW1lc3BhY2UiLCJJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uIiwiU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkiLCJhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MiLCJpc0Z1bGx5U2VncmVnYXRlZCIsImhhc1B1YmxpY1Byb3BlcnRpZXMiLCJtYXJrRnVsbHlTZWdyZWdhdGVkIiwiYXBwbHlNaXJyb3JGbGFncyIsImF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRNZXRhIiwiZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyIsImRhdGFBcnJheSIsImNvbGxlY3Rpb25SZXNvbHZlciIsImtleUFycmF5IiwicGtLZXkiLCJwa1NlcU5hbWUiLCJzZXF1ZW5jZU5hbWUiLCJpZFZhbHVlIiwiY2FuQnVpbGRQZXJJbnN0YW5jZSIsInNldFNlcXVlbmNlU2VncmVnYXRpb24iLCJwcm9wU2VxTmFtZSIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJfayIsImtleVN0cmluZ3MiLCJ3cml0ZVRvIiwic2VncmVnYXRlZERhdGFPblJlYWQiLCJzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIiwib2xkTW9kZWwiLCJzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIiwiaW5uZXJTZWdyZWdhdGVkIiwic2VncmVnYXRlZERlYyIsIlNldCIsImFkZCIsImNvbnN0ck1ldGEiLCJjb25zdHJDb2xsZWN0aW9ucyIsInVwZGF0ZWRUcmFuc2llbnRNZXRhIiwiZGVjcyIsInByb3BlcnRpZXMiLCJncm91cE5hbWUiLCJleHRyYWN0R3JvdXBOYW1lIiwiZGF0YUdyb3VwTmFtZSIsImVhcmx5RXh0cmFjdGlvbk1ldGEiLCJlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQiLCJncm91cCIsInByb3AiLCJvbiIsIkRCT3BlcmF0aW9ucyIsIkFMTCIsInByaXZhdGVEYXRhIiwic2hhcmVkRGF0YSIsInNvcnRLZXlzT25seVJlY3Vyc2l2ZSIsInNvcnQiLCJyZWR1Y2UiLCJhY2MiLCJEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsImVycm9yIiwic2VsZiIsIm8iLCJjYWxsIiwicmVsYXRpb25zIiwiZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUiLCJwYXJzZUV2ZW50TmFtZSIsInBhcnRzIiwic3BsaXQiLCJzdWIiLCJzYWZlUGFyc2VJbnQiLCJzdHJpbmciLCJkaWdpdFJlZ2V4IiwidGVzdCIsInBhcnNlZGludCIsInBhcnNlSW50IiwiaXNOYU4iLCJTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsInB1dEFuY2hvciIsInByZVNlcmlhbGl6YXRpb24iLCJGYWJyaWNJZGVudGl0eVNlcnZpY2UiLCJDbGllbnRCYXNlZFNlcnZpY2UiLCJyb290Q2xpZW50IiwiX3VzZXIiLCJjZXJ0aWZpY2F0ZXMiLCJhZmZpbGlhdGlvbnMiLCJnZXRVc2VyIiwiY2ZnIiwiSU5JVElBTElaQVRJT04iLCJnZXROYW1lIiwidXBkYXRlSWRlbnRpdHkiLCJpZGVudGl0eVJlcXVlc3QiLCJjYVVzZXJJZGVudGl0eSIsInJlZW5yb2xsVXNlciIsImNyZWF0ZVVzZXIiLCJnZXRNc3BpZCIsImVucm9sbG1lbnRBdHRycyIsIm9wdGlvbmFsIiwicmVlbnJvbGwiLCJyZW5ld2VkSWRlbnRpdHkiLCJyZXZva2VPcHRpb25zIiwicmV2b2tlUmVxdWVzdCIsIkNBX1JPTEUiLCJEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MiLCJldmFsdWF0ZVRpbWVvdXQiLCJlbmRvcnNlVGltZW91dCIsInN1Ym1pdFRpbWVvdXQiLCJjb21taXRUaW1lb3V0IiwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzIiwiYWxsb3dHYXRld2F5T3ZlcnJpZGUiLCJlbmNyeXB0VHJhbnNpZW50Iiwic3ludGhldGljRXZlbnRzIiwiZXNjYXBlUmVnRXhwIiwibmV4dExleGljb2dyYXBoaWNTdHJpbmciLCJjaGFycyIsImNvZGVQb2ludEF0IiwiZnJvbUNvZGVQb2ludCIsInByZWZpeFJhbmdlIiwic3RhcnQiLCJlbmQiLCJGYWJyaWNDbGllbnRTdGF0ZW1lbnQiLCJTdGF0ZW1lbnQiLCJzcXVhc2giLCJzcXVhc2hlZCIsIm1ldGhvZCIsImV4ZWN1dGVQcmVwYXJlZCIsImFyZ3oiLCJmb3JNb2RlbCIsImZyb21TZWxlY3RvciIsImFsaWFzIiwiUVVFUlkiLCJpc1NpbXBsZVF1ZXJ5IiwiUXVlcnlDbGF1c2UiLCJ3aGVyZUNvbmRpdGlvbiIsInBhcnNlZCIsInByZXBhcmVDb25kaXRpb24iLCJzZWxlY3RTZWxlY3RvciIsIlNFTEVDVCIsIkFORCIsInRvTG93ZXJDYXNlIiwib3JkZXJCeVNlbGVjdG9ycyIsIk9SREVSX0JZIiwidG9DYW1lbENhc2UiLCJwcm9jZXNzUmVjb3JkIiwicGtBdHRyIiwiSUQiLCJrZXlBcmdzIiwiU0VQQVJBVE9SIiwicmF3IiwicmF3SW5wdXQiLCJhZ2dyZWdhdG9yIiwiYWdncmVnYXRlSW5mbyIsImFnZ3JlZ2F0ZSIsImV4ZWN1dGVBZ2dyZWdhdGUiLCJyZXN1bHRzIiwicHJvY2Vzc2VkIiwiYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQiLCJhZ2dyZWdhdGVRdWVyeSIsImJ1aWxkQWdncmVnYXRlUXVlcnkiLCJzZWxlY3RvcnMiLCJzZWxlY3RvciIsImZpZWxkcyIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiZXEiLCJzZWxlY3RvcktleXMiLCJDb3VjaERCR3JvdXBPcGVyYXRvciIsImluZGV4T2YiLCJ2YWwiLCJPUiIsInMiLCJlbnRyaWVzIiwid2FybiIsInNlbGVjdG9yS2V5IiwicmVjIiwiQ291Y2hEQk9wZXJhdG9yIiwiQklHR0VSIiwibGltaXRTZWxlY3RvciIsIkNvdWNoREJRdWVyeUxpbWl0Iiwib2Zmc2V0U2VsZWN0b3IiLCJza2lwIiwibWVyZ2UiLCJvcCIsIm9iajEiLCJvYmoyIiwiYXR0cjEiLCJvcGVyYXRvciIsImNvbXBhcmlzb24iLCJPcGVyYXRvciIsIlNUQVJUU19XSVRIIiwiUXVlcnlFcnJvciIsInJhbmdlIiwiQklHR0VSX0VRIiwiU01BTExFUiIsIkVORFNfV0lUSCIsIlJFR0VYUCIsIkJFVFdFRU4iLCJtYXgiLCJvcEJldHdlZW4iLCJ0cmFuc2xhdGVPcGVyYXRvcnMiLCJTTUFMTEVSX0VRIiwiR3JvdXBPcGVyYXRvciIsIk5PVCIsIm9wMSIsIm9wMiIsImF2Z1NlbGVjdG9yIiwic3VtSW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IiLCJjb3VudEluZm8iLCJjcmVhdGVBZ2dyZWdhdGVRdWVyeSIsImtpbmQiLCJzdW1EZXNjcmlwdG9yIiwiY291bnREZXNjcmlwdG9yIiwiY291bnREaXN0aW5jdFNlbGVjdG9yIiwiY291bnREaXN0aW5jdCIsImFnZ3JlZ2F0b3JVc2VkIiwiY291bnRTZWxlY3RvciIsIm1pblNlbGVjdG9yIiwibWF4U2VsZWN0b3IiLCJzdW1TZWxlY3RvciIsImRpc3RpbmN0U2VsZWN0b3IiLCJhZ2dyZWdhdG9yQ2hlY2tzIiwibWV0YXMiLCJmaW5kVmlld01ldGFkYXRhIiwidmlld05hbWUiLCJnZW5lcmF0ZVZpZXdOYW1lIiwiZGRvYyIsImdlbmVyYXRlRGVzaWduRG9jTmFtZSIsInJldHVybkRvY3MiLCJ2aWV3IiwiZ2V0RmFicmljQWRhcHRlciIsImlzVmlld0FnZ3JlZ2F0ZSIsImhhbmRsZUF2ZXJhZ2UiLCJmYWJyaWNBZGFwdGVyIiwidmlld0luZm8iLCJwcm9jZXNzVmlld1Jlc3BvbnNlIiwic3VtRGVzYyIsImNvdW50RGVzYyIsInN1bVJlc3BvbnNlIiwiY291bnRSZXNwb25zZSIsInN1bSIsInJvd3MiLCJyb3ciLCJGYWJyaWNDbGllbnRBZGFwdGVyIiwiQWRhcHRlciIsIm9wZXJhdGlvbiIsIm1lcmdlZEZsYWdzIiwic2lsbHkiLCJwb3AiLCJ0b092ZXJyaWRlcyIsIm5ld0N0eCIsInBhcmVudENvbnRleHQiLCJjaGlsZENvbnRleHRzIiwiY3VycmVudE9wIiwiY3VycmVudE1vZGVsIiwicmVwb3NpdG9yeSIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZUFsbFByZWZpeCIsInNoaWZ0IiwiaGFzVHJhbnNpZW50IiwibmVlZHNGdWxsUGF5bG9hZCIsInNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbiIsInRyYW5zaWVudFBheWxvYWQiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJDUkVBVEVfQUxMIiwiZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInJlcyIsInNob3VsZFJlZnJlc2hBZnRlcldyaXRlIiwiUkVBRF9BTEwiLCJVUERBVEVfQUxMIiwiZGVsZXRlQWxsIiwic2hvdWxkSHlkcmF0ZSIsIkRFTEVURV9BTEwiLCJNRVRBREFUQSIsIm1pcnJvck1zcCIsIm1zcHMiLCJtZXJnZWQiLCJlbmRvcnNpbmdPcmdzIiwiZW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50IiwidiIsImNoaWxkUmVidWlsZCIsImdldEZyb21DaGlsZHJlbiIsInJlc29sdmVkT3AiLCJyZXNvbHZlT3BlcmF0aW9uIiwiaGFzSWQiLCJkaXJlY3QiLCJkZXNlcmlhbGl6ZWQiLCJ1cGRhdGVQcmVmaXgiLCJVUERBVEUiLCJERUxFVEUiLCJkb2NzT25seSIsInRyYW5zYWN0aW9uUmVzdWx0IiwicGFyc2VSZWNvcmQiLCJpc01vZGVsIiwiZWwiLCJnZXRDbGllbnQiLCJfY2xpZW50IiwiR2F0ZXdheSIsImdldEdhdGV3YXkiLCJnZXRDb250cmFjdE5hbWUiLCJDb250cmFjdCIsImNvbnRyYWN0TmFtZSIsImdldENvbnRyYWN0IiwidHJhbnNhY3Rpb24iLCJhcGkiLCJzdWJtaXQiLCJ0cmFuc2llbnREYXRhIiwiZ2F0ZXdheSIsImNvbnRyYWN0IiwiZXZhbHVhdGUiLCJwcm9wb3NhbE9wdGlvbnMiLCJhcmd1bWVudHMiLCJjbG9zZSIsInNob3VsZFVzZUxlZ2FjeUdhdGV3YXkiLCJwcmVwYXJlTGVnYWN5QXJncyIsImJ1aWxkTGVnYWN5VHJhbnNpZW50IiwicmVzb2x2ZUxlZ2FjeU1zcENvdW50IiwiY29uZmlndXJlZCIsImxlZ2FjeU1zcENvdW50IiwiaXNGaW5pdGUiLCJmbG9vciIsInBpY2tMZWdhY3lDYW5kaWRhdGVzIiwiY2FuZGlkYXRlcyIsImF2YWlsYWJsZSIsInBpY2tlZCIsImlkeCIsInJhbmRvbSIsInNlbGVjdGlvbiIsInNwbGljZSIsImJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MiLCJwZWVycyIsInBlZXJFbmRwb2ludCIsInBlZXJIb3N0QWxpYXMiLCJ0bHNDZXJ0IiwiZW5kb3JzZXJzIiwib3JnIiwiZXh0cmFzIiwibXNwTWFwIiwibGVnYWN5Q291bnQiLCJzZWxlY3Rpb25zIiwiY2hvaWNlIiwiZW5kcG9pbnQiLCJzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMiLCJmY24iLCJ0cmFuc2llbnRNYXAiLCJwZWVyQ29uZmlncyIsIm5vcm1hbGl6ZUxlZ2FjeVBlZXJzIiwiaWRlbnRpdHlNYXRlcmlhbCIsInJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsIiwid2FsbGV0IiwiV2FsbGV0cyIsIm5ld0luTWVtb3J5V2FsbGV0IiwiaWRlbnRpdHlMYWJlbCIsImNvbm5lY3Rpb25Qcm9maWxlIiwiYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZSIsIkxlZ2FjeUdhdGV3YXkiLCJjb25uZWN0IiwiZGlzY292ZXJ5IiwiZW5hYmxlZCIsImFzTG9jYWxob3N0Iiwic2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0IiwidGxzSW5mbyIsIm5ldHdvcmsiLCJnZXROZXR3b3JrIiwiY2hhbm5lbCIsImNoYWluY29kZU5hbWUiLCJjcmVhdGVUcmFuc2FjdGlvbiIsInNldFRyYW5zaWVudCIsInBlZXIiLCJnZXRDaGFubmVsIiwiZ2V0RW5kb3JzZXIiLCJlbmRvcnNlciIsInNldEVuZG9yc2luZ1BlZXJzIiwiZGlzY29ubmVjdCIsImRlZHVwZWQiLCJNYXAiLCJhZGRQZWVyIiwiaGFzIiwicmVhZFBlbUlucHV0IiwiY2VydENlcnRPckRpcmVjdG9yeVBhdGgiLCJrZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIiwicGVlckVudHJpZXMiLCJjaGFubmVsUGVlcnMiLCJvcmdzIiwidGxzUGVtIiwiaG9zdG5hbWUiLCJleHRyYWN0SG9zdCIsImVuc3VyZUdycGNVcmwiLCJ0bHNDQUNlcnRzIiwiZ3JwY09wdGlvbnMiLCJob3N0bmFtZU92ZXJyaWRlIiwiZW5kb3JzaW5nUGVlciIsImNoYWluY29kZVF1ZXJ5IiwibGVkZ2VyUXVlcnkiLCJldmVudFNvdXJjZSIsIm9yZ2FuaXphdGlvbiIsIm9yZ2FuaXphdGlvbnMiLCJvcmRlcmVycyIsImNoYW5uZWxzIiwiZXZlcnkiLCJpc0xvY2FsRW5kcG9pbnQiLCJob3N0Iiwic2FuaXRpemVkIiwiaXNCdWZmZXIiLCJ0cmltbWVkIiwic3RhdHMiLCJzdGF0IiwiY2F0Y2giLCJpc0RpcmVjdG9yeSIsInJlYWRGc0ZpbGUiLCJlcnIiLCJsZWdhY3lBcmdzIiwic2h1dGRvd24iLCJjaGFubmVsTmFtZSIsImdldENvbm5lY3Rpb24iLCJwYXRoT3JDZXJ0IiwicmVhZEZpbGVTeW5jIiwidGxzQ3JlZGVudGlhbHMiLCJncnBjIiwiY3JlYXRlU3NsIiwic2l6ZUxpbWl0Iiwic2lnbmVyIiwiZXZhbHVhdGVPcHRpb25zIiwiZGVhZGxpbmUiLCJlbmRvcnNlT3B0aW9ucyIsInN1Ym1pdE9wdGlvbnMiLCJjb21taXRTdGF0dXNPcHRpb25zIiwiUHJveHkiLCJ0aGlzQXJnIiwiYXJnQXJyYXkiLCJSZWZsZWN0IiwiRGlzcGF0Y2giLCJHYXRld2F5RXJyb3IiLCJkZXRhaWxzIiwiRW5kb3JzZUVycm9yIiwiQmFkUmVxdWVzdEVycm9yIiwiUGFnaW5nRXJyb3IiLCJNaWdyYXRpb25FcnJvciIsIk9ic2VydmVyRXJyb3IiLCJGb3JiaWRkZW5FcnJvciIsIkNvbm5lY3Rpb25FcnJvciIsImZpbmFsIiwiRCIsIl9hIiwiZGVjb3JhdGlvbiIsInNldEN1cnJlbnQiLCJGYWJyaWNDbGllbnREaXNwYXRjaCIsImxvZ2dlZEFyZ3MiLCJTSFVURE9XTiIsImxpc3RlbmluZ1N0YWNrIiwicGFyc2VQYXlsb2FkIiwianNvbkJ5dGVzIiwianNvbiIsIm9ic2VydmUiLCJvYnNlcnZlciIsInVuT2JzZXJ2ZSIsInJlZnJlc2giLCJoYW5kbGVFdmVudHMiLCJjdHhBcmciLCJjb3JyZWxhdGlvbklkIiwiZXZ0IiwiZXZlbnROYW1lIiwibXNwRXZlbnRPbmx5IiwidGFyZ2V0TW9kZWwiLCJtb2RlbFJlZiIsIm9ic2VydmVyQXJncyIsImdldENoYWluY29kZUV2ZW50cyIsInRvV3JhcCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJidWxrVG9TaW5nbGUiLCJyZXN1bHRBcmdzIiwiVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQVdBLFNBQVNBLHlCQUF5QkM7UUFFaEMsTUFBTUMsS0FBS0MsUUFBUTtRQUVuQixNQUFNQyxPQUFPRCxRQUFRO1FBQ3JCLE1BQU1FLFVBQWtCRCxLQUFLQyxRQUFRSjtRQUNyQyxJQUFJQyxHQUFHSSxXQUFXRCxVQUFVO1lBQzFCLE9BQU87QUFDVDtRQUNBTCx5QkFBeUJLO1FBQ3pCSCxHQUFHSyxVQUFVRjtBQUNmO0lBRU0sU0FBVUcscUJBQ2RDO1FBRUEsT0FBT0MsV0FBQUEsZ0JBQWdCLEVBQUNEO0FBQzFCO0lBRU0sU0FBVUUsd0JBQ2RGLEdBQ0FHO1FBRUEsTUFBTUMsUUFBUUMsV0FBQUEsY0FBYyxFQUFDTDtRQUM3QixNQUFNTSxVQUE0Q0gsU0FBUyxDQUFBO1FBQzNEQyxNQUFNRyxRQUFTQztZQUNiRixRQUFRRSxJQUFJQyxPQUFPRDs7UUFFckIsT0FBT0o7QUFDVDtJQUVNLFNBQVVNLGNBQWNDO1FBRTVCLE1BQU1oQixPQUFPRCxRQUFRO1FBRXJCLE1BQU1rQixZQUFV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
|