footprintjs 9.44.2 → 9.44.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -2
- package/dist/esm/lib/memory/EventLog.d.ts +1 -1
- package/dist/esm/lib/memory/EventLog.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +4 -33
- package/dist/esm/lib/memory/StageContext.js +18 -81
- package/dist/esm/lib/memory/TransactionBuffer.js +2 -2
- package/dist/esm/lib/memory/recordCommit.d.ts +43 -0
- package/dist/esm/lib/memory/recordCommit.js +59 -0
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.js +3 -3
- package/dist/lib/memory/EventLog.js +2 -2
- package/dist/lib/memory/StageContext.js +17 -80
- package/dist/lib/memory/TransactionBuffer.js +2 -2
- package/dist/lib/memory/recordCommit.js +63 -0
- package/dist/lib/memory/redaction.js +2 -2
- package/dist/lib/runner/ExecutionRuntime.js +3 -3
- package/dist/types/lib/memory/EventLog.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +4 -33
- package/dist/types/lib/memory/recordCommit.d.ts +43 -0
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -2
- package/package.json +1 -1
|
@@ -577,7 +577,7 @@ class TransactionBuffer {
|
|
|
577
577
|
commit() {
|
|
578
578
|
const rows = this.commitValues === 'delta' ? this.toDeltaPayload() : this.toChangeOnlyPayload();
|
|
579
579
|
const redactedPaths = this.survivingRedactedPaths(new Set(rows.trace.map((t) => t.path)));
|
|
580
|
-
// The key order is
|
|
580
|
+
// The bundle's key order is `recordCommit`'s; a direct caller keeps this same order.
|
|
581
581
|
const payload = { overwrite: rows.overwrite, updates: rows.updates, redactedPaths, trace: rows.trace };
|
|
582
582
|
this.overwritePatch = {};
|
|
583
583
|
this.updatePatch = {};
|
|
@@ -946,4 +946,4 @@ function flattenedTraceRow(op) {
|
|
|
946
946
|
function provenance(readKeys) {
|
|
947
947
|
return readKeys !== undefined ? { readKeys } : undefined;
|
|
948
948
|
}
|
|
949
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStERzs7O0FBRUgsaURBQWdIO0FBQ2hILHlEQUFvSDtBQUNwSCwrQ0FBeUM7QUFDekMsNkNBVXNCO0FBRXRCLHlDQUFzRjtBQUV0RixNQUFhLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixDQUFrQjtJQUVuRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdEM7Ozs7OztPQU1HO0lBQ0ssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdkM7Ozs7O09BS0c7SUFDSyxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0ssU0FBUyxDQUFtQjtJQUVwQzs7O09BR0c7SUFDSyxZQUFZLENBQW1CO0lBRXZDOzs7OztPQUtHO0lBQ2MsT0FBTyxDQUFvQjtJQUU1QyxvRUFBb0U7SUFDNUQsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN6QixvRkFBb0Y7SUFDNUUsU0FBUyxHQUFHLENBQUMsQ0FBQztJ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SUFDaEYsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDekIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQWMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDdEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUM7QUFFRCwwRkFBMEY7QUFDMUYsU0FBUyxVQUFVLENBQUMsUUFBOEI7SUFDaEQsT0FBTyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWZmZXIg4oCUIFBlci1zdGFnZSBTVEFHSU5HIGJ1ZmZlciBmb3Igc3RhdGUgbXV0YXRpb25zXG4gKlxuICogV2hhdCBpdCBJUzogYSBzdGFnaW5nIGJ1ZmZlciB3aXRoIHJlYWQteW91ci13cml0ZXMgYW5kIG5ldC1jaGFuZ2UgY29tbWl0cy5cbiAqIC0gQ2hhbmdlcyBhcmUgc3RhZ2VkIGhlcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbiBhbmQgZmx1c2hlZCB0b1xuICogICBTaGFyZWRNZW1vcnkgaW4gT05FIGJhdGNoIHBlciBzdGFnZSAoYGNvbW1pdCgpYCkg4oCUIG90aGVyIHN0YWdlcyBhbmRcbiAqICAgcGFyYWxsZWwgc2libGluZ3MgbmV2ZXIgb2JzZXJ2ZSBhIHN0YWdlJ3MgaGFsZi1maW5pc2hlZCB3cml0ZXMuXG4gKiAtIFJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3kgd2l0aGluIGEgc3RhZ2Ug4oCUIGEgc3RhZ2Ugc2VlcyBpdHMgb3duXG4gKiAgIHN0YWdlZCB3cml0ZXMgaW1tZWRpYXRlbHkuXG4gKiAtIGBjb21taXQoKWAgcmVjb3JkcyB0aGUgc3RhZ2UncyBORVQgY2hhbmdlIChzZWUge0BsaW5rIGNvbW1pdH0pLCBwbHVzIGFuXG4gKiAgIG9wZXJhdGlvbiB0cmFjZSBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuXG4gKlxuICogV2hhdCBpdCBpcyBOT1Q6IGEgcm9sbGJhY2sgbWVjaGFuaXNtLiBEZXNwaXRlIHRoZSBuYW1lLCB0aGVyZSBpcyBub1xuICogYWJvcnQvcm9sbGJhY2sgcGF0aCDigJQgd2hlbiBhIHN0YWdlIFRIUk9XUywgdGhlIGVuZ2luZSBzdGlsbCBjb21taXRzXG4gKiBldmVyeXRoaW5nIHN0YWdlZCBzbyBmYXIgYmVmb3JlIHJlLXRocm93aW5nIChjb21taXQtb24tZXJyb3IgaW5cbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXJgKS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgYXVkaXQgdHJhaWwgbXVzdCByZWNvcmRcbiAqIHdoYXQgdGhlIGZhaWxpbmcgc3RhZ2UgY2hhbmdlZC4gRG8gbm90IHJlbHkgb24gXCJzdGFnZSBmYWlsZWQg4oaSIGl0c1xuICogd3JpdGVzIHZhbmlzaGVkXCIuXG4gKlxuICogVGhlIHBhdGNoIHRyZWVzIGhvbGQgUkVGRVJFTkNFUyB1bnRpbCBjb21taXQgKDkuMjMuMCkuIEEgYHNldGAgc3RvcmVzIHRoZVxuICogY2FsbGVyJ3Mgb3duIHZhbHVlIGluIGBvdmVyd3JpdGVQYXRjaGAgZXhhY3RseSBhcyBpdCBhbHdheXMgZGlkIGluXG4gKiBgd29ya2luZ0NvcHlgOyB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHRha2VuIE9OQ0UgcGVyIHN1cnZpdmluZyBwYXRoXG4gKiB3aGVuIHRoZSBwYXlsb2FkIGxlYXZlcyB0aGUgYnVmZmVyIChgdG9DaGFuZ2VPbmx5UGF5bG9hZGAgL1xuICogYHRvRGVsdGFQYXlsb2FkYCDigJQgZXZlcnkgdmFsdWUgdGhleSBlbWl0IHBhc3NlcyB0aHJvdWdoIGBzdHJ1Y3R1cmVkQ2xvbmVgXG4gKiB0aGVyZSkuIFRoZSBsYXcgXCJ0aGUgcmVjb3JkIG5ldmVyIGFsaWFzZXMgYSBjYWxsZXIncyBvYmplY3RcIiBpcyBrZXB0IGF0XG4gKiB0aGUgY29tbWl0IGJvdW5kYXJ5IGluc3RlYWQgb2YgYXQgZXZlcnkgd3JpdGUsIHdoaWNoIGlzIHdoYXQgbWFrZXMgTlxuICogd3JpdGVzIHRvIG9uZSBwYXRoIE8oTikgaW5zdGVhZCBvZiBPKE4gw5cgc2l6ZSkuIENvbnNlcXVlbmNlLCBieSBkZXNpZ246IGFcbiAqIGNhbGxlciB3aG8gbXV0YXRlcyBpdHMgb3duIG9iamVjdCBBRlRFUiB0aGUgd3JpdGUgYW5kIEJFRk9SRSB0aGUgc3RhZ2VcbiAqIGVuZHMgY29tbWl0cyB0aGUgdmFsdWUgYXMgdGhlIHN0YWdlIHJlYWQgaXQgYmFjayDigJQgdGhlIHJlY29yZCBhZ3JlZXMgd2l0aFxuICogdGhlIHN0YWdlIChDTEFVREUubWQgbGFuZG1pbmUgMydzIGZpcnN0IGJpdGUsIGNsb3NlZCkuIFRoZSBvbmUgcGxhY2UgdGhlXG4gKiBlbmdpbmUgaXRzZWxmIGVkaXRzIFRIUk9VR0ggYSBzdGFnZWQgdmFsdWUg4oCUIGEgbGF0ZXIgbmVzdGVkIG9wIHVuZGVyIGFcbiAqIGBzZXRgIHBhdGgg4oCUIGRldGFjaGVzIHRoYXQgdmFsdWUgZmlyc3QgKHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfSksIHNvXG4gKiBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIG5ldmVyIHNoYXJlIGEgY29udGFpbmVyIHRoZSBlbmdpbmVcbiAqIG11dGF0ZXMgb24gb25lIHNpZGUgb25seS5cbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLiBUaGVcbiAqIGJ1ZmZlciBubyBsb25nZXIgY2xvbmVzIHRoZSBjb21taXR0ZWQgc3RhdGUgaXQgc3RhcnRzIGZyb20uIGBiYXNlU25hcHNob3RgXG4gKiBJUyB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQgKGhlbGQgYnkgcmVmZXJlbmNlIOKAlFxuICogY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwKSwgYW5kIGB3b3JraW5nQ29weWAgc3RhcnRzIGFzIGFcbiAqIGNvcHkgb2YgaXRzIFJPT1Qgb25seTogZWFjaCB3cml0ZSBjb3BpZXMgdGhlIGNvbnRhaW5lcnMgb24gaXRzIG93biBwYXRoXG4gKiAoe0BsaW5rIG93blNwaW5lfSksIGFuZCB0aGUgZmlyc3QgUkVBRCBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBvZiBhXG4gKiBjb250YWluZXIgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlIHRha2VzIGEgcHJpdmF0ZSBkZWVwIGNvcHkgb2ZcbiAqIGl0ICh7QGxpbmsgcHJpdmF0aXNlfSkg4oCUIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBldmVyeVxuICogcmVhZCwgc28gYW4gaW4tcGxhY2UgZWRpdCBvZiBhIHJlYWQgdmFsdWUgc3RheXMgcHJpdmF0ZSBleGFjdGx5IGFzIGl0IGRpZC5cbiAqIEEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIgaXMgc2VydmVkIGZyb20gbGl2ZSBzdGF0ZSBieSB0aGVcbiAqIGNhbGxlciwgYXMgYmVmb3JlOyB0aGUgYnVmZmVyIHRoZW4gcmVwbGFjZXMgdGhhdCBwYXRoIG9mIGl0cyBkaWZmIGJhc2VcbiAqIHdpdGggYSBwcml2YXRlIGNvcHkgKHtAbGluayBkZXRhY2hCYXNlfSksIGFzIHRoZSBjbG9uZSBoYWQgaXQuXG4gKlxuICogVEhFIEFETUlUVEVEIFJFQ09SRCAoOS4zMC4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZCkuIEFcbiAqIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGUgc3RhZ2Unc1xuICogcmVhZC15b3VyLXdyaXRlcyB2aWV3IGF0IGV2ZXJ5IHBhdGggdGhlIHN0YWdlIHRvdWNoZWQgKGFuZCBhdCBldmVyeVxuICogY29udGFpbmVyIGl0cyB3cml0ZXMgY3JlYXRlZCBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzKS5cbiAqIEJvdGggZW5jb2RlcnMgY29tbWl0IHRoZSB2YWx1ZSB0aGUgc3RhZ2UgcmVhZDogYSBjb21wYWN0IHJvdyDigJQgYSBgbWVyZ2VgXG4gKiBkZWx0YSwgYW4gYGFwcGVuZGAgdGFpbCDigJQgaXMga2VwdCB3aGVyZSBpdCBwcm92YWJseSBmb2xkcyBiYWNrOyBhIGZhbWlseSBvZlxuICogcm93cyB0aGF0IGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHZhbHVlcyB0aGUgc3RhZ2UgcmVhZFxuICogKHtAbGluayBhZG1pdH0pLiBCZWZvcmUgOS4zMC4wIHRoZSBvbmUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgcGVyIHBhdGggd2FzXG4gKiByZXBsYXllZCBhdCBldmVyeSBgbWVyZ2VgIHJvdyBvZiB0aGF0IHBhdGgsIHdoaWNoIGxpZWQgYWNyb3NzIGEgaGFyZCB3cml0ZVxuICogKGAkdXBkYXRlKGsse3h9KTsgayA9IHt5fTsgJHVwZGF0ZShrLHt6fSlgIGNvbW1pdHRlZCBge3ksIHgsIHp9YCBmb3IgYVxuICogcmVhZC1iYWNrIG9mIGB7eSwgen1gKSwgYW4gYFtdYCBjbGVhciwgYSBraW5kIGNoYW5nZSBvciBhbiBhcnJheSB1bmlvblxuICogZGVkdXBsaWNhdGVkIGJ5IHJlZmVyZW5jZS4gVmVyaWZpZWQgd2hlbiB0aGUgc3RhZ2Ugc3RhZ2VkIGEgYG1lcmdlYCBvciBhXG4gKiBuZXN0ZWQgb3A7IGEgc3RhZ2UgdGhhdCBzdGFnZWQgb25seSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXJcbiAqIGl0cyBhZGRyZXNzIGlzIGNvaGVyZW50IGJ5IGNvbnN0cnVjdGlvbiDigJQgYm90aCB0cmVlcyByZWNlaXZlIHRoZSBzYW1lXG4gKiB3cml0ZSDigJQgYW5kIGlzIGFkbWl0dGVkIHdpdGhvdXQgdGhlIGZvbGQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBGYW1pbHksIHR5cGUgTG9zc3ksIHR5cGUgTWVtYmVyLCB0eXBlIFJvd3MsIGFkZHJlc3NEZXB0aE9mLCBsb3NzeUZhbWlsaWVzIH0gZnJvbSAnLi9hZG1pc3Npb24uanMnO1xuaW1wb3J0IHsgdHlwZSBPcFZlcmIsIHR5cGUgU3Vydml2b3IsIGVtaXRJbkZhbWlseU9yZGVyLCBncm91cEludG9GYW1pbGllcywgcHVzaFZhbHVlUm93IH0gZnJvbSAnLi9kZWx0YUVuY29kaW5nLmpzJztcbmltcG9ydCB7IHJlbGF0aW9uIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQge1xuICBhZG9wdCxcbiAgaXNDb250YWluZXIsXG4gIG5hdGl2ZUdldCBhcyBfZ2V0LFxuICBuYXRpdmVTZXQgYXMgX3NldCxcbiAgb3duLFxuICBvd25DaGlsZCxcbiAgb3duZWRSb290T2YsXG4gIG93blNwaW5lLFxuICBzaGFsbG93Q29weSxcbn0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGVlcFNtYXJ0TWVyZ2UsIERFTElNLCBkcnlGb2xkLCBub3JtYWxpc2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gIC8qKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBkaWZmIGJhc2U6IHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3RcbiAgICogdG91Y2hlZCwgYnkgcmVmZXJlbmNlIOKAlCBleGNlcHQgd2hlcmUge0BsaW5rIGRldGFjaEJhc2V9IHJlcGxhY2VkIGEgcGF0aFxuICAgKiBvZiBpdCB3aXRoIGEgcHJpdmF0ZSBjb3B5IChpdHMgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBhcmVcbiAgICogdGhlbiBjb3BpZXMgdG9vLCBvd25lZCBieSB7QGxpbmsgYmFzZU93bmVkfSkuXG4gICAqL1xuICBwcml2YXRlIGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFBhdGhzIHdob3NlIGBvdmVyd3JpdGVQYXRjaGAgdmFsdWUgaXMgdGhlIGNhbGxlcidzIG93biBvYmplY3QgKDkuMjMuMCk6XG4gICAqIGEgYHNldGAgb2YgYSBjb250YWluZXIgc3RvcmVzIHRoZSByZWZlcmVuY2UsIGFuZCB0aGlzIGlzIHRoZSBsZWRnZXIgb2ZcbiAgICogd2hpY2ggb25lcyBhcmUgc3RpbGwgc2hhcmVkIHdpdGggdGhlIGNhbGxlciAoYW5kIHdpdGggYHdvcmtpbmdDb3B5YCkuXG4gICAqIENvbnN1bHRlZCBvbmx5IGJ5IHRoZSBlbmdpbmUncyBuZXN0ZWQgb3BzIOKAlCBzZWVcbiAgICoge0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9OyB0aGUgY29tbWl0IHBheWxvYWQgY2xvbmVzIGV2ZXJ5IHN1cnZpdmluZ1xuICAgKiB2YWx1ZSBhbnl3YXkgYW5kIG5ldmVyIGFza3MuIENsZWFyZWQgd2l0aCB0aGUgcmVzdCBhdCBgY29tbWl0KClgLlxuICAgKi9cbiAgcHJpdmF0ZSBoZWxkUmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKiogQ29tbWl0LXZhbHVlIGVuY29kaW5nIHBvbGljeSAoIzEzYy1CKS4gYCdmdWxsJ2AgPSBoaXN0b3JpY2FsIGJ5dGVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcblxuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBzb3VyY2UgKCNQMSkuIFdoZW4gc2V0ICh0aGVcbiAgICogIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgZXZlcnkgc3RhZ2VkIG9wIHNuYXBzaG90cyB0aGVcbiAgICogIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciDigJQgdGhlIHRlbXBvcmFsLXByZWZpeCBhdHRyaWJ1dGlvbiBjb25zdW1lZCBieVxuICAgKiAgY2F1c2FsIHNsaWNpbmcuIFVuZGVmaW5lZCAoZGVmYXVsdCkgPSB6ZXJvIGNvc3QsIGJ5dGUtaWRlbnRpY2FsIG9wcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIGluIGB3b3JraW5nQ29weWAgdGhpcyBidWZmZXIgQ1JFQVRFRDogaXRzIHJvb3QgY29weSwgdGhlXG4gICAqIHBhdGggY29waWVzIGl0cyB3cml0ZXMgbWFkZSwgdGhlIG1lcmdlIHJlc3VsdHMgaXQgYnVpbHQsIGFuZCBldmVyeVxuICAgKiBjb250YWluZXIgb2YgdGhlIHByaXZhdGUgY29waWVzIGl0cyByZWFkcyB0b29rLiBBIHdyaXRlIGVkaXRzIHRoZXNlIGluXG4gICAqIHBsYWNlLiBFdmVyeXRoaW5nIGVsc2UgaW4gYHdvcmtpbmdDb3B5YCBpcyBTSEFSRUQg4oCUIHdpdGggdGhlIGNvbW1pdHRlZFxuICAgKiBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkLCBvciB3aXRoIGEgdmFsdWUgdGhlIHN0YWdlIHN0YWdlZCDigJRcbiAgICogYW5kIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCAoe0BsaW5rIG93blNwaW5lfSkuXG4gICAqL1xuICBwcml2YXRlIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgdmFsdWVzIHRoZSBzdGFnZSBzdGFnZWQgd2l0aCB7QGxpbmsgc2V0fSDigJQgaXRzIG93biBvYmplY3RzLFxuICAgKiBoZWxkIGJ5IHJlZmVyZW5jZSAoOS4yMy4wKS4gQSByZWFkIGhhbmRzIHRoZW0gYmFjayBhcyB0aGV5IGFyZSwgZXhhY3RseVxuICAgKiBhcyB0aGUgcHJpdmF0ZSB3b3JraW5nIGNvcHkgYWx3YXlzIGRpZCwgYW5kIG5ldmVyIHByaXZhdGlzZXMgdGhlbTogYVxuICAgKiBwcml2YXRlIGNvcHkgb2YgYSBzdGFnZWQgdmFsdWUgd291bGQgbGVhdmUgYHdvcmtpbmdDb3B5YCBhbmRcbiAgICogYG92ZXJ3cml0ZVBhdGNoYCBkaXNhZ3JlZWluZyBhYm91dCBhIHZhbHVlIHRoZSBzdGFnZSB3cm90ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBPd25lZCBjb250YWluZXJzIHdpdGggbm8gY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZVxuICAgKiBhbnl3aGVyZSBiZWxvdyB0aGVtIChhIHByaXZhdGUgZGVlcCBjb3B5LCBhIG1lcmdlIHJlc3VsdCBidWlsdCBvbiBhXG4gICAqIHByaXZhdGUgYmFzZSwgYSBwYXRoIGNvcHkgd2hvc2Ugc2hhcmVkIGNoaWxkcmVuIHdlcmUgcHJpdmF0aXNlZCkuIEEgcmVhZFxuICAgKiB0aGF0IGxhbmRzIG9uIG9uZSBuZWVkcyBubyB3YWxrIOKAlCBzZWUge0BsaW5rIHByaXZhdGlzZUJlbG93fS5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBvZiB7QGxpbmsgYmFzZVNuYXBzaG90fSB0aGF0IHtAbGluayBkZXRhY2hCYXNlfSBjcmVhdGVkOlxuICAgKiBpdHMgcm9vdCBjb3B5IGFuZCB0aGUgY29waWVzIG9uIHRoZSB3YXkgdG8gYSBkZXRhY2hlZCBwYXRoLiBBbGxvY2F0ZWRcbiAgICogb25seSBieSB0aGUgZmlyc3QgZGV0YWNoIOKAlCB0aGUgaW4tY29udHJhY3Qgc3RhZ2UgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gICAqL1xuICBwcml2YXRlIGJhc2VPd25lZD86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgZGVlcCBjb3BpZXMge0BsaW5rIGRldGFjaEJhc2V9IHB1dCBpbnRvIHRoZSBkaWZmIGJhc2U6IG5vdGhpbmdcbiAgICogYXQgb3IgYmVsb3cgb25lIGlzIGNvbW1pdHRlZCBzdGF0ZSwgc28gYSBsYXRlciBkZXRhY2ggaW5zaWRlIGl0IGlzIGEgbm8tb3AuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaGVkQmFzZT86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIHN0YWdlIHdyaXRlcyAoOS4zMC4wKTogYFsncnVucycsIHJ1bklkXWAgZm9yIGEgcnVuLW5hbWVzcGFjZWRcbiAgICogc3RhZ2UsIGBbXWAgb3RoZXJ3aXNlLiBJdHMgY29udGFpbmVycyBhcmUgdGhlIHN0YWdlJ3MgQUREUkVTUywgbm90IGEgdmFsdWVcbiAgICogdGhlIHN0YWdlIHJlYWRzIChldmVyeSByZWFkIGl0IG1ha2VzIGlzIGEga2V5IGJlbG93IGl0KSwgc28gYSBzaGVsbCBhXG4gICAqIHdyaXRlIGxlYXZlcyB0aGVyZSBpcyBubyBwYXJ0IG9mIHRoZSByZWFkLWJhY2sgdGhlIHJlY29yZCBtdXN0IGhvbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBgbWVyZ2VgIG9wcyBzdGFnZWQgc2luY2UgdGhlIGxhc3QgY29tbWl0IOKAlCBzZWUge0BsaW5rIGFkbWl0fS4gKi9cbiAgcHJpdmF0ZSBzdGFnZWRNZXJnZXMgPSAwO1xuICAvKiogT3BzIHN0YWdlZCBkZWVwZXIgdGhhbiBvbmUga2V5IGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3Mg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIG5lc3RlZE9wcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZTogYW55LFxuICAgIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZSA9ICdmdWxsJyxcbiAgICByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW10sXG4gICAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKSB7XG4gICAgLy8gYGJhc2VgIGlzIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCDigJRcbiAgICAvLyBpbW11dGFibGUtYWZ0ZXItc3dhcCwgdGhlIGludmFyaWFudCB0aGUgZmlyc3QtdG91Y2ggdmlldyBhbHJlYWR5IHJlc3RzXG4gICAgLy8gb24g4oCUIHNvIHRoZSBkaWZmIGJhc2UgaXMgaGVsZCBieSBSRUZFUkVOQ0UsIGFuZCB0aGUgd29ya2luZyBjb3B5IHN0YXJ0c1xuICAgIC8vIGFzIGEgY29weSBvZiBpdHMgUk9PVCBvbmx5LiBCZWZvcmUgOS4yOS4wIHRoZXNlIHR3byBsaW5lcyB3ZXJlIHR3b1xuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgd2hvbGUgc3RhdGUsIHBhaWQgYnkgZXZlcnkgc3RhZ2UgdGhhdCB3cm90ZS5cbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IGJhc2U7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IG93bmVkUm9vdE9mKGJhc2UsIHRoaXMub3duZWQpO1xuICAgIHRoaXMuY29tbWl0VmFsdWVzID0gY29tbWl0VmFsdWVzO1xuICAgIHRoaXMucmVhZEtleXNQcm92aWRlciA9IHJlYWRLZXlzUHJvdmlkZXI7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgY3VycmVudCByZWFkIHByZWZpeCBvbnRvIGEgc3RhZ2VkIG9wIOKAlCBvbmx5IHdoZW4gdGhlXG4gICAqICBwcm92ZW5hbmNlIGRpYWwgaXMgb24gKHByb3ZpZGVyIHByZXNlbnQpLCBzbyB0aGUgZGVmYXVsdCBwYXRoIGFsbG9jYXRlc1xuICAgKiAgbm90aGluZyBhbmQgY29tbWl0IGJ1bmRsZXMgc3RheSBieXRlLWlkZW50aWNhbC4gKi9cbiAgcHJpdmF0ZSBzdGFtcFJlYWRLZXlzKG9wOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH0pOiB0eXBlb2Ygb3Age1xuICAgIGlmICh0aGlzLnJlYWRLZXlzUHJvdmlkZXIpIG9wLnJlYWRLZXlzID0gdGhpcy5yZWFkS2V5c1Byb3ZpZGVyKCk7XG4gICAgcmV0dXJuIG9wO1xuICB9XG5cbiAgLyoqIFN0YWdlIGFuIG9wIGludG8gYG9wVHJhY2VgLCBjb3VudGluZyB3aGF0IGRlY2lkZXMgd2hldGhlciB7QGxpbmsgYWRtaXR9IG11c3QgZm9sZC4gKi9cbiAgcHJpdmF0ZSBzdGFnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBrZXk6IHN0cmluZywgdmVyYjogT3BWZXJiKTogdm9pZCB7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHRoaXMuc3RhZ2VkTWVyZ2VzKys7XG4gICAgaWYgKHBhdGgubGVuZ3RoIC0gYWRkcmVzc0RlcHRoT2YocGF0aCwgdGhpcy5hZGRyZXNzKSA+IDEpIHRoaXMubmVzdGVkT3BzKys7XG4gICAgdGhpcy5vcFRyYWNlLnB1c2godGhpcy5zdGFtcFJlYWRLZXlzKHsgcGF0aDoga2V5LCB2ZXJiIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIFN0b3JlcyB0aGUgUkVGRVJFTkNFIGluIGJvdGggdHJlZXNcbiAgICogKDkuMjMuMCkg4oCUIHRoZSByZWNvcmQncyBjb3B5IGlzIHRha2VuIG9uY2UsIGF0IGNvbW1pdDsgc2VlIHRoZSBoZWFkZXIuXG4gICAqL1xuICBzZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoaXNDb250YWluZXIodmFsdWUpKSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmFkZChrZXkpO1xuICAgICAgdGhpcy5zdGFnZWQuYWRkKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ3NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbmVzdGVkIG9wIGlzIGFib3V0IHRvIHdyaXRlIFRIUk9VR0ggYSBwYXRoIHdob3NlIGBvdmVyd3JpdGVQYXRjaGBcbiAgICogdmFsdWUgaXMgYSBoZWxkIHJlZmVyZW5jZSAoOS4yMy4wKS4gVG9kYXkncyBsYXcgaXMgdGhhdCB0aGUgdHdvIHRyZWVzXG4gICAqIHJlY2VpdmUgdGhlIHNhbWUgbmVzdGVkIGBzZXRgL2BkZWxldGVgIG11dGF0aW9ucyBidXQgT05MWSBgd29ya2luZ0NvcHlgXG4gICAqIHJlY2VpdmVzIGEgbmVzdGVkIGBtZXJnZWAncyByZXN1bHQgKGB1cGRhdGVQYXRjaGAgZ2V0cyB0aGUgZGVsdGEpIOKAlCBzbyBhXG4gICAqIGNvbnRhaW5lciBzaGFyZWQgYmV0d2VlbiB0aGUgdHJlZXMgd291bGQgbGVhayB0aGUgbWVyZ2VkIHZhbHVlIGludG8gdGhlXG4gICAqIG92ZXJ3cml0ZSBwYXlsb2FkLCBhbmQgYSBzaGFyZWQgY29udGFpbmVyIGlzIGFsc28gdGhlIGNhbGxlcidzIG93blxuICAgKiBvYmplY3QsIHdoaWNoIHRoZSBlbmdpbmUgbXVzdCBub3QgZWRpdCBvbiB0aGUgcmVjb3JkJ3MgYmVoYWxmLiBSZXBsYWNpbmdcbiAgICogdGhlIGhlbGQgYW5jZXN0b3Igd2l0aCBpdHMgY2xvbmUgaW4gYG92ZXJ3cml0ZVBhdGNoYCByZXN0b3JlcyBleGFjdGx5XG4gICAqIHRoZSBwcml2YXRlIHRyZWUgdGhlIHBlci13cml0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgaXQsIHBhaWQgb25jZSBwZXJcbiAgICogYW5jZXN0b3IgYW5kIG9ubHkgb24gdGhlIG5lc3RlZC1vcCBwYXRoIHRoZSBwdWJsaWMgc3VyZmFjZSBuZXZlciB0YWtlc1xuICAgKiAodGhlIHNjb3BlIHByb3h5IHdyaXRlcyBST09UIGtleXMpLiBgd29ya2luZ0NvcHlgIGtlZXBzIHRoZSByZWZlcmVuY2UsXG4gICAqIGFzIGl0IGFsd2F5cyBkaWQuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaEhlbGRBbmNlc3RvcnMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlbGRSZWZzLnNpemUgPT09IDApIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGF0aC5zbGljZSgwLCBpKTtcbiAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgoYW5jZXN0b3IpO1xuICAgICAgaWYgKCF0aGlzLmhlbGRSZWZzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGhlbGQgPSBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yKTtcbiAgICAgIGlmIChoZWxkICE9PSBudWxsICYmIHR5cGVvZiBoZWxkID09PSAnb2JqZWN0JykgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBhbmNlc3Rvciwgc3RydWN0dXJlZENsb25lKGhlbGQpKTtcbiAgICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGtleSBkZWxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKCMxM2MtQjsgYWJzb3JicyBiYWNrbG9nIEI4KS5cbiAgICpcbiAgICogU3RhZ2VzIEVYQUNUTFkgdGhlIHNhbWUgYnVmZmVyIG11dGF0aW9ucyBhcyBgc2V0KHBhdGgsIHVuZGVmaW5lZClgIOKAlFxuICAgKiBgd29ya2luZ0NvcHlgL2BvdmVyd3JpdGVQYXRjaGAgZ2V0IGFuIG93biBgdW5kZWZpbmVkYCBhdCB0aGUgcGF0aCAodGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZywgcHJlc2VydmluZyByZWFkIGJlaGF2aW9yIGFuZCB0aGUgZGVkdXAgZGlmZiBiYXNlXG4gICAqIGFjcm9zcyBtb2Rlcykg4oCUIGJ1dCByZWNvcmRzIHRoZSBvcCB2ZXJiIGFzIGAnZGVsZXRlJ2AuIEF0IGNvbW1pdDpcbiAgICogYCdmdWxsJ2AgbW9kZSBtYXBzIGl0IGJhY2sgdG8gYSBgJ3NldCdgIHRyYWNlIGVudHJ5IChieXRlLWlkZW50aWNhbCB0b1xuICAgKiB0b2RheSk7IGAnZGVsdGEnYCBtb2RlIGVtaXRzIGEgcmVhbCBgJ2RlbGV0ZSdgIGVudHJ5IHdob3NlIHJlcGxheVxuICAgKiBSRU1PVkVTIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGBrZXk6IHVuZGVmaW5lZGAgYmVoaW5kLlxuICAgKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBmaWx0ZXIgcmVhZHMgdGhhdCBzdGFnZWQgb3duIGB1bmRlZmluZWRgIGFzIEFCU0VOVFxuICAgKiAoYGRlZXBFcXVhbGAsIDkuMTkuMSkg4oCUIHNvIHVuZGVyIGAnZGVsdGEnYCwgd2hvc2UgY29tbWl0dGVkIHN0YXRlIHJlYWxseVxuICAgKiBsYWNrcyB0aGUga2V5LCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGluc2lkZSBhIGNvbnRhaW5lciB0aGUgc3RhZ2UgYWxzb1xuICAgKiByZS13cm90ZSBpcyB0aGUgbm8tb3AgaXQgaXMsIG5vdCBhIGBzZXRgIG9mIHRoZSB3aG9sZSBjb250YWluZXIuXG4gICAqL1xuICBkZWxldGUocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBgZGVlcFNtYXJ0TWVyZ2VgIGJ1aWxkcyBmcmVzaFxuICAgKiAgY29udGFpbmVycywgc28gbmVpdGhlciB0cmVlIGV2ZXIgaG9sZHMgdGhlIG1lcmdlIElOUFVUIGJ5IHJlZmVyZW5jZTtcbiAgICogIHRoZSBuZXN0ZWQtb3AgZGV0YWNoIGd1YXJkcyB0aGUgYW5jZXN0b3IgaXQgd3JpdGVzIElOVE8uXG4gICAqXG4gICAqICBUaGUgdmFsdWUgbWVyZ2VkIElOVE8gaXMgbWFkZSBwcml2YXRlIGZpcnN0IChgcHJpdmF0aXNlYCksIGFzIHRoZVxuICAgKiAgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBpdCBiZWZvcmUgOS4yOS4wLiBOb3Qgb25seSBmb3IgdGhlIHJlYWRzIHRoYXRcbiAgICogIGZvbGxvdzogYGRlZXBTbWFydE1lcmdlYCB1bmlvbnMgYXJyYXlzIEJZIFJFRkVSRU5DRSwgc28gd2hldGhlciBhblxuICAgKiAgZWxlbWVudCB0aGUgc3RhZ2UgcGFzc2VzIGluIGlzIFwiYWxyZWFkeSB0aGVyZVwiIGRlcGVuZHMgb24gd2hpY2ggb2JqZWN0c1xuICAgKiAgdGhlIGJhc2UgaG9sZHMg4oCUIGEgY29tbWl0dGVkIGFycmF5IHdvdWxkIGRlZHVwIGFuIGVsZW1lbnQgdGhlIHN0YWdlXG4gICAqICByZWFkIGZyb20gaXQgYmVmb3JlIGl0cyBmaXJzdCB3cml0ZSwgd2hlcmUgdGhlIHByaXZhdGUgY29weSAoYW5kXG4gICAqICA5LjI4LjApIGFwcGVuZHMgaXQuICovXG4gIG1lcmdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpID8/IHt9O1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBTbWFydE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgb3duKG1lcmdlZCwgdGhpcy5vd25lZCk7XG4gICAgaWYgKGlzQ29udGFpbmVyKG1lcmdlZCkpIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChtZXJnZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ21lcmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmllbGQtbGV2ZWwgcmVkYWN0aW9uICg5LjE5LjApOiBtYXJrIGRvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlIHN0YWdlZCBhdFxuICAgKiBgcGF0aGAgYXMgc2VjcmV0LCBzbyBgc2NydWJQYXRjaGAgc2NydWJzIHRoZW0gaW4gdGhlIGNvbW1pdCBsb2cgYW5kIHRoZVxuICAgKiBtaXJyb3IgdGhlIHNhbWUgd2F5IGEgd2hvbGUta2V5IHJlZGFjdGlvbiBpcyBzY3J1YmJlZC4gQSBmaWVsZCBpc1xuICAgKiByZWdpc3RlcmVkIGFzIGEgbGl0ZXJhbCBrZXkgQU5ELCB3aGVuIGRvdHRlZCwgYXMgdGhlIG5lc3RlZCBwYXRoIGl0XG4gICAqIG5hbWVzIOKAlCB3aGljaGV2ZXIgZXhpc3RzIGluIHRoZSBwYXRjaCBpcyB0aGUgb25lIGBzY3J1YlBhdGNoYCBmaW5kcy5cbiAgICogTWFya2VkIHBhdGhzIHN1cnZpdmUgY29tbWl0IG9ubHkgd2hpbGUgdGhlIG9wIHBhdGggdGhleSBzaXQgdW5kZXIgZG9lc1xuICAgKiAoc2VlIHtAbGluayBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzfSkuXG4gICAqL1xuICBtYXJrUmVkYWN0ZWRGaWVsZHMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgoWy4uLnBhdGgsIGZpZWxkXSkpO1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKCcuJykpIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgLi4uZmllbGQuc3BsaXQoJy4nKV0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHJlZGFjdGlvbiBtYXJrIGFkZHJlc3MgYW4gYXJyYXkgRUxFTUVOVCByaWdodCBiZWxvdyBgcGF0aGBcbiAgICogKGBsaXN0LjEudG9rZW5gKT8gQW4gYGFwcGVuZGAgcm93IHJlLWJhc2VzIHRoZSBpbmRpY2VzIG9udG8gdGhlIHRhaWwsIHNvXG4gICAqIHN1Y2ggYSBwYXRoIHRha2VzIHRoZSB3aG9sZS12YWx1ZSBgc2V0YCAoYGRlbHRhRW5jb2RpbmcgwrcgcHVzaFZhbHVlUm93YCkuXG4gICAqIEEgbWFyayBieSBOQU1FIGJlbG93IGFuIGFycmF5IChgb2JqLnlgKSBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiB0aGUgdGFpbFxuICAgKiBhcyBvbiB0aGUgd2hvbGUgdmFsdWUsIHNvIHRoZSBjb21wYWN0IHJvdyBzdGF5cyAoYnl0ZS1pZGVudGljYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWRCZWxvdyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXggPSBwYXRoICsgREVMSU07XG4gICAgZm9yIChjb25zdCBtYXJrZWQgb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoIW1hcmtlZC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmV4dCA9IG1hcmtlZC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdChERUxJTSlbMF07XG4gICAgICBpZiAoL14oMHxbMS05XVxcZCopJC8udGVzdChuZXh0KSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0ZWQgcGF0aHMgdGhhdCBzdXJ2aXZlIHRoZSBuZXQtY2hhbmdlIGZpbHRlcjogYSBwYXRoIHN1cnZpdmVzXG4gICAqIHdoZW4gaXQgSVMgYSBzdXJ2aXZpbmcgb3AgcGF0aCAoYSB3aG9sZS1rZXkgcmVkYWN0aW9uKSBvciBzaXRzIFVOREVSIG9uZVxuICAgKiAoYSBmaWVsZCBpbnNpZGUgYSBzdXJ2aXZpbmcgd3JpdGUpLiBBIGRyb3BwZWQgb3AgdGFrZXMgaXRzIGZpZWxkcyB3aXRoIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKHN1cnZpdmluZ1BhdGhzOiBTZXQ8c3RyaW5nPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgIG91dC5hZGQocGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcCBvZiBzdXJ2aXZpbmdQYXRocykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKG9wICsgREVMSU0pKSB7XG4gICAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gVGhlIHZhbHVlIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biDigJQgcHJpdmF0ZSB0byBpdCwgYXMgdGhlIHdob2xlLXN0YXRlIGNsb25lIG1hZGUgZXZlcnkgcmVhZFxuICAgKiBhZnRlciB0aGUgZmlyc3Qgd3JpdGUgYmVmb3JlIDkuMjkuMCAoYHByaXZhdGlzZWApLlxuICAgKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHRoaXMucHJpdmF0aXNlKHBhdGgpO1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgd29ya2luZyBjb3B5IGF0IGBwYXRoYCBXSVRIT1VUIHRha2luZyBhIHByaXZhdGUgY29weSDigJQgZm9yIGFcbiAgICogcmVhZGVyIHRoYXQgb25seSBjb21wYXJlcyAodGhlIGRldi1tb2RlIGJvcnJvd2VkLW11dGF0aW9uIHJlcG9ydCBpblxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdGApLCBuZXZlciBmb3IgYSB2YWx1ZSBoYW5kZWQgdG8gYSBzdGFnZS5cbiAgICovXG4gIHBlZWsocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCB1bmRlciBhIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyLlxuICAgKlxuICAgKiBXaGVuIGB3b3JraW5nQ29weWAgaG9sZHMgbm90aGluZyBhdCBgcGF0aGAg4oCUIHRoZSBzdGFnZSBkZWxldGVkIG9yIHVuc2V0XG4gICAqIGl0LCBvciBhIHdyaXRlIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0IOKAlCBgU3RhZ2VDb250ZXh0IMK3XG4gICAqIHJlYWRTdGF0ZWAgc2VydmVzIHRoZSByZWFkIGZyb20gTElWRSBjb21taXR0ZWQgc3RhdGUsIGV4YWN0bHkgYXMgOS4yOC4wXG4gICAqIGRpZCwgc28gdGhlIHZhbHVlIGl0IGhhbmRzIG91dCBpcyBjb21taXR0ZWQgc3RhdGUgaXRzZWxmLiBPbiA5LjI4LjAgdGhlXG4gICAqIGRpZmYgYmFzZSB3YXMgYSB3aG9sZS1zdGF0ZSBjbG9uZSB0YWtlbiBhdCB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSwgYW5kXG4gICAqIGFuIGluLXBsYWNlIGVkaXQgb2YgdGhhdCB2YWx1ZSAob3V0IG9mIGNvbnRyYWN0IOKAlCByZWFkcyBhcmUgYm9ycm93ZWQpXG4gICAqIGNvdWxkIG5vdCBtb3ZlIGl0OiB3cml0dGVuIGJhY2ssIHRoZSBlZGl0IHdhcyByZWNvcmRlZC4gSGVyZSB0aGUgZGlmZlxuICAgKiBiYXNlIElTIGEgY29tbWl0dGVkIGdlbmVyYXRpb24sIGFuZCBpdCB2ZXJ5IG9mdGVuIGhvbGRzIHRoYXQgc2FtZVxuICAgKiBjb250YWluZXIgYXQgYHBhdGhgIOKAlCB0aGUgZWRpdCB3b3VsZCBtb3ZlIHRoZSBiYXNlIHdpdGggaXQsIGFuZCB0aGVcbiAgICogd3JpdGUtYmFjayB3b3VsZCBjb21taXQgbm8gY2hhbmdlLiBTbyBiZWZvcmUgdGhlIHZhbHVlIGdvZXMgb3V0LCB0aGVcbiAgICogYmFzZSdzIHZhbHVlIGF0IGBwYXRoYCBpcyByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5ICh0aGUgYmFzZSdzXG4gICAqIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgY29waWVkIHNoYWxsb3dseSkg4oCUIHdoYXQgOS4yOC4wJ3NcbiAgICogYmFzZSBoZWxkIHRoZXJlLiBUaGUgY29tbWl0J3MgbmV0LWNoYW5nZSB0ZXN0IGNvbXBhcmVzIGFnYWluc3QgaXQgYW5kXG4gICAqIHRoZSBkZWx0YSBlbmNvZGVyIHJlcGxheXMgZnJvbSBpdDsgdGhlIHZhbHVlIGhhbmRlZCBvdXQgc3RheXMgdGhlIGxpdmVcbiAgICogb25lLCBzbyB3aGF0ZXZlciBlbHNlIGFuIGVkaXQgb2YgaXQgcmVhY2hlcyAobGl2ZSBzdGF0ZSwgdGhlIG5leHRcbiAgICogZ2VuZXJhdGlvbikgYmVoYXZlcyBhcyBvbiA5LjI4LjAgdG9vLlxuICAgKlxuICAgKiBOb3QgYHByaXZhdGlzZWA6IGEgcHJpdmF0ZSBjb3B5IGhhbmRlZCB0byB0aGUgc3RhZ2Ugd291bGQgYWxzbyBrZWVwIHRoZVxuICAgKiBlZGl0IG91dCBvZiBsaXZlIHN0YXRlLCB3aGVyZSA5LjI4LjAgbGV0IGl0IGluIOKAlCBhIHJ1bi1uYW1lc3BhY2VkIHJlYWRcbiAgICogdGhhdCBmYWxscyBiYWNrIHRvIGEgZ2xvYmFsIGtleSB3b3VsZCB0aGVuIGVuZCBkaWZmZXJlbnRseSAodGhlXG4gICAqIGRpZmZlcmVudGlhbCdzIE5FU1RFRCBmYW1pbHkgZmFpbHMgd2l0aGluIDEwMCBwcm9ncmFtcyB0aGF0IHdheSkuXG4gICAqXG4gICAqIENvcGllcyBub3RoaW5nIHdoZW4gdGhlIGJhc2UgaG9sZHMgbm8gY29udGFpbmVyIGF0IGBwYXRoYCwgYW5kIG5vdGhpbmdcbiAgICogdHdpY2U6IGEgcGF0aCBhdCBvciBiZWxvdyBhbiBlYXJsaWVyIGRldGFjaCBpcyBhbHJlYWR5IHByaXZhdGUuIE8ocGF0aClcbiAgICogb3RoZXJ3aXNlLCBwbHVzIE8odmFsdWUpIG9uY2UgcGVyIGRldGFjaGVkIHBhdGguXG4gICAqL1xuICBkZXRhY2hCYXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgfHwgIWlzQ29udGFpbmVyKHRoaXMuYmFzZVNuYXBzaG90KSkgcmV0dXJuO1xuICAgIGxldCBhdDogb2JqZWN0ID0gdGhpcy5iYXNlU25hcHNob3Q7XG4gICAgZm9yIChjb25zdCBrIG9mIHBhdGgpIHtcbiAgICAgIGlmICh0aGlzLmRldGFjaGVkQmFzZT8uaGFzKGF0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGNoaWxkKSkgcmV0dXJuO1xuICAgICAgYXQgPSBjaGlsZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgY29uc3Qgb3duZWQgPSAodGhpcy5iYXNlT3duZWQgPz89IG5ldyBXZWFrU2V0PG9iamVjdD4oKSk7XG4gICAgaWYgKCFvd25lZC5oYXModGhpcy5iYXNlU25hcHNob3QpKSB0aGlzLmJhc2VTbmFwc2hvdCA9IG93bmVkUm9vdE9mKHRoaXMuYmFzZVNuYXBzaG90LCBvd25lZCk7XG4gICAgb3duU3BpbmUodGhpcy5iYXNlU25hcHNob3QsIHBhdGgsIG93bmVkKTtcbiAgICBjb25zdCBjb3B5OiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYXQpO1xuICAgICh0aGlzLmRldGFjaGVkQmFzZSA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKS5hZGQoY29weSk7XG4gICAgX3NldCh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgY29weSk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSByZWFkcyAoOS4yOS4wKTogbWFrZSB0aGUgdmFsdWUgYXQgYHBhdGhgIHRoZSBzdGFnZSdzIG93biBiZWZvcmVcbiAgICogYSByZWFkIGhhbmRzIGl0IG91dCDigJQgc28gYSByZWFkIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIGJlaGF2ZXNcbiAgICogZXhhY3RseSBhcyBpdCBkaWQgd2hlbiB0aGUgYnVmZmVyIGJlZ2FuIHdpdGggYSBkZWVwIGNsb25lIG9mIHRoZSB3aG9sZVxuICAgKiBzdGF0ZS4gQW4gaW4tcGxhY2UgZWRpdCBvZiB3aGF0IHRoZSByZWFkIHJldHVybmVkIChvdXQgb2YgY29udHJhY3Qg4oCUXG4gICAqIHJlYWRzIGFyZSBib3Jyb3dlZCkgc3RheXMgaW5zaWRlIHRoZSBidWZmZXIsIGFuZCBjb21taXR0ZWQgc3RhdGUgaXMgbmV2ZXJcbiAgICogdG91Y2hlZC4gV2hldGhlciB0aGUgUkVDT1JEIGtlZXBzIGl0IGlzIHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXdcbiAgICogKDkuMzAuMCwgb3duZXIgcnVsaW5nIFIxIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHdoYXQgdGhlIHN0YWdlIHJlYWQgYmFjayk6IGl0XG4gICAqIGlzIGtlcHQgd2hlbiB0aGUgZWRpdGVkIHZhbHVlIGxpZXMgYXQgb3IgYmVsb3cgYSBwYXRoIHRoZSBzdGFnZSB3cm90ZSBpblxuICAgKiB0aGlzIHN0YWdlIOKAlCBzZXQsIG1lcmdlZCBvciB3cml0dGVuIGJhY2sgYWxpa2Ug4oCUIGFuZCBsb3N0IG90aGVyd2lzZS5cbiAgICpcbiAgICogV2Fsa2luZyB0aGUgcGF0aCBmcm9tIHRoZSAob3duZWQpIHJvb3Q6XG4gICAqICAtIGEgY29udGFpbmVyIHN0aWxsIFNIQVJFRCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpc1xuICAgKiAgICByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5IHdoZW4gaXQgaXMgdGhlIHZhbHVlIHJlYWQsIG9yIGJ5IGFcbiAgICogICAgc2hhbGxvdyBjb3B5IHdoZW4gaXQgaXMgYSBjb250YWluZXIgb24gdGhlIHdheSB0byBpdCAoc28gYSByZWFkIG9mXG4gICAqICAgIGBydW5zLzxpZD4va2AgY29waWVzIGBrYCwgbm90IGV2ZXJ5IHJ1bidzIG5hbWVzcGFjZSk7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBzdGFnZSBTVEFHRUQgKG9yIGFueXRoaW5nIGVsc2UgdGhlIGJ1ZmZlciBkaWQgbm90XG4gICAqICAgIHRha2UgZnJvbSBjb21taXR0ZWQgc3RhdGUpIGlzIGhhbmRlZCBiYWNrIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlO1xuICAgKiAgLSBhIGNvbnRhaW5lciB0aGUgYnVmZmVyIG93bnMgaXMgd2Fsa2VkIG9uIOKAlCBhbmQgd2hlbiBpdCBpcyB0aGUgdmFsdWVcbiAgICogICAgcmVhZCwgaXRzIHN0aWxsLXNoYXJlZCBkZXNjZW5kYW50cyBhcmUgcHJpdmF0aXNlZFxuICAgKiAgICAoe0BsaW5rIHByaXZhdGlzZUJlbG93fSkuXG4gICAqXG4gICAqIENvc3Q6IE8ocGF0aCkgcGVyIHJlYWQsIHBsdXMgTyh2YWx1ZSkgT05DRSBwZXIgc2hhcmVkIGNvbnRhaW5lciBhIHN0YWdlXG4gICAqIHJlYWRzIGFmdGVyIGl0cyBmaXJzdCB3cml0ZS4gQSBzdGFnZSB0aGF0IG5ldmVyIHJlYWRzIGFmdGVyIHdyaXRpbmcgcGF5c1xuICAgKiBub3RoaW5nOyBhIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBuZXZlciByZWFjaGVzIHRoZSBidWZmZXIuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgLy8gUmVzb2x2ZSBmaXJzdDogYSByZWFkIHRoYXQgbGFuZHMgb24gbm90aGluZyAoYSBtaXNzaW5nIGtleSwgYSByZWZ1c2VkXG4gICAgLy8gc2VnbWVudCwgYSBwcmltaXRpdmUpIHJldHVybnMgbm90aGluZyBhbmQgbXVzdCBjb3B5IG5vdGhpbmcuXG4gICAgY29uc3QgY2hhaW46IG9iamVjdFtdID0gW107XG4gICAgbGV0IGF0OiB1bmtub3duID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgYXQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGF0KSkgcmV0dXJuO1xuICAgICAgY2hhaW4ucHVzaChhdCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMud29ya2luZ0NvcHk7XG4gICAgbGV0IGJhc2U6IHVua25vd24gPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQoYmFzZSwgayk7XG4gICAgICBsZXQgdmFsdWUgPSBjaGFpbltpXTtcbiAgICAgIGlmICghdGhpcy5vd25lZC5oYXModmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gYXRCYXNlIHx8IHRoaXMuc3RhZ2VkLmhhcyh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKGkgPT09IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBhcmVudFtrXSA9IHRoaXMucHJpdmF0ZUNvcHlPZih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm93bmVkLmFkZCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudFtrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gdmFsdWU7XG4gICAgICBiYXNlID0gYXRCYXNlO1xuICAgIH1cbiAgICB0aGlzLnByaXZhdGlzZUJlbG93KHBhcmVudCwgYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gT1dORUQgY29udGFpbmVyIGlzIGFib3V0IHRvIGJlIHJlYWQgd2hvbGUgKGEgcGF0aCBjb3B5IGEgbmVzdGVkIHdyaXRlXG4gICAqIG1hZGUsIHNheSk6IGl0cyBkZXNjZW5kYW50cyBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXJlXG4gICAqIHJlcGxhY2VkIGJ5IHByaXZhdGUgZGVlcCBjb3BpZXMsIHNvIG5vdGhpbmcgdGhlIHJlYWQgaGFuZHMgb3V0IGlzXG4gICAqIGNvbW1pdHRlZCBzdGF0ZS4gV2Fsa3Mgb3duZWQgY29udGFpbmVycyBvbmx5OyBtYXJrcyBlYWNoIG9uZSBmaW5pc2hlZFxuICAgKiAoe0BsaW5rIHByaXZhdGVUcmVlc30pLCBzbyBhIGNvbnRhaW5lciBpcyBzY2FubmVkIG9uY2UgcGVyIHN0YWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2VCZWxvdyhjb250YWluZXI6IG9iamVjdCwgYmFzZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHdvcms6IEFycmF5PFtvYmplY3QsIHVua25vd25dPiA9IFtbY29udGFpbmVyLCBiYXNlXV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW25vZGUsIG5vZGVCYXNlXSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKHRoaXMucHJpdmF0ZVRyZWVzLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKG5vZGUsIGtleSk7XG4gICAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQobm9kZUJhc2UsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLm93bmVkLmhhcyhjaGlsZCkpIHdvcmsucHVzaChbY2hpbGQsIGF0QmFzZV0pO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCA9PT0gYXRCYXNlICYmICF0aGlzLnN0YWdlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB0aGlzLnByaXZhdGVDb3B5T2YoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgcHJpdmF0ZSBkZWVwIGNvcHkgb2YgYSBjb21taXR0ZWQgY29udGFpbmVyIOKAlCBvd25lZCB0aHJvdWdoIGFuZCB0aHJvdWdoLiAqL1xuICBwcml2YXRlIHByaXZhdGVDb3B5T2YodmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgYWRvcHQoY29weSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5wcml2YXRlVHJlZXMuYWRkKGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCBhbnkgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCwgb3IgYSBwYXRoIGFib3ZlIG9yIGJlbG93IGl0P1xuICAgKlxuICAgKiBUaGUgZGV2LW1vZGUgYm9ycm93ZWQtcmVhZCBjaGVjayAoYFN0YWdlQ29udGV4dC5jb21taXRgKSBhc2tzIHRoaXMgYmVmb3JlXG4gICAqIGFjY3VzaW5nIGEgc3RhZ2Ugb2YgbXV0YXRpbmcgYSB2YWx1ZSBpbiBwbGFjZTogYSBrZXkgdGhlIHN0YWdlIGxlZ2l0aW1hdGVseVxuICAgKiBXUk9URSBpcyBleHBlY3RlZCB0byBkaWZmZXIgZnJvbSB3aGF0IGl0IHJlYWQsIGFuZCB3cml0ZXMgcmVhY2ggdGhlIGJ1ZmZlclxuICAgKiBmcm9tIHBhdGhzIHRoYXQgYnlwYXNzIHVzZXItbGV2ZWwgd3JpdGUgdHJhY2tpbmcgdG9vICh0aGUgc3ViZmxvdyBzZWVkLFxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCB0aGUgcmVzdW1lIHJlLXNlZWQpLiBEZXYtbW9kZSBvbmx5IOKAlCBub3RoaW5nIG9uXG4gICAqIHRoZSBob3QgcGF0aCBjYWxscyBpdC5cbiAgICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgLy8gT24gdGhlIHBhdGgsIGJlbG93IGl0IG9yIGFib3ZlIGl0IOKAlCB0aGUgb25lIHBhdGggcmVsYXRpb24gZXZlcnkga2V5IHF1ZXJ5IGFza3MuXG4gICAgICBpZiAocmVsYXRpb24ob3AucGF0aCwgdGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gdGhpcy5zdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKG5ldyBTZXQocm93cy50cmFjZS5tYXAoKHQpID0+IHQucGF0aCkpKTtcbiAgICAvLyBUaGUga2V5IG9yZGVyIGlzIHBhcnQgb2YgdGhlIGJ5dGVzIGEgY29uc3VtZXIga2VlcHMuXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgb3ZlcndyaXRlOiByb3dzLm92ZXJ3cml0ZSwgdXBkYXRlczogcm93cy51cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZTogcm93cy50cmFjZSB9O1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLmhlbGRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuICAgIHRoaXMub3duZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMub3duZWQuYWRkKHRoaXMud29ya2luZ0NvcHkpO1xuICAgIHRoaXMuc3RhZ2VkID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5zdGFnZWRNZXJnZXMgPSAwO1xuICAgIHRoaXMubmVzdGVkT3BzID0gMDtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAsXG4gICAqIGtlZXBpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIOKAlCBhbmQgdGhlIHJlc3VsdCBpcyBBRE1JVFRFRCAoe0BsaW5rIGFkbWl0fSk6XG4gICAqIGEgZmFtaWx5IG9mIHJvd3Mgd2hvc2UgcmVwbGF5IGRvZXMgbm90IGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGlzXG4gICAqIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHJlYWQtYmFjayBpbnN0ZWFkICg5LjMwLjApLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBERUZBVUxUIChgY29tbWl0VmFsdWVzOiAnZnVsbCdgKSBwYXlsb2FkLCBpbmNsdWRpbmcgdGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZyBvZiBzdGFnZWQgYGRlbGV0ZWAgb3BzIGludG8gYHNldGAtb2YtYHVuZGVmaW5lZGBcbiAgICogdHJhY2UgZW50cmllcy4gVGhlIGRlbHRhIGVuY29kaW5nIGxpdmVzIGluIHtAbGluayB0b0RlbHRhUGF5bG9hZH0uXG4gICAqXG4gICAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogdGhlIG5ldC1jaGFuZ2UgdmVyZGljdCBpcyBwYWlkIG9uY2UgcGVyIFBBVEhcbiAgICogYW5kIHRoZSBjbG9uZSBvbmNlIHBlciBDT05TRUNVVElWRSBydW4gb2Ygb3BzIG9uIGEgcGF0aCwgbm90IG9uY2UgcGVyIG9wXG4gICAqIOKAlCBzZWUgdGhlIHR3byBtZW1vcyBpbnNpZGUuIFBpbm5lZCBieVxuICAgKiB0ZXN0L2xpYi9tZW1vcnkvc2NlbmFyaW8vcmVwZWF0ZWQtcGF0aC1ieXRlLWlkZW50aXR5LnRlc3QudHMgYWdhaW5zdCB0aGVcbiAgICogOS4yMi4wIGJ5dGVzLiBTaW5jZSA5LjIzLjAgdGhhdCBjbG9uZSBpcyBUSEUgY2xvbmU6IHRoZSBwYXRjaCB0cmVlcyBob2xkXG4gICAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2VzIChzZWUgdGhlIGNsYXNzIGhlYWRlciksIHNvIHRoaXMgbG9vcCBpcyB0aGUgb25lXG4gICAqIHBsYWNlIHRoZSByZWNvcmQgaXMgZGV0YWNoZWQgZnJvbSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IFJvd3Mge1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5jaGFuZ2VPbmx5Um93cyhsb3NzeSkpO1xuICB9XG5cbiAgLyoqIFRoZSAnZnVsbCcgcm93czsgYSBmYW1pbHkgaW4gYGxvc3N5YCBpcyB3cml0dGVuIGFzIGl0cyByZWFkLWJhY2ssIGF0IGl0cyBsYXN0IHRvdWNoICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkuICovXG4gIHByaXZhdGUgY2hhbmdlT25seVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICAvLyBQZXIgUEFUSCwgZGVjaWRlZCBvbmNlICg5LjIyLjEpOiBiYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmUgZml4ZWQgYXRcbiAgICAvLyBjb21taXQsIHNvIGV2ZXJ5IGxhdGVyIG9wIG9uIGEgcGF0aCBnZXRzIHRoZSB2ZXJkaWN0IGl0cyBmaXJzdCBvcCBnb3QuXG4gICAgLy8gYHVuZGVmaW5lZGAgPSBub3QgeWV0IGRlY2lkZWQ7IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYXJlIHRoZSBgdHJ1ZWAga2V5cy5cbiAgICBjb25zdCBzdXJ2aXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIC8vIFRoZSBwYXRoIHRoZSBMQVNUIHN1cnZpdmluZyBvcCBjb3BpZWQgaW50byBlYWNoIHBhdGNoIHRyZWUgKDkuMjIuMSkuXG4gICAgLy8gVGhlIHZhbHVlIGF0IGEgcGF0aCBpcyBmaXhlZCBhdCBjb21taXQsIHNvIGFuIG9wIHdob3NlIHByZWRlY2Vzc29yIG9uXG4gICAgLy8gdGhlIFNBTUUgdHJlZSBhbHJlYWR5IGNvcGllZCB0aGF0IHBhdGggd291bGQgd3JpdGUgdGhlIHNhbWUgYnl0ZXMgb3ZlclxuICAgIC8vIHRoZSBzYW1lIGtleSDigJQgaXQga2VlcHMgaXRzIHRyYWNlIHJvdyAodGhlIGxvZyBpcyBieXRlLWlkZW50aWNhbCkgYW5kXG4gICAgLy8gcGF5cyBubyBzZWNvbmQgY2xvbmUuIFRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgc3RhZ2VzIE5cbiAgICAvLyB3aG9sZS1hcnJheSBzZXRzIG9uIE9ORSBwYXRoOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhhdCBjb21taXQgTyhOKVxuICAgIC8vIGluc3RlYWQgb2YgTyhOIMOXIG9wcykuIENPTlNFQ1VUSVZFIG9ubHkg4oCUIGFuIG9wIG9uIGFub3RoZXIgcGF0aCBpblxuICAgIC8vIGJldHdlZW4gbWF5IGhhdmUgY29lcmNlZCBvciBncm93biB0aGlzIG9uZSdzIGNvbnRhaW5lciAoYSBkZXNjZW5kYW50XG4gICAgLy8gYG5hdGl2ZVNldGAgdGhyb3VnaCBhIHByaW1pdGl2ZSwgYSBga2V5OiB1bmRlZmluZWRgIHNoZWxsKSBhbmQgdGhlXG4gICAgLy8gcmUtY29weSBpcyB3aGF0IHJlcGFpcnMgaXQ7IGEgYG1lcmdlYCBiZXR3ZWVuIHR3byBzZXRzIHRvdWNoZXMgdGhlXG4gICAgLy8gb3RoZXIgdHJlZSBhbmQgZG9lcyBub3QgY291bnQuIFNhbWUgbGF3IGFzIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAgICBsZXQgbGFzdFNldFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdE1lcmdlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgZmFtaWx5ID0gbG9zc3k/LmZhbWlsaWVzLmdldChsb3NzeS5yb290T2YuZ2V0KG9wLnBhdGgpIGFzIHN0cmluZyk7XG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGkgPT09IGZhbWlseS5zbG90KSB7XG4gICAgICAgICAgdGhpcy5lbWl0UmVhZEJhY2soZmFtaWx5LCByb3dzLCAnZnVsbCcpO1xuICAgICAgICAgIGxhc3RTZXRQYXRoID0gbGFzdE1lcmdlUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBrZWVwID0gc3Vydml2ZXMuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGtlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZWVwID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKTtcbiAgICAgICAgc3Vydml2ZXMuc2V0KG9wLnBhdGgsIGtlZXApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZWVwKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcblxuICAgICAgdHJhY2UucHVzaChmbGF0dGVuZWRUcmFjZVJvdyhvcCkpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgaWYgKGxhc3RNZXJnZVBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0TWVyZ2VQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFNldFBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0U2V0UGF0aCA9IG9wLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0aHJlZSBlbmNvZGluZyBkaWZmZXJlbmNlczpcbiAgICpcbiAgICogMS4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKHRoZSDCpzIuNSBkZWR1cCBydWxlIOKAlCBgYXBwZW5kYFxuICAgKiAgICBpcyBOT1QgaWRlbXBvdGVudCBvbiByZXBsYXksIHNvIGR1cGxpY2F0ZSBlbnRyaWVzIHdvdWxkIG11bHRpcGx5XG4gICAqICAgIHRhaWxzKS4gVGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIG9wIG1peCArIGJhc2XihpJmaW5hbFxuICAgKiAgICByZWxhdGlvbnNoaXA7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaCxcbiAgICogICAgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMuXG4gICAqIDIuICoqVmVyYiByZXNvbHV0aW9uIHBlciBwYXRoKiog4oCUIGZvciBhIHBhdGggd2l0aCBOTyBzdXJ2aXZpbmcgcmVsYXRpdmVcbiAgICogICAgKHNlZSAzKTpcbiAgICogICAgLSBsYXN0IG9wIGAnZGVsZXRlJ2AgQU5EIGZpbmFsIHZhbHVlIGdvbmUg4oaSIGBkZWxldGVgICh0aGUgcGF0aCBzdGF5c1xuICAgKiAgICAgIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWAgd2l0aCBgdW5kZWZpbmVkYCBmb3Iga2V5LXNldCBjb25zdW1lcnMpLlxuICAgKiAgICAgIFJlcXVpcmVzIHRoZSBwYXJlbnQgdG8gYmUgYSByZWFsIGNvbnRhaW5lciBpbiB0aGUgYmFzZSDigJQgcmVwbGF5IHVzZXNcbiAgICogICAgICBgbmF0aXZlRGVsZXRlYCwgd2hpY2ggaXMgaW5lcnQgb24gYSBwcmltaXRpdmUvYWJzZW50IHBhcmVudCwgd2hlcmVhc1xuICAgKiAgICAgIHRoZSBgJ2Z1bGwnYCBmbGF0dGVuaW5nIChgX3NldGAgb2YgYHVuZGVmaW5lZGApIENPRVJDRVMgdGhhdCBwYXJlbnRcbiAgICogICAgICBpbnRvIGFuIG9iamVjdDsgd2hlbiB0aGV5IHdvdWxkIGRpc2FncmVlIHdlIGtlZXAgdGhlIGZsYXR0ZW5pbmc7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YTtcbiAgICogICAgLSBvdGhlcndpc2UgKGBzZXRgL21peGVkKTogdGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgdGhlXG4gICAqICAgICAgcGF0aCAoe0BsaW5rIGZ1bGxSb3dzVmFsdWV9KS4gSWYgYmFzZSBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZFxuICAgKiAgICAgIGJhc2UgaXMgYSBTVFJJQ1QgUFJFRklYIOKGkiBgYXBwZW5kYCBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGBcbiAgICogICAgICBzdG9yaW5nIHRoZSBmdWxsIHZhbHVlLlxuICAgKiAzLiAqKk9WRVJMQVAgRkFNSUxJRVMgdGFrZSB0aGUgZnVsbC12YWx1ZSBmYWxsYmFjay4qKiBgb3ZlcndyaXRlYCAvXG4gICAqICAgIGB1cGRhdGVzYCBhcmUgbmVzdGVkIHBhdGggVFJFRVMsIHNvIHR3byBzdXJ2aXZpbmcgcGF0aHMgd2hlcmUgb25lIGlzXG4gICAqICAgIGFuIGFuY2VzdG9yIG9mIHRoZSBvdGhlciAoYGFgIGFuZCBgYS5wYCkgc2hhcmUgc3RvcmFnZS4gRGVsdGEnc1xuICAgKiAgICBwZXItcGF0aCBlbmNvZGluZ3Mgd291bGQgY2xvYmJlciBlYWNoIG90aGVyIHRoZXJlIChhbiBgYXBwZW5kYFxuICAgKiAgICBhbmNlc3RvciBzdG9yZXMgb25seSBhIFRBSUwsIGEgYGRlbGV0ZWAgYW5jZXN0b3IgYHVuZGVmaW5lZGApLCBzbyBldmVyeVxuICAgKiAgICBwYXRoIHRoYXQgaGFzIGEgc3Vydml2aW5nIGFuY2VzdG9yL2Rlc2NlbmRhbnQgaXMgY29tbWl0dGVkIGFzIGEgcGxhaW5cbiAgICogICAgYHNldGAgb2YgdGhlIHZhbHVlIHRoZSAnZnVsbCcgcm93cyBnaXZlIGl0LCBhbmQgdGhlIGZhbWlseSdzXG4gICAqICAgIHNoYWxsb3dlc3QgcGF0aCAod2hvc2Ugc2V0IGNvdmVycyB0aGUgd2hvbGUgc3VidHJlZSkgaXMgZW1pdHRlZCBMQVNULlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KSBsaWtlIHRoZSAnZnVsbCcgcGF5bG9hZDogYSBjb21wYWN0XG4gICAqIHJvdyBpcyBrZXB0IG9ubHkgd2hlcmUgdGhlIGJ1bmRsZSBwcm92YWJseSBmb2xkcyBiYWNrLCBhbmQgYSBmYW1pbHkgdGhhdFxuICAgKiBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBTbyBib3RoIGVuY29kaW5ncyBjb21taXQgdGhlXG4gICAqIHZhbHVlIHRoZSBzdGFnZSByZWFkOyBiZWZvcmUgOS4zMC4wIHRoZXkgc2hhcmVkIGEgcmVwbGF5IHRoYXQgZGlkIG5vdFxuICAgKiAoYHJlcGxheVBhdGhWZXJic2AgLyBgcmVwbGF5RmFtaWx5VmVyYnNgLCBkZWxldGVkKS5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKTogUm93cyB7XG4gICAgY29uc3QgZnVsbFZhbHVlQXQgPSB0aGlzLmZ1bGxSb3dzVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5hZG1pdCgobG9zc3kpID0+IHRoaXMuZGVsdGFSb3dzKGxvc3N5LCBmdWxsVmFsdWVBdCkpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWx0YSByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBkZWx0YVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkLCBmdWxsVmFsdWVBdDogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93bik6IFJvd3Mge1xuICAgIGNvbnN0IHJvd3M6IFJvd3MgPSB7IG92ZXJ3cml0ZToge30sIHVwZGF0ZXM6IHt9LCB0cmFjZTogW10gfTtcbiAgICBjb25zdCB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UgfSA9IHJvd3M7XG4gICAgY29uc3QgaW5Mb3NzeSA9IChwYXRoOiBzdHJpbmcpID0+IGxvc3N5Py5mYW1pbGllcy5oYXMobG9zc3kucm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpID09PSB0cnVlO1xuICAgIGNvbnN0IHN1cnZpdm9ycyA9IHRoaXMubmV0Q2hhbmdlU3Vydml2b3JzKHRoaXMub3BzQnlQYXRoKCkpLmZpbHRlcigocykgPT4gIWluTG9zc3kocy5wYXRoKSk7XG4gICAgY29uc3QgeyByb290T2YsIGJ5Um9vdCB9ID0gZ3JvdXBJbnRvRmFtaWxpZXMoc3Vydml2b3JzLCBuZXcgU2V0KHN1cnZpdm9ycy5tYXAoKHMpID0+IHMucGF0aCkpKTtcblxuICAgIC8vIFRIRSBWRVJCIENIT0lDRSDigJQgdGhlIGRlbHRhIGVuY29kZXIgcGlja3MgYSB2ZXJiIHBlciBwYXRoOyB0aGUgVkFMVUVTXG4gICAgLy8gaXQgZW5jb2RlcyBjb21lIGZyb20gdGhlIG9uZSByZXBsYXkgKGBmdWxsVmFsdWVBdGApLCBuZXZlciBhIHJlcGxpY2Egb2ZcbiAgICAvLyB0aGUgdmVyYiBsYXcgKDkuMzAuMDogQ0xBVURFLm1kJ3MgdmVyYi1zd2l0Y2ggcmVwbGljYXMgbG9zdCB0d28gaGVyZSkuXG4gICAgY29uc3QgZW1pdCA9IChzOiBTdXJ2aXZvcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBzZWdtZW50cywgdmVyYnMsIGJlZm9yZSB9ID0gcztcbiAgICAgIGNvbnN0IHByb3YgPSBwcm92ZW5hbmNlKHMucmVhZEtleXMpO1xuICAgICAgaWYgKChieVJvb3QuZ2V0KHJvb3RPZi5nZXQocGF0aCkgYXMgc3RyaW5nKSBhcyBTdXJ2aXZvcltdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJ1bGUgMyDigJQgb25lIGNvaGVyZW50IHRyZWU6IGV2ZXJ5IG1lbWJlciBhIHNldCBvZiBpdHMgdmFsdWUuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoZnVsbFZhbHVlQXQoc2VnbWVudHMpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RWZXJiID0gdmVyYnNbdmVyYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdFZlcmIgPT09ICdkZWxldGUnICYmIHMuYWZ0ZXIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlbGV0ZVJlcGxheXNBc0ZsYXR0ZW5pbmcoc2VnbWVudHMpKSB7XG4gICAgICAgIC8vIFJlYWwgZGVsZXRpb24g4oCUIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuIEtlZXAgdGhlIHBhdGggZW51bWVyYXRlZFxuICAgICAgICAvLyBpbiBgb3ZlcndyaXRlYCAodW5kZWZpbmVkKSBzbyBPYmplY3Qua2V5cyBjb25zdW1lcnMgc2VlIGl0LlxuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ2RlbGV0ZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAodmVyYnMuZXZlcnkoKHYpID0+IHYgPT09ICdtZXJnZScpKSB7XG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnbWVyZ2UnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hWYWx1ZVJvdyhyb3dzLCBwYXRoLCBzZWdtZW50cywgYmVmb3JlLCBmdWxsVmFsdWVBdChzZWdtZW50cyksIHByb3YsIHRoaXMubWFya2VkQmVsb3cocGF0aCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGZhbWlseSB0aGF0IGRpZCBub3QgZm9sZCBiYWNrIHRha2VzIGl0cyBwbGFjZSBieSBpdHMgbGFzdCB0b3VjaC5cbiAgICBjb25zdCBwZW5kaW5nID0gbG9zc3kgPT09IHVuZGVmaW5lZCA/IFtdIDogWy4uLmxvc3N5LmZhbWlsaWVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBhLnNsb3QgLSBiLnNsb3QpO1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBjb25zdCBmbHVzaEJlZm9yZSA9ICh0b3VjaDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB3aGlsZSAobmV4dCA8IHBlbmRpbmcubGVuZ3RoICYmIHBlbmRpbmdbbmV4dF0uc2xvdCA8IHRvdWNoKSB0aGlzLmVtaXRSZWFkQmFjayhwZW5kaW5nW25leHQrK10sIHJvd3MsICdkZWx0YScpO1xuICAgIH07XG4gICAgZW1pdEluRmFtaWx5T3JkZXIoc3Vydml2b3JzLCByb290T2YsIGJ5Um9vdCwgZW1pdCwgZmx1c2hCZWZvcmUpO1xuICAgIGZsdXNoQmVmb3JlKEluZmluaXR5KTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgYWRtaXR0ZWQgcmVjb3JkICg5LjMwLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUSEUgQURNSVNTSU9OIOKAlCBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGVcbiAgICogc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZC4gYGJ1aWxkYFxuICAgKiBsYXlzIHRoZSByb3dzIG91dCAob25lIGVuY29kZXI6IGAnZnVsbCdgIG9yIGAnZGVsdGEnYCk7IHRoZSBjYW5kaWRhdGUgaXNcbiAgICogY2hlY2tlZCAoe0BsaW5rIGxvc3N5RmFtaWxpZXN9KSwgYW5kIHdoZW4gc29tZSBmYW1pbHkncyByb3dzIGRvIG5vdCBmb2xkXG4gICAqIGJhY2sgdGhlIHJvd3MgYXJlIGxhaWQgb3V0IGFnYWluIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZVxuICAgKiBzdGFnZSByZWFkICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkg4oCUIGV2ZXJ5IG90aGVyIGZhbWlseSdzIGJ5dGVzIGV4YWN0bHkgYXNcbiAgICogdGhlIGZpcnN0IGxheW91dCBtYWRlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KGJ1aWxkOiAobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKSA9PiBSb3dzKTogUm93cyB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYnVpbGQodW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb3NzeSA9IHRoaXMubG9zc3lGYW1pbGllcyhjYW5kaWRhdGUpO1xuICAgIHJldHVybiBsb3NzeSA9PT0gdW5kZWZpbmVkID8gY2FuZGlkYXRlIDogYnVpbGQobG9zc3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYW1pbGllcyB3aG9zZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGUgc3RhZ2UgcmVhZCDigJRcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAoYGFkbWlzc2lvbi50cyDCtyBsb3NzeUZhbWlsaWVzYDogdGhlXG4gICAqIGNhbmRpZGF0ZSByZXBsYXllZCBvbnRvIHRoZSBkaWZmIGJhc2UgYnkgYGRyeUZvbGRgLCBldmVyeSBmYW1pbHkgb2ZcbiAgICogdG91Y2hlZCBwYXRocyBjb21wYXJlZCB3aXRoIHRoZSB3b3JraW5nIGNvcHkgYXQgaXRzIHJvb3QgYW5kIG9uIHRoZSB3YXlcbiAgICogZG93biB0byBpdCkuXG4gICAqXG4gICAqIFdpdGhvdXQgYSBmb2xkLCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wOiBpdHNcbiAgICogcm93cyBhcmUgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyIGl0cyBhZGRyZXNzLCBlYWNoXG4gICAqIHdyaXRpbmcgdGhlIFNBTUUgdmFsdWUgaW50byBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIOKAlCB0aGVcbiAgICogcmVjb3JkIGlzIHRoZSByZWFkLWJhY2sgYnkgY29uc3RydWN0aW9uICh0aGUgcHJvcGVydHkncyBST09ULU9OTFkgYXJtXG4gICAqIHBpbnMgdGhpcykuIFRoYXQga2VlcHMgdGhlIGNvbW1pdCBvZiB0aGUgdHlwZWQgc2NvcGUncyByb290LWtleSB3cml0ZXNcbiAgICogZXhhY3RseSBhcyBjaGVhcCBhcyBpdCB3YXMuXG4gICAqL1xuICBwcml2YXRlIGxvc3N5RmFtaWxpZXMoY2FuZGlkYXRlOiBSb3dzKTogTG9zc3kgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN0YWdlZE1lcmdlcyA9PT0gMCAmJiB0aGlzLm5lc3RlZE9wcyA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbG9zc3lGYW1pbGllcyhjYW5kaWRhdGUsIHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLndvcmtpbmdDb3B5LCB0aGlzLm9wVHJhY2UsIHRoaXMuYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYW1pbHkgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkOlxuICAgKiBvbmUgYHNldGAgcm93IHBlciBtZW1iZXIgdGhhdCBjaGFuZ2VkIChkZXNjZW5kYW50cyBieSBsYXN0IHRvdWNoLCBlYWNoXG4gICAqIHdpdGggaXRzIG93biByZWFkIHByZWZpeCksIHRoZSBST09UIGxhc3QsIGFuZCB0aGUgcm9vdCdzIHJlYWQtYmFjayB2YWx1ZVxuICAgKiBpbiBgb3ZlcndyaXRlYCDigJQgb25lIGNvaGVyZW50IHRyZWUsIHNvIG5vIHJvdyBjYW4gY2xvYmJlciBhbm90aGVyLiBUaGVcbiAgICogcm9vdCdzIHJvdyBpcyB3cml0dGVuIGV2ZW4gd2hlbiB0aGUgcm9vdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2U6IGl0IGlzIHRoZVxuICAgKiByb3cgdGhhdCBjYXJyaWVzIHRoZSBmYW1pbHkncyByZWFkLWJhY2sgKGFuZCB0aGUgY29udGFpbmVycyBMLTEncyBkcm9wcGVkXG4gICAqIG9wIGxlZnQpLiBBIGxvbmUgcm9vdCB1bmRlciBgJ2RlbHRhJ2Aga2VlcHMgdGhlIGNvbXBhY3QgYGFwcGVuZGAgd2hlbiB0aGVcbiAgICogdmFsdWUgaXQgcmVhZCBpcyBpdHMgYmFzZSBwbHVzIGEgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgZW1pdFJlYWRCYWNrKGZhbWlseTogRmFtaWx5LCByb3dzOiBSb3dzLCBlbmNvZGluZzogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIGxldCByb290OiBNZW1iZXIgPSBmYW1pbHkubWVtYmVyc1swXTtcbiAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGZhbWlseS5tZW1iZXJzKSB7XG4gICAgICBpZiAobS5wYXRoID09PSBmYW1pbHkucm9vdCkge1xuICAgICAgICByb290ID0gbTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShtLnBhdGguc3BsaXQoREVMSU0pKSkgY29udGludWU7XG4gICAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoOiBtLnBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKG0ucmVhZEtleXMpIH0pO1xuICAgICAgY2hhbmdlZCsrO1xuICAgIH1cbiAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgaWYgKGVuY29kaW5nID09PSAnZGVsdGEnICYmIGNoYW5nZWQgPT09IDAgJiYgYWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgICBwdXNoVmFsdWVSb3coXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGZhbWlseS5yb290LFxuICAgICAgICBmYW1pbHkucm9vdFNlZ21lbnRzLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyLFxuICAgICAgICBwcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpLFxuICAgICAgICB0aGlzLm1hcmtlZEJlbG93KGZhbWlseS5yb290KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IGZhbWlseS5yb290LCB2ZXJiOiAnc2V0JywgLi4ucHJvdmVuYW5jZShyb290LnJlYWRLZXlzKSB9KTtcbiAgICAvLyBUaGUgY2xvbmUgdGhlIGNoZWNrIHRvb2sgKGBhZG1pc3Npb24udHMgwrcgZm9sZHNCYWNrYCksIHdoZW4gaXQgdG9vayBvbmUuXG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgZmFtaWx5LnJvb3RTZWdtZW50cywgZmFtaWx5LmhlbGQgIT09IHVuZGVmaW5lZCA/IGZhbWlseS5oZWxkLnZhbHVlIDogc3RydWN0dXJlZENsb25lKGFmdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgYSBwYXRoIOKAlCB3aGF0IHRoZSBkZWx0YSBlbmNvZGVyXG4gICAqIGNvbW1pdHMgZm9yIGEgZmFtaWx5IG1lbWJlciBvciBhIHBhdGggd2l0aCBhIGBzZXRgIOKAlCByZWFkIGZyb20gT05FXG4gICAqIHtAbGluayBkcnlGb2xkfSBvZiB0aG9zZSByb3dzIG92ZXIgdGhlIHBhdGNoIHRyZWVzIHRoZW1zZWx2ZXMsIHRha2VuIHRoZVxuICAgKiBmaXJzdCB0aW1lIGl0IGlzIGFza2VkLiBCeSByZWZlcmVuY2UsIGFzIHRoZSBzdGFnZSBoZWxkIHRoZW06IGFuIGVsZW1lbnRcbiAgICogYSBgc2V0YCBhbmQgYSBgbWVyZ2VgIG9mIG9uZSBwYXRoIHNoYXJlIHN0YXlzIG9uZSBlbGVtZW50LiBBIHN0YWdlIHRoYXRcbiAgICogc3RhZ2VkIG5vIGBtZXJnZWAgYW5kIG5vIG5lc3RlZCBvcCBuZWVkcyBubyBmb2xkIOKAlCBhIHBhdGgncyB2YWx1ZSBpcyBpdHNcbiAgICogbGFzdCBzdGFnZWQgdmFsdWUuIChCZWZvcmUgOS4zMC4wOiB0d28gcmVwbGljYXMgb2YgdGhlIHZlcmIgbGF3LFxuICAgKiBgcmVwbGF5UGF0aFZlcmJzYCBhbmQgYHJlcGxheUZhbWlseVZlcmJzYC4pXG4gICAqL1xuICBwcml2YXRlIGZ1bGxSb3dzVmFsdWUoKTogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93biB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gKHNlZ21lbnRzKSA9PiBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBsZXQgZm9sZDogdW5rbm93bjtcbiAgICByZXR1cm4gKHNlZ21lbnRzKSA9PiB7XG4gICAgICBmb2xkID8/PSBkcnlGb2xkKHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLnVwZGF0ZVBhdGNoLCB0aGlzLm92ZXJ3cml0ZVBhdGNoLCB0aGlzLmZ1bGxSb3dzKCkpO1xuICAgICAgcmV0dXJuIF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3M6IGV2ZXJ5IG9wIG9uIGEgcGF0aCB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIga2VlcHMsIGEgYGRlbGV0ZWAgc3BlbGxlZCBgc2V0YC4gKi9cbiAgcHJpdmF0ZSBmdWxsUm93cygpOiBUcmFjZUVudHJ5W10ge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCByb3dzOiBUcmFjZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgbGV0IGsgPSBrZWVwLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIGtlZXAuc2V0KG9wLnBhdGgsIChrID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKSkpO1xuICAgICAgaWYgKGspIHJvd3MucHVzaCh7IHBhdGg6IG9wLnBhdGgsIHZlcmI6IG9wLnZlcmIgPT09ICdtZXJnZScgPyAnbWVyZ2UnIDogJ3NldCcgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgc3RhZ2UgY2hhbmdlIHRoZSB2YWx1ZSBhdCBgc2VnbWVudHNgPyBCYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmVcbiAgICogZml4ZWQgYXQgY29tbWl0LCBzbyB0aGlzIGlzIHRoZSBPTkUgbmV0LWNoYW5nZSB2ZXJkaWN0IGJvdGggcGF5bG9hZFxuICAgKiBlbmNvZGluZ3MgYXBwbHkgKGEgbm8tb3Agd3JpdGUgYW5kIGEgd3JpdGUtdGhlbi1yZXZlcnQgYm90aCBmYWlsIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbChfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyksIF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgKyByZS1pbnNlcnRcbiAgICogbW92ZXMgYSByZS10b3VjaGVkIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgTWFwJ3MgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICAgKiBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocykuIFBlci13cml0ZVxuICAgKiBwcm92ZW5hbmNlICgjUDEpOiB0aGUgTEFTVCBvcCdzIHJlYWRLZXlzIGlzIGtlcHQg4oCUIHJlYWQgcHJlZml4ZXMgb25seSBncm93XG4gICAqIHdpdGhpbiBhIHN0YWdlLCBzbyBsYXN0ID09IHVuaW9uIGFjcm9zcyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgb3BzQnlQYXRoKCk6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnZlcmJzLnB1c2gob3AudmVyYik7XG4gICAgICAgIHByZXYubGFzdCA9IGk7XG4gICAgICAgIGlmIChvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkKSBwcmV2LnJlYWRLZXlzID0gb3AucmVhZEtleXM7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIHtcbiAgICAgICAgICB2ZXJiczogW29wLnZlcmJdLFxuICAgICAgICAgIGxhc3Q6IGksXG4gICAgICAgICAgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciDigJQgaWRlbnRpY2FsIHRvICdmdWxsJyAoe0BsaW5rIGNoYW5nZWRTaW5jZUJhc2V9KS4gU3Vydml2b3JzIGtlZXAgbGFzdC10b3VjaCBvcmRlci4gKi9cbiAgcHJpdmF0ZSBuZXRDaGFuZ2VTdXJ2aXZvcnMoYnlQYXRoOiBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KTogU3Vydml2b3JbXSB7XG4gICAgY29uc3Qgc3Vydml2b3JzOiBTdXJ2aXZvcltdID0gW107XG4gICAgZm9yIChjb25zdCBbcGF0aCwgeyB2ZXJicywgcmVhZEtleXMsIGxhc3QgfV0gb2YgYnlQYXRoKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgaWYgKCF0aGlzLmNoYW5nZWRTaW5jZUJhc2Uoc2VnbWVudHMpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBzdXJ2aXZvcnMucHVzaCh7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgcmVhZEtleXMsIGxhc3QsIGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdXJ2aXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGEgc3RhZ2VkIGBkZWxldGVgIGF0IHRoaXMgcGF0aCBjb21taXQgYXMgdGhlIGAnZGVsZXRlJ2AgdmVyYj9cbiAgICpcbiAgICogT25seSB3aGVuIHJlbW92aW5nIHRoZSBrZXkgYW5kIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgZmxhdHRlbmluZyAoYF9zZXRgIG9mXG4gICAqIGB1bmRlZmluZWRgKSBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLiBUaGV5IGRpdmVyZ2Ugd2hlbiB0aGUgcGFyZW50IGlzIG5vdFxuICAgKiBhIGNvbnRhaW5lcjogYG5hdGl2ZURlbGV0ZWAgd2Fsa3MgYXdheSB1bnRvdWNoZWQsIHdoaWxlIGBuYXRpdmVTZXRgXG4gICAqIENPRVJDRVMgdGhlIHByaW1pdGl2ZSBwYXJlbnQgaW50byBhbiBvYmplY3QgdG8gaG9sZCB0aGUga2V5LiBDb21taXR0aW5nXG4gICAqIGBkZWxldGVgIHRoZXJlIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBzdGF0ZSBjaGFuZ2UgdGhlIHN0YWdlIHJlYWxseSBtYWRlLFxuICAgKiBzbyB0aG9zZSAocGF0aG9sb2dpY2FsKSBkZWxldGVzIGtlZXAgdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgLy8gcGFyZW50IGlzIHRoZSBzdGF0ZSByb290IOKAlCBhbHdheXMgYSBjb250YWluZXJcbiAgICBjb25zdCBwYXJlbnQgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cy5zbGljZSgwLCAtMSkpO1xuICAgIHJldHVybiBwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCc7XG4gIH1cbn1cblxuLyoqXG4gKiBIaXN0b3JpY2FsIGZsYXR0ZW5pbmcgZm9yIHRoZSBgJ2Z1bGwnYCBwYXlsb2FkOiBhbiBleHBsaWNpdCBkZWxldGUgY29tbWl0c1xuICogYXMgc2V0LW9mLXVuZGVmaW5lZC4gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSkgcmlkZXMgZWFjaCBzdXJ2aXZpbmcgZW50cnlcbiAqIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbmVkVHJhY2VSb3cob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IFRyYWNlRW50cnkge1xuICByZXR1cm4gb3AudmVyYiA9PT0gJ2RlbGV0ZSdcbiAgICA/IHsgcGF0aDogb3AucGF0aCwgdmVyYjogJ3NldCcgYXMgY29uc3QsIC4uLihvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZEtleXM6IG9wLnJlYWRLZXlzIH0pIH1cbiAgICA6IG9wO1xufVxuXG4vKiogQSByb3cncyBgcmVhZEtleXNgIGZyYWdtZW50IOKAlCBhYnNlbnQgdW5sZXNzIHRoZSBwcm92ZW5hbmNlIGRpYWwgcmVjb3JkZWQgb25lICgjUDEpLiAqL1xuZnVuY3Rpb24gcHJvdmVuYW5jZShyZWFkS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IHJlYWRLZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlYWRLZXlzICE9PSB1bmRlZmluZWQgPyB7IHJlYWRLZXlzIH0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
949
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStERzs7O0FBRUgsaURBQWdIO0FBQ2hILHlEQUFvSDtBQUNwSCwrQ0FBeUM7QUFDekMsNkNBVXNCO0FBRXRCLHlDQUFzRjtBQUV0RixNQUFhLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixDQUFrQjtJQUVuRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdEM7Ozs7OztPQU1HO0lBQ0ssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdkM7Ozs7O09BS0c7SUFDSyxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0ssU0FBUyxDQUFtQjtJQUVwQzs7O09BR0c7SUFDSyxZQUFZLENBQW1CO0lBRXZDOzs7OztPQUtHO0lBQ2MsT0FBTyxDQUFvQjtJQUU1QyxvRUFBb0U7SUFDNUQsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN6QixvRkFBb0Y7SUFDNUUsU0FBUyxHQUFHLENBQUMsQ0FBQztJ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SUFDaEYsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDekIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQWMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDdEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUM7QUFFRCwwRkFBMEY7QUFDMUYsU0FBUyxVQUFVLENBQUMsUUFBOEI7SUFDaEQsT0FBTyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWZmZXIg4oCUIFBlci1zdGFnZSBTVEFHSU5HIGJ1ZmZlciBmb3Igc3RhdGUgbXV0YXRpb25zXG4gKlxuICogV2hhdCBpdCBJUzogYSBzdGFnaW5nIGJ1ZmZlciB3aXRoIHJlYWQteW91ci13cml0ZXMgYW5kIG5ldC1jaGFuZ2UgY29tbWl0cy5cbiAqIC0gQ2hhbmdlcyBhcmUgc3RhZ2VkIGhlcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbiBhbmQgZmx1c2hlZCB0b1xuICogICBTaGFyZWRNZW1vcnkgaW4gT05FIGJhdGNoIHBlciBzdGFnZSAoYGNvbW1pdCgpYCkg4oCUIG90aGVyIHN0YWdlcyBhbmRcbiAqICAgcGFyYWxsZWwgc2libGluZ3MgbmV2ZXIgb2JzZXJ2ZSBhIHN0YWdlJ3MgaGFsZi1maW5pc2hlZCB3cml0ZXMuXG4gKiAtIFJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3kgd2l0aGluIGEgc3RhZ2Ug4oCUIGEgc3RhZ2Ugc2VlcyBpdHMgb3duXG4gKiAgIHN0YWdlZCB3cml0ZXMgaW1tZWRpYXRlbHkuXG4gKiAtIGBjb21taXQoKWAgcmVjb3JkcyB0aGUgc3RhZ2UncyBORVQgY2hhbmdlIChzZWUge0BsaW5rIGNvbW1pdH0pLCBwbHVzIGFuXG4gKiAgIG9wZXJhdGlvbiB0cmFjZSBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuXG4gKlxuICogV2hhdCBpdCBpcyBOT1Q6IGEgcm9sbGJhY2sgbWVjaGFuaXNtLiBEZXNwaXRlIHRoZSBuYW1lLCB0aGVyZSBpcyBub1xuICogYWJvcnQvcm9sbGJhY2sgcGF0aCDigJQgd2hlbiBhIHN0YWdlIFRIUk9XUywgdGhlIGVuZ2luZSBzdGlsbCBjb21taXRzXG4gKiBldmVyeXRoaW5nIHN0YWdlZCBzbyBmYXIgYmVmb3JlIHJlLXRocm93aW5nIChjb21taXQtb24tZXJyb3IgaW5cbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXJgKS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgYXVkaXQgdHJhaWwgbXVzdCByZWNvcmRcbiAqIHdoYXQgdGhlIGZhaWxpbmcgc3RhZ2UgY2hhbmdlZC4gRG8gbm90IHJlbHkgb24gXCJzdGFnZSBmYWlsZWQg4oaSIGl0c1xuICogd3JpdGVzIHZhbmlzaGVkXCIuXG4gKlxuICogVGhlIHBhdGNoIHRyZWVzIGhvbGQgUkVGRVJFTkNFUyB1bnRpbCBjb21taXQgKDkuMjMuMCkuIEEgYHNldGAgc3RvcmVzIHRoZVxuICogY2FsbGVyJ3Mgb3duIHZhbHVlIGluIGBvdmVyd3JpdGVQYXRjaGAgZXhhY3RseSBhcyBpdCBhbHdheXMgZGlkIGluXG4gKiBgd29ya2luZ0NvcHlgOyB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHRha2VuIE9OQ0UgcGVyIHN1cnZpdmluZyBwYXRoXG4gKiB3aGVuIHRoZSBwYXlsb2FkIGxlYXZlcyB0aGUgYnVmZmVyIChgdG9DaGFuZ2VPbmx5UGF5bG9hZGAgL1xuICogYHRvRGVsdGFQYXlsb2FkYCDigJQgZXZlcnkgdmFsdWUgdGhleSBlbWl0IHBhc3NlcyB0aHJvdWdoIGBzdHJ1Y3R1cmVkQ2xvbmVgXG4gKiB0aGVyZSkuIFRoZSBsYXcgXCJ0aGUgcmVjb3JkIG5ldmVyIGFsaWFzZXMgYSBjYWxsZXIncyBvYmplY3RcIiBpcyBrZXB0IGF0XG4gKiB0aGUgY29tbWl0IGJvdW5kYXJ5IGluc3RlYWQgb2YgYXQgZXZlcnkgd3JpdGUsIHdoaWNoIGlzIHdoYXQgbWFrZXMgTlxuICogd3JpdGVzIHRvIG9uZSBwYXRoIE8oTikgaW5zdGVhZCBvZiBPKE4gw5cgc2l6ZSkuIENvbnNlcXVlbmNlLCBieSBkZXNpZ246IGFcbiAqIGNhbGxlciB3aG8gbXV0YXRlcyBpdHMgb3duIG9iamVjdCBBRlRFUiB0aGUgd3JpdGUgYW5kIEJFRk9SRSB0aGUgc3RhZ2VcbiAqIGVuZHMgY29tbWl0cyB0aGUgdmFsdWUgYXMgdGhlIHN0YWdlIHJlYWQgaXQgYmFjayDigJQgdGhlIHJlY29yZCBhZ3JlZXMgd2l0aFxuICogdGhlIHN0YWdlIChDTEFVREUubWQgbGFuZG1pbmUgMydzIGZpcnN0IGJpdGUsIGNsb3NlZCkuIFRoZSBvbmUgcGxhY2UgdGhlXG4gKiBlbmdpbmUgaXRzZWxmIGVkaXRzIFRIUk9VR0ggYSBzdGFnZWQgdmFsdWUg4oCUIGEgbGF0ZXIgbmVzdGVkIG9wIHVuZGVyIGFcbiAqIGBzZXRgIHBhdGgg4oCUIGRldGFjaGVzIHRoYXQgdmFsdWUgZmlyc3QgKHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfSksIHNvXG4gKiBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIG5ldmVyIHNoYXJlIGEgY29udGFpbmVyIHRoZSBlbmdpbmVcbiAqIG11dGF0ZXMgb24gb25lIHNpZGUgb25seS5cbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLiBUaGVcbiAqIGJ1ZmZlciBubyBsb25nZXIgY2xvbmVzIHRoZSBjb21taXR0ZWQgc3RhdGUgaXQgc3RhcnRzIGZyb20uIGBiYXNlU25hcHNob3RgXG4gKiBJUyB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQgKGhlbGQgYnkgcmVmZXJlbmNlIOKAlFxuICogY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwKSwgYW5kIGB3b3JraW5nQ29weWAgc3RhcnRzIGFzIGFcbiAqIGNvcHkgb2YgaXRzIFJPT1Qgb25seTogZWFjaCB3cml0ZSBjb3BpZXMgdGhlIGNvbnRhaW5lcnMgb24gaXRzIG93biBwYXRoXG4gKiAoe0BsaW5rIG93blNwaW5lfSksIGFuZCB0aGUgZmlyc3QgUkVBRCBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBvZiBhXG4gKiBjb250YWluZXIgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlIHRha2VzIGEgcHJpdmF0ZSBkZWVwIGNvcHkgb2ZcbiAqIGl0ICh7QGxpbmsgcHJpdmF0aXNlfSkg4oCUIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBldmVyeVxuICogcmVhZCwgc28gYW4gaW4tcGxhY2UgZWRpdCBvZiBhIHJlYWQgdmFsdWUgc3RheXMgcHJpdmF0ZSBleGFjdGx5IGFzIGl0IGRpZC5cbiAqIEEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIgaXMgc2VydmVkIGZyb20gbGl2ZSBzdGF0ZSBieSB0aGVcbiAqIGNhbGxlciwgYXMgYmVmb3JlOyB0aGUgYnVmZmVyIHRoZW4gcmVwbGFjZXMgdGhhdCBwYXRoIG9mIGl0cyBkaWZmIGJhc2VcbiAqIHdpdGggYSBwcml2YXRlIGNvcHkgKHtAbGluayBkZXRhY2hCYXNlfSksIGFzIHRoZSBjbG9uZSBoYWQgaXQuXG4gKlxuICogVEhFIEFETUlUVEVEIFJFQ09SRCAoOS4zMC4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZCkuIEFcbiAqIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGUgc3RhZ2Unc1xuICogcmVhZC15b3VyLXdyaXRlcyB2aWV3IGF0IGV2ZXJ5IHBhdGggdGhlIHN0YWdlIHRvdWNoZWQgKGFuZCBhdCBldmVyeVxuICogY29udGFpbmVyIGl0cyB3cml0ZXMgY3JlYXRlZCBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzKS5cbiAqIEJvdGggZW5jb2RlcnMgY29tbWl0IHRoZSB2YWx1ZSB0aGUgc3RhZ2UgcmVhZDogYSBjb21wYWN0IHJvdyDigJQgYSBgbWVyZ2VgXG4gKiBkZWx0YSwgYW4gYGFwcGVuZGAgdGFpbCDigJQgaXMga2VwdCB3aGVyZSBpdCBwcm92YWJseSBmb2xkcyBiYWNrOyBhIGZhbWlseSBvZlxuICogcm93cyB0aGF0IGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHZhbHVlcyB0aGUgc3RhZ2UgcmVhZFxuICogKHtAbGluayBhZG1pdH0pLiBCZWZvcmUgOS4zMC4wIHRoZSBvbmUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgcGVyIHBhdGggd2FzXG4gKiByZXBsYXllZCBhdCBldmVyeSBgbWVyZ2VgIHJvdyBvZiB0aGF0IHBhdGgsIHdoaWNoIGxpZWQgYWNyb3NzIGEgaGFyZCB3cml0ZVxuICogKGAkdXBkYXRlKGsse3h9KTsgayA9IHt5fTsgJHVwZGF0ZShrLHt6fSlgIGNvbW1pdHRlZCBge3ksIHgsIHp9YCBmb3IgYVxuICogcmVhZC1iYWNrIG9mIGB7eSwgen1gKSwgYW4gYFtdYCBjbGVhciwgYSBraW5kIGNoYW5nZSBvciBhbiBhcnJheSB1bmlvblxuICogZGVkdXBsaWNhdGVkIGJ5IHJlZmVyZW5jZS4gVmVyaWZpZWQgd2hlbiB0aGUgc3RhZ2Ugc3RhZ2VkIGEgYG1lcmdlYCBvciBhXG4gKiBuZXN0ZWQgb3A7IGEgc3RhZ2UgdGhhdCBzdGFnZWQgb25seSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXJcbiAqIGl0cyBhZGRyZXNzIGlzIGNvaGVyZW50IGJ5IGNvbnN0cnVjdGlvbiDigJQgYm90aCB0cmVlcyByZWNlaXZlIHRoZSBzYW1lXG4gKiB3cml0ZSDigJQgYW5kIGlzIGFkbWl0dGVkIHdpdGhvdXQgdGhlIGZvbGQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBGYW1pbHksIHR5cGUgTG9zc3ksIHR5cGUgTWVtYmVyLCB0eXBlIFJvd3MsIGFkZHJlc3NEZXB0aE9mLCBsb3NzeUZhbWlsaWVzIH0gZnJvbSAnLi9hZG1pc3Npb24uanMnO1xuaW1wb3J0IHsgdHlwZSBPcFZlcmIsIHR5cGUgU3Vydml2b3IsIGVtaXRJbkZhbWlseU9yZGVyLCBncm91cEludG9GYW1pbGllcywgcHVzaFZhbHVlUm93IH0gZnJvbSAnLi9kZWx0YUVuY29kaW5nLmpzJztcbmltcG9ydCB7IHJlbGF0aW9uIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQge1xuICBhZG9wdCxcbiAgaXNDb250YWluZXIsXG4gIG5hdGl2ZUdldCBhcyBfZ2V0LFxuICBuYXRpdmVTZXQgYXMgX3NldCxcbiAgb3duLFxuICBvd25DaGlsZCxcbiAgb3duZWRSb290T2YsXG4gIG93blNwaW5lLFxuICBzaGFsbG93Q29weSxcbn0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGVlcFNtYXJ0TWVyZ2UsIERFTElNLCBkcnlGb2xkLCBub3JtYWxpc2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gIC8qKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBkaWZmIGJhc2U6IHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3RcbiAgICogdG91Y2hlZCwgYnkgcmVmZXJlbmNlIOKAlCBleGNlcHQgd2hlcmUge0BsaW5rIGRldGFjaEJhc2V9IHJlcGxhY2VkIGEgcGF0aFxuICAgKiBvZiBpdCB3aXRoIGEgcHJpdmF0ZSBjb3B5IChpdHMgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBhcmVcbiAgICogdGhlbiBjb3BpZXMgdG9vLCBvd25lZCBieSB7QGxpbmsgYmFzZU93bmVkfSkuXG4gICAqL1xuICBwcml2YXRlIGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFBhdGhzIHdob3NlIGBvdmVyd3JpdGVQYXRjaGAgdmFsdWUgaXMgdGhlIGNhbGxlcidzIG93biBvYmplY3QgKDkuMjMuMCk6XG4gICAqIGEgYHNldGAgb2YgYSBjb250YWluZXIgc3RvcmVzIHRoZSByZWZlcmVuY2UsIGFuZCB0aGlzIGlzIHRoZSBsZWRnZXIgb2ZcbiAgICogd2hpY2ggb25lcyBhcmUgc3RpbGwgc2hhcmVkIHdpdGggdGhlIGNhbGxlciAoYW5kIHdpdGggYHdvcmtpbmdDb3B5YCkuXG4gICAqIENvbnN1bHRlZCBvbmx5IGJ5IHRoZSBlbmdpbmUncyBuZXN0ZWQgb3BzIOKAlCBzZWVcbiAgICoge0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9OyB0aGUgY29tbWl0IHBheWxvYWQgY2xvbmVzIGV2ZXJ5IHN1cnZpdmluZ1xuICAgKiB2YWx1ZSBhbnl3YXkgYW5kIG5ldmVyIGFza3MuIENsZWFyZWQgd2l0aCB0aGUgcmVzdCBhdCBgY29tbWl0KClgLlxuICAgKi9cbiAgcHJpdmF0ZSBoZWxkUmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKiogQ29tbWl0LXZhbHVlIGVuY29kaW5nIHBvbGljeSAoIzEzYy1CKS4gYCdmdWxsJ2AgPSBoaXN0b3JpY2FsIGJ5dGVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcblxuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBzb3VyY2UgKCNQMSkuIFdoZW4gc2V0ICh0aGVcbiAgICogIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgZXZlcnkgc3RhZ2VkIG9wIHNuYXBzaG90cyB0aGVcbiAgICogIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciDigJQgdGhlIHRlbXBvcmFsLXByZWZpeCBhdHRyaWJ1dGlvbiBjb25zdW1lZCBieVxuICAgKiAgY2F1c2FsIHNsaWNpbmcuIFVuZGVmaW5lZCAoZGVmYXVsdCkgPSB6ZXJvIGNvc3QsIGJ5dGUtaWRlbnRpY2FsIG9wcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIGluIGB3b3JraW5nQ29weWAgdGhpcyBidWZmZXIgQ1JFQVRFRDogaXRzIHJvb3QgY29weSwgdGhlXG4gICAqIHBhdGggY29waWVzIGl0cyB3cml0ZXMgbWFkZSwgdGhlIG1lcmdlIHJlc3VsdHMgaXQgYnVpbHQsIGFuZCBldmVyeVxuICAgKiBjb250YWluZXIgb2YgdGhlIHByaXZhdGUgY29waWVzIGl0cyByZWFkcyB0b29rLiBBIHdyaXRlIGVkaXRzIHRoZXNlIGluXG4gICAqIHBsYWNlLiBFdmVyeXRoaW5nIGVsc2UgaW4gYHdvcmtpbmdDb3B5YCBpcyBTSEFSRUQg4oCUIHdpdGggdGhlIGNvbW1pdHRlZFxuICAgKiBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkLCBvciB3aXRoIGEgdmFsdWUgdGhlIHN0YWdlIHN0YWdlZCDigJRcbiAgICogYW5kIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCAoe0BsaW5rIG93blNwaW5lfSkuXG4gICAqL1xuICBwcml2YXRlIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgdmFsdWVzIHRoZSBzdGFnZSBzdGFnZWQgd2l0aCB7QGxpbmsgc2V0fSDigJQgaXRzIG93biBvYmplY3RzLFxuICAgKiBoZWxkIGJ5IHJlZmVyZW5jZSAoOS4yMy4wKS4gQSByZWFkIGhhbmRzIHRoZW0gYmFjayBhcyB0aGV5IGFyZSwgZXhhY3RseVxuICAgKiBhcyB0aGUgcHJpdmF0ZSB3b3JraW5nIGNvcHkgYWx3YXlzIGRpZCwgYW5kIG5ldmVyIHByaXZhdGlzZXMgdGhlbTogYVxuICAgKiBwcml2YXRlIGNvcHkgb2YgYSBzdGFnZWQgdmFsdWUgd291bGQgbGVhdmUgYHdvcmtpbmdDb3B5YCBhbmRcbiAgICogYG92ZXJ3cml0ZVBhdGNoYCBkaXNhZ3JlZWluZyBhYm91dCBhIHZhbHVlIHRoZSBzdGFnZSB3cm90ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBPd25lZCBjb250YWluZXJzIHdpdGggbm8gY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZVxuICAgKiBhbnl3aGVyZSBiZWxvdyB0aGVtIChhIHByaXZhdGUgZGVlcCBjb3B5LCBhIG1lcmdlIHJlc3VsdCBidWlsdCBvbiBhXG4gICAqIHByaXZhdGUgYmFzZSwgYSBwYXRoIGNvcHkgd2hvc2Ugc2hhcmVkIGNoaWxkcmVuIHdlcmUgcHJpdmF0aXNlZCkuIEEgcmVhZFxuICAgKiB0aGF0IGxhbmRzIG9uIG9uZSBuZWVkcyBubyB3YWxrIOKAlCBzZWUge0BsaW5rIHByaXZhdGlzZUJlbG93fS5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBvZiB7QGxpbmsgYmFzZVNuYXBzaG90fSB0aGF0IHtAbGluayBkZXRhY2hCYXNlfSBjcmVhdGVkOlxuICAgKiBpdHMgcm9vdCBjb3B5IGFuZCB0aGUgY29waWVzIG9uIHRoZSB3YXkgdG8gYSBkZXRhY2hlZCBwYXRoLiBBbGxvY2F0ZWRcbiAgICogb25seSBieSB0aGUgZmlyc3QgZGV0YWNoIOKAlCB0aGUgaW4tY29udHJhY3Qgc3RhZ2UgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gICAqL1xuICBwcml2YXRlIGJhc2VPd25lZD86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgZGVlcCBjb3BpZXMge0BsaW5rIGRldGFjaEJhc2V9IHB1dCBpbnRvIHRoZSBkaWZmIGJhc2U6IG5vdGhpbmdcbiAgICogYXQgb3IgYmVsb3cgb25lIGlzIGNvbW1pdHRlZCBzdGF0ZSwgc28gYSBsYXRlciBkZXRhY2ggaW5zaWRlIGl0IGlzIGEgbm8tb3AuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaGVkQmFzZT86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIHN0YWdlIHdyaXRlcyAoOS4zMC4wKTogYFsncnVucycsIHJ1bklkXWAgZm9yIGEgcnVuLW5hbWVzcGFjZWRcbiAgICogc3RhZ2UsIGBbXWAgb3RoZXJ3aXNlLiBJdHMgY29udGFpbmVycyBhcmUgdGhlIHN0YWdlJ3MgQUREUkVTUywgbm90IGEgdmFsdWVcbiAgICogdGhlIHN0YWdlIHJlYWRzIChldmVyeSByZWFkIGl0IG1ha2VzIGlzIGEga2V5IGJlbG93IGl0KSwgc28gYSBzaGVsbCBhXG4gICAqIHdyaXRlIGxlYXZlcyB0aGVyZSBpcyBubyBwYXJ0IG9mIHRoZSByZWFkLWJhY2sgdGhlIHJlY29yZCBtdXN0IGhvbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBgbWVyZ2VgIG9wcyBzdGFnZWQgc2luY2UgdGhlIGxhc3QgY29tbWl0IOKAlCBzZWUge0BsaW5rIGFkbWl0fS4gKi9cbiAgcHJpdmF0ZSBzdGFnZWRNZXJnZXMgPSAwO1xuICAvKiogT3BzIHN0YWdlZCBkZWVwZXIgdGhhbiBvbmUga2V5IGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3Mg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIG5lc3RlZE9wcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZTogYW55LFxuICAgIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZSA9ICdmdWxsJyxcbiAgICByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW10sXG4gICAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKSB7XG4gICAgLy8gYGJhc2VgIGlzIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCDigJRcbiAgICAvLyBpbW11dGFibGUtYWZ0ZXItc3dhcCwgdGhlIGludmFyaWFudCB0aGUgZmlyc3QtdG91Y2ggdmlldyBhbHJlYWR5IHJlc3RzXG4gICAgLy8gb24g4oCUIHNvIHRoZSBkaWZmIGJhc2UgaXMgaGVsZCBieSBSRUZFUkVOQ0UsIGFuZCB0aGUgd29ya2luZyBjb3B5IHN0YXJ0c1xuICAgIC8vIGFzIGEgY29weSBvZiBpdHMgUk9PVCBvbmx5LiBCZWZvcmUgOS4yOS4wIHRoZXNlIHR3byBsaW5lcyB3ZXJlIHR3b1xuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgd2hvbGUgc3RhdGUsIHBhaWQgYnkgZXZlcnkgc3RhZ2UgdGhhdCB3cm90ZS5cbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IGJhc2U7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IG93bmVkUm9vdE9mKGJhc2UsIHRoaXMub3duZWQpO1xuICAgIHRoaXMuY29tbWl0VmFsdWVzID0gY29tbWl0VmFsdWVzO1xuICAgIHRoaXMucmVhZEtleXNQcm92aWRlciA9IHJlYWRLZXlzUHJvdmlkZXI7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgY3VycmVudCByZWFkIHByZWZpeCBvbnRvIGEgc3RhZ2VkIG9wIOKAlCBvbmx5IHdoZW4gdGhlXG4gICAqICBwcm92ZW5hbmNlIGRpYWwgaXMgb24gKHByb3ZpZGVyIHByZXNlbnQpLCBzbyB0aGUgZGVmYXVsdCBwYXRoIGFsbG9jYXRlc1xuICAgKiAgbm90aGluZyBhbmQgY29tbWl0IGJ1bmRsZXMgc3RheSBieXRlLWlkZW50aWNhbC4gKi9cbiAgcHJpdmF0ZSBzdGFtcFJlYWRLZXlzKG9wOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH0pOiB0eXBlb2Ygb3Age1xuICAgIGlmICh0aGlzLnJlYWRLZXlzUHJvdmlkZXIpIG9wLnJlYWRLZXlzID0gdGhpcy5yZWFkS2V5c1Byb3ZpZGVyKCk7XG4gICAgcmV0dXJuIG9wO1xuICB9XG5cbiAgLyoqIFN0YWdlIGFuIG9wIGludG8gYG9wVHJhY2VgLCBjb3VudGluZyB3aGF0IGRlY2lkZXMgd2hldGhlciB7QGxpbmsgYWRtaXR9IG11c3QgZm9sZC4gKi9cbiAgcHJpdmF0ZSBzdGFnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBrZXk6IHN0cmluZywgdmVyYjogT3BWZXJiKTogdm9pZCB7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHRoaXMuc3RhZ2VkTWVyZ2VzKys7XG4gICAgaWYgKHBhdGgubGVuZ3RoIC0gYWRkcmVzc0RlcHRoT2YocGF0aCwgdGhpcy5hZGRyZXNzKSA+IDEpIHRoaXMubmVzdGVkT3BzKys7XG4gICAgdGhpcy5vcFRyYWNlLnB1c2godGhpcy5zdGFtcFJlYWRLZXlzKHsgcGF0aDoga2V5LCB2ZXJiIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIFN0b3JlcyB0aGUgUkVGRVJFTkNFIGluIGJvdGggdHJlZXNcbiAgICogKDkuMjMuMCkg4oCUIHRoZSByZWNvcmQncyBjb3B5IGlzIHRha2VuIG9uY2UsIGF0IGNvbW1pdDsgc2VlIHRoZSBoZWFkZXIuXG4gICAqL1xuICBzZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoaXNDb250YWluZXIodmFsdWUpKSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmFkZChrZXkpO1xuICAgICAgdGhpcy5zdGFnZWQuYWRkKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ3NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbmVzdGVkIG9wIGlzIGFib3V0IHRvIHdyaXRlIFRIUk9VR0ggYSBwYXRoIHdob3NlIGBvdmVyd3JpdGVQYXRjaGBcbiAgICogdmFsdWUgaXMgYSBoZWxkIHJlZmVyZW5jZSAoOS4yMy4wKS4gVG9kYXkncyBsYXcgaXMgdGhhdCB0aGUgdHdvIHRyZWVzXG4gICAqIHJlY2VpdmUgdGhlIHNhbWUgbmVzdGVkIGBzZXRgL2BkZWxldGVgIG11dGF0aW9ucyBidXQgT05MWSBgd29ya2luZ0NvcHlgXG4gICAqIHJlY2VpdmVzIGEgbmVzdGVkIGBtZXJnZWAncyByZXN1bHQgKGB1cGRhdGVQYXRjaGAgZ2V0cyB0aGUgZGVsdGEpIOKAlCBzbyBhXG4gICAqIGNvbnRhaW5lciBzaGFyZWQgYmV0d2VlbiB0aGUgdHJlZXMgd291bGQgbGVhayB0aGUgbWVyZ2VkIHZhbHVlIGludG8gdGhlXG4gICAqIG92ZXJ3cml0ZSBwYXlsb2FkLCBhbmQgYSBzaGFyZWQgY29udGFpbmVyIGlzIGFsc28gdGhlIGNhbGxlcidzIG93blxuICAgKiBvYmplY3QsIHdoaWNoIHRoZSBlbmdpbmUgbXVzdCBub3QgZWRpdCBvbiB0aGUgcmVjb3JkJ3MgYmVoYWxmLiBSZXBsYWNpbmdcbiAgICogdGhlIGhlbGQgYW5jZXN0b3Igd2l0aCBpdHMgY2xvbmUgaW4gYG92ZXJ3cml0ZVBhdGNoYCByZXN0b3JlcyBleGFjdGx5XG4gICAqIHRoZSBwcml2YXRlIHRyZWUgdGhlIHBlci13cml0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgaXQsIHBhaWQgb25jZSBwZXJcbiAgICogYW5jZXN0b3IgYW5kIG9ubHkgb24gdGhlIG5lc3RlZC1vcCBwYXRoIHRoZSBwdWJsaWMgc3VyZmFjZSBuZXZlciB0YWtlc1xuICAgKiAodGhlIHNjb3BlIHByb3h5IHdyaXRlcyBST09UIGtleXMpLiBgd29ya2luZ0NvcHlgIGtlZXBzIHRoZSByZWZlcmVuY2UsXG4gICAqIGFzIGl0IGFsd2F5cyBkaWQuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaEhlbGRBbmNlc3RvcnMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlbGRSZWZzLnNpemUgPT09IDApIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGF0aC5zbGljZSgwLCBpKTtcbiAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgoYW5jZXN0b3IpO1xuICAgICAgaWYgKCF0aGlzLmhlbGRSZWZzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGhlbGQgPSBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yKTtcbiAgICAgIGlmIChoZWxkICE9PSBudWxsICYmIHR5cGVvZiBoZWxkID09PSAnb2JqZWN0JykgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBhbmNlc3Rvciwgc3RydWN0dXJlZENsb25lKGhlbGQpKTtcbiAgICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGtleSBkZWxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKCMxM2MtQjsgYWJzb3JicyBiYWNrbG9nIEI4KS5cbiAgICpcbiAgICogU3RhZ2VzIEVYQUNUTFkgdGhlIHNhbWUgYnVmZmVyIG11dGF0aW9ucyBhcyBgc2V0KHBhdGgsIHVuZGVmaW5lZClgIOKAlFxuICAgKiBgd29ya2luZ0NvcHlgL2BvdmVyd3JpdGVQYXRjaGAgZ2V0IGFuIG93biBgdW5kZWZpbmVkYCBhdCB0aGUgcGF0aCAodGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZywgcHJlc2VydmluZyByZWFkIGJlaGF2aW9yIGFuZCB0aGUgZGVkdXAgZGlmZiBiYXNlXG4gICAqIGFjcm9zcyBtb2Rlcykg4oCUIGJ1dCByZWNvcmRzIHRoZSBvcCB2ZXJiIGFzIGAnZGVsZXRlJ2AuIEF0IGNvbW1pdDpcbiAgICogYCdmdWxsJ2AgbW9kZSBtYXBzIGl0IGJhY2sgdG8gYSBgJ3NldCdgIHRyYWNlIGVudHJ5IChieXRlLWlkZW50aWNhbCB0b1xuICAgKiB0b2RheSk7IGAnZGVsdGEnYCBtb2RlIGVtaXRzIGEgcmVhbCBgJ2RlbGV0ZSdgIGVudHJ5IHdob3NlIHJlcGxheVxuICAgKiBSRU1PVkVTIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGBrZXk6IHVuZGVmaW5lZGAgYmVoaW5kLlxuICAgKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBmaWx0ZXIgcmVhZHMgdGhhdCBzdGFnZWQgb3duIGB1bmRlZmluZWRgIGFzIEFCU0VOVFxuICAgKiAoYGRlZXBFcXVhbGAsIDkuMTkuMSkg4oCUIHNvIHVuZGVyIGAnZGVsdGEnYCwgd2hvc2UgY29tbWl0dGVkIHN0YXRlIHJlYWxseVxuICAgKiBsYWNrcyB0aGUga2V5LCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGluc2lkZSBhIGNvbnRhaW5lciB0aGUgc3RhZ2UgYWxzb1xuICAgKiByZS13cm90ZSBpcyB0aGUgbm8tb3AgaXQgaXMsIG5vdCBhIGBzZXRgIG9mIHRoZSB3aG9sZSBjb250YWluZXIuXG4gICAqL1xuICBkZWxldGUocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBgZGVlcFNtYXJ0TWVyZ2VgIGJ1aWxkcyBmcmVzaFxuICAgKiAgY29udGFpbmVycywgc28gbmVpdGhlciB0cmVlIGV2ZXIgaG9sZHMgdGhlIG1lcmdlIElOUFVUIGJ5IHJlZmVyZW5jZTtcbiAgICogIHRoZSBuZXN0ZWQtb3AgZGV0YWNoIGd1YXJkcyB0aGUgYW5jZXN0b3IgaXQgd3JpdGVzIElOVE8uXG4gICAqXG4gICAqICBUaGUgdmFsdWUgbWVyZ2VkIElOVE8gaXMgbWFkZSBwcml2YXRlIGZpcnN0IChgcHJpdmF0aXNlYCksIGFzIHRoZVxuICAgKiAgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBpdCBiZWZvcmUgOS4yOS4wLiBOb3Qgb25seSBmb3IgdGhlIHJlYWRzIHRoYXRcbiAgICogIGZvbGxvdzogYGRlZXBTbWFydE1lcmdlYCB1bmlvbnMgYXJyYXlzIEJZIFJFRkVSRU5DRSwgc28gd2hldGhlciBhblxuICAgKiAgZWxlbWVudCB0aGUgc3RhZ2UgcGFzc2VzIGluIGlzIFwiYWxyZWFkeSB0aGVyZVwiIGRlcGVuZHMgb24gd2hpY2ggb2JqZWN0c1xuICAgKiAgdGhlIGJhc2UgaG9sZHMg4oCUIGEgY29tbWl0dGVkIGFycmF5IHdvdWxkIGRlZHVwIGFuIGVsZW1lbnQgdGhlIHN0YWdlXG4gICAqICByZWFkIGZyb20gaXQgYmVmb3JlIGl0cyBmaXJzdCB3cml0ZSwgd2hlcmUgdGhlIHByaXZhdGUgY29weSAoYW5kXG4gICAqICA5LjI4LjApIGFwcGVuZHMgaXQuICovXG4gIG1lcmdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpID8/IHt9O1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBTbWFydE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgb3duKG1lcmdlZCwgdGhpcy5vd25lZCk7XG4gICAgaWYgKGlzQ29udGFpbmVyKG1lcmdlZCkpIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChtZXJnZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ21lcmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmllbGQtbGV2ZWwgcmVkYWN0aW9uICg5LjE5LjApOiBtYXJrIGRvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlIHN0YWdlZCBhdFxuICAgKiBgcGF0aGAgYXMgc2VjcmV0LCBzbyBgc2NydWJQYXRjaGAgc2NydWJzIHRoZW0gaW4gdGhlIGNvbW1pdCBsb2cgYW5kIHRoZVxuICAgKiBtaXJyb3IgdGhlIHNhbWUgd2F5IGEgd2hvbGUta2V5IHJlZGFjdGlvbiBpcyBzY3J1YmJlZC4gQSBmaWVsZCBpc1xuICAgKiByZWdpc3RlcmVkIGFzIGEgbGl0ZXJhbCBrZXkgQU5ELCB3aGVuIGRvdHRlZCwgYXMgdGhlIG5lc3RlZCBwYXRoIGl0XG4gICAqIG5hbWVzIOKAlCB3aGljaGV2ZXIgZXhpc3RzIGluIHRoZSBwYXRjaCBpcyB0aGUgb25lIGBzY3J1YlBhdGNoYCBmaW5kcy5cbiAgICogTWFya2VkIHBhdGhzIHN1cnZpdmUgY29tbWl0IG9ubHkgd2hpbGUgdGhlIG9wIHBhdGggdGhleSBzaXQgdW5kZXIgZG9lc1xuICAgKiAoc2VlIHtAbGluayBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzfSkuXG4gICAqL1xuICBtYXJrUmVkYWN0ZWRGaWVsZHMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgoWy4uLnBhdGgsIGZpZWxkXSkpO1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKCcuJykpIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgLi4uZmllbGQuc3BsaXQoJy4nKV0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHJlZGFjdGlvbiBtYXJrIGFkZHJlc3MgYW4gYXJyYXkgRUxFTUVOVCByaWdodCBiZWxvdyBgcGF0aGBcbiAgICogKGBsaXN0LjEudG9rZW5gKT8gQW4gYGFwcGVuZGAgcm93IHJlLWJhc2VzIHRoZSBpbmRpY2VzIG9udG8gdGhlIHRhaWwsIHNvXG4gICAqIHN1Y2ggYSBwYXRoIHRha2VzIHRoZSB3aG9sZS12YWx1ZSBgc2V0YCAoYGRlbHRhRW5jb2RpbmcgwrcgcHVzaFZhbHVlUm93YCkuXG4gICAqIEEgbWFyayBieSBOQU1FIGJlbG93IGFuIGFycmF5IChgb2JqLnlgKSBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiB0aGUgdGFpbFxuICAgKiBhcyBvbiB0aGUgd2hvbGUgdmFsdWUsIHNvIHRoZSBjb21wYWN0IHJvdyBzdGF5cyAoYnl0ZS1pZGVudGljYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWRCZWxvdyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXggPSBwYXRoICsgREVMSU07XG4gICAgZm9yIChjb25zdCBtYXJrZWQgb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoIW1hcmtlZC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmV4dCA9IG1hcmtlZC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdChERUxJTSlbMF07XG4gICAgICBpZiAoL14oMHxbMS05XVxcZCopJC8udGVzdChuZXh0KSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0ZWQgcGF0aHMgdGhhdCBzdXJ2aXZlIHRoZSBuZXQtY2hhbmdlIGZpbHRlcjogYSBwYXRoIHN1cnZpdmVzXG4gICAqIHdoZW4gaXQgSVMgYSBzdXJ2aXZpbmcgb3AgcGF0aCAoYSB3aG9sZS1rZXkgcmVkYWN0aW9uKSBvciBzaXRzIFVOREVSIG9uZVxuICAgKiAoYSBmaWVsZCBpbnNpZGUgYSBzdXJ2aXZpbmcgd3JpdGUpLiBBIGRyb3BwZWQgb3AgdGFrZXMgaXRzIGZpZWxkcyB3aXRoIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKHN1cnZpdmluZ1BhdGhzOiBTZXQ8c3RyaW5nPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgIG91dC5hZGQocGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcCBvZiBzdXJ2aXZpbmdQYXRocykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKG9wICsgREVMSU0pKSB7XG4gICAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gVGhlIHZhbHVlIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biDigJQgcHJpdmF0ZSB0byBpdCwgYXMgdGhlIHdob2xlLXN0YXRlIGNsb25lIG1hZGUgZXZlcnkgcmVhZFxuICAgKiBhZnRlciB0aGUgZmlyc3Qgd3JpdGUgYmVmb3JlIDkuMjkuMCAoYHByaXZhdGlzZWApLlxuICAgKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHRoaXMucHJpdmF0aXNlKHBhdGgpO1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgd29ya2luZyBjb3B5IGF0IGBwYXRoYCBXSVRIT1VUIHRha2luZyBhIHByaXZhdGUgY29weSDigJQgZm9yIGFcbiAgICogcmVhZGVyIHRoYXQgb25seSBjb21wYXJlcyAodGhlIGRldi1tb2RlIGJvcnJvd2VkLW11dGF0aW9uIHJlcG9ydCBpblxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdGApLCBuZXZlciBmb3IgYSB2YWx1ZSBoYW5kZWQgdG8gYSBzdGFnZS5cbiAgICovXG4gIHBlZWsocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCB1bmRlciBhIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyLlxuICAgKlxuICAgKiBXaGVuIGB3b3JraW5nQ29weWAgaG9sZHMgbm90aGluZyBhdCBgcGF0aGAg4oCUIHRoZSBzdGFnZSBkZWxldGVkIG9yIHVuc2V0XG4gICAqIGl0LCBvciBhIHdyaXRlIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0IOKAlCBgU3RhZ2VDb250ZXh0IMK3XG4gICAqIHJlYWRTdGF0ZWAgc2VydmVzIHRoZSByZWFkIGZyb20gTElWRSBjb21taXR0ZWQgc3RhdGUsIGV4YWN0bHkgYXMgOS4yOC4wXG4gICAqIGRpZCwgc28gdGhlIHZhbHVlIGl0IGhhbmRzIG91dCBpcyBjb21taXR0ZWQgc3RhdGUgaXRzZWxmLiBPbiA5LjI4LjAgdGhlXG4gICAqIGRpZmYgYmFzZSB3YXMgYSB3aG9sZS1zdGF0ZSBjbG9uZSB0YWtlbiBhdCB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSwgYW5kXG4gICAqIGFuIGluLXBsYWNlIGVkaXQgb2YgdGhhdCB2YWx1ZSAob3V0IG9mIGNvbnRyYWN0IOKAlCByZWFkcyBhcmUgYm9ycm93ZWQpXG4gICAqIGNvdWxkIG5vdCBtb3ZlIGl0OiB3cml0dGVuIGJhY2ssIHRoZSBlZGl0IHdhcyByZWNvcmRlZC4gSGVyZSB0aGUgZGlmZlxuICAgKiBiYXNlIElTIGEgY29tbWl0dGVkIGdlbmVyYXRpb24sIGFuZCBpdCB2ZXJ5IG9mdGVuIGhvbGRzIHRoYXQgc2FtZVxuICAgKiBjb250YWluZXIgYXQgYHBhdGhgIOKAlCB0aGUgZWRpdCB3b3VsZCBtb3ZlIHRoZSBiYXNlIHdpdGggaXQsIGFuZCB0aGVcbiAgICogd3JpdGUtYmFjayB3b3VsZCBjb21taXQgbm8gY2hhbmdlLiBTbyBiZWZvcmUgdGhlIHZhbHVlIGdvZXMgb3V0LCB0aGVcbiAgICogYmFzZSdzIHZhbHVlIGF0IGBwYXRoYCBpcyByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5ICh0aGUgYmFzZSdzXG4gICAqIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgY29waWVkIHNoYWxsb3dseSkg4oCUIHdoYXQgOS4yOC4wJ3NcbiAgICogYmFzZSBoZWxkIHRoZXJlLiBUaGUgY29tbWl0J3MgbmV0LWNoYW5nZSB0ZXN0IGNvbXBhcmVzIGFnYWluc3QgaXQgYW5kXG4gICAqIHRoZSBkZWx0YSBlbmNvZGVyIHJlcGxheXMgZnJvbSBpdDsgdGhlIHZhbHVlIGhhbmRlZCBvdXQgc3RheXMgdGhlIGxpdmVcbiAgICogb25lLCBzbyB3aGF0ZXZlciBlbHNlIGFuIGVkaXQgb2YgaXQgcmVhY2hlcyAobGl2ZSBzdGF0ZSwgdGhlIG5leHRcbiAgICogZ2VuZXJhdGlvbikgYmVoYXZlcyBhcyBvbiA5LjI4LjAgdG9vLlxuICAgKlxuICAgKiBOb3QgYHByaXZhdGlzZWA6IGEgcHJpdmF0ZSBjb3B5IGhhbmRlZCB0byB0aGUgc3RhZ2Ugd291bGQgYWxzbyBrZWVwIHRoZVxuICAgKiBlZGl0IG91dCBvZiBsaXZlIHN0YXRlLCB3aGVyZSA5LjI4LjAgbGV0IGl0IGluIOKAlCBhIHJ1bi1uYW1lc3BhY2VkIHJlYWRcbiAgICogdGhhdCBmYWxscyBiYWNrIHRvIGEgZ2xvYmFsIGtleSB3b3VsZCB0aGVuIGVuZCBkaWZmZXJlbnRseSAodGhlXG4gICAqIGRpZmZlcmVudGlhbCdzIE5FU1RFRCBmYW1pbHkgZmFpbHMgd2l0aGluIDEwMCBwcm9ncmFtcyB0aGF0IHdheSkuXG4gICAqXG4gICAqIENvcGllcyBub3RoaW5nIHdoZW4gdGhlIGJhc2UgaG9sZHMgbm8gY29udGFpbmVyIGF0IGBwYXRoYCwgYW5kIG5vdGhpbmdcbiAgICogdHdpY2U6IGEgcGF0aCBhdCBvciBiZWxvdyBhbiBlYXJsaWVyIGRldGFjaCBpcyBhbHJlYWR5IHByaXZhdGUuIE8ocGF0aClcbiAgICogb3RoZXJ3aXNlLCBwbHVzIE8odmFsdWUpIG9uY2UgcGVyIGRldGFjaGVkIHBhdGguXG4gICAqL1xuICBkZXRhY2hCYXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgfHwgIWlzQ29udGFpbmVyKHRoaXMuYmFzZVNuYXBzaG90KSkgcmV0dXJuO1xuICAgIGxldCBhdDogb2JqZWN0ID0gdGhpcy5iYXNlU25hcHNob3Q7XG4gICAgZm9yIChjb25zdCBrIG9mIHBhdGgpIHtcbiAgICAgIGlmICh0aGlzLmRldGFjaGVkQmFzZT8uaGFzKGF0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGNoaWxkKSkgcmV0dXJuO1xuICAgICAgYXQgPSBjaGlsZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgY29uc3Qgb3duZWQgPSAodGhpcy5iYXNlT3duZWQgPz89IG5ldyBXZWFrU2V0PG9iamVjdD4oKSk7XG4gICAgaWYgKCFvd25lZC5oYXModGhpcy5iYXNlU25hcHNob3QpKSB0aGlzLmJhc2VTbmFwc2hvdCA9IG93bmVkUm9vdE9mKHRoaXMuYmFzZVNuYXBzaG90LCBvd25lZCk7XG4gICAgb3duU3BpbmUodGhpcy5iYXNlU25hcHNob3QsIHBhdGgsIG93bmVkKTtcbiAgICBjb25zdCBjb3B5OiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYXQpO1xuICAgICh0aGlzLmRldGFjaGVkQmFzZSA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKS5hZGQoY29weSk7XG4gICAgX3NldCh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgY29weSk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSByZWFkcyAoOS4yOS4wKTogbWFrZSB0aGUgdmFsdWUgYXQgYHBhdGhgIHRoZSBzdGFnZSdzIG93biBiZWZvcmVcbiAgICogYSByZWFkIGhhbmRzIGl0IG91dCDigJQgc28gYSByZWFkIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIGJlaGF2ZXNcbiAgICogZXhhY3RseSBhcyBpdCBkaWQgd2hlbiB0aGUgYnVmZmVyIGJlZ2FuIHdpdGggYSBkZWVwIGNsb25lIG9mIHRoZSB3aG9sZVxuICAgKiBzdGF0ZS4gQW4gaW4tcGxhY2UgZWRpdCBvZiB3aGF0IHRoZSByZWFkIHJldHVybmVkIChvdXQgb2YgY29udHJhY3Qg4oCUXG4gICAqIHJlYWRzIGFyZSBib3Jyb3dlZCkgc3RheXMgaW5zaWRlIHRoZSBidWZmZXIsIGFuZCBjb21taXR0ZWQgc3RhdGUgaXMgbmV2ZXJcbiAgICogdG91Y2hlZC4gV2hldGhlciB0aGUgUkVDT1JEIGtlZXBzIGl0IGlzIHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXdcbiAgICogKDkuMzAuMCwgb3duZXIgcnVsaW5nIFIxIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHdoYXQgdGhlIHN0YWdlIHJlYWQgYmFjayk6IGl0XG4gICAqIGlzIGtlcHQgd2hlbiB0aGUgZWRpdGVkIHZhbHVlIGxpZXMgYXQgb3IgYmVsb3cgYSBwYXRoIHRoZSBzdGFnZSB3cm90ZSBpblxuICAgKiB0aGlzIHN0YWdlIOKAlCBzZXQsIG1lcmdlZCBvciB3cml0dGVuIGJhY2sgYWxpa2Ug4oCUIGFuZCBsb3N0IG90aGVyd2lzZS5cbiAgICpcbiAgICogV2Fsa2luZyB0aGUgcGF0aCBmcm9tIHRoZSAob3duZWQpIHJvb3Q6XG4gICAqICAtIGEgY29udGFpbmVyIHN0aWxsIFNIQVJFRCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpc1xuICAgKiAgICByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5IHdoZW4gaXQgaXMgdGhlIHZhbHVlIHJlYWQsIG9yIGJ5IGFcbiAgICogICAgc2hhbGxvdyBjb3B5IHdoZW4gaXQgaXMgYSBjb250YWluZXIgb24gdGhlIHdheSB0byBpdCAoc28gYSByZWFkIG9mXG4gICAqICAgIGBydW5zLzxpZD4va2AgY29waWVzIGBrYCwgbm90IGV2ZXJ5IHJ1bidzIG5hbWVzcGFjZSk7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBzdGFnZSBTVEFHRUQgKG9yIGFueXRoaW5nIGVsc2UgdGhlIGJ1ZmZlciBkaWQgbm90XG4gICAqICAgIHRha2UgZnJvbSBjb21taXR0ZWQgc3RhdGUpIGlzIGhhbmRlZCBiYWNrIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlO1xuICAgKiAgLSBhIGNvbnRhaW5lciB0aGUgYnVmZmVyIG93bnMgaXMgd2Fsa2VkIG9uIOKAlCBhbmQgd2hlbiBpdCBpcyB0aGUgdmFsdWVcbiAgICogICAgcmVhZCwgaXRzIHN0aWxsLXNoYXJlZCBkZXNjZW5kYW50cyBhcmUgcHJpdmF0aXNlZFxuICAgKiAgICAoe0BsaW5rIHByaXZhdGlzZUJlbG93fSkuXG4gICAqXG4gICAqIENvc3Q6IE8ocGF0aCkgcGVyIHJlYWQsIHBsdXMgTyh2YWx1ZSkgT05DRSBwZXIgc2hhcmVkIGNvbnRhaW5lciBhIHN0YWdlXG4gICAqIHJlYWRzIGFmdGVyIGl0cyBmaXJzdCB3cml0ZS4gQSBzdGFnZSB0aGF0IG5ldmVyIHJlYWRzIGFmdGVyIHdyaXRpbmcgcGF5c1xuICAgKiBub3RoaW5nOyBhIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBuZXZlciByZWFjaGVzIHRoZSBidWZmZXIuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgLy8gUmVzb2x2ZSBmaXJzdDogYSByZWFkIHRoYXQgbGFuZHMgb24gbm90aGluZyAoYSBtaXNzaW5nIGtleSwgYSByZWZ1c2VkXG4gICAgLy8gc2VnbWVudCwgYSBwcmltaXRpdmUpIHJldHVybnMgbm90aGluZyBhbmQgbXVzdCBjb3B5IG5vdGhpbmcuXG4gICAgY29uc3QgY2hhaW46IG9iamVjdFtdID0gW107XG4gICAgbGV0IGF0OiB1bmtub3duID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgYXQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGF0KSkgcmV0dXJuO1xuICAgICAgY2hhaW4ucHVzaChhdCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMud29ya2luZ0NvcHk7XG4gICAgbGV0IGJhc2U6IHVua25vd24gPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQoYmFzZSwgayk7XG4gICAgICBsZXQgdmFsdWUgPSBjaGFpbltpXTtcbiAgICAgIGlmICghdGhpcy5vd25lZC5oYXModmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gYXRCYXNlIHx8IHRoaXMuc3RhZ2VkLmhhcyh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKGkgPT09IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBhcmVudFtrXSA9IHRoaXMucHJpdmF0ZUNvcHlPZih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm93bmVkLmFkZCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudFtrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gdmFsdWU7XG4gICAgICBiYXNlID0gYXRCYXNlO1xuICAgIH1cbiAgICB0aGlzLnByaXZhdGlzZUJlbG93KHBhcmVudCwgYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gT1dORUQgY29udGFpbmVyIGlzIGFib3V0IHRvIGJlIHJlYWQgd2hvbGUgKGEgcGF0aCBjb3B5IGEgbmVzdGVkIHdyaXRlXG4gICAqIG1hZGUsIHNheSk6IGl0cyBkZXNjZW5kYW50cyBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXJlXG4gICAqIHJlcGxhY2VkIGJ5IHByaXZhdGUgZGVlcCBjb3BpZXMsIHNvIG5vdGhpbmcgdGhlIHJlYWQgaGFuZHMgb3V0IGlzXG4gICAqIGNvbW1pdHRlZCBzdGF0ZS4gV2Fsa3Mgb3duZWQgY29udGFpbmVycyBvbmx5OyBtYXJrcyBlYWNoIG9uZSBmaW5pc2hlZFxuICAgKiAoe0BsaW5rIHByaXZhdGVUcmVlc30pLCBzbyBhIGNvbnRhaW5lciBpcyBzY2FubmVkIG9uY2UgcGVyIHN0YWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2VCZWxvdyhjb250YWluZXI6IG9iamVjdCwgYmFzZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHdvcms6IEFycmF5PFtvYmplY3QsIHVua25vd25dPiA9IFtbY29udGFpbmVyLCBiYXNlXV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW25vZGUsIG5vZGVCYXNlXSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKHRoaXMucHJpdmF0ZVRyZWVzLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKG5vZGUsIGtleSk7XG4gICAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQobm9kZUJhc2UsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLm93bmVkLmhhcyhjaGlsZCkpIHdvcmsucHVzaChbY2hpbGQsIGF0QmFzZV0pO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCA9PT0gYXRCYXNlICYmICF0aGlzLnN0YWdlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB0aGlzLnByaXZhdGVDb3B5T2YoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgcHJpdmF0ZSBkZWVwIGNvcHkgb2YgYSBjb21taXR0ZWQgY29udGFpbmVyIOKAlCBvd25lZCB0aHJvdWdoIGFuZCB0aHJvdWdoLiAqL1xuICBwcml2YXRlIHByaXZhdGVDb3B5T2YodmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgYWRvcHQoY29weSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5wcml2YXRlVHJlZXMuYWRkKGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCBhbnkgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCwgb3IgYSBwYXRoIGFib3ZlIG9yIGJlbG93IGl0P1xuICAgKlxuICAgKiBUaGUgZGV2LW1vZGUgYm9ycm93ZWQtcmVhZCBjaGVjayAoYFN0YWdlQ29udGV4dC5jb21taXRgKSBhc2tzIHRoaXMgYmVmb3JlXG4gICAqIGFjY3VzaW5nIGEgc3RhZ2Ugb2YgbXV0YXRpbmcgYSB2YWx1ZSBpbiBwbGFjZTogYSBrZXkgdGhlIHN0YWdlIGxlZ2l0aW1hdGVseVxuICAgKiBXUk9URSBpcyBleHBlY3RlZCB0byBkaWZmZXIgZnJvbSB3aGF0IGl0IHJlYWQsIGFuZCB3cml0ZXMgcmVhY2ggdGhlIGJ1ZmZlclxuICAgKiBmcm9tIHBhdGhzIHRoYXQgYnlwYXNzIHVzZXItbGV2ZWwgd3JpdGUgdHJhY2tpbmcgdG9vICh0aGUgc3ViZmxvdyBzZWVkLFxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCB0aGUgcmVzdW1lIHJlLXNlZWQpLiBEZXYtbW9kZSBvbmx5IOKAlCBub3RoaW5nIG9uXG4gICAqIHRoZSBob3QgcGF0aCBjYWxscyBpdC5cbiAgICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgLy8gT24gdGhlIHBhdGgsIGJlbG93IGl0IG9yIGFib3ZlIGl0IOKAlCB0aGUgb25lIHBhdGggcmVsYXRpb24gZXZlcnkga2V5IHF1ZXJ5IGFza3MuXG4gICAgICBpZiAocmVsYXRpb24ob3AucGF0aCwgdGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gdGhpcy5zdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKG5ldyBTZXQocm93cy50cmFjZS5tYXAoKHQpID0+IHQucGF0aCkpKTtcbiAgICAvLyBUaGUgYnVuZGxlJ3Mga2V5IG9yZGVyIGlzIGByZWNvcmRDb21taXRgJ3M7IGEgZGlyZWN0IGNhbGxlciBrZWVwcyB0aGlzIHNhbWUgb3JkZXIuXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgb3ZlcndyaXRlOiByb3dzLm92ZXJ3cml0ZSwgdXBkYXRlczogcm93cy51cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZTogcm93cy50cmFjZSB9O1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLmhlbGRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuICAgIHRoaXMub3duZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMub3duZWQuYWRkKHRoaXMud29ya2luZ0NvcHkpO1xuICAgIHRoaXMuc3RhZ2VkID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5zdGFnZWRNZXJnZXMgPSAwO1xuICAgIHRoaXMubmVzdGVkT3BzID0gMDtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAsXG4gICAqIGtlZXBpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIOKAlCBhbmQgdGhlIHJlc3VsdCBpcyBBRE1JVFRFRCAoe0BsaW5rIGFkbWl0fSk6XG4gICAqIGEgZmFtaWx5IG9mIHJvd3Mgd2hvc2UgcmVwbGF5IGRvZXMgbm90IGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGlzXG4gICAqIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHJlYWQtYmFjayBpbnN0ZWFkICg5LjMwLjApLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBERUZBVUxUIChgY29tbWl0VmFsdWVzOiAnZnVsbCdgKSBwYXlsb2FkLCBpbmNsdWRpbmcgdGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZyBvZiBzdGFnZWQgYGRlbGV0ZWAgb3BzIGludG8gYHNldGAtb2YtYHVuZGVmaW5lZGBcbiAgICogdHJhY2UgZW50cmllcy4gVGhlIGRlbHRhIGVuY29kaW5nIGxpdmVzIGluIHtAbGluayB0b0RlbHRhUGF5bG9hZH0uXG4gICAqXG4gICAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogdGhlIG5ldC1jaGFuZ2UgdmVyZGljdCBpcyBwYWlkIG9uY2UgcGVyIFBBVEhcbiAgICogYW5kIHRoZSBjbG9uZSBvbmNlIHBlciBDT05TRUNVVElWRSBydW4gb2Ygb3BzIG9uIGEgcGF0aCwgbm90IG9uY2UgcGVyIG9wXG4gICAqIOKAlCBzZWUgdGhlIHR3byBtZW1vcyBpbnNpZGUuIFBpbm5lZCBieVxuICAgKiB0ZXN0L2xpYi9tZW1vcnkvc2NlbmFyaW8vcmVwZWF0ZWQtcGF0aC1ieXRlLWlkZW50aXR5LnRlc3QudHMgYWdhaW5zdCB0aGVcbiAgICogOS4yMi4wIGJ5dGVzLiBTaW5jZSA5LjIzLjAgdGhhdCBjbG9uZSBpcyBUSEUgY2xvbmU6IHRoZSBwYXRjaCB0cmVlcyBob2xkXG4gICAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2VzIChzZWUgdGhlIGNsYXNzIGhlYWRlciksIHNvIHRoaXMgbG9vcCBpcyB0aGUgb25lXG4gICAqIHBsYWNlIHRoZSByZWNvcmQgaXMgZGV0YWNoZWQgZnJvbSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IFJvd3Mge1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5jaGFuZ2VPbmx5Um93cyhsb3NzeSkpO1xuICB9XG5cbiAgLyoqIFRoZSAnZnVsbCcgcm93czsgYSBmYW1pbHkgaW4gYGxvc3N5YCBpcyB3cml0dGVuIGFzIGl0cyByZWFkLWJhY2ssIGF0IGl0cyBsYXN0IHRvdWNoICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkuICovXG4gIHByaXZhdGUgY2hhbmdlT25seVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICAvLyBQZXIgUEFUSCwgZGVjaWRlZCBvbmNlICg5LjIyLjEpOiBiYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmUgZml4ZWQgYXRcbiAgICAvLyBjb21taXQsIHNvIGV2ZXJ5IGxhdGVyIG9wIG9uIGEgcGF0aCBnZXRzIHRoZSB2ZXJkaWN0IGl0cyBmaXJzdCBvcCBnb3QuXG4gICAgLy8gYHVuZGVmaW5lZGAgPSBub3QgeWV0IGRlY2lkZWQ7IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYXJlIHRoZSBgdHJ1ZWAga2V5cy5cbiAgICBjb25zdCBzdXJ2aXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIC8vIFRoZSBwYXRoIHRoZSBMQVNUIHN1cnZpdmluZyBvcCBjb3BpZWQgaW50byBlYWNoIHBhdGNoIHRyZWUgKDkuMjIuMSkuXG4gICAgLy8gVGhlIHZhbHVlIGF0IGEgcGF0aCBpcyBmaXhlZCBhdCBjb21taXQsIHNvIGFuIG9wIHdob3NlIHByZWRlY2Vzc29yIG9uXG4gICAgLy8gdGhlIFNBTUUgdHJlZSBhbHJlYWR5IGNvcGllZCB0aGF0IHBhdGggd291bGQgd3JpdGUgdGhlIHNhbWUgYnl0ZXMgb3ZlclxuICAgIC8vIHRoZSBzYW1lIGtleSDigJQgaXQga2VlcHMgaXRzIHRyYWNlIHJvdyAodGhlIGxvZyBpcyBieXRlLWlkZW50aWNhbCkgYW5kXG4gICAgLy8gcGF5cyBubyBzZWNvbmQgY2xvbmUuIFRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgc3RhZ2VzIE5cbiAgICAvLyB3aG9sZS1hcnJheSBzZXRzIG9uIE9ORSBwYXRoOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhhdCBjb21taXQgTyhOKVxuICAgIC8vIGluc3RlYWQgb2YgTyhOIMOXIG9wcykuIENPTlNFQ1VUSVZFIG9ubHkg4oCUIGFuIG9wIG9uIGFub3RoZXIgcGF0aCBpblxuICAgIC8vIGJldHdlZW4gbWF5IGhhdmUgY29lcmNlZCBvciBncm93biB0aGlzIG9uZSdzIGNvbnRhaW5lciAoYSBkZXNjZW5kYW50XG4gICAgLy8gYG5hdGl2ZVNldGAgdGhyb3VnaCBhIHByaW1pdGl2ZSwgYSBga2V5OiB1bmRlZmluZWRgIHNoZWxsKSBhbmQgdGhlXG4gICAgLy8gcmUtY29weSBpcyB3aGF0IHJlcGFpcnMgaXQ7IGEgYG1lcmdlYCBiZXR3ZWVuIHR3byBzZXRzIHRvdWNoZXMgdGhlXG4gICAgLy8gb3RoZXIgdHJlZSBhbmQgZG9lcyBub3QgY291bnQuIFNhbWUgbGF3IGFzIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAgICBsZXQgbGFzdFNldFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdE1lcmdlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgZmFtaWx5ID0gbG9zc3k/LmZhbWlsaWVzLmdldChsb3NzeS5yb290T2YuZ2V0KG9wLnBhdGgpIGFzIHN0cmluZyk7XG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGkgPT09IGZhbWlseS5zbG90KSB7XG4gICAgICAgICAgdGhpcy5lbWl0UmVhZEJhY2soZmFtaWx5LCByb3dzLCAnZnVsbCcpO1xuICAgICAgICAgIGxhc3RTZXRQYXRoID0gbGFzdE1lcmdlUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBrZWVwID0gc3Vydml2ZXMuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGtlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZWVwID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKTtcbiAgICAgICAgc3Vydml2ZXMuc2V0KG9wLnBhdGgsIGtlZXApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZWVwKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcblxuICAgICAgdHJhY2UucHVzaChmbGF0dGVuZWRUcmFjZVJvdyhvcCkpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgaWYgKGxhc3RNZXJnZVBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0TWVyZ2VQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFNldFBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0U2V0UGF0aCA9IG9wLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0aHJlZSBlbmNvZGluZyBkaWZmZXJlbmNlczpcbiAgICpcbiAgICogMS4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKHRoZSDCpzIuNSBkZWR1cCBydWxlIOKAlCBgYXBwZW5kYFxuICAgKiAgICBpcyBOT1QgaWRlbXBvdGVudCBvbiByZXBsYXksIHNvIGR1cGxpY2F0ZSBlbnRyaWVzIHdvdWxkIG11bHRpcGx5XG4gICAqICAgIHRhaWxzKS4gVGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIG9wIG1peCArIGJhc2XihpJmaW5hbFxuICAgKiAgICByZWxhdGlvbnNoaXA7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaCxcbiAgICogICAgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMuXG4gICAqIDIuICoqVmVyYiByZXNvbHV0aW9uIHBlciBwYXRoKiog4oCUIGZvciBhIHBhdGggd2l0aCBOTyBzdXJ2aXZpbmcgcmVsYXRpdmVcbiAgICogICAgKHNlZSAzKTpcbiAgICogICAgLSBsYXN0IG9wIGAnZGVsZXRlJ2AgQU5EIGZpbmFsIHZhbHVlIGdvbmUg4oaSIGBkZWxldGVgICh0aGUgcGF0aCBzdGF5c1xuICAgKiAgICAgIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWAgd2l0aCBgdW5kZWZpbmVkYCBmb3Iga2V5LXNldCBjb25zdW1lcnMpLlxuICAgKiAgICAgIFJlcXVpcmVzIHRoZSBwYXJlbnQgdG8gYmUgYSByZWFsIGNvbnRhaW5lciBpbiB0aGUgYmFzZSDigJQgcmVwbGF5IHVzZXNcbiAgICogICAgICBgbmF0aXZlRGVsZXRlYCwgd2hpY2ggaXMgaW5lcnQgb24gYSBwcmltaXRpdmUvYWJzZW50IHBhcmVudCwgd2hlcmVhc1xuICAgKiAgICAgIHRoZSBgJ2Z1bGwnYCBmbGF0dGVuaW5nIChgX3NldGAgb2YgYHVuZGVmaW5lZGApIENPRVJDRVMgdGhhdCBwYXJlbnRcbiAgICogICAgICBpbnRvIGFuIG9iamVjdDsgd2hlbiB0aGV5IHdvdWxkIGRpc2FncmVlIHdlIGtlZXAgdGhlIGZsYXR0ZW5pbmc7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YTtcbiAgICogICAgLSBvdGhlcndpc2UgKGBzZXRgL21peGVkKTogdGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgdGhlXG4gICAqICAgICAgcGF0aCAoe0BsaW5rIGZ1bGxSb3dzVmFsdWV9KS4gSWYgYmFzZSBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZFxuICAgKiAgICAgIGJhc2UgaXMgYSBTVFJJQ1QgUFJFRklYIOKGkiBgYXBwZW5kYCBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGBcbiAgICogICAgICBzdG9yaW5nIHRoZSBmdWxsIHZhbHVlLlxuICAgKiAzLiAqKk9WRVJMQVAgRkFNSUxJRVMgdGFrZSB0aGUgZnVsbC12YWx1ZSBmYWxsYmFjay4qKiBgb3ZlcndyaXRlYCAvXG4gICAqICAgIGB1cGRhdGVzYCBhcmUgbmVzdGVkIHBhdGggVFJFRVMsIHNvIHR3byBzdXJ2aXZpbmcgcGF0aHMgd2hlcmUgb25lIGlzXG4gICAqICAgIGFuIGFuY2VzdG9yIG9mIHRoZSBvdGhlciAoYGFgIGFuZCBgYS5wYCkgc2hhcmUgc3RvcmFnZS4gRGVsdGEnc1xuICAgKiAgICBwZXItcGF0aCBlbmNvZGluZ3Mgd291bGQgY2xvYmJlciBlYWNoIG90aGVyIHRoZXJlIChhbiBgYXBwZW5kYFxuICAgKiAgICBhbmNlc3RvciBzdG9yZXMgb25seSBhIFRBSUwsIGEgYGRlbGV0ZWAgYW5jZXN0b3IgYHVuZGVmaW5lZGApLCBzbyBldmVyeVxuICAgKiAgICBwYXRoIHRoYXQgaGFzIGEgc3Vydml2aW5nIGFuY2VzdG9yL2Rlc2NlbmRhbnQgaXMgY29tbWl0dGVkIGFzIGEgcGxhaW5cbiAgICogICAgYHNldGAgb2YgdGhlIHZhbHVlIHRoZSAnZnVsbCcgcm93cyBnaXZlIGl0LCBhbmQgdGhlIGZhbWlseSdzXG4gICAqICAgIHNoYWxsb3dlc3QgcGF0aCAod2hvc2Ugc2V0IGNvdmVycyB0aGUgd2hvbGUgc3VidHJlZSkgaXMgZW1pdHRlZCBMQVNULlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KSBsaWtlIHRoZSAnZnVsbCcgcGF5bG9hZDogYSBjb21wYWN0XG4gICAqIHJvdyBpcyBrZXB0IG9ubHkgd2hlcmUgdGhlIGJ1bmRsZSBwcm92YWJseSBmb2xkcyBiYWNrLCBhbmQgYSBmYW1pbHkgdGhhdFxuICAgKiBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBTbyBib3RoIGVuY29kaW5ncyBjb21taXQgdGhlXG4gICAqIHZhbHVlIHRoZSBzdGFnZSByZWFkOyBiZWZvcmUgOS4zMC4wIHRoZXkgc2hhcmVkIGEgcmVwbGF5IHRoYXQgZGlkIG5vdFxuICAgKiAoYHJlcGxheVBhdGhWZXJic2AgLyBgcmVwbGF5RmFtaWx5VmVyYnNgLCBkZWxldGVkKS5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKTogUm93cyB7XG4gICAgY29uc3QgZnVsbFZhbHVlQXQgPSB0aGlzLmZ1bGxSb3dzVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5hZG1pdCgobG9zc3kpID0+IHRoaXMuZGVsdGFSb3dzKGxvc3N5LCBmdWxsVmFsdWVBdCkpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWx0YSByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBkZWx0YVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkLCBmdWxsVmFsdWVBdDogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93bik6IFJvd3Mge1xuICAgIGNvbnN0IHJvd3M6IFJvd3MgPSB7IG92ZXJ3cml0ZToge30sIHVwZGF0ZXM6IHt9LCB0cmFjZTogW10gfTtcbiAgICBjb25zdCB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UgfSA9IHJvd3M7XG4gICAgY29uc3QgaW5Mb3NzeSA9IChwYXRoOiBzdHJpbmcpID0+IGxvc3N5Py5mYW1pbGllcy5oYXMobG9zc3kucm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpID09PSB0cnVlO1xuICAgIGNvbnN0IHN1cnZpdm9ycyA9IHRoaXMubmV0Q2hhbmdlU3Vydml2b3JzKHRoaXMub3BzQnlQYXRoKCkpLmZpbHRlcigocykgPT4gIWluTG9zc3kocy5wYXRoKSk7XG4gICAgY29uc3QgeyByb290T2YsIGJ5Um9vdCB9ID0gZ3JvdXBJbnRvRmFtaWxpZXMoc3Vydml2b3JzLCBuZXcgU2V0KHN1cnZpdm9ycy5tYXAoKHMpID0+IHMucGF0aCkpKTtcblxuICAgIC8vIFRIRSBWRVJCIENIT0lDRSDigJQgdGhlIGRlbHRhIGVuY29kZXIgcGlja3MgYSB2ZXJiIHBlciBwYXRoOyB0aGUgVkFMVUVTXG4gICAgLy8gaXQgZW5jb2RlcyBjb21lIGZyb20gdGhlIG9uZSByZXBsYXkgKGBmdWxsVmFsdWVBdGApLCBuZXZlciBhIHJlcGxpY2Egb2ZcbiAgICAvLyB0aGUgdmVyYiBsYXcgKDkuMzAuMDogQ0xBVURFLm1kJ3MgdmVyYi1zd2l0Y2ggcmVwbGljYXMgbG9zdCB0d28gaGVyZSkuXG4gICAgY29uc3QgZW1pdCA9IChzOiBTdXJ2aXZvcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBzZWdtZW50cywgdmVyYnMsIGJlZm9yZSB9ID0gcztcbiAgICAgIGNvbnN0IHByb3YgPSBwcm92ZW5hbmNlKHMucmVhZEtleXMpO1xuICAgICAgaWYgKChieVJvb3QuZ2V0KHJvb3RPZi5nZXQocGF0aCkgYXMgc3RyaW5nKSBhcyBTdXJ2aXZvcltdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJ1bGUgMyDigJQgb25lIGNvaGVyZW50IHRyZWU6IGV2ZXJ5IG1lbWJlciBhIHNldCBvZiBpdHMgdmFsdWUuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoZnVsbFZhbHVlQXQoc2VnbWVudHMpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RWZXJiID0gdmVyYnNbdmVyYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdFZlcmIgPT09ICdkZWxldGUnICYmIHMuYWZ0ZXIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlbGV0ZVJlcGxheXNBc0ZsYXR0ZW5pbmcoc2VnbWVudHMpKSB7XG4gICAgICAgIC8vIFJlYWwgZGVsZXRpb24g4oCUIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuIEtlZXAgdGhlIHBhdGggZW51bWVyYXRlZFxuICAgICAgICAvLyBpbiBgb3ZlcndyaXRlYCAodW5kZWZpbmVkKSBzbyBPYmplY3Qua2V5cyBjb25zdW1lcnMgc2VlIGl0LlxuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ2RlbGV0ZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAodmVyYnMuZXZlcnkoKHYpID0+IHYgPT09ICdtZXJnZScpKSB7XG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnbWVyZ2UnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hWYWx1ZVJvdyhyb3dzLCBwYXRoLCBzZWdtZW50cywgYmVmb3JlLCBmdWxsVmFsdWVBdChzZWdtZW50cyksIHByb3YsIHRoaXMubWFya2VkQmVsb3cocGF0aCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGZhbWlseSB0aGF0IGRpZCBub3QgZm9sZCBiYWNrIHRha2VzIGl0cyBwbGFjZSBieSBpdHMgbGFzdCB0b3VjaC5cbiAgICBjb25zdCBwZW5kaW5nID0gbG9zc3kgPT09IHVuZGVmaW5lZCA/IFtdIDogWy4uLmxvc3N5LmZhbWlsaWVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBhLnNsb3QgLSBiLnNsb3QpO1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBjb25zdCBmbHVzaEJlZm9yZSA9ICh0b3VjaDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB3aGlsZSAobmV4dCA8IHBlbmRpbmcubGVuZ3RoICYmIHBlbmRpbmdbbmV4dF0uc2xvdCA8IHRvdWNoKSB0aGlzLmVtaXRSZWFkQmFjayhwZW5kaW5nW25leHQrK10sIHJvd3MsICdkZWx0YScpO1xuICAgIH07XG4gICAgZW1pdEluRmFtaWx5T3JkZXIoc3Vydml2b3JzLCByb290T2YsIGJ5Um9vdCwgZW1pdCwgZmx1c2hCZWZvcmUpO1xuICAgIGZsdXNoQmVmb3JlKEluZmluaXR5KTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgYWRtaXR0ZWQgcmVjb3JkICg5LjMwLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUSEUgQURNSVNTSU9OIOKAlCBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGVcbiAgICogc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZC4gYGJ1aWxkYFxuICAgKiBsYXlzIHRoZSByb3dzIG91dCAob25lIGVuY29kZXI6IGAnZnVsbCdgIG9yIGAnZGVsdGEnYCk7IHRoZSBjYW5kaWRhdGUgaXNcbiAgICogY2hlY2tlZCAoe0BsaW5rIGxvc3N5RmFtaWxpZXN9KSwgYW5kIHdoZW4gc29tZSBmYW1pbHkncyByb3dzIGRvIG5vdCBmb2xkXG4gICAqIGJhY2sgdGhlIHJvd3MgYXJlIGxhaWQgb3V0IGFnYWluIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZVxuICAgKiBzdGFnZSByZWFkICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkg4oCUIGV2ZXJ5IG90aGVyIGZhbWlseSdzIGJ5dGVzIGV4YWN0bHkgYXNcbiAgICogdGhlIGZpcnN0IGxheW91dCBtYWRlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KGJ1aWxkOiAobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKSA9PiBSb3dzKTogUm93cyB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYnVpbGQodW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb3NzeSA9IHRoaXMubG9zc3lGYW1pbGllcyhjYW5kaWRhdGUpO1xuICAgIHJldHVybiBsb3NzeSA9PT0gdW5kZWZpbmVkID8gY2FuZGlkYXRlIDogYnVpbGQobG9zc3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYW1pbGllcyB3aG9zZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGUgc3RhZ2UgcmVhZCDigJRcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAoYGFkbWlzc2lvbi50cyDCtyBsb3NzeUZhbWlsaWVzYDogdGhlXG4gICAqIGNhbmRpZGF0ZSByZXBsYXllZCBvbnRvIHRoZSBkaWZmIGJhc2UgYnkgYGRyeUZvbGRgLCBldmVyeSBmYW1pbHkgb2ZcbiAgICogdG91Y2hlZCBwYXRocyBjb21wYXJlZCB3aXRoIHRoZSB3b3JraW5nIGNvcHkgYXQgaXRzIHJvb3QgYW5kIG9uIHRoZSB3YXlcbiAgICogZG93biB0byBpdCkuXG4gICAqXG4gICAqIFdpdGhvdXQgYSBmb2xkLCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wOiBpdHNcbiAgICogcm93cyBhcmUgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyIGl0cyBhZGRyZXNzLCBlYWNoXG4gICAqIHdyaXRpbmcgdGhlIFNBTUUgdmFsdWUgaW50byBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIOKAlCB0aGVcbiAgICogcmVjb3JkIGlzIHRoZSByZWFkLWJhY2sgYnkgY29uc3RydWN0aW9uICh0aGUgcHJvcGVydHkncyBST09ULU9OTFkgYXJtXG4gICAqIHBpbnMgdGhpcykuIFRoYXQga2VlcHMgdGhlIGNvbW1pdCBvZiB0aGUgdHlwZWQgc2NvcGUncyByb290LWtleSB3cml0ZXNcbiAgICogZXhhY3RseSBhcyBjaGVhcCBhcyBpdCB3YXMuXG4gICAqL1xuICBwcml2YXRlIGxvc3N5RmFtaWxpZXMoY2FuZGlkYXRlOiBSb3dzKTogTG9zc3kgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN0YWdlZE1lcmdlcyA9PT0gMCAmJiB0aGlzLm5lc3RlZE9wcyA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbG9zc3lGYW1pbGllcyhjYW5kaWRhdGUsIHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLndvcmtpbmdDb3B5LCB0aGlzLm9wVHJhY2UsIHRoaXMuYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYW1pbHkgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkOlxuICAgKiBvbmUgYHNldGAgcm93IHBlciBtZW1iZXIgdGhhdCBjaGFuZ2VkIChkZXNjZW5kYW50cyBieSBsYXN0IHRvdWNoLCBlYWNoXG4gICAqIHdpdGggaXRzIG93biByZWFkIHByZWZpeCksIHRoZSBST09UIGxhc3QsIGFuZCB0aGUgcm9vdCdzIHJlYWQtYmFjayB2YWx1ZVxuICAgKiBpbiBgb3ZlcndyaXRlYCDigJQgb25lIGNvaGVyZW50IHRyZWUsIHNvIG5vIHJvdyBjYW4gY2xvYmJlciBhbm90aGVyLiBUaGVcbiAgICogcm9vdCdzIHJvdyBpcyB3cml0dGVuIGV2ZW4gd2hlbiB0aGUgcm9vdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2U6IGl0IGlzIHRoZVxuICAgKiByb3cgdGhhdCBjYXJyaWVzIHRoZSBmYW1pbHkncyByZWFkLWJhY2sgKGFuZCB0aGUgY29udGFpbmVycyBMLTEncyBkcm9wcGVkXG4gICAqIG9wIGxlZnQpLiBBIGxvbmUgcm9vdCB1bmRlciBgJ2RlbHRhJ2Aga2VlcHMgdGhlIGNvbXBhY3QgYGFwcGVuZGAgd2hlbiB0aGVcbiAgICogdmFsdWUgaXQgcmVhZCBpcyBpdHMgYmFzZSBwbHVzIGEgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgZW1pdFJlYWRCYWNrKGZhbWlseTogRmFtaWx5LCByb3dzOiBSb3dzLCBlbmNvZGluZzogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIGxldCByb290OiBNZW1iZXIgPSBmYW1pbHkubWVtYmVyc1swXTtcbiAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGZhbWlseS5tZW1iZXJzKSB7XG4gICAgICBpZiAobS5wYXRoID09PSBmYW1pbHkucm9vdCkge1xuICAgICAgICByb290ID0gbTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShtLnBhdGguc3BsaXQoREVMSU0pKSkgY29udGludWU7XG4gICAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoOiBtLnBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKG0ucmVhZEtleXMpIH0pO1xuICAgICAgY2hhbmdlZCsrO1xuICAgIH1cbiAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgaWYgKGVuY29kaW5nID09PSAnZGVsdGEnICYmIGNoYW5nZWQgPT09IDAgJiYgYWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgICBwdXNoVmFsdWVSb3coXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGZhbWlseS5yb290LFxuICAgICAgICBmYW1pbHkucm9vdFNlZ21lbnRzLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyLFxuICAgICAgICBwcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpLFxuICAgICAgICB0aGlzLm1hcmtlZEJlbG93KGZhbWlseS5yb290KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IGZhbWlseS5yb290LCB2ZXJiOiAnc2V0JywgLi4ucHJvdmVuYW5jZShyb290LnJlYWRLZXlzKSB9KTtcbiAgICAvLyBUaGUgY2xvbmUgdGhlIGNoZWNrIHRvb2sgKGBhZG1pc3Npb24udHMgwrcgZm9sZHNCYWNrYCksIHdoZW4gaXQgdG9vayBvbmUuXG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgZmFtaWx5LnJvb3RTZWdtZW50cywgZmFtaWx5LmhlbGQgIT09IHVuZGVmaW5lZCA/IGZhbWlseS5oZWxkLnZhbHVlIDogc3RydWN0dXJlZENsb25lKGFmdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgYSBwYXRoIOKAlCB3aGF0IHRoZSBkZWx0YSBlbmNvZGVyXG4gICAqIGNvbW1pdHMgZm9yIGEgZmFtaWx5IG1lbWJlciBvciBhIHBhdGggd2l0aCBhIGBzZXRgIOKAlCByZWFkIGZyb20gT05FXG4gICAqIHtAbGluayBkcnlGb2xkfSBvZiB0aG9zZSByb3dzIG92ZXIgdGhlIHBhdGNoIHRyZWVzIHRoZW1zZWx2ZXMsIHRha2VuIHRoZVxuICAgKiBmaXJzdCB0aW1lIGl0IGlzIGFza2VkLiBCeSByZWZlcmVuY2UsIGFzIHRoZSBzdGFnZSBoZWxkIHRoZW06IGFuIGVsZW1lbnRcbiAgICogYSBgc2V0YCBhbmQgYSBgbWVyZ2VgIG9mIG9uZSBwYXRoIHNoYXJlIHN0YXlzIG9uZSBlbGVtZW50LiBBIHN0YWdlIHRoYXRcbiAgICogc3RhZ2VkIG5vIGBtZXJnZWAgYW5kIG5vIG5lc3RlZCBvcCBuZWVkcyBubyBmb2xkIOKAlCBhIHBhdGgncyB2YWx1ZSBpcyBpdHNcbiAgICogbGFzdCBzdGFnZWQgdmFsdWUuIChCZWZvcmUgOS4zMC4wOiB0d28gcmVwbGljYXMgb2YgdGhlIHZlcmIgbGF3LFxuICAgKiBgcmVwbGF5UGF0aFZlcmJzYCBhbmQgYHJlcGxheUZhbWlseVZlcmJzYC4pXG4gICAqL1xuICBwcml2YXRlIGZ1bGxSb3dzVmFsdWUoKTogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93biB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gKHNlZ21lbnRzKSA9PiBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBsZXQgZm9sZDogdW5rbm93bjtcbiAgICByZXR1cm4gKHNlZ21lbnRzKSA9PiB7XG4gICAgICBmb2xkID8/PSBkcnlGb2xkKHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLnVwZGF0ZVBhdGNoLCB0aGlzLm92ZXJ3cml0ZVBhdGNoLCB0aGlzLmZ1bGxSb3dzKCkpO1xuICAgICAgcmV0dXJuIF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3M6IGV2ZXJ5IG9wIG9uIGEgcGF0aCB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIga2VlcHMsIGEgYGRlbGV0ZWAgc3BlbGxlZCBgc2V0YC4gKi9cbiAgcHJpdmF0ZSBmdWxsUm93cygpOiBUcmFjZUVudHJ5W10ge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCByb3dzOiBUcmFjZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgbGV0IGsgPSBrZWVwLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIGtlZXAuc2V0KG9wLnBhdGgsIChrID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKSkpO1xuICAgICAgaWYgKGspIHJvd3MucHVzaCh7IHBhdGg6IG9wLnBhdGgsIHZlcmI6IG9wLnZlcmIgPT09ICdtZXJnZScgPyAnbWVyZ2UnIDogJ3NldCcgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgc3RhZ2UgY2hhbmdlIHRoZSB2YWx1ZSBhdCBgc2VnbWVudHNgPyBCYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmVcbiAgICogZml4ZWQgYXQgY29tbWl0LCBzbyB0aGlzIGlzIHRoZSBPTkUgbmV0LWNoYW5nZSB2ZXJkaWN0IGJvdGggcGF5bG9hZFxuICAgKiBlbmNvZGluZ3MgYXBwbHkgKGEgbm8tb3Agd3JpdGUgYW5kIGEgd3JpdGUtdGhlbi1yZXZlcnQgYm90aCBmYWlsIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbChfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyksIF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgKyByZS1pbnNlcnRcbiAgICogbW92ZXMgYSByZS10b3VjaGVkIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgTWFwJ3MgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICAgKiBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocykuIFBlci13cml0ZVxuICAgKiBwcm92ZW5hbmNlICgjUDEpOiB0aGUgTEFTVCBvcCdzIHJlYWRLZXlzIGlzIGtlcHQg4oCUIHJlYWQgcHJlZml4ZXMgb25seSBncm93XG4gICAqIHdpdGhpbiBhIHN0YWdlLCBzbyBsYXN0ID09IHVuaW9uIGFjcm9zcyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgb3BzQnlQYXRoKCk6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnZlcmJzLnB1c2gob3AudmVyYik7XG4gICAgICAgIHByZXYubGFzdCA9IGk7XG4gICAgICAgIGlmIChvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkKSBwcmV2LnJlYWRLZXlzID0gb3AucmVhZEtleXM7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIHtcbiAgICAgICAgICB2ZXJiczogW29wLnZlcmJdLFxuICAgICAgICAgIGxhc3Q6IGksXG4gICAgICAgICAgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciDigJQgaWRlbnRpY2FsIHRvICdmdWxsJyAoe0BsaW5rIGNoYW5nZWRTaW5jZUJhc2V9KS4gU3Vydml2b3JzIGtlZXAgbGFzdC10b3VjaCBvcmRlci4gKi9cbiAgcHJpdmF0ZSBuZXRDaGFuZ2VTdXJ2aXZvcnMoYnlQYXRoOiBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KTogU3Vydml2b3JbXSB7XG4gICAgY29uc3Qgc3Vydml2b3JzOiBTdXJ2aXZvcltdID0gW107XG4gICAgZm9yIChjb25zdCBbcGF0aCwgeyB2ZXJicywgcmVhZEtleXMsIGxhc3QgfV0gb2YgYnlQYXRoKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgaWYgKCF0aGlzLmNoYW5nZWRTaW5jZUJhc2Uoc2VnbWVudHMpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBzdXJ2aXZvcnMucHVzaCh7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgcmVhZEtleXMsIGxhc3QsIGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdXJ2aXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGEgc3RhZ2VkIGBkZWxldGVgIGF0IHRoaXMgcGF0aCBjb21taXQgYXMgdGhlIGAnZGVsZXRlJ2AgdmVyYj9cbiAgICpcbiAgICogT25seSB3aGVuIHJlbW92aW5nIHRoZSBrZXkgYW5kIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgZmxhdHRlbmluZyAoYF9zZXRgIG9mXG4gICAqIGB1bmRlZmluZWRgKSBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLiBUaGV5IGRpdmVyZ2Ugd2hlbiB0aGUgcGFyZW50IGlzIG5vdFxuICAgKiBhIGNvbnRhaW5lcjogYG5hdGl2ZURlbGV0ZWAgd2Fsa3MgYXdheSB1bnRvdWNoZWQsIHdoaWxlIGBuYXRpdmVTZXRgXG4gICAqIENPRVJDRVMgdGhlIHByaW1pdGl2ZSBwYXJlbnQgaW50byBhbiBvYmplY3QgdG8gaG9sZCB0aGUga2V5LiBDb21taXR0aW5nXG4gICAqIGBkZWxldGVgIHRoZXJlIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBzdGF0ZSBjaGFuZ2UgdGhlIHN0YWdlIHJlYWxseSBtYWRlLFxuICAgKiBzbyB0aG9zZSAocGF0aG9sb2dpY2FsKSBkZWxldGVzIGtlZXAgdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgLy8gcGFyZW50IGlzIHRoZSBzdGF0ZSByb290IOKAlCBhbHdheXMgYSBjb250YWluZXJcbiAgICBjb25zdCBwYXJlbnQgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cy5zbGljZSgwLCAtMSkpO1xuICAgIHJldHVybiBwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCc7XG4gIH1cbn1cblxuLyoqXG4gKiBIaXN0b3JpY2FsIGZsYXR0ZW5pbmcgZm9yIHRoZSBgJ2Z1bGwnYCBwYXlsb2FkOiBhbiBleHBsaWNpdCBkZWxldGUgY29tbWl0c1xuICogYXMgc2V0LW9mLXVuZGVmaW5lZC4gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSkgcmlkZXMgZWFjaCBzdXJ2aXZpbmcgZW50cnlcbiAqIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbmVkVHJhY2VSb3cob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IFRyYWNlRW50cnkge1xuICByZXR1cm4gb3AudmVyYiA9PT0gJ2RlbGV0ZSdcbiAgICA/IHsgcGF0aDogb3AucGF0aCwgdmVyYjogJ3NldCcgYXMgY29uc3QsIC4uLihvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZEtleXM6IG9wLnJlYWRLZXlzIH0pIH1cbiAgICA6IG9wO1xufVxuXG4vKiogQSByb3cncyBgcmVhZEtleXNgIGZyYWdtZW50IOKAlCBhYnNlbnQgdW5sZXNzIHRoZSBwcm92ZW5hbmNlIGRpYWwgcmVjb3JkZWQgb25lICgjUDEpLiAqL1xuZnVuY3Rpb24gcHJvdmVuYW5jZShyZWFkS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IHJlYWRLZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlYWRLZXlzICE9PSB1bmRlZmluZWQgPyB7IHJlYWRLZXlzIH0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* recordCommit — one stage's commit onto the record (C1, L3). The one owner of a bundle's bytes and
|
|
4
|
+
* of where a commit lands: live state, the redacted mirror, the log.
|
|
5
|
+
*
|
|
6
|
+
* THE LAW:
|
|
7
|
+
* 1. No payload (the stage staged no write) → an EMPTY bundle goes to the log, and nothing else
|
|
8
|
+
* moves: live state and the mirror keep their generation. Every executed stage is a cursor stop.
|
|
9
|
+
* 2. A payload → its names are read first, so a stamp that cannot be read fails the commit before
|
|
10
|
+
* anything moves; then its raw rows build live state's next generation, `scrubPatch` puts the
|
|
11
|
+
* placeholder at each redacted path that holds a value (in a spine copy, never in the raw
|
|
12
|
+
* patch), and the mirror and the log take the scrubbed rows — never the raw ones.
|
|
13
|
+
* 3. The bundle's KEY ORDER is the record's bytes: `overwrite`, `updates`, `redactedPaths`, `trace`,
|
|
14
|
+
* `stage`, `stageId`, `runtimeStageId`, then `untrackedSources`, `tags` and `phase`, each only
|
|
15
|
+
* when it has something to say (absent, never empty). `EventLog · record` appends `idx`. The
|
|
16
|
+
* names are names: no redaction reads them, and no encoding (`commitValues`) changes them.
|
|
17
|
+
*
|
|
18
|
+
* The frame (`StageContext`) decides WHAT is committed — the payload, the names, whether the bundle
|
|
19
|
+
* is a continuation — and keeps what is not the record: retention, diagnostics, the dev-mode
|
|
20
|
+
* warnings and the commit observer.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.recordCommit = void 0;
|
|
24
|
+
const redaction_js_1 = require("./redaction.js");
|
|
25
|
+
/** Record one commit (the module law). `payload` absent = the empty commit. */
|
|
26
|
+
function recordCommit(payload, stamp, into) {
|
|
27
|
+
if (payload === undefined) {
|
|
28
|
+
into.log?.record(bundleOf({}, {}, [], [], namesOf(stamp)));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const names = namesOf(stamp);
|
|
32
|
+
const { redactedPaths, trace } = payload;
|
|
33
|
+
into.state.applyPatch(payload.overwrite, payload.updates, trace);
|
|
34
|
+
const overwrite = (0, redaction_js_1.scrubPatch)(payload.overwrite, redactedPaths);
|
|
35
|
+
const updates = (0, redaction_js_1.scrubPatch)(payload.updates, redactedPaths);
|
|
36
|
+
into.mirror?.applyPatch(overwrite, updates, trace);
|
|
37
|
+
into.log?.record(bundleOf(overwrite, updates, [...redactedPaths], trace, names));
|
|
38
|
+
}
|
|
39
|
+
exports.recordCommit = recordCommit;
|
|
40
|
+
/** THE bundle (law 3): the payload's four keys, the three names, then each optional name that has something to say. */
|
|
41
|
+
function bundleOf(overwrite, updates, redactedPaths, trace, names) {
|
|
42
|
+
const { stage, stageId, runtimeStageId, untrackedSources, tags, phase } = names;
|
|
43
|
+
const bundle = { overwrite, updates, redactedPaths, trace, stage, stageId, runtimeStageId };
|
|
44
|
+
if (untrackedSources)
|
|
45
|
+
bundle.untrackedSources = untrackedSources;
|
|
46
|
+
if (tags)
|
|
47
|
+
bundle.tags = tags;
|
|
48
|
+
if (phase)
|
|
49
|
+
bundle.phase = phase;
|
|
50
|
+
return bundle;
|
|
51
|
+
}
|
|
52
|
+
/** The names, read once — before anything moves (law 2). An optional one with nothing to say is `undefined`. */
|
|
53
|
+
function namesOf({ stage, stageId, runtimeStageId, untrackedSources, tags, phase }) {
|
|
54
|
+
return {
|
|
55
|
+
stage,
|
|
56
|
+
stageId,
|
|
57
|
+
runtimeStageId,
|
|
58
|
+
untrackedSources: !untrackedSources || untrackedSources.size === 0 ? undefined : [...untrackedSources],
|
|
59
|
+
tags: !tags || tags.length === 0 ? undefined : tags,
|
|
60
|
+
phase: phase || undefined,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkQ29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVjb3JkQ29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7O0FBR0gsaURBQTRDO0FBMkI1QywrRUFBK0U7QUFDL0UsU0FBZ0IsWUFBWSxDQUFDLE9BQWtDLEVBQUUsS0FBa0IsRUFBRSxJQUFtQjtJQUN0RyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sU0FBUyxHQUFHLElBQUEseUJBQVUsRUFBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sT0FBTyxHQUFHLElBQUEseUJBQVUsRUFBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ25GLENBQUM7QUFaRCxvQ0FZQztBQUVELHVIQUF1SDtBQUN2SCxTQUFTLFFBQVEsQ0FDZixTQUFzQixFQUN0QixPQUFvQixFQUNwQixhQUF1QixFQUN2QixLQUFtQixFQUNuQixLQUFZO0lBRVosTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDaEYsTUFBTSxNQUFNLEdBQWlCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDMUcsSUFBSSxnQkFBZ0I7UUFBRSxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDakUsSUFBSSxJQUFJO1FBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDN0IsSUFBSSxLQUFLO1FBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDaEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGdIQUFnSDtBQUNoSCxTQUFTLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQWU7SUFDN0YsT0FBTztRQUNMLEtBQUs7UUFDTCxPQUFPO1FBQ1AsY0FBYztRQUNkLGdCQUFnQixFQUFFLENBQUMsZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7UUFDdEcsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDbkQsS0FBSyxFQUFFLEtBQUssSUFBSSxTQUFTO0tBQzFCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWNvcmRDb21taXQg4oCUIG9uZSBzdGFnZSdzIGNvbW1pdCBvbnRvIHRoZSByZWNvcmQgKEMxLCBMMykuIFRoZSBvbmUgb3duZXIgb2YgYSBidW5kbGUncyBieXRlcyBhbmRcbiAqIG9mIHdoZXJlIGEgY29tbWl0IGxhbmRzOiBsaXZlIHN0YXRlLCB0aGUgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbG9nLlxuICpcbiAqIFRIRSBMQVc6XG4gKiAgIDEuIE5vIHBheWxvYWQgKHRoZSBzdGFnZSBzdGFnZWQgbm8gd3JpdGUpIOKGkiBhbiBFTVBUWSBidW5kbGUgZ29lcyB0byB0aGUgbG9nLCBhbmQgbm90aGluZyBlbHNlXG4gKiAgICAgIG1vdmVzOiBsaXZlIHN0YXRlIGFuZCB0aGUgbWlycm9yIGtlZXAgdGhlaXIgZ2VuZXJhdGlvbi4gRXZlcnkgZXhlY3V0ZWQgc3RhZ2UgaXMgYSBjdXJzb3Igc3RvcC5cbiAqICAgMi4gQSBwYXlsb2FkIOKGkiBpdHMgbmFtZXMgYXJlIHJlYWQgZmlyc3QsIHNvIGEgc3RhbXAgdGhhdCBjYW5ub3QgYmUgcmVhZCBmYWlscyB0aGUgY29tbWl0IGJlZm9yZVxuICogICAgICBhbnl0aGluZyBtb3ZlczsgdGhlbiBpdHMgcmF3IHJvd3MgYnVpbGQgbGl2ZSBzdGF0ZSdzIG5leHQgZ2VuZXJhdGlvbiwgYHNjcnViUGF0Y2hgIHB1dHMgdGhlXG4gKiAgICAgIHBsYWNlaG9sZGVyIGF0IGVhY2ggcmVkYWN0ZWQgcGF0aCB0aGF0IGhvbGRzIGEgdmFsdWUgKGluIGEgc3BpbmUgY29weSwgbmV2ZXIgaW4gdGhlIHJhd1xuICogICAgICBwYXRjaCksIGFuZCB0aGUgbWlycm9yIGFuZCB0aGUgbG9nIHRha2UgdGhlIHNjcnViYmVkIHJvd3Mg4oCUIG5ldmVyIHRoZSByYXcgb25lcy5cbiAqICAgMy4gVGhlIGJ1bmRsZSdzIEtFWSBPUkRFUiBpcyB0aGUgcmVjb3JkJ3MgYnl0ZXM6IGBvdmVyd3JpdGVgLCBgdXBkYXRlc2AsIGByZWRhY3RlZFBhdGhzYCwgYHRyYWNlYCxcbiAqICAgICAgYHN0YWdlYCwgYHN0YWdlSWRgLCBgcnVudGltZVN0YWdlSWRgLCB0aGVuIGB1bnRyYWNrZWRTb3VyY2VzYCwgYHRhZ3NgIGFuZCBgcGhhc2VgLCBlYWNoIG9ubHlcbiAqICAgICAgd2hlbiBpdCBoYXMgc29tZXRoaW5nIHRvIHNheSAoYWJzZW50LCBuZXZlciBlbXB0eSkuIGBFdmVudExvZyDCtyByZWNvcmRgIGFwcGVuZHMgYGlkeGAuIFRoZVxuICogICAgICBuYW1lcyBhcmUgbmFtZXM6IG5vIHJlZGFjdGlvbiByZWFkcyB0aGVtLCBhbmQgbm8gZW5jb2RpbmcgKGBjb21taXRWYWx1ZXNgKSBjaGFuZ2VzIHRoZW0uXG4gKlxuICogVGhlIGZyYW1lIChgU3RhZ2VDb250ZXh0YCkgZGVjaWRlcyBXSEFUIGlzIGNvbW1pdHRlZCDigJQgdGhlIHBheWxvYWQsIHRoZSBuYW1lcywgd2hldGhlciB0aGUgYnVuZGxlXG4gKiBpcyBhIGNvbnRpbnVhdGlvbiDigJQgYW5kIGtlZXBzIHdoYXQgaXMgbm90IHRoZSByZWNvcmQ6IHJldGVudGlvbiwgZGlhZ25vc3RpY3MsIHRoZSBkZXYtbW9kZVxuICogd2FybmluZ3MgYW5kIHRoZSBjb21taXQgb2JzZXJ2ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgc2NydWJQYXRjaCB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2FjdGlvbkJ1ZmZlciB9IGZyb20gJy4vVHJhbnNhY3Rpb25CdWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIENvbW1pdFBoYXNlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSwgVW50cmFja2VkU291cmNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBPbmUgc3RhZ2UncyBuZXQgY2hhbmdlLCBhcyBgVHJhbnNhY3Rpb25CdWZmZXIgwrcgY29tbWl0YCBoYW5kcyBpdCBvdmVyLiAqL1xuZXhwb3J0IHR5cGUgQ29tbWl0UGF5bG9hZCA9IFJldHVyblR5cGU8VHJhbnNhY3Rpb25CdWZmZXJbJ2NvbW1pdCddPjtcblxuLyoqIFdoYXQgbmFtZXMgYSBjb21taXQgb24gdGhlIHJlY29yZCwgYmVzaWRlIGl0cyBwYXlsb2FkIChsYXcgMykuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1pdFN0YW1wIHtcbiAgc3RhZ2U6IHN0cmluZztcbiAgc3RhZ2VJZDogc3RyaW5nO1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICB1bnRyYWNrZWRTb3VyY2VzPzogUmVhZG9ubHlTZXQ8VW50cmFja2VkU291cmNlPjtcbiAgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICBwaGFzZT86IENvbW1pdFBoYXNlO1xufVxuXG4vKiogV2hlcmUgYSBjb21taXQgbGFuZHM6IGxpdmUgc3RhdGUgYWx3YXlzOyB0aGUgbWlycm9yIGFuZCB0aGUgbG9nIHdoZW4gdGhlIHJ1biBrZWVwcyB0aGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21taXRUYXJnZXRzIHtcbiAgc3RhdGU6IFNoYXJlZE1lbW9yeTtcbiAgbWlycm9yPzogU2hhcmVkTWVtb3J5O1xuICBsb2c/OiBFdmVudExvZztcbn1cblxudHlwZSBOYW1lcyA9IFBpY2s8Q29tbWl0QnVuZGxlLCAnc3RhZ2UnIHwgJ3N0YWdlSWQnIHwgJ3J1bnRpbWVTdGFnZUlkJyB8ICd1bnRyYWNrZWRTb3VyY2VzJyB8ICd0YWdzJyB8ICdwaGFzZSc+O1xuXG4vKiogUmVjb3JkIG9uZSBjb21taXQgKHRoZSBtb2R1bGUgbGF3KS4gYHBheWxvYWRgIGFic2VudCA9IHRoZSBlbXB0eSBjb21taXQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQ29tbWl0KHBheWxvYWQ6IENvbW1pdFBheWxvYWQgfCB1bmRlZmluZWQsIHN0YW1wOiBDb21taXRTdGFtcCwgaW50bzogQ29tbWl0VGFyZ2V0cyk6IHZvaWQge1xuICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaW50by5sb2c/LnJlY29yZChidW5kbGVPZih7fSwge30sIFtdLCBbXSwgbmFtZXNPZihzdGFtcCkpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmFtZXMgPSBuYW1lc09mKHN0YW1wKTtcbiAgY29uc3QgeyByZWRhY3RlZFBhdGhzLCB0cmFjZSB9ID0gcGF5bG9hZDtcbiAgaW50by5zdGF0ZS5hcHBseVBhdGNoKHBheWxvYWQub3ZlcndyaXRlLCBwYXlsb2FkLnVwZGF0ZXMsIHRyYWNlKTtcbiAgY29uc3Qgb3ZlcndyaXRlID0gc2NydWJQYXRjaChwYXlsb2FkLm92ZXJ3cml0ZSwgcmVkYWN0ZWRQYXRocyk7XG4gIGNvbnN0IHVwZGF0ZXMgPSBzY3J1YlBhdGNoKHBheWxvYWQudXBkYXRlcywgcmVkYWN0ZWRQYXRocyk7XG4gIGludG8ubWlycm9yPy5hcHBseVBhdGNoKG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UpO1xuICBpbnRvLmxvZz8ucmVjb3JkKGJ1bmRsZU9mKG92ZXJ3cml0ZSwgdXBkYXRlcywgWy4uLnJlZGFjdGVkUGF0aHNdLCB0cmFjZSwgbmFtZXMpKTtcbn1cblxuLyoqIFRIRSBidW5kbGUgKGxhdyAzKTogdGhlIHBheWxvYWQncyBmb3VyIGtleXMsIHRoZSB0aHJlZSBuYW1lcywgdGhlbiBlYWNoIG9wdGlvbmFsIG5hbWUgdGhhdCBoYXMgc29tZXRoaW5nIHRvIHNheS4gKi9cbmZ1bmN0aW9uIGJ1bmRsZU9mKFxuICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICB1cGRhdGVzOiBNZW1vcnlQYXRjaCxcbiAgcmVkYWN0ZWRQYXRoczogc3RyaW5nW10sXG4gIHRyYWNlOiBUcmFjZUVudHJ5W10sXG4gIG5hbWVzOiBOYW1lcyxcbik6IENvbW1pdEJ1bmRsZSB7XG4gIGNvbnN0IHsgc3RhZ2UsIHN0YWdlSWQsIHJ1bnRpbWVTdGFnZUlkLCB1bnRyYWNrZWRTb3VyY2VzLCB0YWdzLCBwaGFzZSB9ID0gbmFtZXM7XG4gIGNvbnN0IGJ1bmRsZTogQ29tbWl0QnVuZGxlID0geyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlLCBzdGFnZSwgc3RhZ2VJZCwgcnVudGltZVN0YWdlSWQgfTtcbiAgaWYgKHVudHJhY2tlZFNvdXJjZXMpIGJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzID0gdW50cmFja2VkU291cmNlcztcbiAgaWYgKHRhZ3MpIGJ1bmRsZS50YWdzID0gdGFncztcbiAgaWYgKHBoYXNlKSBidW5kbGUucGhhc2UgPSBwaGFzZTtcbiAgcmV0dXJuIGJ1bmRsZTtcbn1cblxuLyoqIFRoZSBuYW1lcywgcmVhZCBvbmNlIOKAlCBiZWZvcmUgYW55dGhpbmcgbW92ZXMgKGxhdyAyKS4gQW4gb3B0aW9uYWwgb25lIHdpdGggbm90aGluZyB0byBzYXkgaXMgYHVuZGVmaW5lZGAuICovXG5mdW5jdGlvbiBuYW1lc09mKHsgc3RhZ2UsIHN0YWdlSWQsIHJ1bnRpbWVTdGFnZUlkLCB1bnRyYWNrZWRTb3VyY2VzLCB0YWdzLCBwaGFzZSB9OiBDb21taXRTdGFtcCk6IE5hbWVzIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFnZSxcbiAgICBzdGFnZUlkLFxuICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgIHVudHJhY2tlZFNvdXJjZXM6ICF1bnRyYWNrZWRTb3VyY2VzIHx8IHVudHJhY2tlZFNvdXJjZXMuc2l6ZSA9PT0gMCA/IHVuZGVmaW5lZCA6IFsuLi51bnRyYWNrZWRTb3VyY2VzXSxcbiAgICB0YWdzOiAhdGFncyB8fCB0YWdzLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHRhZ3MsXG4gICAgcGhhc2U6IHBoYXNlIHx8IHVuZGVmaW5lZCxcbiAgfTtcbn1cbiJdfQ==
|