footprintjs 9.48.1 → 9.48.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/dist/esm/lib/capture/freeze.js +2 -14
- package/dist/esm/lib/capture/ownData.d.ts +18 -0
- package/dist/esm/lib/capture/ownData.js +36 -0
- package/dist/esm/lib/memory/TransactionBuffer.js +5 -4
- package/dist/esm/lib/memory/merge.d.ts +1 -1
- package/dist/esm/lib/memory/merge.js +4 -12
- package/dist/esm/lib/memory/pathOps.d.ts +15 -12
- package/dist/esm/lib/memory/pathOps.js +33 -29
- package/dist/esm/lib/memory/utils.js +2 -10
- package/dist/lib/capture/freeze.js +3 -15
- package/dist/lib/capture/ownData.js +41 -0
- package/dist/lib/memory/TransactionBuffer.js +5 -4
- package/dist/lib/memory/merge.js +4 -12
- package/dist/lib/memory/pathOps.js +33 -29
- package/dist/lib/memory/utils.js +8 -16
- package/dist/types/lib/capture/ownData.d.ts +18 -0
- package/dist/types/lib/memory/merge.d.ts +1 -1
- package/dist/types/lib/memory/pathOps.d.ts +15 -12
- package/package.json +1 -1
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
* its address is coherent by construction — both trees receive the same
|
|
63
63
|
* write — and is admitted without the fold.
|
|
64
64
|
*/
|
|
65
|
+
import { putOwn } from '../capture/ownData.js';
|
|
65
66
|
import { addressDepthOf, lossyFamilies } from './admission.js';
|
|
66
67
|
import { emitInFamilyOrder, groupIntoFamilies, pushValueRow } from './deltaEncoding.js';
|
|
67
68
|
import { relation } from './keyPaths.js';
|
|
@@ -449,12 +450,12 @@ export class TransactionBuffer {
|
|
|
449
450
|
if (value !== atBase || this.staged.has(value))
|
|
450
451
|
return;
|
|
451
452
|
if (i === path.length - 1) {
|
|
452
|
-
parent
|
|
453
|
+
putOwn(parent, k, this.privateCopyOf(value));
|
|
453
454
|
return;
|
|
454
455
|
}
|
|
455
456
|
value = shallowCopy(value);
|
|
456
457
|
this.owned.add(value);
|
|
457
|
-
parent
|
|
458
|
+
putOwn(parent, k, value);
|
|
458
459
|
}
|
|
459
460
|
parent = value;
|
|
460
461
|
base = atBase;
|
|
@@ -482,7 +483,7 @@ export class TransactionBuffer {
|
|
|
482
483
|
if (this.owned.has(child))
|
|
483
484
|
work.push([child, atBase]);
|
|
484
485
|
else if (child === atBase && !this.staged.has(child)) {
|
|
485
|
-
node
|
|
486
|
+
putOwn(node, key, this.privateCopyOf(child));
|
|
486
487
|
}
|
|
487
488
|
}
|
|
488
489
|
this.privateTrees.add(node);
|
|
@@ -943,4 +944,4 @@ function flattenedTraceRow(op) {
|
|
|
943
944
|
function provenance(readKeys) {
|
|
944
945
|
return readKeys !== undefined ? { readKeys } : undefined;
|
|
945
946
|
}
|
|
946
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0RHO0FBRUgsT0FBTyxFQUFtRCxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEgsT0FBTyxFQUE4QixpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFNBQVMsSUFBSSxJQUFJLEVBQ2pCLFNBQVMsSUFBSSxJQUFJLEVBQ2pCLEdBQUcsRUFDSCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFFBQVEsRUFDUixXQUFXLEdBQ1osTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEYsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixD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QUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDdEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUM7QUFFRCwwRkFBMEY7QUFDMUYsU0FBUyxVQUFVLENBQUMsUUFBOEI7SUFDaEQsT0FBTyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWZmZXIg4oCUIFBlci1zdGFnZSBTVEFHSU5HIGJ1ZmZlciBmb3Igc3RhdGUgbXV0YXRpb25zXG4gKlxuICogV2hhdCBpdCBJUzogYSBzdGFnaW5nIGJ1ZmZlciB3aXRoIHJlYWQteW91ci13cml0ZXMgYW5kIG5ldC1jaGFuZ2UgY29tbWl0cy5cbiAqIC0gQ2hhbmdlcyBhcmUgc3RhZ2VkIGhlcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbiBhbmQgZmx1c2hlZCB0b1xuICogICBTaGFyZWRNZW1vcnkgaW4gT05FIGJhdGNoIHBlciBzdGFnZSAoYGNvbW1pdCgpYCkg4oCUIG90aGVyIHN0YWdlcyBhbmRcbiAqICAgcGFyYWxsZWwgc2libGluZ3MgbmV2ZXIgb2JzZXJ2ZSBhIHN0YWdlJ3MgaGFsZi1maW5pc2hlZCB3cml0ZXMuXG4gKiAtIFJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3kgd2l0aGluIGEgc3RhZ2Ug4oCUIGEgc3RhZ2Ugc2VlcyBpdHMgb3duXG4gKiAgIHN0YWdlZCB3cml0ZXMgaW1tZWRpYXRlbHkuXG4gKiAtIGBjb21taXQoKWAgcmVjb3JkcyB0aGUgc3RhZ2UncyBORVQgY2hhbmdlIChzZWUge0BsaW5rIGNvbW1pdH0pLCBwbHVzIGFuXG4gKiAgIG9wZXJhdGlvbiB0cmFjZSBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuXG4gKlxuICogV2hhdCBpdCBpcyBOT1Q6IGEgcm9sbGJhY2sgbWVjaGFuaXNtLiBEZXNwaXRlIHRoZSBuYW1lLCB0aGVyZSBpcyBub1xuICogYWJvcnQvcm9sbGJhY2sgcGF0aCDigJQgd2hlbiBhIHN0YWdlIFRIUk9XUywgdGhlIGVuZ2luZSBzdGlsbCBjb21taXRzXG4gKiBldmVyeXRoaW5nIHN0YWdlZCBzbyBmYXIgYmVmb3JlIHJlLXRocm93aW5nIChjb21taXQtb24tZXJyb3IgaW5cbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXJgKS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgYXVkaXQgdHJhaWwgbXVzdCByZWNvcmRcbiAqIHdoYXQgdGhlIGZhaWxpbmcgc3RhZ2UgY2hhbmdlZC4gRG8gbm90IHJlbHkgb24gXCJzdGFnZSBmYWlsZWQg4oaSIGl0c1xuICogd3JpdGVzIHZhbmlzaGVkXCIuXG4gKlxuICogVGhlIHBhdGNoIHRyZWVzIGhvbGQgUkVGRVJFTkNFUyB1bnRpbCBjb21taXQgKDkuMjMuMCkuIEEgYHNldGAgc3RvcmVzIHRoZVxuICogY2FsbGVyJ3Mgb3duIHZhbHVlIGluIGBvdmVyd3JpdGVQYXRjaGAgZXhhY3RseSBhcyBpdCBhbHdheXMgZGlkIGluXG4gKiBgd29ya2luZ0NvcHlgOyB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHRha2VuIE9OQ0UgcGVyIHN1cnZpdmluZyBwYXRoXG4gKiB3aGVuIHRoZSBwYXlsb2FkIGxlYXZlcyB0aGUgYnVmZmVyIChgdG9DaGFuZ2VPbmx5UGF5bG9hZGAgL1xuICogYHRvRGVsdGFQYXlsb2FkYCDigJQgZXZlcnkgdmFsdWUgdGhleSBlbWl0IHBhc3NlcyB0aHJvdWdoIGBzdHJ1Y3R1cmVkQ2xvbmVgXG4gKiB0aGVyZSkuIFRoZSBsYXcgXCJ0aGUgcmVjb3JkIG5ldmVyIGFsaWFzZXMgYSBjYWxsZXIncyBvYmplY3RcIiBpcyBrZXB0IGF0XG4gKiB0aGUgY29tbWl0IGJvdW5kYXJ5IGluc3RlYWQgb2YgYXQgZXZlcnkgd3JpdGUsIHdoaWNoIGlzIHdoYXQgbWFrZXMgTlxuICogd3JpdGVzIHRvIG9uZSBwYXRoIE8oTikgaW5zdGVhZCBvZiBPKE4gw5cgc2l6ZSkuIENvbnNlcXVlbmNlLCBieSBkZXNpZ246IGFcbiAqIGNhbGxlciB3aG8gbXV0YXRlcyBpdHMgb3duIG9iamVjdCBBRlRFUiB0aGUgd3JpdGUgYW5kIEJFRk9SRSB0aGUgc3RhZ2VcbiAqIGVuZHMgY29tbWl0cyB0aGUgdmFsdWUgYXMgdGhlIHN0YWdlIHJlYWQgaXQgYmFjayDigJQgdGhlIHJlY29yZCBhZ3JlZXMgd2l0aFxuICogdGhlIHN0YWdlIChDTEFVREUubWQgbGFuZG1pbmUgMydzIGZpcnN0IGJpdGUsIGNsb3NlZCkuIFRoZSBvbmUgcGxhY2UgdGhlXG4gKiBlbmdpbmUgaXRzZWxmIGVkaXRzIFRIUk9VR0ggYSBzdGFnZWQgdmFsdWUg4oCUIGEgbGF0ZXIgbmVzdGVkIG9wIHVuZGVyIGFcbiAqIGBzZXRgIHBhdGgg4oCUIGRldGFjaGVzIHRoYXQgdmFsdWUgZmlyc3QgKHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfSksIHNvXG4gKiBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIG5ldmVyIHNoYXJlIGEgY29udGFpbmVyIHRoZSBlbmdpbmVcbiAqIG11dGF0ZXMgb24gb25lIHNpZGUgb25seS5cbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLiBUaGVcbiAqIGJ1ZmZlciBubyBsb25nZXIgY2xvbmVzIHRoZSBjb21taXR0ZWQgc3RhdGUgaXQgc3RhcnRzIGZyb20uIGBiYXNlU25hcHNob3RgXG4gKiBJUyB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQgKGhlbGQgYnkgcmVmZXJlbmNlIOKAlFxuICogY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwKSwgYW5kIGB3b3JraW5nQ29weWAgc3RhcnRzIGFzIGFcbiAqIGNvcHkgb2YgaXRzIFJPT1Qgb25seTogZWFjaCB3cml0ZSBjb3BpZXMgdGhlIGNvbnRhaW5lcnMgb24gaXRzIG93biBwYXRoXG4gKiAoe0BsaW5rIG93blNwaW5lfSksIGFuZCB0aGUgZmlyc3QgUkVBRCBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBvZiBhXG4gKiBjb250YWluZXIgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlIHRha2VzIGEgcHJpdmF0ZSBkZWVwIGNvcHkgb2ZcbiAqIGl0ICh7QGxpbmsgcHJpdmF0aXNlfSkg4oCUIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBldmVyeVxuICogcmVhZCwgc28gYW4gaW4tcGxhY2UgZWRpdCBvZiBhIHJlYWQgdmFsdWUgc3RheXMgcHJpdmF0ZSBleGFjdGx5IGFzIGl0IGRpZC5cbiAqIEEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIgaXMgc2VydmVkIGZyb20gbGl2ZSBzdGF0ZSBieSB0aGVcbiAqIGNhbGxlciwgYXMgYmVmb3JlOyB0aGUgYnVmZmVyIHRoZW4gcmVwbGFjZXMgdGhhdCBwYXRoIG9mIGl0cyBkaWZmIGJhc2VcbiAqIHdpdGggYSBwcml2YXRlIGNvcHkgKHtAbGluayBkZXRhY2hCYXNlfSksIGFzIHRoZSBjbG9uZSBoYWQgaXQuXG4gKlxuICogVEhFIEFETUlUVEVEIFJFQ09SRCAoOS4zMC4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZCkuIEFcbiAqIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGUgc3RhZ2Unc1xuICogcmVhZC15b3VyLXdyaXRlcyB2aWV3IGF0IGV2ZXJ5IHBhdGggdGhlIHN0YWdlIHRvdWNoZWQgKGFuZCBhdCBldmVyeVxuICogY29udGFpbmVyIGl0cyB3cml0ZXMgY3JlYXRlZCBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzKS5cbiAqIEJvdGggZW5jb2RlcnMgY29tbWl0IHRoZSB2YWx1ZSB0aGUgc3RhZ2UgcmVhZDogYSBjb21wYWN0IHJvdyDigJQgYSBgbWVyZ2VgXG4gKiBkZWx0YSwgYW4gYGFwcGVuZGAgdGFpbCDigJQgaXMga2VwdCB3aGVyZSBpdCBwcm92YWJseSBmb2xkcyBiYWNrOyBhIGZhbWlseSBvZlxuICogcm93cyB0aGF0IGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHZhbHVlcyB0aGUgc3RhZ2UgcmVhZFxuICogKHtAbGluayBhZG1pdH0pLiBCZWZvcmUgOS4zMC4wIHRoZSBvbmUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgcGVyIHBhdGggd2FzXG4gKiByZXBsYXllZCBhdCBldmVyeSBgbWVyZ2VgIHJvdyBvZiB0aGF0IHBhdGgsIHdoaWNoIGxpZWQgYWNyb3NzIGEgaGFyZCB3cml0ZVxuICogKGAkdXBkYXRlKGsse3h9KTsgayA9IHt5fTsgJHVwZGF0ZShrLHt6fSlgIGNvbW1pdHRlZCBge3ksIHgsIHp9YCBmb3IgYVxuICogcmVhZC1iYWNrIG9mIGB7eSwgen1gKSwgYW4gYFtdYCBjbGVhciwgYSBraW5kIGNoYW5nZSBvciBhbiBhcnJheSB1bmlvblxuICogZGVkdXBsaWNhdGVkIGJ5IHJlZmVyZW5jZS4gVmVyaWZpZWQgd2hlbiB0aGUgc3RhZ2Ugc3RhZ2VkIGEgYG1lcmdlYCBvciBhXG4gKiBuZXN0ZWQgb3A7IGEgc3RhZ2UgdGhhdCBzdGFnZWQgb25seSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXJcbiAqIGl0cyBhZGRyZXNzIGlzIGNvaGVyZW50IGJ5IGNvbnN0cnVjdGlvbiDigJQgYm90aCB0cmVlcyByZWNlaXZlIHRoZSBzYW1lXG4gKiB3cml0ZSDigJQgYW5kIGlzIGFkbWl0dGVkIHdpdGhvdXQgdGhlIGZvbGQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBGYW1pbHksIHR5cGUgTG9zc3ksIHR5cGUgTWVtYmVyLCB0eXBlIFJvd3MsIGFkZHJlc3NEZXB0aE9mLCBsb3NzeUZhbWlsaWVzIH0gZnJvbSAnLi9hZG1pc3Npb24uanMnO1xuaW1wb3J0IHsgdHlwZSBPcFZlcmIsIHR5cGUgU3Vydml2b3IsIGVtaXRJbkZhbWlseU9yZGVyLCBncm91cEludG9GYW1pbGllcywgcHVzaFZhbHVlUm93IH0gZnJvbSAnLi9kZWx0YUVuY29kaW5nLmpzJztcbmltcG9ydCB7IHJlbGF0aW9uIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQge1xuICBhZG9wdCxcbiAgaXNDb250YWluZXIsXG4gIG5hdGl2ZUdldCBhcyBfZ2V0LFxuICBuYXRpdmVTZXQgYXMgX3NldCxcbiAgb3duLFxuICBvd25DaGlsZCxcbiAgb3duZWRSb290T2YsXG4gIG93blNwaW5lLFxuICBzaGFsbG93Q29weSxcbn0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGVlcFNtYXJ0TWVyZ2UsIERFTElNLCBkcnlGb2xkLCBub3JtYWxpc2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gIC8qKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBkaWZmIGJhc2U6IHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3RcbiAgICogdG91Y2hlZCwgYnkgcmVmZXJlbmNlIOKAlCBleGNlcHQgd2hlcmUge0BsaW5rIGRldGFjaEJhc2V9IHJlcGxhY2VkIGEgcGF0aFxuICAgKiBvZiBpdCB3aXRoIGEgcHJpdmF0ZSBjb3B5IChpdHMgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBhcmVcbiAgICogdGhlbiBjb3BpZXMgdG9vLCBvd25lZCBieSB7QGxpbmsgYmFzZU93bmVkfSkuXG4gICAqL1xuICBwcml2YXRlIGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFBhdGhzIHdob3NlIGBvdmVyd3JpdGVQYXRjaGAgdmFsdWUgaXMgdGhlIGNhbGxlcidzIG93biBvYmplY3QgKDkuMjMuMCk6XG4gICAqIGEgYHNldGAgb2YgYSBjb250YWluZXIgc3RvcmVzIHRoZSByZWZlcmVuY2UsIGFuZCB0aGlzIGlzIHRoZSBsZWRnZXIgb2ZcbiAgICogd2hpY2ggb25lcyBhcmUgc3RpbGwgc2hhcmVkIHdpdGggdGhlIGNhbGxlciAoYW5kIHdpdGggYHdvcmtpbmdDb3B5YCkuXG4gICAqIENvbnN1bHRlZCBvbmx5IGJ5IHRoZSBlbmdpbmUncyBuZXN0ZWQgb3BzIOKAlCBzZWVcbiAgICoge0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9OyB0aGUgY29tbWl0IHBheWxvYWQgY2xvbmVzIGV2ZXJ5IHN1cnZpdmluZ1xuICAgKiB2YWx1ZSBhbnl3YXkgYW5kIG5ldmVyIGFza3MuIENsZWFyZWQgd2l0aCB0aGUgcmVzdCBhdCBgY29tbWl0KClgLlxuICAgKi9cbiAgcHJpdmF0ZSBoZWxkUmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKiogQ29tbWl0LXZhbHVlIGVuY29kaW5nIHBvbGljeSAoIzEzYy1CKS4gYCdmdWxsJ2AgPSBoaXN0b3JpY2FsIGJ5dGVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcblxuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBzb3VyY2UgKCNQMSkuIFdoZW4gc2V0ICh0aGVcbiAgICogIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgZXZlcnkgc3RhZ2VkIG9wIHNuYXBzaG90cyB0aGVcbiAgICogIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciDigJQgdGhlIHRlbXBvcmFsLXByZWZpeCBhdHRyaWJ1dGlvbiBjb25zdW1lZCBieVxuICAgKiAgY2F1c2FsIHNsaWNpbmcuIFVuZGVmaW5lZCAoZGVmYXVsdCkgPSB6ZXJvIGNvc3QsIGJ5dGUtaWRlbnRpY2FsIG9wcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIGluIGB3b3JraW5nQ29weWAgdGhpcyBidWZmZXIgQ1JFQVRFRDogaXRzIHJvb3QgY29weSwgdGhlXG4gICAqIHBhdGggY29waWVzIGl0cyB3cml0ZXMgbWFkZSwgdGhlIG1lcmdlIHJlc3VsdHMgaXQgYnVpbHQsIGFuZCBldmVyeVxuICAgKiBjb250YWluZXIgb2YgdGhlIHByaXZhdGUgY29waWVzIGl0cyByZWFkcyB0b29rLiBBIHdyaXRlIGVkaXRzIHRoZXNlIGluXG4gICAqIHBsYWNlLiBFdmVyeXRoaW5nIGVsc2UgaW4gYHdvcmtpbmdDb3B5YCBpcyBTSEFSRUQg4oCUIHdpdGggdGhlIGNvbW1pdHRlZFxuICAgKiBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkLCBvciB3aXRoIGEgdmFsdWUgdGhlIHN0YWdlIHN0YWdlZCDigJRcbiAgICogYW5kIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCAoe0BsaW5rIG93blNwaW5lfSkuXG4gICAqL1xuICBwcml2YXRlIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgdmFsdWVzIHRoZSBzdGFnZSBzdGFnZWQgd2l0aCB7QGxpbmsgc2V0fSDigJQgaXRzIG93biBvYmplY3RzLFxuICAgKiBoZWxkIGJ5IHJlZmVyZW5jZSAoOS4yMy4wKS4gQSByZWFkIGhhbmRzIHRoZW0gYmFjayBhcyB0aGV5IGFyZSwgZXhhY3RseVxuICAgKiBhcyB0aGUgcHJpdmF0ZSB3b3JraW5nIGNvcHkgYWx3YXlzIGRpZCwgYW5kIG5ldmVyIHByaXZhdGlzZXMgdGhlbTogYVxuICAgKiBwcml2YXRlIGNvcHkgb2YgYSBzdGFnZWQgdmFsdWUgd291bGQgbGVhdmUgYHdvcmtpbmdDb3B5YCBhbmRcbiAgICogYG92ZXJ3cml0ZVBhdGNoYCBkaXNhZ3JlZWluZyBhYm91dCBhIHZhbHVlIHRoZSBzdGFnZSB3cm90ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBPd25lZCBjb250YWluZXJzIHdpdGggbm8gY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZVxuICAgKiBhbnl3aGVyZSBiZWxvdyB0aGVtIChhIHByaXZhdGUgZGVlcCBjb3B5LCBhIG1lcmdlIHJlc3VsdCBidWlsdCBvbiBhXG4gICAqIHByaXZhdGUgYmFzZSwgYSBwYXRoIGNvcHkgd2hvc2Ugc2hhcmVkIGNoaWxkcmVuIHdlcmUgcHJpdmF0aXNlZCkuIEEgcmVhZFxuICAgKiB0aGF0IGxhbmRzIG9uIG9uZSBuZWVkcyBubyB3YWxrIOKAlCBzZWUge0BsaW5rIHByaXZhdGlzZUJlbG93fS5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBvZiB7QGxpbmsgYmFzZVNuYXBzaG90fSB0aGF0IHtAbGluayBkZXRhY2hCYXNlfSBjcmVhdGVkOlxuICAgKiBpdHMgcm9vdCBjb3B5IGFuZCB0aGUgY29waWVzIG9uIHRoZSB3YXkgdG8gYSBkZXRhY2hlZCBwYXRoLiBBbGxvY2F0ZWRcbiAgICogb25seSBieSB0aGUgZmlyc3QgZGV0YWNoIOKAlCB0aGUgaW4tY29udHJhY3Qgc3RhZ2UgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gICAqL1xuICBwcml2YXRlIGJhc2VPd25lZD86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgZGVlcCBjb3BpZXMge0BsaW5rIGRldGFjaEJhc2V9IHB1dCBpbnRvIHRoZSBkaWZmIGJhc2U6IG5vdGhpbmdcbiAgICogYXQgb3IgYmVsb3cgb25lIGlzIGNvbW1pdHRlZCBzdGF0ZSwgc28gYSBsYXRlciBkZXRhY2ggaW5zaWRlIGl0IGlzIGEgbm8tb3AuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaGVkQmFzZT86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIHN0YWdlIHdyaXRlcyAoOS4zMC4wKTogYSBwYXRoIHByZWZpeCBpdHMgZnJhbWUgY29tcHV0ZWQgYW5kXG4gICAqIGhhbmRzIG92ZXIgYXMgZGF0YSAoQzIg4oCUIGZvciB0aGUgZW5naW5lLCB0aGUgZnJhbWUncyBydW4gbmFtZXNwYWNlLCBvclxuICAgKiBgW11gIGZvciB0aGUgcm9vdCkuIEl0cyBjb250YWluZXJzIGFyZSB0aGUgc3RhZ2UncyBBRERSRVNTLCBub3QgYSB2YWx1ZVxuICAgKiB0aGUgc3RhZ2UgcmVhZHMgKGV2ZXJ5IHJlYWQgaXQgbWFrZXMgaXMgYSBrZXkgYmVsb3cgaXQpLCBzbyBhIHNoZWxsIGFcbiAgICogd3JpdGUgbGVhdmVzIHRoZXJlIGlzIG5vIHBhcnQgb2YgdGhlIHJlYWQtYmFjayB0aGUgcmVjb3JkIG11c3QgaG9sZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIGBtZXJnZWAgb3BzIHN0YWdlZCBzaW5jZSB0aGUgbGFzdCBjb21taXQg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIHN0YWdlZE1lcmdlcyA9IDA7XG4gIC8qKiBPcHMgc3RhZ2VkIGRlZXBlciB0aGFuIG9uZSBrZXkgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcyDigJQgc2VlIHtAbGluayBhZG1pdH0uICovXG4gIHByaXZhdGUgbmVzdGVkT3BzID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBiYXNlOiBhbnksXG4gICAgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlID0gJ2Z1bGwnLFxuICAgIHJlYWRLZXlzUHJvdmlkZXI/OiAoKSA9PiBzdHJpbmdbXSxcbiAgICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICApIHtcbiAgICAvLyBgYmFzZWAgaXMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIOKAlFxuICAgIC8vIGltbXV0YWJsZS1hZnRlci1zd2FwLCB0aGUgaW52YXJpYW50IHRoZSBmaXJzdC10b3VjaCB2aWV3IGFscmVhZHkgcmVzdHNcbiAgICAvLyBvbiDigJQgc28gdGhlIGRpZmYgYmFzZSBpcyBoZWxkIGJ5IFJFRkVSRU5DRSwgYW5kIHRoZSB3b3JraW5nIGNvcHkgc3RhcnRzXG4gICAgLy8gYXMgYSBjb3B5IG9mIGl0cyBST09UIG9ubHkuIEJlZm9yZSA5LjI5LjAgdGhlc2UgdHdvIGxpbmVzIHdlcmUgdHdvXG4gICAgLy8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSB3aG9sZSBzdGF0ZSwgcGFpZCBieSBldmVyeSBzdGFnZSB0aGF0IHdyb3RlLlxuICAgIHRoaXMuYmFzZVNuYXBzaG90ID0gYmFzZTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0gb3duZWRSb290T2YoYmFzZSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5jb21taXRWYWx1ZXMgPSBjb21taXRWYWx1ZXM7XG4gICAgdGhpcy5yZWFkS2V5c1Byb3ZpZGVyID0gcmVhZEtleXNQcm92aWRlcjtcbiAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFN0YW1wIHRoZSBjdXJyZW50IHJlYWQgcHJlZml4IG9udG8gYSBzdGFnZWQgb3Ag4oCUIG9ubHkgd2hlbiB0aGVcbiAgICogIHByb3ZlbmFuY2UgZGlhbCBpcyBvbiAocHJvdmlkZXIgcHJlc2VudCksIHNvIHRoZSBkZWZhdWx0IHBhdGggYWxsb2NhdGVzXG4gICAqICBub3RoaW5nIGFuZCBjb21taXQgYnVuZGxlcyBzdGF5IGJ5dGUtaWRlbnRpY2FsLiAqL1xuICBwcml2YXRlIHN0YW1wUmVhZEtleXMob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IHR5cGVvZiBvcCB7XG4gICAgaWYgKHRoaXMucmVhZEtleXNQcm92aWRlcikgb3AucmVhZEtleXMgPSB0aGlzLnJlYWRLZXlzUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gb3A7XG4gIH1cblxuICAvKiogU3RhZ2UgYW4gb3AgaW50byBgb3BUcmFjZWAsIGNvdW50aW5nIHdoYXQgZGVjaWRlcyB3aGV0aGVyIHtAbGluayBhZG1pdH0gbXVzdCBmb2xkLiAqL1xuICBwcml2YXRlIHN0YWdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGtleTogc3RyaW5nLCB2ZXJiOiBPcFZlcmIpOiB2b2lkIHtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgdGhpcy5zdGFnZWRNZXJnZXMrKztcbiAgICBpZiAocGF0aC5sZW5ndGggLSBhZGRyZXNzRGVwdGhPZihwYXRoLCB0aGlzLmFkZHJlc3MpID4gMSkgdGhpcy5uZXN0ZWRPcHMrKztcbiAgICB0aGlzLm9wVHJhY2UucHVzaCh0aGlzLnN0YW1wUmVhZEtleXMoeyBwYXRoOiBrZXksIHZlcmIgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQgb3ZlcndyaXRlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gU3RvcmVzIHRoZSBSRUZFUkVOQ0UgaW4gYm90aCB0cmVlc1xuICAgKiAoOS4yMy4wKSDigJQgdGhlIHJlY29yZCdzIGNvcHkgaXMgdGFrZW4gb25jZSwgYXQgY29tbWl0OyBzZWUgdGhlIGhlYWRlci5cbiAgICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgdmFsdWUpO1xuICAgIGlmIChpc0NvbnRhaW5lcih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaGVsZFJlZnMuYWRkKGtleSk7XG4gICAgICB0aGlzLnN0YWdlZC5hZGQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnc2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSBuZXN0ZWQgb3AgaXMgYWJvdXQgdG8gd3JpdGUgVEhST1VHSCBhIHBhdGggd2hvc2UgYG92ZXJ3cml0ZVBhdGNoYFxuICAgKiB2YWx1ZSBpcyBhIGhlbGQgcmVmZXJlbmNlICg5LjIzLjApLiBUb2RheSdzIGxhdyBpcyB0aGF0IHRoZSB0d28gdHJlZXNcbiAgICogcmVjZWl2ZSB0aGUgc2FtZSBuZXN0ZWQgYHNldGAvYGRlbGV0ZWAgbXV0YXRpb25zIGJ1dCBPTkxZIGB3b3JraW5nQ29weWBcbiAgICogcmVjZWl2ZXMgYSBuZXN0ZWQgYG1lcmdlYCdzIHJlc3VsdCAoYHVwZGF0ZVBhdGNoYCBnZXRzIHRoZSBkZWx0YSkg4oCUIHNvIGFcbiAgICogY29udGFpbmVyIHNoYXJlZCBiZXR3ZWVuIHRoZSB0cmVlcyB3b3VsZCBsZWFrIHRoZSBtZXJnZWQgdmFsdWUgaW50byB0aGVcbiAgICogb3ZlcndyaXRlIHBheWxvYWQsIGFuZCBhIHNoYXJlZCBjb250YWluZXIgaXMgYWxzbyB0aGUgY2FsbGVyJ3Mgb3duXG4gICAqIG9iamVjdCwgd2hpY2ggdGhlIGVuZ2luZSBtdXN0IG5vdCBlZGl0IG9uIHRoZSByZWNvcmQncyBiZWhhbGYuIFJlcGxhY2luZ1xuICAgKiB0aGUgaGVsZCBhbmNlc3RvciB3aXRoIGl0cyBjbG9uZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIHJlc3RvcmVzIGV4YWN0bHlcbiAgICogdGhlIHByaXZhdGUgdHJlZSB0aGUgcGVyLXdyaXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBpdCwgcGFpZCBvbmNlIHBlclxuICAgKiBhbmNlc3RvciBhbmQgb25seSBvbiB0aGUgbmVzdGVkLW9wIHBhdGggdGhlIHB1YmxpYyBzdXJmYWNlIG5ldmVyIHRha2VzXG4gICAqICh0aGUgc2NvcGUgcHJveHkgd3JpdGVzIFJPT1Qga2V5cykuIGB3b3JraW5nQ29weWAga2VlcHMgdGhlIHJlZmVyZW5jZSxcbiAgICogYXMgaXQgYWx3YXlzIGRpZC5cbiAgICovXG4gIHByaXZhdGUgZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVsZFJlZnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW5jZXN0b3IgPSBwYXRoLnNsaWNlKDAsIGkpO1xuICAgICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChhbmNlc3Rvcik7XG4gICAgICBpZiAoIXRoaXMuaGVsZFJlZnMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaGVsZCA9IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgYW5jZXN0b3IpO1xuICAgICAgaWYgKGhlbGQgIT09IG51bGwgJiYgdHlwZW9mIGhlbGQgPT09ICdvYmplY3QnKSBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yLCBzdHJ1Y3R1cmVkQ2xvbmUoaGVsZCkpO1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwbGljaXQga2V5IGRlbGV0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCAoIzEzYy1COyBhYnNvcmJzIGJhY2tsb2cgQjgpLlxuICAgKlxuICAgKiBTdGFnZXMgRVhBQ1RMWSB0aGUgc2FtZSBidWZmZXIgbXV0YXRpb25zIGFzIGBzZXQocGF0aCwgdW5kZWZpbmVkKWAg4oCUXG4gICAqIGB3b3JraW5nQ29weWAvYG92ZXJ3cml0ZVBhdGNoYCBnZXQgYW4gb3duIGB1bmRlZmluZWRgIGF0IHRoZSBwYXRoICh0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nLCBwcmVzZXJ2aW5nIHJlYWQgYmVoYXZpb3IgYW5kIHRoZSBkZWR1cCBkaWZmIGJhc2VcbiAgICogYWNyb3NzIG1vZGVzKSDigJQgYnV0IHJlY29yZHMgdGhlIG9wIHZlcmIgYXMgYCdkZWxldGUnYC4gQXQgY29tbWl0OlxuICAgKiBgJ2Z1bGwnYCBtb2RlIG1hcHMgaXQgYmFjayB0byBhIGAnc2V0J2AgdHJhY2UgZW50cnkgKGJ5dGUtaWRlbnRpY2FsIHRvXG4gICAqIHRvZGF5KTsgYCdkZWx0YSdgIG1vZGUgZW1pdHMgYSByZWFsIGAnZGVsZXRlJ2AgZW50cnkgd2hvc2UgcmVwbGF5XG4gICAqIFJFTU9WRVMgdGhlIGtleSBpbnN0ZWFkIG9mIGxlYXZpbmcgYGtleTogdW5kZWZpbmVkYCBiZWhpbmQuXG4gICAqXG4gICAqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciByZWFkcyB0aGF0IHN0YWdlZCBvd24gYHVuZGVmaW5lZGAgYXMgQUJTRU5UXG4gICAqIChgZGVlcEVxdWFsYCwgOS4xOS4xKSDigJQgc28gdW5kZXIgYCdkZWx0YSdgLCB3aG9zZSBjb21taXR0ZWQgc3RhdGUgcmVhbGx5XG4gICAqIGxhY2tzIHRoZSBrZXksIGRlbGV0aW5nIGFuIGFic2VudCBrZXkgaW5zaWRlIGEgY29udGFpbmVyIHRoZSBzdGFnZSBhbHNvXG4gICAqIHJlLXdyb3RlIGlzIHRoZSBuby1vcCBpdCBpcywgbm90IGEgYHNldGAgb2YgdGhlIHdob2xlIGNvbnRhaW5lci5cbiAgICovXG4gIGRlbGV0ZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdW5kZWZpbmVkKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnZGVsZXRlJyk7XG4gIH1cblxuICAvKiogRGVlcCB1bmlvbiBtZXJnZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIGBkZWVwU21hcnRNZXJnZWAgYnVpbGRzIGZyZXNoXG4gICAqICBjb250YWluZXJzLCBzbyBuZWl0aGVyIHRyZWUgZXZlciBob2xkcyB0aGUgbWVyZ2UgSU5QVVQgYnkgcmVmZXJlbmNlO1xuICAgKiAgdGhlIG5lc3RlZC1vcCBkZXRhY2ggZ3VhcmRzIHRoZSBhbmNlc3RvciBpdCB3cml0ZXMgSU5UTy5cbiAgICpcbiAgICogIFRoZSB2YWx1ZSBtZXJnZWQgSU5UTyBpcyBtYWRlIHByaXZhdGUgZmlyc3QgKGBwcml2YXRpc2VgKSwgYXMgdGhlXG4gICAqICB3aG9sZS1zdGF0ZSBjbG9uZSBtYWRlIGl0IGJlZm9yZSA5LjI5LjAuIE5vdCBvbmx5IGZvciB0aGUgcmVhZHMgdGhhdFxuICAgKiAgZm9sbG93OiBgZGVlcFNtYXJ0TWVyZ2VgIHVuaW9ucyBhcnJheXMgQlkgUkVGRVJFTkNFLCBzbyB3aGV0aGVyIGFuXG4gICAqICBlbGVtZW50IHRoZSBzdGFnZSBwYXNzZXMgaW4gaXMgXCJhbHJlYWR5IHRoZXJlXCIgZGVwZW5kcyBvbiB3aGljaCBvYmplY3RzXG4gICAqICB0aGUgYmFzZSBob2xkcyDigJQgYSBjb21taXR0ZWQgYXJyYXkgd291bGQgZGVkdXAgYW4gZWxlbWVudCB0aGUgc3RhZ2VcbiAgICogIHJlYWQgZnJvbSBpdCBiZWZvcmUgaXRzIGZpcnN0IHdyaXRlLCB3aGVyZSB0aGUgcHJpdmF0ZSBjb3B5IChhbmRcbiAgICogIDkuMjguMCkgYXBwZW5kcyBpdC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICB0aGlzLnByaXZhdGlzZShwYXRoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBvd24obWVyZ2VkLCB0aGlzLm93bmVkKTtcbiAgICBpZiAoaXNDb250YWluZXIobWVyZ2VkKSkgdGhpcy5wcml2YXRlVHJlZXMuYWRkKG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBtZXJnZWQpO1xuICAgIF9zZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCwgZGVlcFNtYXJ0TWVyZ2UoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoKSA/PyB7fSwgdmFsdWUpKTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gKDkuMTkuMCk6IG1hcmsgZG90LXBhdGhzIElOU0lERSB0aGUgdmFsdWUgc3RhZ2VkIGF0XG4gICAqIGBwYXRoYCBhcyBzZWNyZXQsIHNvIGBzY3J1YlBhdGNoYCBzY3J1YnMgdGhlbSBpbiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlXG4gICAqIG1pcnJvciB0aGUgc2FtZSB3YXkgYSB3aG9sZS1rZXkgcmVkYWN0aW9uIGlzIHNjcnViYmVkLiBBIGZpZWxkIGlzXG4gICAqIHJlZ2lzdGVyZWQgYXMgYSBsaXRlcmFsIGtleSBBTkQsIHdoZW4gZG90dGVkLCBhcyB0aGUgbmVzdGVkIHBhdGggaXRcbiAgICogbmFtZXMg4oCUIHdoaWNoZXZlciBleGlzdHMgaW4gdGhlIHBhdGNoIGlzIHRoZSBvbmUgYHNjcnViUGF0Y2hgIGZpbmRzLlxuICAgKiBNYXJrZWQgcGF0aHMgc3Vydml2ZSBjb21taXQgb25seSB3aGlsZSB0aGUgb3AgcGF0aCB0aGV5IHNpdCB1bmRlciBkb2VzXG4gICAqIChzZWUge0BsaW5rIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHN9KS5cbiAgICovXG4gIG1hcmtSZWRhY3RlZEZpZWxkcyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgZmllbGRdKSk7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoJy4nKSkgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKFsuLi5wYXRoLCAuLi5maWVsZC5zcGxpdCgnLicpXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIGEgcmVkYWN0aW9uIG1hcmsgYWRkcmVzcyBhbiBhcnJheSBFTEVNRU5UIHJpZ2h0IGJlbG93IGBwYXRoYFxuICAgKiAoYGxpc3QuMS50b2tlbmApPyBBbiBgYXBwZW5kYCByb3cgcmUtYmFzZXMgdGhlIGluZGljZXMgb250byB0aGUgdGFpbCwgc29cbiAgICogc3VjaCBhIHBhdGggdGFrZXMgdGhlIHdob2xlLXZhbHVlIGBzZXRgIChgZGVsdGFFbmNvZGluZyDCtyBwdXNoVmFsdWVSb3dgKS5cbiAgICogQSBtYXJrIGJ5IE5BTUUgYmVsb3cgYW4gYXJyYXkgKGBvYmoueWApIG1lYW5zIHRoZSBzYW1lIHRoaW5nIG9uIHRoZSB0YWlsXG4gICAqIGFzIG9uIHRoZSB3aG9sZSB2YWx1ZSwgc28gdGhlIGNvbXBhY3Qgcm93IHN0YXlzIChieXRlLWlkZW50aWNhbCkuXG4gICAqL1xuICBwcml2YXRlIG1hcmtlZEJlbG93KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHBhdGggKyBERUxJTTtcbiAgICBmb3IgKGNvbnN0IG1hcmtlZCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmICghbWFya2VkLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0ID0gbWFya2VkLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KERFTElNKVswXTtcbiAgICAgIGlmICgvXigwfFsxLTldXFxkKikkLy50ZXN0KG5leHQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3RlZCBwYXRocyB0aGF0IHN1cnZpdmUgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyOiBhIHBhdGggc3Vydml2ZXNcbiAgICogd2hlbiBpdCBJUyBhIHN1cnZpdmluZyBvcCBwYXRoIChhIHdob2xlLWtleSByZWRhY3Rpb24pIG9yIHNpdHMgVU5ERVIgb25lXG4gICAqIChhIGZpZWxkIGluc2lkZSBhIHN1cnZpdmluZyB3cml0ZSkuIEEgZHJvcHBlZCBvcCB0YWtlcyBpdHMgZmllbGRzIHdpdGggaXQuXG4gICAqL1xuICBwcml2YXRlIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHMoc3Vydml2aW5nUGF0aHM6IFNldDxzdHJpbmc+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmIChzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHN1cnZpdmluZ1BhdGhzKSB7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgob3AgKyBERUxJTSkpIHtcbiAgICAgICAgICBvdXQuYWRkKHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBjdXJyZW50IHZhbHVlIGF0IHBhdGggKGluY2x1ZGVzIHVuY29tbWl0dGVkIGNoYW5nZXMpLiBUaGUgdmFsdWUgaXNcbiAgICogdGhlIHN0YWdlJ3Mgb3duIOKAlCBwcml2YXRlIHRvIGl0LCBhcyB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBldmVyeSByZWFkXG4gICAqIGFmdGVyIHRoZSBmaXJzdCB3cml0ZSBiZWZvcmUgOS4yOS4wIChgcHJpdmF0aXNlYCkuXG4gICAqL1xuICBnZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KSB7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSB3b3JraW5nIGNvcHkgYXQgYHBhdGhgIFdJVEhPVVQgdGFraW5nIGEgcHJpdmF0ZSBjb3B5IOKAlCBmb3IgYVxuICAgKiByZWFkZXIgdGhhdCBvbmx5IGNvbXBhcmVzICh0aGUgZGV2LW1vZGUgYm9ycm93ZWQtbXV0YXRpb24gcmVwb3J0IGluXG4gICAqIGBTdGFnZUNvbnRleHQuY29tbWl0YCksIG5ldmVyIGZvciBhIHZhbHVlIGhhbmRlZCB0byBhIHN0YWdlLlxuICAgKi9cbiAgcGVlayhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcCB0aGUgZGlmZiBiYXNlIGV4YWN0IHVuZGVyIGEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIuXG4gICAqXG4gICAqIFdoZW4gYHdvcmtpbmdDb3B5YCBob2xkcyBub3RoaW5nIGF0IGBwYXRoYCDigJQgdGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXRcbiAgICogaXQsIG9yIGEgd3JpdGUgcmVwbGFjZWQgYSBjb250YWluZXIgYWJvdmUgaXQg4oCUIGBSZWNvcmRGcmFtZSDCtyByZWFkYFxuICAgKiBzZXJ2ZXMgdGhlIHJlYWQgZnJvbSBMSVZFIGNvbW1pdHRlZCBzdGF0ZSwgZXhhY3RseSBhcyA5LjI4LjBcbiAgICogZGlkLCBzbyB0aGUgdmFsdWUgaXQgaGFuZHMgb3V0IGlzIGNvbW1pdHRlZCBzdGF0ZSBpdHNlbGYuIE9uIDkuMjguMCB0aGVcbiAgICogZGlmZiBiYXNlIHdhcyBhIHdob2xlLXN0YXRlIGNsb25lIHRha2VuIGF0IHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlLCBhbmRcbiAgICogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGF0IHZhbHVlIChvdXQgb2YgY29udHJhY3Qg4oCUIHJlYWRzIGFyZSBib3Jyb3dlZClcbiAgICogY291bGQgbm90IG1vdmUgaXQ6IHdyaXR0ZW4gYmFjaywgdGhlIGVkaXQgd2FzIHJlY29yZGVkLiBIZXJlIHRoZSBkaWZmXG4gICAqIGJhc2UgSVMgYSBjb21taXR0ZWQgZ2VuZXJhdGlvbiwgYW5kIGl0IHZlcnkgb2Z0ZW4gaG9sZHMgdGhhdCBzYW1lXG4gICAqIGNvbnRhaW5lciBhdCBgcGF0aGAg4oCUIHRoZSBlZGl0IHdvdWxkIG1vdmUgdGhlIGJhc2Ugd2l0aCBpdCwgYW5kIHRoZVxuICAgKiB3cml0ZS1iYWNrIHdvdWxkIGNvbW1pdCBubyBjaGFuZ2UuIFNvIGJlZm9yZSB0aGUgdmFsdWUgZ29lcyBvdXQsIHRoZVxuICAgKiBiYXNlJ3MgdmFsdWUgYXQgYHBhdGhgIGlzIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgKHRoZSBiYXNlJ3NcbiAgICogcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBjb3BpZWQgc2hhbGxvd2x5KSDigJQgd2hhdCA5LjI4LjAnc1xuICAgKiBiYXNlIGhlbGQgdGhlcmUuIFRoZSBjb21taXQncyBuZXQtY2hhbmdlIHRlc3QgY29tcGFyZXMgYWdhaW5zdCBpdCBhbmRcbiAgICogdGhlIGRlbHRhIGVuY29kZXIgcmVwbGF5cyBmcm9tIGl0OyB0aGUgdmFsdWUgaGFuZGVkIG91dCBzdGF5cyB0aGUgbGl2ZVxuICAgKiBvbmUsIHNvIHdoYXRldmVyIGVsc2UgYW4gZWRpdCBvZiBpdCByZWFjaGVzIChsaXZlIHN0YXRlLCB0aGUgbmV4dFxuICAgKiBnZW5lcmF0aW9uKSBiZWhhdmVzIGFzIG9uIDkuMjguMCB0b28uXG4gICAqXG4gICAqIE5vdCBgcHJpdmF0aXNlYDogYSBwcml2YXRlIGNvcHkgaGFuZGVkIHRvIHRoZSBzdGFnZSB3b3VsZCBhbHNvIGtlZXAgdGhlXG4gICAqIGVkaXQgb3V0IG9mIGxpdmUgc3RhdGUsIHdoZXJlIDkuMjguMCBsZXQgaXQgaW4g4oCUIGEgcnVuLW5hbWVzcGFjZWQgcmVhZFxuICAgKiB0aGF0IGZhbGxzIGJhY2sgdG8gYSBnbG9iYWwga2V5IHdvdWxkIHRoZW4gZW5kIGRpZmZlcmVudGx5ICh0aGVcbiAgICogZGlmZmVyZW50aWFsJ3MgTkVTVEVEIGZhbWlseSBmYWlscyB3aXRoaW4gMTAwIHByb2dyYW1zIHRoYXQgd2F5KS5cbiAgICpcbiAgICogQ29waWVzIG5vdGhpbmcgd2hlbiB0aGUgYmFzZSBob2xkcyBubyBjb250YWluZXIgYXQgYHBhdGhgLCBhbmQgbm90aGluZ1xuICAgKiB0d2ljZTogYSBwYXRoIGF0IG9yIGJlbG93IGFuIGVhcmxpZXIgZGV0YWNoIGlzIGFscmVhZHkgcHJpdmF0ZS4gTyhwYXRoKVxuICAgKiBvdGhlcndpc2UsIHBsdXMgTyh2YWx1ZSkgb25jZSBwZXIgZGV0YWNoZWQgcGF0aC5cbiAgICovXG4gIGRldGFjaEJhc2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCB8fCAhaXNDb250YWluZXIodGhpcy5iYXNlU25hcHNob3QpKSByZXR1cm47XG4gICAgbGV0IGF0OiBvYmplY3QgPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSByZXR1cm47XG4gICAgICBhdCA9IGNoaWxkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXRhY2hlZEJhc2U/LmhhcyhhdCkpIHJldHVybjtcbiAgICBjb25zdCBvd25lZCA9ICh0aGlzLmJhc2VPd25lZCA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKTtcbiAgICBpZiAoIW93bmVkLmhhcyh0aGlzLmJhc2VTbmFwc2hvdCkpIHRoaXMuYmFzZVNuYXBzaG90ID0gb3duZWRSb290T2YodGhpcy5iYXNlU25hcHNob3QsIG93bmVkKTtcbiAgICBvd25TcGluZSh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgb3duZWQpO1xuICAgIGNvbnN0IGNvcHk6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShhdCk7XG4gICAgKHRoaXMuZGV0YWNoZWRCYXNlID8/PSBuZXcgV2Vha1NldDxvYmplY3Q+KCkpLmFkZChjb3B5KTtcbiAgICBfc2V0KHRoaXMuYmFzZVNuYXBzaG90LCBwYXRoLCBjb3B5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIHJlYWRzICg5LjI5LjApOiBtYWtlIHRoZSB2YWx1ZSBhdCBgcGF0aGAgdGhlIHN0YWdlJ3Mgb3duIGJlZm9yZVxuICAgKiBhIHJlYWQgaGFuZHMgaXQgb3V0IOKAlCBzbyBhIHJlYWQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgYmVoYXZlc1xuICAgKiBleGFjdGx5IGFzIGl0IGRpZCB3aGVuIHRoZSBidWZmZXIgYmVnYW4gd2l0aCBhIGRlZXAgY2xvbmUgb2YgdGhlIHdob2xlXG4gICAqIHN0YXRlLiBBbiBpbi1wbGFjZSBlZGl0IG9mIHdoYXQgdGhlIHJlYWQgcmV0dXJuZWQgKG91dCBvZiBjb250cmFjdCDigJRcbiAgICogcmVhZHMgYXJlIGJvcnJvd2VkKSBzdGF5cyBpbnNpZGUgdGhlIGJ1ZmZlciwgYW5kIGNvbW1pdHRlZCBzdGF0ZSBpcyBuZXZlclxuICAgKiB0b3VjaGVkLiBXaGV0aGVyIHRoZSBSRUNPUkQga2VlcHMgaXQgaXMgdGhlIGFkbWl0dGVkIHJlY29yZCdzIGxhd1xuICAgKiAoOS4zMC4wLCBvd25lciBydWxpbmcgUjEg4oCUIHRoZSByZWNvcmQga2VlcHMgd2hhdCB0aGUgc3RhZ2UgcmVhZCBiYWNrKTogaXRcbiAgICogaXMga2VwdCB3aGVuIHRoZSBlZGl0ZWQgdmFsdWUgbGllcyBhdCBvciBiZWxvdyBhIHBhdGggdGhlIHN0YWdlIHdyb3RlIGluXG4gICAqIHRoaXMgc3RhZ2Ug4oCUIHNldCwgbWVyZ2VkIG9yIHdyaXR0ZW4gYmFjayBhbGlrZSDigJQgYW5kIGxvc3Qgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBXYWxraW5nIHRoZSBwYXRoIGZyb20gdGhlIChvd25lZCkgcm9vdDpcbiAgICogIC0gYSBjb250YWluZXIgc3RpbGwgU0hBUkVEIHdpdGggY29tbWl0dGVkIHN0YXRlIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGlzXG4gICAqICAgIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgd2hlbiBpdCBpcyB0aGUgdmFsdWUgcmVhZCwgb3IgYnkgYVxuICAgKiAgICBzaGFsbG93IGNvcHkgd2hlbiBpdCBpcyBhIGNvbnRhaW5lciBvbiB0aGUgd2F5IHRvIGl0IChzbyBhIHJlYWQgb2ZcbiAgICogICAgYGtgIHVuZGVyIGEgZm9yayBjaGlsZCdzIGFkZHJlc3MgY29waWVzIGBrYCwgbm90IGV2ZXJ5IGNoaWxkJ3MgbmFtZXNwYWNlKTtcbiAgICogIC0gYSBjb250YWluZXIgdGhlIHN0YWdlIFNUQUdFRCAob3IgYW55dGhpbmcgZWxzZSB0aGUgYnVmZmVyIGRpZCBub3RcbiAgICogICAgdGFrZSBmcm9tIGNvbW1pdHRlZCBzdGF0ZSkgaXMgaGFuZGVkIGJhY2sgYnkgcmVmZXJlbmNlLCBhcyBiZWZvcmU7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBidWZmZXIgb3ducyBpcyB3YWxrZWQgb24g4oCUIGFuZCB3aGVuIGl0IGlzIHRoZSB2YWx1ZVxuICAgKiAgICByZWFkLCBpdHMgc3RpbGwtc2hhcmVkIGRlc2NlbmRhbnRzIGFyZSBwcml2YXRpc2VkXG4gICAqICAgICh7QGxpbmsgcHJpdmF0aXNlQmVsb3d9KS5cbiAgICpcbiAgICogQ29zdDogTyhwYXRoKSBwZXIgcmVhZCwgcGx1cyBPKHZhbHVlKSBPTkNFIHBlciBzaGFyZWQgY29udGFpbmVyIGEgc3RhZ2VcbiAgICogcmVhZHMgYWZ0ZXIgaXRzIGZpcnN0IHdyaXRlLiBBIHN0YWdlIHRoYXQgbmV2ZXIgcmVhZHMgYWZ0ZXIgd3JpdGluZyBwYXlzXG4gICAqIG5vdGhpbmc7IGEgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIG5ldmVyIHJlYWNoZXMgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0aXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAvLyBSZXNvbHZlIGZpcnN0OiBhIHJlYWQgdGhhdCBsYW5kcyBvbiBub3RoaW5nIChhIG1pc3Npbmcga2V5LCBhIHJlZnVzZWRcbiAgICAvLyBzZWdtZW50LCBhIHByaW1pdGl2ZSkgcmV0dXJucyBub3RoaW5nIGFuZCBtdXN0IGNvcHkgbm90aGluZy5cbiAgICBjb25zdCBjaGFpbjogb2JqZWN0W10gPSBbXTtcbiAgICBsZXQgYXQ6IHVua25vd24gPSB0aGlzLndvcmtpbmdDb3B5O1xuICAgIGZvciAoY29uc3QgayBvZiBwYXRoKSB7XG4gICAgICBhdCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoYXQpKSByZXR1cm47XG4gICAgICBjaGFpbi5wdXNoKGF0KTtcbiAgICB9XG4gICAgbGV0IHBhcmVudDogYW55ID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBsZXQgYmFzZTogdW5rbm93biA9IHRoaXMuYmFzZVNuYXBzaG90O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IHBhdGhbaV07XG4gICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChiYXNlLCBrKTtcbiAgICAgIGxldCB2YWx1ZSA9IGNoYWluW2ldO1xuICAgICAgaWYgKCF0aGlzLm93bmVkLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBhdEJhc2UgfHwgdGhpcy5zdGFnZWQuaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoaSA9PT0gcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcGFyZW50W2tdID0gdGhpcy5wcml2YXRlQ29weU9mKHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBzaGFsbG93Q29weSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub3duZWQuYWRkKHZhbHVlKTtcbiAgICAgICAgcGFyZW50W2tdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSB2YWx1ZTtcbiAgICAgIGJhc2UgPSBhdEJhc2U7XG4gICAgfVxuICAgIHRoaXMucHJpdmF0aXNlQmVsb3cocGFyZW50LCBiYXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBPV05FRCBjb250YWluZXIgaXMgYWJvdXQgdG8gYmUgcmVhZCB3aG9sZSAoYSBwYXRoIGNvcHkgYSBuZXN0ZWQgd3JpdGVcbiAgICogbWFkZSwgc2F5KTogaXRzIGRlc2NlbmRhbnRzIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhcmVcbiAgICogcmVwbGFjZWQgYnkgcHJpdmF0ZSBkZWVwIGNvcGllcywgc28gbm90aGluZyB0aGUgcmVhZCBoYW5kcyBvdXQgaXNcbiAgICogY29tbWl0dGVkIHN0YXRlLiBXYWxrcyBvd25lZCBjb250YWluZXJzIG9ubHk7IG1hcmtzIGVhY2ggb25lIGZpbmlzaGVkXG4gICAqICh7QGxpbmsgcHJpdmF0ZVRyZWVzfSksIHNvIGEgY29udGFpbmVyIGlzIHNjYW5uZWQgb25jZSBwZXIgc3RhZ2UuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZUJlbG93KGNvbnRhaW5lcjogb2JqZWN0LCBiYXNlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgd29yazogQXJyYXk8W29iamVjdCwgdW5rbm93bl0+ID0gW1tjb250YWluZXIsIGJhc2VdXTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbbm9kZSwgbm9kZUJhc2VdID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAodGhpcy5wcml2YXRlVHJlZXMuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gb3duQ2hpbGQobm9kZSwga2V5KTtcbiAgICAgICAgaWYgKCFpc0NvbnRhaW5lcihjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChub2RlQmFzZSwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMub3duZWQuaGFzKGNoaWxkKSkgd29yay5wdXNoKFtjaGlsZCwgYXRCYXNlXSk7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkID09PSBhdEJhc2UgJiYgIXRoaXMuc3RhZ2VkLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHRoaXMucHJpdmF0ZUNvcHlPZihjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQSBwcml2YXRlIGRlZXAgY29weSBvZiBhIGNvbW1pdHRlZCBjb250YWluZXIg4oCUIG93bmVkIHRocm91Z2ggYW5kIHRocm91Z2guICovXG4gIHByaXZhdGUgcHJpdmF0ZUNvcHlPZih2YWx1ZTogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICBhZG9wdChjb3B5LCB0aGlzLm93bmVkKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQoY29weSk7XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIGFueSBzdGFnZWQgb3AgdG91Y2ggYHBhdGhgLCBvciBhIHBhdGggYWJvdmUgb3IgYmVsb3cgaXQ/XG4gICAqXG4gICAqIFRoZSBkZXYtbW9kZSBib3Jyb3dlZC1yZWFkIGNoZWNrIChgU3RhZ2VDb250ZXh0LmNvbW1pdGApIGFza3MgdGhpcyBiZWZvcmVcbiAgICogYWNjdXNpbmcgYSBzdGFnZSBvZiBtdXRhdGluZyBhIHZhbHVlIGluIHBsYWNlOiBhIGtleSB0aGUgc3RhZ2UgbGVnaXRpbWF0ZWx5XG4gICAqIFdST1RFIGlzIGV4cGVjdGVkIHRvIGRpZmZlciBmcm9tIHdoYXQgaXQgcmVhZCwgYW5kIHdyaXRlcyByZWFjaCB0aGUgYnVmZmVyXG4gICAqIGZyb20gcGF0aHMgdGhhdCBieXBhc3MgdXNlci1sZXZlbCB3cml0ZSB0cmFja2luZyB0b28gKHRoZSBzdWJmbG93IHNlZWQsXG4gICAqIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIHRoZSByZXN1bWUgcmUtc2VlZCkuIERldi1tb2RlIG9ubHkg4oCUIG5vdGhpbmcgb25cbiAgICogdGhlIGhvdCBwYXRoIGNhbGxzIGl0LlxuICAgKi9cbiAgd2FzU3RhZ2VkKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgICBjb25zdCB0YXJnZXQgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICAvLyBPbiB0aGUgcGF0aCwgYmVsb3cgaXQgb3IgYWJvdmUgaXQg4oCUIHRoZSBvbmUgcGF0aCByZWxhdGlvbiBldmVyeSBrZXkgcXVlcnkgYXNrcy5cbiAgICAgIGlmIChyZWxhdGlvbihvcC5wYXRoLCB0YXJnZXQpICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggYWxsIHN0YWdlZCBtdXRhdGlvbnMgYW5kIHJldHVybiB0aGUgY29tbWl0IGJ1bmRsZSDigJQgcmVjb3JkaW5nIHRoZVxuICAgKiBzdGFnZSdzIE5FVCBDSEFOR0UsIG5vdCBpdHMgcmF3IHdyaXRlIGxvZy5cbiAgICpcbiAgICog4pSA4pSAIFdIWSAodGhlIGRlZmVjdCB0aGlzIGZpeGVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogUHJldmlvdXNseSBldmVyeSBgc2V0YC9gbWVyZ2VgIHdhcyByZWNvcmRlZCB2ZXJiYXRpbSwgc28gdGhlIGNvbW1pdCBidW5kbGVcbiAgICogd2FzIGEgbG9nIG9mICpvcGVyYXRpb25zKiByYXRoZXIgdGhhbiAqY2hhbmdlcyouIFR3byBvcGVyYXRpb25zIHByb2R1Y2Ugbm9cbiAgICogbmV0IGNoYW5nZSB5ZXQgd2VyZSBzdGlsbCBjb21taXR0ZWQgYXMgXCJtdXRhdGlvbnNcIjpcbiAgICpcbiAgICogICAxLiBOby1vcCB3cml0ZSAgIOKAlCB3cml0aW5nIGEga2V5IHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhvbGRzIChlLmcuIGFuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFnZW50IGNvbnRleHQgc2xvdCByZS1lbWl0dGluZyBpZGVudGljYWwgY29udGVudCBldmVyeVxuICAgKiAgICAgICAgICAgICAgICAgICAgICB0dXJuKS4gYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTEuXG4gICAqICAgMi4gV3JpdGUtcmV2ZXJ0ICDigJQgY2hhbmdpbmcgdGhlbiByZXN0b3JpbmcgYSBrZXkgd2l0aGluIG9uZSBzdGFnZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTIgdGhlbiBLPTEuXG4gICAqXG4gICAqIFJlY29yZGluZyB0aGVzZSBhcyBtdXRhdGlvbnMgKGEpIGJsb2F0ZWQgY2F1c2FsIHNsaWNpbmcgLyBiYWNrdHJhY2tpbmcgd2l0aFxuICAgKiBzcHVyaW91cyBkZXBlbmRlbmNpZXMgb24gaW50ZXJtZWRpYXRlIHZhbHVlcyB0aGF0IG5ldmVyIHJlYWNoIGZpbmFsIHN0YXRlLFxuICAgKiBhbmQgKGIpIG1hZGUgZG93bnN0cmVhbSBcIndoYXQgY2hhbmdlZCBoZXJlP1wiIGNvbnN1bWVycyBsaWdodCB1cCBzdGFnZXMgdGhhdFxuICAgKiBjaGFuZ2VkIG5vdGhpbmcg4oCUIG1vc3QgdmlzaWJseSB0aGUgbGVucyBoaWdobGlnaHQgZmxhZ2dpbmcgZXZlcnkgc2xvdC5cbiAgICpcbiAgICog4pSA4pSAIEhPVyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogQXQgY29tbWl0IHdlIGhvbGQgQk9USCBgYmFzZVNuYXBzaG90YCAoc3RhdGUgd2hlbiB0aGUgc3RhZ2UgYmVnYW4pIGFuZFxuICAgKiBgd29ya2luZ0NvcHlgIChzdGF0ZSBhZnRlciBhbGwgaXRzIHdyaXRlcykuIEZvciBlYWNoIHBhdGggdGhlIHN0YWdlIHRvdWNoZWRcbiAgICogd2Uga2VlcCBpdCBpbiB0aGUgYnVuZGxlIE9OTFkgaWYgaXRzIGZpbmFsIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZVxuICAgKiB2YWx1ZSAoe0BsaW5rIGRlZXBFcXVhbH0pLiBOby1vcCBBTkQgd3JpdGUtcmV2ZXJ0IHBhdGhzIGRyb3Agb3V0LCBiZWNhdXNlXG4gICAqIGJvdGggY29tcGFyZSBlcXVhbCB0byBiYXNlLiBUaGlzIGlzIGEgc2luZ2xlIG5ldC1kZWx0YSBkaWZmIGF0IGNvbW1pdCB0aW1lXG4gICAqIOKAlCBvbmUgZGVlcCBjb21wYXJlIHBlciB0b3VjaGVkIHBhdGgsIE8oY2hhbmdlZCBzdGF0ZSksIHBhaWQgb25jZSBwZXIgc3RhZ2VcbiAgICogKE5PVCBwZXIgd3JpdGUpLiBBIG5haXZlIHBlci13cml0ZSBkZWVwLWVxdWFsIHNraXAgd291bGQgYmUgbW9yZSBleHBlbnNpdmVcbiAgICogYW5kIHdvdWxkIHN0aWxsIG1pc3Mgd3JpdGUtcmV2ZXJ0ICh0aGUgaW50ZXJtZWRpYXRlIHdyaXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICogdmFsdWUgcHJlc2VudCBhdCB0aGUgbW9tZW50IG9mIHdyaXRpbmcpLlxuICAgKlxuICAgKiDilIDilIAgVFdPIEhPTkVTVCBUSUVSUyAoYnkgZGVzaWduIOKAlCBkbyBub3QgXCJ1bmlmeVwiIHRoZW0pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiAgIOKAoiBjb21taXQgKGhlcmUpICAgPSBDSEFOR0UtbGV2ZWwg4oCUIHRydXRoZnVsIG5ldCBkZWx0YS4gRmVlZHMgdGhlIGNvbW1pdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbG9nLCBjYXVzYWwgY2hhaW4sIG5hcnJhdGl2ZSwgYW5kIHRoZSBsZW5zIGhpZ2hsaWdodC5cbiAgICogICDigKIgYG9uV3JpdGVgIGV2ZW50ID0gT1AtbGV2ZWwg4oCUIGZpcmVzIG9uIEVWRVJZIHdyaXRlIGF0dGVtcHQgcmVnYXJkbGVzcyBvZlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbmV0IGNoYW5nZS4gRmVlZHMgbWV0cmljcyAvIGJlaGF2aW91cmFsIG9ic2VydmFiaWxpdHlcbiAgICogICAgICAgICAgICAgICAgICAgICAgIChhIGRlYnVnZ2VyIHdhbnRzIHRvIHNlZSBcIndyb3RlIDIsIHRoZW4gcmV2ZXJ0ZWRcIikuXG4gICAqIGBvbldyaXRlYCBpcyB1bmNoYW5nZWQgYnkgdGhpcyBtZXRob2Q7IG9ubHkgdGhlIENPTU1JVCBiZWNvbWVzIGNoYW5nZS1vbmx5LlxuICAgKlxuICAgKiDilIDilIAgRU1QVFkgQ09NTUlUUyBBUkUgSU5URU5USU9OQUwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEEgc3RhZ2UgdGhhdCBuZXRzIG5vIGNoYW5nZSBjb21taXRzIGFuIEVNUFRZIHBhdGNoIOKAlCBOT1Qgbm90aGluZy5cbiAgICoge0BsaW5rIFN0YWdlQ29udGV4dC5jb21taXR9IHN0aWxsIHJlY29yZHMgdGhlIGJ1bmRsZSB1bmNvbmRpdGlvbmFsbHksIHNvXG4gICAqIGV2ZXJ5IGV4ZWN1dGVkIHN0YWdlIHJlbWFpbnMgYSB0aW1lLXRyYXZlbCBjdXJzb3Igc3RvcCAoaXRzIGBydW50aW1lU3RhZ2VJZGBcbiAgICogbWFya2VyIGlzIHByZXNlcnZlZCk7IG9ubHkgaXRzIFBBVENIIGlzIGVtcHR5LiBUaGlzIGlzIHdoYXQga2VlcHMgdGhlXG4gICAqIGNvbW1pdC1pbmRleGVkIHNsaWRlciBzdGFibGUgd2hpbGUgbWFraW5nIHRoZSBoaWdobGlnaHQgdHJ1dGhmdWwuXG4gICAqXG4gICAqIOKUgOKUgCBLTk9XTiBMSU1JVEFUSU9OUyAvIEZVVFVSRSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgRXhwbGljaXQga2V5IERFTEVUSU9OIHVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIGlzIHN0aWxsXG4gICAqICAgICBmbGF0dGVuZWQgdG8gc2V0LW9mLWB1bmRlZmluZWRgIChhIHJlbW92ZWQga2V5IGNhbm5vdCBiZSBleHByZXNzZWRcbiAgICogICAgIGluIE1lbW9yeVBhdGNoIGFsb25lKS4gQ0xPU0VEIHVuZGVyIGBjb21taXRWYWx1ZXM6ICdkZWx0YSdgICgjMTNjLUIpOlxuICAgKiAgICAge0BsaW5rIGRlbGV0ZX0gc3RhZ2VzIGEgZGlzdGluY3Qgb3AgYW5kIHRoZSBidW5kbGUgY2FycmllcyBhIHJlYWxcbiAgICogICAgIGBkZWxldGVgIHRyYWNlIHZlcmIgd2hvc2UgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIH0ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmNvbW1pdFZhbHVlcyA9PT0gJ2RlbHRhJyA/IHRoaXMudG9EZWx0YVBheWxvYWQoKSA6IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuICAgIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSB0aGlzLnN1cnZpdmluZ1JlZGFjdGVkUGF0aHMobmV3IFNldChyb3dzLnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSkpO1xuICAgIC8vIFRoZSBidW5kbGUncyBrZXkgb3JkZXIgaXMgYHJlY29yZENvbW1pdGAnczsgYSBkaXJlY3QgY2FsbGVyIGtlZXBzIHRoaXMgc2FtZSBvcmRlci5cbiAgICBjb25zdCBwYXlsb2FkID0geyBvdmVyd3JpdGU6IHJvd3Mub3ZlcndyaXRlLCB1cGRhdGVzOiByb3dzLnVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlOiByb3dzLnRyYWNlIH07XG5cbiAgICB0aGlzLm92ZXJ3cml0ZVBhdGNoID0ge307XG4gICAgdGhpcy51cGRhdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMub3BUcmFjZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkYWN0ZWRQYXRocy5jbGVhcigpO1xuICAgIHRoaXMuaGVsZFJlZnMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG4gICAgdGhpcy5vd25lZCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5vd25lZC5hZGQodGhpcy53b3JraW5nQ29weSk7XG4gICAgdGhpcy5zdGFnZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMucHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnN0YWdlZE1lcmdlcyA9IDA7XG4gICAgdGhpcy5uZXN0ZWRPcHMgPSAwO1xuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBvdmVyd3JpdGUgLyB1cGRhdGVzIC8gdHJhY2Uga2VlcGluZyBPTkxZIHBhdGhzIHdob3NlIGZpbmFsIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSB2YWx1ZSDigJQgaS5lLiB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlLiBTZWVcbiAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdH0gZm9yIHRoZSByYXRpb25hbGUuXG4gICAqXG4gICAqIFBhdGhzIGFyZSBjb21wYXJlZCBhdCB0aGUgZXhhY3QgZ3JhbnVsYXJpdHkgdGhleSB3ZXJlIHdyaXR0ZW4gKGVhY2ggdHJhY2VcbiAgICogZW50cnkncyBwYXRoKSwgYWdhaW5zdCBgd29ya2luZ0NvcHlgIChmaW5hbCkgdnMgYGJhc2VTbmFwc2hvdGAgKHN0YXJ0KS5cbiAgICogU3Vydml2aW5nIGBzZXRgIHBhdGhzIGNvcHkgdGhlaXIgZmluYWwgdmFsdWUgZnJvbSBgb3ZlcndyaXRlUGF0Y2hgO1xuICAgKiBzdXJ2aXZpbmcgYG1lcmdlYCBwYXRocyBjb3B5IHRoZWlyIGFjY3VtdWxhdGVkIGRlbHRhIGZyb20gYHVwZGF0ZVBhdGNoYCxcbiAgICoga2VlcGluZyB0aGUgc2V0LXZzLW1lcmdlIHZlcmIg4oCUIGFuZCB0aGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KTpcbiAgICogYSBmYW1pbHkgb2Ygcm93cyB3aG9zZSByZXBsYXkgZG9lcyBub3QgZ2l2ZSBiYWNrIHdoYXQgdGhlIHN0YWdlIHJlYWQgaXNcbiAgICogcmVjb3JkZWQgYXMgYHNldGAgcm93cyBvZiB0aGUgcmVhZC1iYWNrIGluc3RlYWQgKDkuMzAuMCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIERFRkFVTFQgKGBjb21taXRWYWx1ZXM6ICdmdWxsJ2ApIHBheWxvYWQsIGluY2x1ZGluZyB0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nIG9mIHN0YWdlZCBgZGVsZXRlYCBvcHMgaW50byBgc2V0YC1vZi1gdW5kZWZpbmVkYFxuICAgKiB0cmFjZSBlbnRyaWVzLiBUaGUgZGVsdGEgZW5jb2RpbmcgbGl2ZXMgaW4ge0BsaW5rIHRvRGVsdGFQYXlsb2FkfS5cbiAgICpcbiAgICogV29yaywgbm90IGJ5dGVzICg5LjIyLjEpOiB0aGUgbmV0LWNoYW5nZSB2ZXJkaWN0IGlzIHBhaWQgb25jZSBwZXIgUEFUSFxuICAgKiBhbmQgdGhlIGNsb25lIG9uY2UgcGVyIENPTlNFQ1VUSVZFIHJ1biBvZiBvcHMgb24gYSBwYXRoLCBub3Qgb25jZSBwZXIgb3BcbiAgICog4oCUIHNlZSB0aGUgdHdvIG1lbW9zIGluc2lkZS4gUGlubmVkIGJ5XG4gICAqIHRlc3QvbGliL21lbW9yeS9zY2VuYXJpby9yZXBlYXRlZC1wYXRoLWJ5dGUtaWRlbnRpdHkudGVzdC50cyBhZ2FpbnN0IHRoZVxuICAgKiA5LjIyLjAgYnl0ZXMuIFNpbmNlIDkuMjMuMCB0aGF0IGNsb25lIGlzIFRIRSBjbG9uZTogdGhlIHBhdGNoIHRyZWVzIGhvbGRcbiAgICogdGhlIGNhbGxlcidzIHJlZmVyZW5jZXMgKHNlZSB0aGUgY2xhc3MgaGVhZGVyKSwgc28gdGhpcyBsb29wIGlzIHRoZSBvbmVcbiAgICogcGxhY2UgdGhlIHJlY29yZCBpcyBkZXRhY2hlZCBmcm9tIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIHRvQ2hhbmdlT25seVBheWxvYWQoKTogUm93cyB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaXQoKGxvc3N5KSA9PiB0aGlzLmNoYW5nZU9ubHlSb3dzKGxvc3N5KSk7XG4gIH1cblxuICAvKiogVGhlICdmdWxsJyByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VPbmx5Um93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpOiBSb3dzIHtcbiAgICBjb25zdCByb3dzOiBSb3dzID0geyBvdmVyd3JpdGU6IHt9LCB1cGRhdGVzOiB7fSwgdHJhY2U6IFtdIH07XG4gICAgY29uc3QgeyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHRyYWNlIH0gPSByb3dzO1xuICAgIC8vIFBlciBQQVRILCBkZWNpZGVkIG9uY2UgKDkuMjIuMSk6IGJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZSBmaXhlZCBhdFxuICAgIC8vIGNvbW1pdCwgc28gZXZlcnkgbGF0ZXIgb3Agb24gYSBwYXRoIGdldHMgdGhlIHZlcmRpY3QgaXRzIGZpcnN0IG9wIGdvdC5cbiAgICAvLyBgdW5kZWZpbmVkYCA9IG5vdCB5ZXQgZGVjaWRlZDsgdGhlIHN1cnZpdmluZyBwYXRocyBhcmUgdGhlIGB0cnVlYCBrZXlzLlxuICAgIGNvbnN0IHN1cnZpdmVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgLy8gVGhlIHBhdGggdGhlIExBU1Qgc3Vydml2aW5nIG9wIGNvcGllZCBpbnRvIGVhY2ggcGF0Y2ggdHJlZSAoOS4yMi4xKS5cbiAgICAvLyBUaGUgdmFsdWUgYXQgYSBwYXRoIGlzIGZpeGVkIGF0IGNvbW1pdCwgc28gYW4gb3Agd2hvc2UgcHJlZGVjZXNzb3Igb25cbiAgICAvLyB0aGUgU0FNRSB0cmVlIGFscmVhZHkgY29waWVkIHRoYXQgcGF0aCB3b3VsZCB3cml0ZSB0aGUgc2FtZSBieXRlcyBvdmVyXG4gICAgLy8gdGhlIHNhbWUga2V5IOKAlCBpdCBrZWVwcyBpdHMgdHJhY2Ugcm93ICh0aGUgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsKSBhbmRcbiAgICAvLyBwYXlzIG5vIHNlY29uZCBjbG9uZS4gVGhlIDkuMjIuMCBlbGVtZW50LXdyaXRlIGZ1bm5lbCBzdGFnZXMgTlxuICAgIC8vIHdob2xlLWFycmF5IHNldHMgb24gT05FIHBhdGg7IHRoaXMgaXMgd2hhdCBtYWtlcyB0aGF0IGNvbW1pdCBPKE4pXG4gICAgLy8gaW5zdGVhZCBvZiBPKE4gw5cgb3BzKS4gQ09OU0VDVVRJVkUgb25seSDigJQgYW4gb3Agb24gYW5vdGhlciBwYXRoIGluXG4gICAgLy8gYmV0d2VlbiBtYXkgaGF2ZSBjb2VyY2VkIG9yIGdyb3duIHRoaXMgb25lJ3MgY29udGFpbmVyIChhIGRlc2NlbmRhbnRcbiAgICAvLyBgbmF0aXZlU2V0YCB0aHJvdWdoIGEgcHJpbWl0aXZlLCBhIGBrZXk6IHVuZGVmaW5lZGAgc2hlbGwpIGFuZCB0aGVcbiAgICAvLyByZS1jb3B5IGlzIHdoYXQgcmVwYWlycyBpdDsgYSBgbWVyZ2VgIGJldHdlZW4gdHdvIHNldHMgdG91Y2hlcyB0aGVcbiAgICAvLyBvdGhlciB0cmVlIGFuZCBkb2VzIG5vdCBjb3VudC4gU2FtZSBsYXcgYXMgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICAgIGxldCBsYXN0U2V0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0TWVyZ2VQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBmYW1pbHkgPSBsb3NzeT8uZmFtaWxpZXMuZ2V0KGxvc3N5LnJvb3RPZi5nZXQob3AucGF0aCkgYXMgc3RyaW5nKTtcbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaSA9PT0gZmFtaWx5LnNsb3QpIHtcbiAgICAgICAgICB0aGlzLmVtaXRSZWFkQmFjayhmYW1pbHksIHJvd3MsICdmdWxsJyk7XG4gICAgICAgICAgbGFzdFNldFBhdGggPSBsYXN0TWVyZ2VQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGtlZXAgPSBzdXJ2aXZlcy5nZXQob3AucGF0aCk7XG4gICAgICBpZiAoa2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtlZXAgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpO1xuICAgICAgICBzdXJ2aXZlcy5zZXQob3AucGF0aCwga2VlcCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtlZXApIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKGZsYXR0ZW5lZFRyYWNlUm93KG9wKSk7XG4gICAgICBpZiAob3AudmVyYiA9PT0gJ21lcmdlJykge1xuICAgICAgICBpZiAobGFzdE1lcmdlUGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RNZXJnZVBhdGggPSBvcC5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsYXN0U2V0UGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RTZXRQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGVsdGEtZW5jb2RlZCBwYXlsb2FkIChgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCwgIzEzYy1CKSDigJQgc2FtZSBuZXQtY2hhbmdlXG4gICAqIGZpbHRlciBhcyB7QGxpbmsgdG9DaGFuZ2VPbmx5UGF5bG9hZH0sIHRocmVlIGVuY29kaW5nIGRpZmZlcmVuY2VzOlxuICAgKlxuICAgKiAxLiAqKk9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgqKiAodGhlIMKnMi41IGRlZHVwIHJ1bGUg4oCUIGBhcHBlbmRgXG4gICAqICAgIGlzIE5PVCBpZGVtcG90ZW50IG9uIHJlcGxheSwgc28gZHVwbGljYXRlIGVudHJpZXMgd291bGQgbXVsdGlwbHlcbiAgICogICAgdGFpbHMpLiBUaGUgdmVyYiBpcyByZXNvbHZlZCBmcm9tIHRoZSBwYXRoJ3Mgb3AgbWl4ICsgYmFzZeKGkmZpbmFsXG4gICAqICAgIHJlbGF0aW9uc2hpcDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLFxuICAgKiAgICBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocy5cbiAgICogMi4gKipWZXJiIHJlc29sdXRpb24gcGVyIHBhdGgqKiDigJQgZm9yIGEgcGF0aCB3aXRoIE5PIHN1cnZpdmluZyByZWxhdGl2ZVxuICAgKiAgICAoc2VlIDMpOlxuICAgKiAgICAtIGxhc3Qgb3AgYCdkZWxldGUnYCBBTkQgZmluYWwgdmFsdWUgZ29uZSDihpIgYGRlbGV0ZWAgKHRoZSBwYXRoIHN0YXlzXG4gICAqICAgICAgZW51bWVyYXRlZCBpbiBgb3ZlcndyaXRlYCB3aXRoIGB1bmRlZmluZWRgIGZvciBrZXktc2V0IGNvbnN1bWVycykuXG4gICAqICAgICAgUmVxdWlyZXMgdGhlIHBhcmVudCB0byBiZSBhIHJlYWwgY29udGFpbmVyIGluIHRoZSBiYXNlIOKAlCByZXBsYXkgdXNlc1xuICAgKiAgICAgIGBuYXRpdmVEZWxldGVgLCB3aGljaCBpcyBpbmVydCBvbiBhIHByaW1pdGl2ZS9hYnNlbnQgcGFyZW50LCB3aGVyZWFzXG4gICAqICAgICAgdGhlIGAnZnVsbCdgIGZsYXR0ZW5pbmcgKGBfc2V0YCBvZiBgdW5kZWZpbmVkYCkgQ09FUkNFUyB0aGF0IHBhcmVudFxuICAgKiAgICAgIGludG8gYW4gb2JqZWN0OyB3aGVuIHRoZXkgd291bGQgZGlzYWdyZWUgd2Uga2VlcCB0aGUgZmxhdHRlbmluZztcbiAgICogICAgLSBPTkxZIGAnbWVyZ2UnYCBvcHMg4oaSIGBtZXJnZWAgd2l0aCB0aGUgYWNjdW11bGF0ZWQgYHVwZGF0ZVBhdGNoYFxuICAgKiAgICAgIGRlbHRhO1xuICAgKiAgICAtIG90aGVyd2lzZSAoYHNldGAvbWl4ZWQpOiB0aGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSB0aGVcbiAgICogICAgICBwYXRoICh7QGxpbmsgZnVsbFJvd3NWYWx1ZX0pLiBJZiBiYXNlIGFuZCB0aGF0IHZhbHVlIGFyZSBhcnJheXMgYW5kXG4gICAqICAgICAgYmFzZSBpcyBhIFNUUklDVCBQUkVGSVgg4oaSIGBhcHBlbmRgIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgZWxzZSBgc2V0YFxuICAgKiAgICAgIHN0b3JpbmcgdGhlIGZ1bGwgdmFsdWUuXG4gICAqIDMuICoqT1ZFUkxBUCBGQU1JTElFUyB0YWtlIHRoZSBmdWxsLXZhbHVlIGZhbGxiYWNrLioqIGBvdmVyd3JpdGVgIC9cbiAgICogICAgYHVwZGF0ZXNgIGFyZSBuZXN0ZWQgcGF0aCBUUkVFUywgc28gdHdvIHN1cnZpdmluZyBwYXRocyB3aGVyZSBvbmUgaXNcbiAgICogICAgYW4gYW5jZXN0b3Igb2YgdGhlIG90aGVyIChgYWAgYW5kIGBhLnBgKSBzaGFyZSBzdG9yYWdlLiBEZWx0YSdzXG4gICAqICAgIHBlci1wYXRoIGVuY29kaW5ncyB3b3VsZCBjbG9iYmVyIGVhY2ggb3RoZXIgdGhlcmUgKGFuIGBhcHBlbmRgXG4gICAqICAgIGFuY2VzdG9yIHN0b3JlcyBvbmx5IGEgVEFJTCwgYSBgZGVsZXRlYCBhbmNlc3RvciBgdW5kZWZpbmVkYCksIHNvIGV2ZXJ5XG4gICAqICAgIHBhdGggdGhhdCBoYXMgYSBzdXJ2aXZpbmcgYW5jZXN0b3IvZGVzY2VuZGFudCBpcyBjb21taXR0ZWQgYXMgYSBwbGFpblxuICAgKiAgICBgc2V0YCBvZiB0aGUgdmFsdWUgdGhlICdmdWxsJyByb3dzIGdpdmUgaXQsIGFuZCB0aGUgZmFtaWx5J3NcbiAgICogICAgc2hhbGxvd2VzdCBwYXRoICh3aG9zZSBzZXQgY292ZXJzIHRoZSB3aG9sZSBzdWJ0cmVlKSBpcyBlbWl0dGVkIExBU1QuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgaXMgQURNSVRURUQgKHtAbGluayBhZG1pdH0pIGxpa2UgdGhlICdmdWxsJyBwYXlsb2FkOiBhIGNvbXBhY3RcbiAgICogcm93IGlzIGtlcHQgb25seSB3aGVyZSB0aGUgYnVuZGxlIHByb3ZhYmx5IGZvbGRzIGJhY2ssIGFuZCBhIGZhbWlseSB0aGF0XG4gICAqIGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQuIFNvIGJvdGggZW5jb2RpbmdzIGNvbW1pdCB0aGVcbiAgICogdmFsdWUgdGhlIHN0YWdlIHJlYWQ7IGJlZm9yZSA5LjMwLjAgdGhleSBzaGFyZWQgYSByZXBsYXkgdGhhdCBkaWQgbm90XG4gICAqIChgcmVwbGF5UGF0aFZlcmJzYCAvIGByZXBsYXlGYW1pbHlWZXJic2AsIGRlbGV0ZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0RlbHRhUGF5bG9hZCgpOiBSb3dzIHtcbiAgICBjb25zdCBmdWxsVmFsdWVBdCA9IHRoaXMuZnVsbFJvd3NWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5kZWx0YVJvd3MobG9zc3ksIGZ1bGxWYWx1ZUF0KSk7XG4gIH1cblxuICAvKiogVGhlIGRlbHRhIHJvd3M7IGEgZmFtaWx5IGluIGBsb3NzeWAgaXMgd3JpdHRlbiBhcyBpdHMgcmVhZC1iYWNrLCBhdCBpdHMgbGFzdCB0b3VjaCAoe0BsaW5rIGVtaXRSZWFkQmFja30pLiAqL1xuICBwcml2YXRlIGRlbHRhUm93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQsIGZ1bGxWYWx1ZUF0OiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICBjb25zdCBpbkxvc3N5ID0gKHBhdGg6IHN0cmluZykgPT4gbG9zc3k/LmZhbWlsaWVzLmhhcyhsb3NzeS5yb290T2YuZ2V0KHBhdGgpIGFzIHN0cmluZykgPT09IHRydWU7XG4gICAgY29uc3Qgc3Vydml2b3JzID0gdGhpcy5uZXRDaGFuZ2VTdXJ2aXZvcnModGhpcy5vcHNCeVBhdGgoKSkuZmlsdGVyKChzKSA9PiAhaW5Mb3NzeShzLnBhdGgpKTtcbiAgICBjb25zdCB7IHJvb3RPZiwgYnlSb290IH0gPSBncm91cEludG9GYW1pbGllcyhzdXJ2aXZvcnMsIG5ldyBTZXQoc3Vydml2b3JzLm1hcCgocykgPT4gcy5wYXRoKSkpO1xuXG4gICAgLy8gVEhFIFZFUkIgQ0hPSUNFIOKAlCB0aGUgZGVsdGEgZW5jb2RlciBwaWNrcyBhIHZlcmIgcGVyIHBhdGg7IHRoZSBWQUxVRVNcbiAgICAvLyBpdCBlbmNvZGVzIGNvbWUgZnJvbSB0aGUgb25lIHJlcGxheSAoYGZ1bGxWYWx1ZUF0YCksIG5ldmVyIGEgcmVwbGljYSBvZlxuICAgIC8vIHRoZSB2ZXJiIGxhdyAoOS4zMC4wOiBDTEFVREUubWQncyB2ZXJiLXN3aXRjaCByZXBsaWNhcyBsb3N0IHR3byBoZXJlKS5cbiAgICBjb25zdCBlbWl0ID0gKHM6IFN1cnZpdm9yKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgYmVmb3JlIH0gPSBzO1xuICAgICAgY29uc3QgcHJvdiA9IHByb3ZlbmFuY2Uocy5yZWFkS2V5cyk7XG4gICAgICBpZiAoKGJ5Um9vdC5nZXQocm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpIGFzIFN1cnZpdm9yW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gUnVsZSAzIOKAlCBvbmUgY29oZXJlbnQgdHJlZTogZXZlcnkgbWVtYmVyIGEgc2V0IG9mIGl0cyB2YWx1ZS5cbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShmdWxsVmFsdWVBdChzZWdtZW50cykpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdFZlcmIgPSB2ZXJic1t2ZXJicy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChsYXN0VmVyYiA9PT0gJ2RlbGV0ZScgJiYgcy5hZnRlciA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50cykpIHtcbiAgICAgICAgLy8gUmVhbCBkZWxldGlvbiDigJQgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS4gS2VlcCB0aGUgcGF0aCBlbnVtZXJhdGVkXG4gICAgICAgIC8vIGluIGBvdmVyd3JpdGVgICh1bmRlZmluZWQpIHNvIE9iamVjdC5rZXlzIGNvbnN1bWVycyBzZWUgaXQuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnZGVsZXRlJywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCB1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmICh2ZXJicy5ldmVyeSgodikgPT4gdiA9PT0gJ21lcmdlJykpIHtcbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdtZXJnZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQodXBkYXRlcywgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFZhbHVlUm93KHJvd3MsIHBhdGgsIHNlZ21lbnRzLCBiZWZvcmUsIGZ1bGxWYWx1ZUF0KHNlZ21lbnRzKSwgcHJvdiwgdGhpcy5tYXJrZWRCZWxvdyhwYXRoKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEEgZmFtaWx5IHRoYXQgZGlkIG5vdCBmb2xkIGJhY2sgdGFrZXMgaXRzIHBsYWNlIGJ5IGl0cyBsYXN0IHRvdWNoLlxuICAgIGNvbnN0IHBlbmRpbmcgPSBsb3NzeSA9PT0gdW5kZWZpbmVkID8gW10gOiBbLi4ubG9zc3kuZmFtaWxpZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IGEuc2xvdCAtIGIuc2xvdCk7XG4gICAgbGV0IG5leHQgPSAwO1xuICAgIGNvbnN0IGZsdXNoQmVmb3JlID0gKHRvdWNoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHdoaWxlIChuZXh0IDwgcGVuZGluZy5sZW5ndGggJiYgcGVuZGluZ1tuZXh0XS5zbG90IDwgdG91Y2gpIHRoaXMuZW1pdFJlYWRCYWNrKHBlbmRpbmdbbmV4dCsrXSwgcm93cywgJ2RlbHRhJyk7XG4gICAgfTtcbiAgICBlbWl0SW5GYW1pbHlPcmRlcihzdXJ2aXZvcnMsIHJvb3RPZiwgYnlSb290LCBlbWl0LCBmbHVzaEJlZm9yZSk7XG4gICAgZmx1c2hCZWZvcmUoSW5maW5pdHkpO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBhZG1pdHRlZCByZWNvcmQgKDkuMzAuMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRIRSBBRE1JU1NJT04g4oCUIGEgY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFnZSdzIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkLiBgYnVpbGRgXG4gICAqIGxheXMgdGhlIHJvd3Mgb3V0IChvbmUgZW5jb2RlcjogYCdmdWxsJ2Agb3IgYCdkZWx0YSdgKTsgdGhlIGNhbmRpZGF0ZSBpc1xuICAgKiBjaGVja2VkICh7QGxpbmsgbG9zc3lGYW1pbGllc30pLCBhbmQgd2hlbiBzb21lIGZhbWlseSdzIHJvd3MgZG8gbm90IGZvbGRcbiAgICogYmFjayB0aGUgcm93cyBhcmUgbGFpZCBvdXQgYWdhaW4gd2l0aCB0aG9zZSBmYW1pbGllcyB3cml0dGVuIGFzIHdoYXQgdGhlXG4gICAqIHN0YWdlIHJlYWQgKHtAbGluayBlbWl0UmVhZEJhY2t9KSDigJQgZXZlcnkgb3RoZXIgZmFtaWx5J3MgYnl0ZXMgZXhhY3RseSBhc1xuICAgKiB0aGUgZmlyc3QgbGF5b3V0IG1hZGUgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgYWRtaXQoYnVpbGQ6IChsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpID0+IFJvd3MpOiBSb3dzIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBidWlsZCh1bmRlZmluZWQpO1xuICAgIGNvbnN0IGxvc3N5ID0gdGhpcy5sb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSk7XG4gICAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyBjYW5kaWRhdGUgOiBidWlsZChsb3NzeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZG8gbm90IGZvbGQgYmFjayB0byB3aGF0IHRoZSBzdGFnZSByZWFkIOKAlFxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChgYWRtaXNzaW9uLnRzIMK3IGxvc3N5RmFtaWxpZXNgOiB0aGVcbiAgICogY2FuZGlkYXRlIHJlcGxheWVkIG9udG8gdGhlIGRpZmYgYmFzZSBieSBgZHJ5Rm9sZGAsIGV2ZXJ5IGZhbWlseSBvZlxuICAgKiB0b3VjaGVkIHBhdGhzIGNvbXBhcmVkIHdpdGggdGhlIHdvcmtpbmcgY29weSBhdCBpdHMgcm9vdCBhbmQgb24gdGhlIHdheVxuICAgKiBkb3duIHRvIGl0KS5cbiAgICpcbiAgICogV2l0aG91dCBhIGZvbGQsIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBubyBgbWVyZ2VgIGFuZCBubyBuZXN0ZWQgb3A6IGl0c1xuICAgKiByb3dzIGFyZSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXIgaXRzIGFkZHJlc3MsIGVhY2hcbiAgICogd3JpdGluZyB0aGUgU0FNRSB2YWx1ZSBpbnRvIGB3b3JraW5nQ29weWAgYW5kIGBvdmVyd3JpdGVQYXRjaGAg4oCUIHRoZVxuICAgKiByZWNvcmQgaXMgdGhlIHJlYWQtYmFjayBieSBjb25zdHJ1Y3Rpb24gKHRoZSBwcm9wZXJ0eSdzIFJPT1QtT05MWSBhcm1cbiAgICogcGlucyB0aGlzKS4gVGhhdCBrZWVwcyB0aGUgY29tbWl0IG9mIHRoZSB0eXBlZCBzY29wZSdzIHJvb3Qta2V5IHdyaXRlc1xuICAgKiBleGFjdGx5IGFzIGNoZWFwIGFzIGl0IHdhcy5cbiAgICovXG4gIHByaXZhdGUgbG9zc3lGYW1pbGllcyhjYW5kaWRhdGU6IFJvd3MpOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBsb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSwgdGhpcy5iYXNlU25hcHNob3QsIHRoaXMud29ya2luZ0NvcHksIHRoaXMub3BUcmFjZSwgdGhpcy5hZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhbWlseSB3aG9zZSByb3dzIGRpZCBub3QgZm9sZCBiYWNrLCB3cml0dGVuIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQ6XG4gICAqIG9uZSBgc2V0YCByb3cgcGVyIG1lbWJlciB0aGF0IGNoYW5nZWQgKGRlc2NlbmRhbnRzIGJ5IGxhc3QgdG91Y2gsIGVhY2hcbiAgICogd2l0aCBpdHMgb3duIHJlYWQgcHJlZml4KSwgdGhlIFJPT1QgbGFzdCwgYW5kIHRoZSByb290J3MgcmVhZC1iYWNrIHZhbHVlXG4gICAqIGluIGBvdmVyd3JpdGVgIOKAlCBvbmUgY29oZXJlbnQgdHJlZSwgc28gbm8gcm93IGNhbiBjbG9iYmVyIGFub3RoZXIuIFRoZVxuICAgKiByb290J3Mgcm93IGlzIHdyaXR0ZW4gZXZlbiB3aGVuIHRoZSByb290IGl0c2VsZiBkaWQgbm90IGNoYW5nZTogaXQgaXMgdGhlXG4gICAqIHJvdyB0aGF0IGNhcnJpZXMgdGhlIGZhbWlseSdzIHJlYWQtYmFjayAoYW5kIHRoZSBjb250YWluZXJzIEwtMSdzIGRyb3BwZWRcbiAgICogb3AgbGVmdCkuIEEgbG9uZSByb290IHVuZGVyIGAnZGVsdGEnYCBrZWVwcyB0aGUgY29tcGFjdCBgYXBwZW5kYCB3aGVuIHRoZVxuICAgKiB2YWx1ZSBpdCByZWFkIGlzIGl0cyBiYXNlIHBsdXMgYSB0YWlsLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UmVhZEJhY2soZmFtaWx5OiBGYW1pbHksIHJvd3M6IFJvd3MsIGVuY29kaW5nOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgbGV0IHJvb3Q6IE1lbWJlciA9IGZhbWlseS5tZW1iZXJzWzBdO1xuICAgIGxldCBjaGFuZ2VkID0gMDtcbiAgICBmb3IgKGNvbnN0IG0gb2YgZmFtaWx5Lm1lbWJlcnMpIHtcbiAgICAgIGlmIChtLnBhdGggPT09IGZhbWlseS5yb290KSB7XG4gICAgICAgIHJvb3QgPSBtO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG0ucGF0aC5zcGxpdChERUxJTSkpKSBjb250aW51ZTtcbiAgICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IG0ucGF0aCwgdmVyYjogJ3NldCcsIC4uLnByb3ZlbmFuY2UobS5yZWFkS2V5cykgfSk7XG4gICAgICBjaGFuZ2VkKys7XG4gICAgfVxuICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdkZWx0YScgJiYgY2hhbmdlZCA9PT0gMCAmJiBhZnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICAgIHB1c2hWYWx1ZVJvdyhcbiAgICAgICAgcm93cyxcbiAgICAgICAgZmFtaWx5LnJvb3QsXG4gICAgICAgIGZhbWlseS5yb290U2VnbWVudHMsXG4gICAgICAgIGJlZm9yZSxcbiAgICAgICAgYWZ0ZXIsXG4gICAgICAgIHByb3ZlbmFuY2Uocm9vdC5yZWFkS2V5cyksXG4gICAgICAgIHRoaXMubWFya2VkQmVsb3coZmFtaWx5LnJvb3QpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcm93cy50cmFjZS5wdXNoKHsgcGF0aDogZmFtaWx5LnJvb3QsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpIH0pO1xuICAgIC8vIFRoZSBjbG9uZSB0aGUgY2hlY2sgdG9vayAoYGFkbWlzc2lvbi50cyDCtyBmb2xkc0JhY2tgKSwgd2hlbiBpdCB0b29rIG9uZS5cbiAgICBfc2V0KHJvd3Mub3ZlcndyaXRlLCBmYW1pbHkucm9vdFNlZ21lbnRzLCBmYW1pbHkuaGVsZCAhPT0gdW5kZWZpbmVkID8gZmFtaWx5LmhlbGQudmFsdWUgOiBzdHJ1Y3R1cmVkQ2xvbmUoYWZ0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSBhIHBhdGgg4oCUIHdoYXQgdGhlIGRlbHRhIGVuY29kZXJcbiAgICogY29tbWl0cyBmb3IgYSBmYW1pbHkgbWVtYmVyIG9yIGEgcGF0aCB3aXRoIGEgYHNldGAg4oCUIHJlYWQgZnJvbSBPTkVcbiAgICoge0BsaW5rIGRyeUZvbGR9IG9mIHRob3NlIHJvd3Mgb3ZlciB0aGUgcGF0Y2ggdHJlZXMgdGhlbXNlbHZlcywgdGFrZW4gdGhlXG4gICAqIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQuIEJ5IHJlZmVyZW5jZSwgYXMgdGhlIHN0YWdlIGhlbGQgdGhlbTogYW4gZWxlbWVudFxuICAgKiBhIGBzZXRgIGFuZCBhIGBtZXJnZWAgb2Ygb25lIHBhdGggc2hhcmUgc3RheXMgb25lIGVsZW1lbnQuIEEgc3RhZ2UgdGhhdFxuICAgKiBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wIG5lZWRzIG5vIGZvbGQg4oCUIGEgcGF0aCdzIHZhbHVlIGlzIGl0c1xuICAgKiBsYXN0IHN0YWdlZCB2YWx1ZS4gKEJlZm9yZSA5LjMwLjA6IHR3byByZXBsaWNhcyBvZiB0aGUgdmVyYiBsYXcsXG4gICAqIGByZXBsYXlQYXRoVmVyYnNgIGFuZCBgcmVwbGF5RmFtaWx5VmVyYnNgLilcbiAgICovXG4gIHByaXZhdGUgZnVsbFJvd3NWYWx1ZSgpOiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duIHtcbiAgICBpZiAodGhpcy5zdGFnZWRNZXJnZXMgPT09IDAgJiYgdGhpcy5uZXN0ZWRPcHMgPT09IDApIHJldHVybiAoc2VnbWVudHMpID0+IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpO1xuICAgIGxldCBmb2xkOiB1bmtub3duO1xuICAgIHJldHVybiAoc2VnbWVudHMpID0+IHtcbiAgICAgIGZvbGQgPz89IGRyeUZvbGQodGhpcy5iYXNlU25hcHNob3QsIHRoaXMudXBkYXRlUGF0Y2gsIHRoaXMub3ZlcndyaXRlUGF0Y2gsIHRoaXMuZnVsbFJvd3MoKSk7XG4gICAgICByZXR1cm4gX2dldChmb2xkLCBzZWdtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2UncyAnZnVsbCcgcm93czogZXZlcnkgb3Agb24gYSBwYXRoIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBrZWVwcywgYSBgZGVsZXRlYCBzcGVsbGVkIGBzZXRgLiAqL1xuICBwcml2YXRlIGZ1bGxSb3dzKCk6IFRyYWNlRW50cnlbXSB7XG4gICAgY29uc3Qga2VlcCA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIGNvbnN0IHJvd3M6IFRyYWNlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBsZXQgayA9IGtlZXAuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGsgPT09IHVuZGVmaW5lZCkga2VlcC5zZXQob3AucGF0aCwgKGsgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpKSk7XG4gICAgICBpZiAoaykgcm93cy5wdXNoKHsgcGF0aDogb3AucGF0aCwgdmVyYjogb3AudmVyYiA9PT0gJ21lcmdlJyA/ICdtZXJnZScgOiAnc2V0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSBzdGFnZSBjaGFuZ2UgdGhlIHZhbHVlIGF0IGBzZWdtZW50c2A/IEJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZVxuICAgKiBmaXhlZCBhdCBjb21taXQsIHNvIHRoaXMgaXMgdGhlIE9ORSBuZXQtY2hhbmdlIHZlcmRpY3QgYm90aCBwYXlsb2FkXG4gICAqIGVuY29kaW5ncyBhcHBseSAoYSBuby1vcCB3cml0ZSBhbmQgYSB3cml0ZS10aGVuLXJldmVydCBib3RoIGZhaWwgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkU2luY2VCYXNlKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGVlcEVxdWFsKF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKSwgX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGgg4oaSIGl0cyBvcC12ZXJiIHNlcXVlbmNlLCBvcmRlcmVkIGJ5IExBU1QgdG91Y2ggKGRlbGV0ZSArIHJlLWluc2VydFxuICAgKiBtb3ZlcyBhIHJlLXRvdWNoZWQgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBNYXAncyBpbnNlcnRpb24gb3JkZXIg4oCUXG4gICAqIHByZXNlcnZpbmcgbGFzdC13cml0ZXItd2lucyBmb3IgbmVzdGVkL292ZXJsYXBwaW5nIHBhdGhzKS4gUGVyLXdyaXRlXG4gICAqIHByb3ZlbmFuY2UgKCNQMSk6IHRoZSBMQVNUIG9wJ3MgcmVhZEtleXMgaXMga2VwdCDigJQgcmVhZCBwcmVmaXhlcyBvbmx5IGdyb3dcbiAgICogd2l0aGluIGEgc3RhZ2UsIHNvIGxhc3QgPT0gdW5pb24gYWNyb3NzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBvcHNCeVBhdGgoKTogTWFwPHN0cmluZywgeyB2ZXJiczogT3BWZXJiW107IHJlYWRLZXlzPzogc3RyaW5nW107IGxhc3Q6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBwcmV2ID0gYnlQYXRoLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHByZXYudmVyYnMucHVzaChvcC52ZXJiKTtcbiAgICAgICAgcHJldi5sYXN0ID0gaTtcbiAgICAgICAgaWYgKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQpIHByZXYucmVhZEtleXMgPSBvcC5yZWFkS2V5cztcbiAgICAgICAgYnlQYXRoLmRlbGV0ZShvcC5wYXRoKTtcbiAgICAgICAgYnlQYXRoLnNldChvcC5wYXRoLCBwcmV2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwge1xuICAgICAgICAgIHZlcmJzOiBbb3AudmVyYl0sXG4gICAgICAgICAgbGFzdDogaSxcbiAgICAgICAgICAuLi4ob3AucmVhZEtleXMgIT09IHVuZGVmaW5lZCAmJiB7IHJlYWRLZXlzOiBvcC5yZWFkS2V5cyB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBieVBhdGg7XG4gIH1cblxuICAvKiogVGhlIG5ldC1jaGFuZ2UgZmlsdGVyIOKAlCBpZGVudGljYWwgdG8gJ2Z1bGwnICh7QGxpbmsgY2hhbmdlZFNpbmNlQmFzZX0pLiBTdXJ2aXZvcnMga2VlcCBsYXN0LXRvdWNoIG9yZGVyLiAqL1xuICBwcml2YXRlIG5ldENoYW5nZVN1cnZpdm9ycyhieVBhdGg6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4pOiBTdXJ2aXZvcltdIHtcbiAgICBjb25zdCBzdXJ2aXZvcnM6IFN1cnZpdm9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCB7IHZlcmJzLCByZWFkS2V5cywgbGFzdCB9XSBvZiBieVBhdGgpIHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50cykpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIHN1cnZpdm9ycy5wdXNoKHsgcGF0aCwgc2VnbWVudHMsIHZlcmJzLCByZWFkS2V5cywgbGFzdCwgYmVmb3JlLCBhZnRlciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cnZpdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXkgYSBzdGFnZWQgYGRlbGV0ZWAgYXQgdGhpcyBwYXRoIGNvbW1pdCBhcyB0aGUgYCdkZWxldGUnYCB2ZXJiP1xuICAgKlxuICAgKiBPbmx5IHdoZW4gcmVtb3ZpbmcgdGhlIGtleSBhbmQgdGhlIGAnZnVsbCdgIG1vZGUncyBmbGF0dGVuaW5nIChgX3NldGAgb2ZcbiAgICogYHVuZGVmaW5lZGApIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuIFRoZXkgZGl2ZXJnZSB3aGVuIHRoZSBwYXJlbnQgaXMgbm90XG4gICAqIGEgY29udGFpbmVyOiBgbmF0aXZlRGVsZXRlYCB3YWxrcyBhd2F5IHVudG91Y2hlZCwgd2hpbGUgYG5hdGl2ZVNldGBcbiAgICogQ09FUkNFUyB0aGUgcHJpbWl0aXZlIHBhcmVudCBpbnRvIGFuIG9iamVjdCB0byBob2xkIHRoZSBrZXkuIENvbW1pdHRpbmdcbiAgICogYGRlbGV0ZWAgdGhlcmUgd291bGQgc2lsZW50bHkgZHJvcCBhIHN0YXRlIGNoYW5nZSB0aGUgc3RhZ2UgcmVhbGx5IG1hZGUsXG4gICAqIHNvIHRob3NlIChwYXRob2xvZ2ljYWwpIGRlbGV0ZXMga2VlcCB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVSZXBsYXlzQXNGbGF0dGVuaW5nKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlOyAvLyBwYXJlbnQgaXMgdGhlIHN0YXRlIHJvb3Qg4oCUIGFsd2F5cyBhIGNvbnRhaW5lclxuICAgIGNvbnN0IHBhcmVudCA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzLnNsaWNlKDAsIC0xKSk7XG4gICAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyZW50ID09PSAnb2JqZWN0JztcbiAgfVxufVxuXG4vKipcbiAqIEhpc3RvcmljYWwgZmxhdHRlbmluZyBmb3IgdGhlIGAnZnVsbCdgIHBheWxvYWQ6IGFuIGV4cGxpY2l0IGRlbGV0ZSBjb21taXRzXG4gKiBhcyBzZXQtb2YtdW5kZWZpbmVkLiBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKSByaWRlcyBlYWNoIHN1cnZpdmluZyBlbnRyeVxuICogdW50b3VjaGVkLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuZWRUcmFjZVJvdyhvcDogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9KTogVHJhY2VFbnRyeSB7XG4gIHJldHVybiBvcC52ZXJiID09PSAnZGVsZXRlJ1xuICAgID8geyBwYXRoOiBvcC5wYXRoLCB2ZXJiOiAnc2V0JyBhcyBjb25zdCwgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSkgfVxuICAgIDogb3A7XG59XG5cbi8qKiBBIHJvdydzIGByZWFkS2V5c2AgZnJhZ21lbnQg4oCUIGFic2VudCB1bmxlc3MgdGhlIHByb3ZlbmFuY2UgZGlhbCByZWNvcmRlZCBvbmUgKCNQMSkuICovXG5mdW5jdGlvbiBwcm92ZW5hbmNlKHJlYWRLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHsgcmVhZEtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVhZEtleXMgIT09IHVuZGVmaW5lZCA/IHsgcmVhZEtleXMgfSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
947
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0RHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBbUQsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hILE9BQU8sRUFBOEIsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLElBQUksSUFBSSxFQUNqQixTQUFTLElBQUksSUFBSSxFQUNqQixHQUFHLEVBQ0gsUUFBUSxFQUNSLFdBQVcsRUFDWCxRQUFRLEVBQ1IsV0FBVyxHQUNaLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRGLE1BQU0sT0FBTyxpQkFBaUI7SUFDNUI7Ozs7O09BS0c7SUFDSyxZQUFZLENBQU07SUFDbEIsV0FBVyxDQUFNO0lBRWpCLGNBQWMsR0FBZ0IsRUFBRSxDQUFDO0lBQ2pDLFdBQVcsR0FBZ0IsRUFBRSxDQUFDO0lBQzlCLE9BQU8sR0FBMEQsRUFBRSxDQUFDO0lBQ3BFLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzFDOzs7Ozs7O09BT0c7SUFDSyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNyQywwRUFBMEU7SUFD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O1FBQ3pCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ3RHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLFNBQVMsVUFBVSxDQUFDLFFBQThCO0lBQ2hELE9BQU8sUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zYWN0aW9uQnVmZmVyIOKAlCBQZXItc3RhZ2UgU1RBR0lORyBidWZmZXIgZm9yIHN0YXRlIG11dGF0aW9uc1xuICpcbiAqIFdoYXQgaXQgSVM6IGEgc3RhZ2luZyBidWZmZXIgd2l0aCByZWFkLXlvdXItd3JpdGVzIGFuZCBuZXQtY2hhbmdlIGNvbW1pdHMuXG4gKiAtIENoYW5nZXMgYXJlIHN0YWdlZCBoZXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24gYW5kIGZsdXNoZWQgdG9cbiAqICAgU2hhcmVkTWVtb3J5IGluIE9ORSBiYXRjaCBwZXIgc3RhZ2UgKGBjb21taXQoKWApIOKAlCBvdGhlciBzdGFnZXMgYW5kXG4gKiAgIHBhcmFsbGVsIHNpYmxpbmdzIG5ldmVyIG9ic2VydmUgYSBzdGFnZSdzIGhhbGYtZmluaXNoZWQgd3JpdGVzLlxuICogLSBSZWFkLWFmdGVyLXdyaXRlIGNvbnNpc3RlbmN5IHdpdGhpbiBhIHN0YWdlIOKAlCBhIHN0YWdlIHNlZXMgaXRzIG93blxuICogICBzdGFnZWQgd3JpdGVzIGltbWVkaWF0ZWx5LlxuICogLSBgY29tbWl0KClgIHJlY29yZHMgdGhlIHN0YWdlJ3MgTkVUIGNoYW5nZSAoc2VlIHtAbGluayBjb21taXR9KSwgcGx1cyBhblxuICogICBvcGVyYXRpb24gdHJhY2UgZm9yIGRldGVybWluaXN0aWMgcmVwbGF5LlxuICpcbiAqIFdoYXQgaXQgaXMgTk9UOiBhIHJvbGxiYWNrIG1lY2hhbmlzbS4gRGVzcGl0ZSB0aGUgbmFtZSwgdGhlcmUgaXMgbm9cbiAqIGFib3J0L3JvbGxiYWNrIHBhdGgg4oCUIHdoZW4gYSBzdGFnZSBUSFJPV1MsIHRoZSBlbmdpbmUgc3RpbGwgY29tbWl0c1xuICogZXZlcnl0aGluZyBzdGFnZWQgc28gZmFyIGJlZm9yZSByZS10aHJvd2luZyAoY29tbWl0LW9uLWVycm9yIGluXG4gKiBgRmxvd2NoYXJ0VHJhdmVyc2VyYCkuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIGF1ZGl0IHRyYWlsIG11c3QgcmVjb3JkXG4gKiB3aGF0IHRoZSBmYWlsaW5nIHN0YWdlIGNoYW5nZWQuIERvIG5vdCByZWx5IG9uIFwic3RhZ2UgZmFpbGVkIOKGkiBpdHNcbiAqIHdyaXRlcyB2YW5pc2hlZFwiLlxuICpcbiAqIFRoZSBwYXRjaCB0cmVlcyBob2xkIFJFRkVSRU5DRVMgdW50aWwgY29tbWl0ICg5LjIzLjApLiBBIGBzZXRgIHN0b3JlcyB0aGVcbiAqIGNhbGxlcidzIG93biB2YWx1ZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGRpZCBpblxuICogYHdvcmtpbmdDb3B5YDsgdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyB0YWtlbiBPTkNFIHBlciBzdXJ2aXZpbmcgcGF0aFxuICogd2hlbiB0aGUgcGF5bG9hZCBsZWF2ZXMgdGhlIGJ1ZmZlciAoYHRvQ2hhbmdlT25seVBheWxvYWRgIC9cbiAqIGB0b0RlbHRhUGF5bG9hZGAg4oCUIGV2ZXJ5IHZhbHVlIHRoZXkgZW1pdCBwYXNzZXMgdGhyb3VnaCBgc3RydWN0dXJlZENsb25lYFxuICogdGhlcmUpLiBUaGUgbGF3IFwidGhlIHJlY29yZCBuZXZlciBhbGlhc2VzIGEgY2FsbGVyJ3Mgb2JqZWN0XCIgaXMga2VwdCBhdFxuICogdGhlIGNvbW1pdCBib3VuZGFyeSBpbnN0ZWFkIG9mIGF0IGV2ZXJ5IHdyaXRlLCB3aGljaCBpcyB3aGF0IG1ha2VzIE5cbiAqIHdyaXRlcyB0byBvbmUgcGF0aCBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHNpemUpLiBDb25zZXF1ZW5jZSwgYnkgZGVzaWduOiBhXG4gKiBjYWxsZXIgd2hvIG11dGF0ZXMgaXRzIG93biBvYmplY3QgQUZURVIgdGhlIHdyaXRlIGFuZCBCRUZPUkUgdGhlIHN0YWdlXG4gKiBlbmRzIGNvbW1pdHMgdGhlIHZhbHVlIGFzIHRoZSBzdGFnZSByZWFkIGl0IGJhY2sg4oCUIHRoZSByZWNvcmQgYWdyZWVzIHdpdGhcbiAqIHRoZSBzdGFnZSAoQ0xBVURFLm1kIGxhbmRtaW5lIDMncyBmaXJzdCBiaXRlLCBjbG9zZWQpLiBUaGUgb25lIHBsYWNlIHRoZVxuICogZW5naW5lIGl0c2VsZiBlZGl0cyBUSFJPVUdIIGEgc3RhZ2VkIHZhbHVlIOKAlCBhIGxhdGVyIG5lc3RlZCBvcCB1bmRlciBhXG4gKiBgc2V0YCBwYXRoIOKAlCBkZXRhY2hlcyB0aGF0IHZhbHVlIGZpcnN0ICh7QGxpbmsgZGV0YWNoSGVsZEFuY2VzdG9yc30pLCBzb1xuICogYHdvcmtpbmdDb3B5YCBhbmQgYG92ZXJ3cml0ZVBhdGNoYCBuZXZlciBzaGFyZSBhIGNvbnRhaW5lciB0aGUgZW5naW5lXG4gKiBtdXRhdGVzIG9uIG9uZSBzaWRlIG9ubHkuXG4gKlxuICogQ09QWS1PTi1XUklURSAoOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS4gVGhlXG4gKiBidWZmZXIgbm8gbG9uZ2VyIGNsb25lcyB0aGUgY29tbWl0dGVkIHN0YXRlIGl0IHN0YXJ0cyBmcm9tLiBgYmFzZVNuYXBzaG90YFxuICogSVMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIChoZWxkIGJ5IHJlZmVyZW5jZSDigJRcbiAqIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcCksIGFuZCBgd29ya2luZ0NvcHlgIHN0YXJ0cyBhcyBhXG4gKiBjb3B5IG9mIGl0cyBST09UIG9ubHk6IGVhY2ggd3JpdGUgY29waWVzIHRoZSBjb250YWluZXJzIG9uIGl0cyBvd24gcGF0aFxuICogKHtAbGluayBvd25TcGluZX0pLCBhbmQgdGhlIGZpcnN0IFJFQUQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgb2YgYVxuICogY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSB0YWtlcyBhIHByaXZhdGUgZGVlcCBjb3B5IG9mXG4gKiBpdCAoe0BsaW5rIHByaXZhdGlzZX0pIOKAlCB3aGF0IHRoZSB3aG9sZS1zdGF0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgZXZlcnlcbiAqIHJlYWQsIHNvIGFuIGluLXBsYWNlIGVkaXQgb2YgYSByZWFkIHZhbHVlIHN0YXlzIHByaXZhdGUgZXhhY3RseSBhcyBpdCBkaWQuXG4gKiBBIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyIGlzIHNlcnZlZCBmcm9tIGxpdmUgc3RhdGUgYnkgdGhlXG4gKiBjYWxsZXIsIGFzIGJlZm9yZTsgdGhlIGJ1ZmZlciB0aGVuIHJlcGxhY2VzIHRoYXQgcGF0aCBvZiBpdHMgZGlmZiBiYXNlXG4gKiB3aXRoIGEgcHJpdmF0ZSBjb3B5ICh7QGxpbmsgZGV0YWNoQmFzZX0pLCBhcyB0aGUgY2xvbmUgaGFkIGl0LlxuICpcbiAqIFRIRSBBRE1JVFRFRCBSRUNPUkQgKDkuMzAuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1hZG1pdHRlZC1yZWNvcmQubWQpLiBBXG4gKiBjb21taXQgaXMgYWRtaXR0ZWQgb25seSBpZiBpdHMgYnVuZGxlIGZvbGRzIGJhY2sgdG8gdGhlIHN0YWdlJ3NcbiAqIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkIChhbmQgYXQgZXZlcnlcbiAqIGNvbnRhaW5lciBpdHMgd3JpdGVzIGNyZWF0ZWQgb24gdGhlIHdheSB0aGVyZSwgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcykuXG4gKiBCb3RoIGVuY29kZXJzIGNvbW1pdCB0aGUgdmFsdWUgdGhlIHN0YWdlIHJlYWQ6IGEgY29tcGFjdCByb3cg4oCUIGEgYG1lcmdlYFxuICogZGVsdGEsIGFuIGBhcHBlbmRgIHRhaWwg4oCUIGlzIGtlcHQgd2hlcmUgaXQgcHJvdmFibHkgZm9sZHMgYmFjazsgYSBmYW1pbHkgb2ZcbiAqIHJvd3MgdGhhdCBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyBgc2V0YCByb3dzIG9mIHRoZSB2YWx1ZXMgdGhlIHN0YWdlIHJlYWRcbiAqICh7QGxpbmsgYWRtaXR9KS4gQmVmb3JlIDkuMzAuMCB0aGUgb25lIGFjY3VtdWxhdGVkIG1lcmdlIGRlbHRhIHBlciBwYXRoIHdhc1xuICogcmVwbGF5ZWQgYXQgZXZlcnkgYG1lcmdlYCByb3cgb2YgdGhhdCBwYXRoLCB3aGljaCBsaWVkIGFjcm9zcyBhIGhhcmQgd3JpdGVcbiAqIChgJHVwZGF0ZShrLHt4fSk7IGsgPSB7eX07ICR1cGRhdGUoayx7en0pYCBjb21taXR0ZWQgYHt5LCB4LCB6fWAgZm9yIGFcbiAqIHJlYWQtYmFjayBvZiBge3ksIHp9YCksIGFuIGBbXWAgY2xlYXIsIGEga2luZCBjaGFuZ2Ugb3IgYW4gYXJyYXkgdW5pb25cbiAqIGRlZHVwbGljYXRlZCBieSByZWZlcmVuY2UuIFZlcmlmaWVkIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBhIGBtZXJnZWAgb3IgYVxuICogbmVzdGVkIG9wOyBhIHN0YWdlIHRoYXQgc3RhZ2VkIG9ubHkgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyXG4gKiBpdHMgYWRkcmVzcyBpcyBjb2hlcmVudCBieSBjb25zdHJ1Y3Rpb24g4oCUIGJvdGggdHJlZXMgcmVjZWl2ZSB0aGUgc2FtZVxuICogd3JpdGUg4oCUIGFuZCBpcyBhZG1pdHRlZCB3aXRob3V0IHRoZSBmb2xkLlxuICovXG5cbmltcG9ydCB7IHB1dE93biB9IGZyb20gJy4uL2NhcHR1cmUvb3duRGF0YS5qcyc7XG5pbXBvcnQgeyB0eXBlIEZhbWlseSwgdHlwZSBMb3NzeSwgdHlwZSBNZW1iZXIsIHR5cGUgUm93cywgYWRkcmVzc0RlcHRoT2YsIGxvc3N5RmFtaWxpZXMgfSBmcm9tICcuL2FkbWlzc2lvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIE9wVmVyYiwgdHlwZSBTdXJ2aXZvciwgZW1pdEluRmFtaWx5T3JkZXIsIGdyb3VwSW50b0ZhbWlsaWVzLCBwdXNoVmFsdWVSb3cgfSBmcm9tICcuL2RlbHRhRW5jb2RpbmcuanMnO1xuaW1wb3J0IHsgcmVsYXRpb24gfSBmcm9tICcuL2tleVBhdGhzLmpzJztcbmltcG9ydCB7XG4gIGFkb3B0LFxuICBpc0NvbnRhaW5lcixcbiAgbmF0aXZlR2V0IGFzIF9nZXQsXG4gIG5hdGl2ZVNldCBhcyBfc2V0LFxuICBvd24sXG4gIG93bkNoaWxkLFxuICBvd25lZFJvb3RPZixcbiAgb3duU3BpbmUsXG4gIHNoYWxsb3dDb3B5LFxufSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRWYWx1ZXNNb2RlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBkZWVwU21hcnRNZXJnZSwgREVMSU0sIGRyeUZvbGQsIG5vcm1hbGlzZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgLyoqXG4gICAqIFRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZTogdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdFxuICAgKiB0b3VjaGVkLCBieSByZWZlcmVuY2Ug4oCUIGV4Y2VwdCB3aGVyZSB7QGxpbmsgZGV0YWNoQmFzZX0gcmVwbGFjZWQgYSBwYXRoXG4gICAqIG9mIGl0IHdpdGggYSBwcml2YXRlIGNvcHkgKGl0cyByb290IGFuZCB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IGFyZVxuICAgKiB0aGVuIGNvcGllcyB0b28sIG93bmVkIGJ5IHtAbGluayBiYXNlT3duZWR9KS5cbiAgICovXG4gIHByaXZhdGUgYmFzZVNuYXBzaG90OiBhbnk7XG4gIHByaXZhdGUgd29ya2luZ0NvcHk6IGFueTtcblxuICBwcml2YXRlIG92ZXJ3cml0ZVBhdGNoOiBNZW1vcnlQYXRjaCA9IHt9O1xuICBwcml2YXRlIHVwZGF0ZVBhdGNoOiBNZW1vcnlQYXRjaCA9IHt9O1xuICBwcml2YXRlIG9wVHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfVtdID0gW107XG4gIHByaXZhdGUgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKipcbiAgICogUGF0aHMgd2hvc2UgYG92ZXJ3cml0ZVBhdGNoYCB2YWx1ZSBpcyB0aGUgY2FsbGVyJ3Mgb3duIG9iamVjdCAoOS4yMy4wKTpcbiAgICogYSBgc2V0YCBvZiBhIGNvbnRhaW5lciBzdG9yZXMgdGhlIHJlZmVyZW5jZSwgYW5kIHRoaXMgaXMgdGhlIGxlZGdlciBvZlxuICAgKiB3aGljaCBvbmVzIGFyZSBzdGlsbCBzaGFyZWQgd2l0aCB0aGUgY2FsbGVyIChhbmQgd2l0aCBgd29ya2luZ0NvcHlgKS5cbiAgICogQ29uc3VsdGVkIG9ubHkgYnkgdGhlIGVuZ2luZSdzIG5lc3RlZCBvcHMg4oCUIHNlZVxuICAgKiB7QGxpbmsgZGV0YWNoSGVsZEFuY2VzdG9yc307IHRoZSBjb21taXQgcGF5bG9hZCBjbG9uZXMgZXZlcnkgc3Vydml2aW5nXG4gICAqIHZhbHVlIGFueXdheSBhbmQgbmV2ZXIgYXNrcy4gQ2xlYXJlZCB3aXRoIHRoZSByZXN0IGF0IGBjb21taXQoKWAuXG4gICAqL1xuICBwcml2YXRlIGhlbGRSZWZzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBDb21taXQtdmFsdWUgZW5jb2RpbmcgcG9saWN5ICgjMTNjLUIpLiBgJ2Z1bGwnYCA9IGhpc3RvcmljYWwgYnl0ZXMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlO1xuXG4gIC8qKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHNvdXJjZSAoI1AxKS4gV2hlbiBzZXQgKHRoZVxuICAgKiAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBldmVyeSBzdGFnZWQgb3Agc25hcHNob3RzIHRoZVxuICAgKiAga2V5cyB0cmFja2VkLXJlYWQgc28gZmFyIOKAlCB0aGUgdGVtcG9yYWwtcHJlZml4IGF0dHJpYnV0aW9uIGNvbnN1bWVkIGJ5XG4gICAqICBjYXVzYWwgc2xpY2luZy4gVW5kZWZpbmVkIChkZWZhdWx0KSA9IHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgb3BzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRLZXlzUHJvdmlkZXI/OiAoKSA9PiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lcnMgaW4gYHdvcmtpbmdDb3B5YCB0aGlzIGJ1ZmZlciBDUkVBVEVEOiBpdHMgcm9vdCBjb3B5LCB0aGVcbiAgICogcGF0aCBjb3BpZXMgaXRzIHdyaXRlcyBtYWRlLCB0aGUgbWVyZ2UgcmVzdWx0cyBpdCBidWlsdCwgYW5kIGV2ZXJ5XG4gICAqIGNvbnRhaW5lciBvZiB0aGUgcHJpdmF0ZSBjb3BpZXMgaXRzIHJlYWRzIHRvb2suIEEgd3JpdGUgZWRpdHMgdGhlc2UgaW5cbiAgICogcGxhY2UuIEV2ZXJ5dGhpbmcgZWxzZSBpbiBgd29ya2luZ0NvcHlgIGlzIFNIQVJFRCDigJQgd2l0aCB0aGUgY29tbWl0dGVkXG4gICAqIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQsIG9yIHdpdGggYSB2YWx1ZSB0aGUgc3RhZ2Ugc3RhZ2VkIOKAlFxuICAgKiBhbmQgaXMgY29waWVkIGJlZm9yZSBhIHdyaXRlIHBhc3NlcyB0aHJvdWdoIGl0ICh7QGxpbmsgb3duU3BpbmV9KS5cbiAgICovXG4gIHByaXZhdGUgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciB2YWx1ZXMgdGhlIHN0YWdlIHN0YWdlZCB3aXRoIHtAbGluayBzZXR9IOKAlCBpdHMgb3duIG9iamVjdHMsXG4gICAqIGhlbGQgYnkgcmVmZXJlbmNlICg5LjIzLjApLiBBIHJlYWQgaGFuZHMgdGhlbSBiYWNrIGFzIHRoZXkgYXJlLCBleGFjdGx5XG4gICAqIGFzIHRoZSBwcml2YXRlIHdvcmtpbmcgY29weSBhbHdheXMgZGlkLCBhbmQgbmV2ZXIgcHJpdmF0aXNlcyB0aGVtOiBhXG4gICAqIHByaXZhdGUgY29weSBvZiBhIHN0YWdlZCB2YWx1ZSB3b3VsZCBsZWF2ZSBgd29ya2luZ0NvcHlgIGFuZFxuICAgKiBgb3ZlcndyaXRlUGF0Y2hgIGRpc2FncmVlaW5nIGFib3V0IGEgdmFsdWUgdGhlIHN0YWdlIHdyb3RlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLyoqXG4gICAqIE93bmVkIGNvbnRhaW5lcnMgd2l0aCBubyBjb250YWluZXIgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlXG4gICAqIGFueXdoZXJlIGJlbG93IHRoZW0gKGEgcHJpdmF0ZSBkZWVwIGNvcHksIGEgbWVyZ2UgcmVzdWx0IGJ1aWx0IG9uIGFcbiAgICogcHJpdmF0ZSBiYXNlLCBhIHBhdGggY29weSB3aG9zZSBzaGFyZWQgY2hpbGRyZW4gd2VyZSBwcml2YXRpc2VkKS4gQSByZWFkXG4gICAqIHRoYXQgbGFuZHMgb24gb25lIG5lZWRzIG5vIHdhbGsg4oCUIHNlZSB7QGxpbmsgcHJpdmF0aXNlQmVsb3d9LlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRlVHJlZXMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIG9mIHtAbGluayBiYXNlU25hcHNob3R9IHRoYXQge0BsaW5rIGRldGFjaEJhc2V9IGNyZWF0ZWQ6XG4gICAqIGl0cyByb290IGNvcHkgYW5kIHRoZSBjb3BpZXMgb24gdGhlIHdheSB0byBhIGRldGFjaGVkIHBhdGguIEFsbG9jYXRlZFxuICAgKiBvbmx5IGJ5IHRoZSBmaXJzdCBkZXRhY2gg4oCUIHRoZSBpbi1jb250cmFjdCBzdGFnZSBuZXZlciBwYXlzIGZvciBpdC5cbiAgICovXG4gIHByaXZhdGUgYmFzZU93bmVkPzogV2Vha1NldDxvYmplY3Q+O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpdmF0ZSBkZWVwIGNvcGllcyB7QGxpbmsgZGV0YWNoQmFzZX0gcHV0IGludG8gdGhlIGRpZmYgYmFzZTogbm90aGluZ1xuICAgKiBhdCBvciBiZWxvdyBvbmUgaXMgY29tbWl0dGVkIHN0YXRlLCBzbyBhIGxhdGVyIGRldGFjaCBpbnNpZGUgaXQgaXMgYSBuby1vcC5cbiAgICovXG4gIHByaXZhdGUgZGV0YWNoZWRCYXNlPzogV2Vha1NldDxvYmplY3Q+O1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc3RhZ2Ugd3JpdGVzICg5LjMwLjApOiBhIHBhdGggcHJlZml4IGl0cyBmcmFtZSBjb21wdXRlZCBhbmRcbiAgICogaGFuZHMgb3ZlciBhcyBkYXRhIChDMiDigJQgZm9yIHRoZSBlbmdpbmUsIHRoZSBmcmFtZSdzIHJ1biBuYW1lc3BhY2UsIG9yXG4gICAqIGBbXWAgZm9yIHRoZSByb290KS4gSXRzIGNvbnRhaW5lcnMgYXJlIHRoZSBzdGFnZSdzIEFERFJFU1MsIG5vdCBhIHZhbHVlXG4gICAqIHRoZSBzdGFnZSByZWFkcyAoZXZlcnkgcmVhZCBpdCBtYWtlcyBpcyBhIGtleSBiZWxvdyBpdCksIHNvIGEgc2hlbGwgYVxuICAgKiB3cml0ZSBsZWF2ZXMgdGhlcmUgaXMgbm8gcGFydCBvZiB0aGUgcmVhZC1iYWNrIHRoZSByZWNvcmQgbXVzdCBob2xkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogYG1lcmdlYCBvcHMgc3RhZ2VkIHNpbmNlIHRoZSBsYXN0IGNvbW1pdCDigJQgc2VlIHtAbGluayBhZG1pdH0uICovXG4gIHByaXZhdGUgc3RhZ2VkTWVyZ2VzID0gMDtcbiAgLyoqIE9wcyBzdGFnZWQgZGVlcGVyIHRoYW4gb25lIGtleSBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzIOKAlCBzZWUge0BsaW5rIGFkbWl0fS4gKi9cbiAgcHJpdmF0ZSBuZXN0ZWRPcHMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJhc2U6IGFueSxcbiAgICBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGUgPSAnZnVsbCcsXG4gICAgcmVhZEtleXNQcm92aWRlcj86ICgpID0+IHN0cmluZ1tdLFxuICAgIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gICkge1xuICAgIC8vIGBiYXNlYCBpcyB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQg4oCUXG4gICAgLy8gaW1tdXRhYmxlLWFmdGVyLXN3YXAsIHRoZSBpbnZhcmlhbnQgdGhlIGZpcnN0LXRvdWNoIHZpZXcgYWxyZWFkeSByZXN0c1xuICAgIC8vIG9uIOKAlCBzbyB0aGUgZGlmZiBiYXNlIGlzIGhlbGQgYnkgUkVGRVJFTkNFLCBhbmQgdGhlIHdvcmtpbmcgY29weSBzdGFydHNcbiAgICAvLyBhcyBhIGNvcHkgb2YgaXRzIFJPT1Qgb25seS4gQmVmb3JlIDkuMjkuMCB0aGVzZSB0d28gbGluZXMgd2VyZSB0d29cbiAgICAvLyBgc3RydWN0dXJlZENsb25lYHMgb2YgdGhlIHdob2xlIHN0YXRlLCBwYWlkIGJ5IGV2ZXJ5IHN0YWdlIHRoYXQgd3JvdGUuXG4gICAgdGhpcy5iYXNlU25hcHNob3QgPSBiYXNlO1xuICAgIHRoaXMud29ya2luZ0NvcHkgPSBvd25lZFJvb3RPZihiYXNlLCB0aGlzLm93bmVkKTtcbiAgICB0aGlzLmNvbW1pdFZhbHVlcyA9IGNvbW1pdFZhbHVlcztcbiAgICB0aGlzLnJlYWRLZXlzUHJvdmlkZXIgPSByZWFkS2V5c1Byb3ZpZGVyO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKiogU3RhbXAgdGhlIGN1cnJlbnQgcmVhZCBwcmVmaXggb250byBhIHN0YWdlZCBvcCDigJQgb25seSB3aGVuIHRoZVxuICAgKiAgcHJvdmVuYW5jZSBkaWFsIGlzIG9uIChwcm92aWRlciBwcmVzZW50KSwgc28gdGhlIGRlZmF1bHQgcGF0aCBhbGxvY2F0ZXNcbiAgICogIG5vdGhpbmcgYW5kIGNvbW1pdCBidW5kbGVzIHN0YXkgYnl0ZS1pZGVudGljYWwuICovXG4gIHByaXZhdGUgc3RhbXBSZWFkS2V5cyhvcDogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9KTogdHlwZW9mIG9wIHtcbiAgICBpZiAodGhpcy5yZWFkS2V5c1Byb3ZpZGVyKSBvcC5yZWFkS2V5cyA9IHRoaXMucmVhZEtleXNQcm92aWRlcigpO1xuICAgIHJldHVybiBvcDtcbiAgfVxuXG4gIC8qKiBTdGFnZSBhbiBvcCBpbnRvIGBvcFRyYWNlYCwgY291bnRpbmcgd2hhdCBkZWNpZGVzIHdoZXRoZXIge0BsaW5rIGFkbWl0fSBtdXN0IGZvbGQuICovXG4gIHByaXZhdGUgc3RhZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwga2V5OiBzdHJpbmcsIHZlcmI6IE9wVmVyYik6IHZvaWQge1xuICAgIGlmICh2ZXJiID09PSAnbWVyZ2UnKSB0aGlzLnN0YWdlZE1lcmdlcysrO1xuICAgIGlmIChwYXRoLmxlbmd0aCAtIGFkZHJlc3NEZXB0aE9mKHBhdGgsIHRoaXMuYWRkcmVzcykgPiAxKSB0aGlzLm5lc3RlZE9wcysrO1xuICAgIHRoaXMub3BUcmFjZS5wdXNoKHRoaXMuc3RhbXBSZWFkS2V5cyh7IHBhdGg6IGtleSwgdmVyYiB9KSk7XG4gIH1cblxuICAvKipcbiAgICogSGFyZCBvdmVyd3JpdGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBTdG9yZXMgdGhlIFJFRkVSRU5DRSBpbiBib3RoIHRyZWVzXG4gICAqICg5LjIzLjApIOKAlCB0aGUgcmVjb3JkJ3MgY29weSBpcyB0YWtlbiBvbmNlLCBhdCBjb21taXQ7IHNlZSB0aGUgaGVhZGVyLlxuICAgKi9cbiAgc2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB2YWx1ZSk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCB2YWx1ZSk7XG4gICAgaWYgKGlzQ29udGFpbmVyKHZhbHVlKSkge1xuICAgICAgdGhpcy5oZWxkUmVmcy5hZGQoa2V5KTtcbiAgICAgIHRoaXMuc3RhZ2VkLmFkZCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5zdGFnZShwYXRoLCBrZXksICdzZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIG5lc3RlZCBvcCBpcyBhYm91dCB0byB3cml0ZSBUSFJPVUdIIGEgcGF0aCB3aG9zZSBgb3ZlcndyaXRlUGF0Y2hgXG4gICAqIHZhbHVlIGlzIGEgaGVsZCByZWZlcmVuY2UgKDkuMjMuMCkuIFRvZGF5J3MgbGF3IGlzIHRoYXQgdGhlIHR3byB0cmVlc1xuICAgKiByZWNlaXZlIHRoZSBzYW1lIG5lc3RlZCBgc2V0YC9gZGVsZXRlYCBtdXRhdGlvbnMgYnV0IE9OTFkgYHdvcmtpbmdDb3B5YFxuICAgKiByZWNlaXZlcyBhIG5lc3RlZCBgbWVyZ2VgJ3MgcmVzdWx0IChgdXBkYXRlUGF0Y2hgIGdldHMgdGhlIGRlbHRhKSDigJQgc28gYVxuICAgKiBjb250YWluZXIgc2hhcmVkIGJldHdlZW4gdGhlIHRyZWVzIHdvdWxkIGxlYWsgdGhlIG1lcmdlZCB2YWx1ZSBpbnRvIHRoZVxuICAgKiBvdmVyd3JpdGUgcGF5bG9hZCwgYW5kIGEgc2hhcmVkIGNvbnRhaW5lciBpcyBhbHNvIHRoZSBjYWxsZXIncyBvd25cbiAgICogb2JqZWN0LCB3aGljaCB0aGUgZW5naW5lIG11c3Qgbm90IGVkaXQgb24gdGhlIHJlY29yZCdzIGJlaGFsZi4gUmVwbGFjaW5nXG4gICAqIHRoZSBoZWxkIGFuY2VzdG9yIHdpdGggaXRzIGNsb25lIGluIGBvdmVyd3JpdGVQYXRjaGAgcmVzdG9yZXMgZXhhY3RseVxuICAgKiB0aGUgcHJpdmF0ZSB0cmVlIHRoZSBwZXItd3JpdGUgY2xvbmUgdXNlZCB0byBnaXZlIGl0LCBwYWlkIG9uY2UgcGVyXG4gICAqIGFuY2VzdG9yIGFuZCBvbmx5IG9uIHRoZSBuZXN0ZWQtb3AgcGF0aCB0aGUgcHVibGljIHN1cmZhY2UgbmV2ZXIgdGFrZXNcbiAgICogKHRoZSBzY29wZSBwcm94eSB3cml0ZXMgUk9PVCBrZXlzKS4gYHdvcmtpbmdDb3B5YCBrZWVwcyB0aGUgcmVmZXJlbmNlLFxuICAgKiBhcyBpdCBhbHdheXMgZGlkLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWxkUmVmcy5zaXplID09PSAwKSByZXR1cm47XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhbmNlc3RvciA9IHBhdGguc2xpY2UoMCwgaSk7XG4gICAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKGFuY2VzdG9yKTtcbiAgICAgIGlmICghdGhpcy5oZWxkUmVmcy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBjb25zdCBoZWxkID0gX2dldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBhbmNlc3Rvcik7XG4gICAgICBpZiAoaGVsZCAhPT0gbnVsbCAmJiB0eXBlb2YgaGVsZCA9PT0gJ29iamVjdCcpIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgYW5jZXN0b3IsIHN0cnVjdHVyZWRDbG9uZShoZWxkKSk7XG4gICAgICB0aGlzLmhlbGRSZWZzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsaWNpdCBrZXkgZGVsZXRpb24gYXQgdGhlIHNwZWNpZmllZCBwYXRoICgjMTNjLUI7IGFic29yYnMgYmFja2xvZyBCOCkuXG4gICAqXG4gICAqIFN0YWdlcyBFWEFDVExZIHRoZSBzYW1lIGJ1ZmZlciBtdXRhdGlvbnMgYXMgYHNldChwYXRoLCB1bmRlZmluZWQpYCDigJRcbiAgICogYHdvcmtpbmdDb3B5YC9gb3ZlcndyaXRlUGF0Y2hgIGdldCBhbiBvd24gYHVuZGVmaW5lZGAgYXQgdGhlIHBhdGggKHRoZVxuICAgKiBoaXN0b3JpY2FsIGZsYXR0ZW5pbmcsIHByZXNlcnZpbmcgcmVhZCBiZWhhdmlvciBhbmQgdGhlIGRlZHVwIGRpZmYgYmFzZVxuICAgKiBhY3Jvc3MgbW9kZXMpIOKAlCBidXQgcmVjb3JkcyB0aGUgb3AgdmVyYiBhcyBgJ2RlbGV0ZSdgLiBBdCBjb21taXQ6XG4gICAqIGAnZnVsbCdgIG1vZGUgbWFwcyBpdCBiYWNrIHRvIGEgYCdzZXQnYCB0cmFjZSBlbnRyeSAoYnl0ZS1pZGVudGljYWwgdG9cbiAgICogdG9kYXkpOyBgJ2RlbHRhJ2AgbW9kZSBlbWl0cyBhIHJlYWwgYCdkZWxldGUnYCBlbnRyeSB3aG9zZSByZXBsYXlcbiAgICogUkVNT1ZFUyB0aGUga2V5IGluc3RlYWQgb2YgbGVhdmluZyBga2V5OiB1bmRlZmluZWRgIGJlaGluZC5cbiAgICpcbiAgICogVGhlIG5ldC1jaGFuZ2UgZmlsdGVyIHJlYWRzIHRoYXQgc3RhZ2VkIG93biBgdW5kZWZpbmVkYCBhcyBBQlNFTlRcbiAgICogKGBkZWVwRXF1YWxgLCA5LjE5LjEpIOKAlCBzbyB1bmRlciBgJ2RlbHRhJ2AsIHdob3NlIGNvbW1pdHRlZCBzdGF0ZSByZWFsbHlcbiAgICogbGFja3MgdGhlIGtleSwgZGVsZXRpbmcgYW4gYWJzZW50IGtleSBpbnNpZGUgYSBjb250YWluZXIgdGhlIHN0YWdlIGFsc29cbiAgICogcmUtd3JvdGUgaXMgdGhlIG5vLW9wIGl0IGlzLCBub3QgYSBgc2V0YCBvZiB0aGUgd2hvbGUgY29udGFpbmVyLlxuICAgKi9cbiAgZGVsZXRlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB1bmRlZmluZWQpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgdW5kZWZpbmVkKTtcbiAgICB0aGlzLmhlbGRSZWZzLmRlbGV0ZShrZXkpO1xuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5zdGFnZShwYXRoLCBrZXksICdkZWxldGUnKTtcbiAgfVxuXG4gIC8qKiBEZWVwIHVuaW9uIG1lcmdlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gYGRlZXBTbWFydE1lcmdlYCBidWlsZHMgZnJlc2hcbiAgICogIGNvbnRhaW5lcnMsIHNvIG5laXRoZXIgdHJlZSBldmVyIGhvbGRzIHRoZSBtZXJnZSBJTlBVVCBieSByZWZlcmVuY2U7XG4gICAqICB0aGUgbmVzdGVkLW9wIGRldGFjaCBndWFyZHMgdGhlIGFuY2VzdG9yIGl0IHdyaXRlcyBJTlRPLlxuICAgKlxuICAgKiAgVGhlIHZhbHVlIG1lcmdlZCBJTlRPIGlzIG1hZGUgcHJpdmF0ZSBmaXJzdCAoYHByaXZhdGlzZWApLCBhcyB0aGVcbiAgICogIHdob2xlLXN0YXRlIGNsb25lIG1hZGUgaXQgYmVmb3JlIDkuMjkuMC4gTm90IG9ubHkgZm9yIHRoZSByZWFkcyB0aGF0XG4gICAqICBmb2xsb3c6IGBkZWVwU21hcnRNZXJnZWAgdW5pb25zIGFycmF5cyBCWSBSRUZFUkVOQ0UsIHNvIHdoZXRoZXIgYW5cbiAgICogIGVsZW1lbnQgdGhlIHN0YWdlIHBhc3NlcyBpbiBpcyBcImFscmVhZHkgdGhlcmVcIiBkZXBlbmRzIG9uIHdoaWNoIG9iamVjdHNcbiAgICogIHRoZSBiYXNlIGhvbGRzIOKAlCBhIGNvbW1pdHRlZCBhcnJheSB3b3VsZCBkZWR1cCBhbiBlbGVtZW50IHRoZSBzdGFnZVxuICAgKiAgcmVhZCBmcm9tIGl0IGJlZm9yZSBpdHMgZmlyc3Qgd3JpdGUsIHdoZXJlIHRoZSBwcml2YXRlIGNvcHkgKGFuZFxuICAgKiAgOS4yOC4wKSBhcHBlbmRzIGl0LiAqL1xuICBtZXJnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIHRoaXMucHJpdmF0aXNlKHBhdGgpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoKSA/PyB7fTtcbiAgICBjb25zdCBtZXJnZWQgPSBkZWVwU21hcnRNZXJnZShleGlzdGluZywgdmFsdWUpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIG93bihtZXJnZWQsIHRoaXMub3duZWQpO1xuICAgIGlmIChpc0NvbnRhaW5lcihtZXJnZWQpKSB0aGlzLnByaXZhdGVUcmVlcy5hZGQobWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoLCBkZWVwU21hcnRNZXJnZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgpID8/IHt9LCB2YWx1ZSkpO1xuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5zdGFnZShwYXRoLCBrZXksICdtZXJnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpZWxkLWxldmVsIHJlZGFjdGlvbiAoOS4xOS4wKTogbWFyayBkb3QtcGF0aHMgSU5TSURFIHRoZSB2YWx1ZSBzdGFnZWQgYXRcbiAgICogYHBhdGhgIGFzIHNlY3JldCwgc28gYHNjcnViUGF0Y2hgIHNjcnVicyB0aGVtIGluIHRoZSBjb21taXQgbG9nIGFuZCB0aGVcbiAgICogbWlycm9yIHRoZSBzYW1lIHdheSBhIHdob2xlLWtleSByZWRhY3Rpb24gaXMgc2NydWJiZWQuIEEgZmllbGQgaXNcbiAgICogcmVnaXN0ZXJlZCBhcyBhIGxpdGVyYWwga2V5IEFORCwgd2hlbiBkb3R0ZWQsIGFzIHRoZSBuZXN0ZWQgcGF0aCBpdFxuICAgKiBuYW1lcyDigJQgd2hpY2hldmVyIGV4aXN0cyBpbiB0aGUgcGF0Y2ggaXMgdGhlIG9uZSBgc2NydWJQYXRjaGAgZmluZHMuXG4gICAqIE1hcmtlZCBwYXRocyBzdXJ2aXZlIGNvbW1pdCBvbmx5IHdoaWxlIHRoZSBvcCBwYXRoIHRoZXkgc2l0IHVuZGVyIGRvZXNcbiAgICogKHNlZSB7QGxpbmsgc3Vydml2aW5nUmVkYWN0ZWRQYXRoc30pLlxuICAgKi9cbiAgbWFya1JlZGFjdGVkRmllbGRzKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKFsuLi5wYXRoLCBmaWVsZF0pKTtcbiAgICAgIGlmIChmaWVsZC5pbmNsdWRlcygnLicpKSB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgoWy4uLnBhdGgsIC4uLmZpZWxkLnNwbGl0KCcuJyldKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgYSByZWRhY3Rpb24gbWFyayBhZGRyZXNzIGFuIGFycmF5IEVMRU1FTlQgcmlnaHQgYmVsb3cgYHBhdGhgXG4gICAqIChgbGlzdC4xLnRva2VuYCk/IEFuIGBhcHBlbmRgIHJvdyByZS1iYXNlcyB0aGUgaW5kaWNlcyBvbnRvIHRoZSB0YWlsLCBzb1xuICAgKiBzdWNoIGEgcGF0aCB0YWtlcyB0aGUgd2hvbGUtdmFsdWUgYHNldGAgKGBkZWx0YUVuY29kaW5nIMK3IHB1c2hWYWx1ZVJvd2ApLlxuICAgKiBBIG1hcmsgYnkgTkFNRSBiZWxvdyBhbiBhcnJheSAoYG9iai55YCkgbWVhbnMgdGhlIHNhbWUgdGhpbmcgb24gdGhlIHRhaWxcbiAgICogYXMgb24gdGhlIHdob2xlIHZhbHVlLCBzbyB0aGUgY29tcGFjdCByb3cgc3RheXMgKGJ5dGUtaWRlbnRpY2FsKS5cbiAgICovXG4gIHByaXZhdGUgbWFya2VkQmVsb3cocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJlZml4ID0gcGF0aCArIERFTElNO1xuICAgIGZvciAoY29uc3QgbWFya2VkIG9mIHRoaXMucmVkYWN0ZWRQYXRocykge1xuICAgICAgaWYgKCFtYXJrZWQuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5leHQgPSBtYXJrZWQuc2xpY2UocHJlZml4Lmxlbmd0aCkuc3BsaXQoREVMSU0pWzBdO1xuICAgICAgaWYgKC9eKDB8WzEtOV1cXGQqKSQvLnRlc3QobmV4dCkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZGFjdGVkIHBhdGhzIHRoYXQgc3Vydml2ZSB0aGUgbmV0LWNoYW5nZSBmaWx0ZXI6IGEgcGF0aCBzdXJ2aXZlc1xuICAgKiB3aGVuIGl0IElTIGEgc3Vydml2aW5nIG9wIHBhdGggKGEgd2hvbGUta2V5IHJlZGFjdGlvbikgb3Igc2l0cyBVTkRFUiBvbmVcbiAgICogKGEgZmllbGQgaW5zaWRlIGEgc3Vydml2aW5nIHdyaXRlKS4gQSBkcm9wcGVkIG9wIHRha2VzIGl0cyBmaWVsZHMgd2l0aCBpdC5cbiAgICovXG4gIHByaXZhdGUgc3Vydml2aW5nUmVkYWN0ZWRQYXRocyhzdXJ2aXZpbmdQYXRoczogU2V0PHN0cmluZz4pOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMucmVkYWN0ZWRQYXRocykge1xuICAgICAgaWYgKHN1cnZpdmluZ1BhdGhzLmhhcyhwYXRoKSkge1xuICAgICAgICBvdXQuYWRkKHBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qgb3Agb2Ygc3Vydml2aW5nUGF0aHMpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChvcCArIERFTElNKSkge1xuICAgICAgICAgIG91dC5hZGQocGF0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGN1cnJlbnQgdmFsdWUgYXQgcGF0aCAoaW5jbHVkZXMgdW5jb21taXR0ZWQgY2hhbmdlcykuIFRoZSB2YWx1ZSBpc1xuICAgKiB0aGUgc3RhZ2UncyBvd24g4oCUIHByaXZhdGUgdG8gaXQsIGFzIHRoZSB3aG9sZS1zdGF0ZSBjbG9uZSBtYWRlIGV2ZXJ5IHJlYWRcbiAgICogYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlIGJlZm9yZSA5LjI5LjAgKGBwcml2YXRpc2VgKS5cbiAgICovXG4gIGdldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpIHtcbiAgICB0aGlzLnByaXZhdGlzZShwYXRoKTtcbiAgICByZXR1cm4gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIHdvcmtpbmcgY29weSBhdCBgcGF0aGAgV0lUSE9VVCB0YWtpbmcgYSBwcml2YXRlIGNvcHkg4oCUIGZvciBhXG4gICAqIHJlYWRlciB0aGF0IG9ubHkgY29tcGFyZXMgKHRoZSBkZXYtbW9kZSBib3Jyb3dlZC1tdXRhdGlvbiByZXBvcnQgaW5cbiAgICogYFN0YWdlQ29udGV4dC5jb21taXRgKSwgbmV2ZXIgZm9yIGEgdmFsdWUgaGFuZGVkIHRvIGEgc3RhZ2UuXG4gICAqL1xuICBwZWVrKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBkaWZmIGJhc2UgZXhhY3QgdW5kZXIgYSByZWFkIHRoZSB3b3JraW5nIGNvcHkgY2Fubm90IGFuc3dlci5cbiAgICpcbiAgICogV2hlbiBgd29ya2luZ0NvcHlgIGhvbGRzIG5vdGhpbmcgYXQgYHBhdGhgIOKAlCB0aGUgc3RhZ2UgZGVsZXRlZCBvciB1bnNldFxuICAgKiBpdCwgb3IgYSB3cml0ZSByZXBsYWNlZCBhIGNvbnRhaW5lciBhYm92ZSBpdCDigJQgYFJlY29yZEZyYW1lIMK3IHJlYWRgXG4gICAqIHNlcnZlcyB0aGUgcmVhZCBmcm9tIExJVkUgY29tbWl0dGVkIHN0YXRlLCBleGFjdGx5IGFzIDkuMjguMFxuICAgKiBkaWQsIHNvIHRoZSB2YWx1ZSBpdCBoYW5kcyBvdXQgaXMgY29tbWl0dGVkIHN0YXRlIGl0c2VsZi4gT24gOS4yOC4wIHRoZVxuICAgKiBkaWZmIGJhc2Ugd2FzIGEgd2hvbGUtc3RhdGUgY2xvbmUgdGFrZW4gYXQgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUsIGFuZFxuICAgKiBhbiBpbi1wbGFjZSBlZGl0IG9mIHRoYXQgdmFsdWUgKG91dCBvZiBjb250cmFjdCDigJQgcmVhZHMgYXJlIGJvcnJvd2VkKVxuICAgKiBjb3VsZCBub3QgbW92ZSBpdDogd3JpdHRlbiBiYWNrLCB0aGUgZWRpdCB3YXMgcmVjb3JkZWQuIEhlcmUgdGhlIGRpZmZcbiAgICogYmFzZSBJUyBhIGNvbW1pdHRlZCBnZW5lcmF0aW9uLCBhbmQgaXQgdmVyeSBvZnRlbiBob2xkcyB0aGF0IHNhbWVcbiAgICogY29udGFpbmVyIGF0IGBwYXRoYCDigJQgdGhlIGVkaXQgd291bGQgbW92ZSB0aGUgYmFzZSB3aXRoIGl0LCBhbmQgdGhlXG4gICAqIHdyaXRlLWJhY2sgd291bGQgY29tbWl0IG5vIGNoYW5nZS4gU28gYmVmb3JlIHRoZSB2YWx1ZSBnb2VzIG91dCwgdGhlXG4gICAqIGJhc2UncyB2YWx1ZSBhdCBgcGF0aGAgaXMgcmVwbGFjZWQgYnkgYSBwcml2YXRlIGRlZXAgY29weSAodGhlIGJhc2Unc1xuICAgKiByb290IGFuZCB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IGNvcGllZCBzaGFsbG93bHkpIOKAlCB3aGF0IDkuMjguMCdzXG4gICAqIGJhc2UgaGVsZCB0aGVyZS4gVGhlIGNvbW1pdCdzIG5ldC1jaGFuZ2UgdGVzdCBjb21wYXJlcyBhZ2FpbnN0IGl0IGFuZFxuICAgKiB0aGUgZGVsdGEgZW5jb2RlciByZXBsYXlzIGZyb20gaXQ7IHRoZSB2YWx1ZSBoYW5kZWQgb3V0IHN0YXlzIHRoZSBsaXZlXG4gICAqIG9uZSwgc28gd2hhdGV2ZXIgZWxzZSBhbiBlZGl0IG9mIGl0IHJlYWNoZXMgKGxpdmUgc3RhdGUsIHRoZSBuZXh0XG4gICAqIGdlbmVyYXRpb24pIGJlaGF2ZXMgYXMgb24gOS4yOC4wIHRvby5cbiAgICpcbiAgICogTm90IGBwcml2YXRpc2VgOiBhIHByaXZhdGUgY29weSBoYW5kZWQgdG8gdGhlIHN0YWdlIHdvdWxkIGFsc28ga2VlcCB0aGVcbiAgICogZWRpdCBvdXQgb2YgbGl2ZSBzdGF0ZSwgd2hlcmUgOS4yOC4wIGxldCBpdCBpbiDigJQgYSBydW4tbmFtZXNwYWNlZCByZWFkXG4gICAqIHRoYXQgZmFsbHMgYmFjayB0byBhIGdsb2JhbCBrZXkgd291bGQgdGhlbiBlbmQgZGlmZmVyZW50bHkgKHRoZVxuICAgKiBkaWZmZXJlbnRpYWwncyBORVNURUQgZmFtaWx5IGZhaWxzIHdpdGhpbiAxMDAgcHJvZ3JhbXMgdGhhdCB3YXkpLlxuICAgKlxuICAgKiBDb3BpZXMgbm90aGluZyB3aGVuIHRoZSBiYXNlIGhvbGRzIG5vIGNvbnRhaW5lciBhdCBgcGF0aGAsIGFuZCBub3RoaW5nXG4gICAqIHR3aWNlOiBhIHBhdGggYXQgb3IgYmVsb3cgYW4gZWFybGllciBkZXRhY2ggaXMgYWxyZWFkeSBwcml2YXRlLiBPKHBhdGgpXG4gICAqIG90aGVyd2lzZSwgcGx1cyBPKHZhbHVlKSBvbmNlIHBlciBkZXRhY2hlZCBwYXRoLlxuICAgKi9cbiAgZGV0YWNoQmFzZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwIHx8ICFpc0NvbnRhaW5lcih0aGlzLmJhc2VTbmFwc2hvdCkpIHJldHVybjtcbiAgICBsZXQgYXQ6IG9iamVjdCA9IHRoaXMuYmFzZVNuYXBzaG90O1xuICAgIGZvciAoY29uc3QgayBvZiBwYXRoKSB7XG4gICAgICBpZiAodGhpcy5kZXRhY2hlZEJhc2U/LmhhcyhhdCkpIHJldHVybjtcbiAgICAgIGNvbnN0IGNoaWxkID0gb3duQ2hpbGQoYXQsIGspO1xuICAgICAgaWYgKCFpc0NvbnRhaW5lcihjaGlsZCkpIHJldHVybjtcbiAgICAgIGF0ID0gY2hpbGQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRldGFjaGVkQmFzZT8uaGFzKGF0KSkgcmV0dXJuO1xuICAgIGNvbnN0IG93bmVkID0gKHRoaXMuYmFzZU93bmVkID8/PSBuZXcgV2Vha1NldDxvYmplY3Q+KCkpO1xuICAgIGlmICghb3duZWQuaGFzKHRoaXMuYmFzZVNuYXBzaG90KSkgdGhpcy5iYXNlU25hcHNob3QgPSBvd25lZFJvb3RPZih0aGlzLmJhc2VTbmFwc2hvdCwgb3duZWQpO1xuICAgIG93blNwaW5lKHRoaXMuYmFzZVNuYXBzaG90LCBwYXRoLCBvd25lZCk7XG4gICAgY29uc3QgY29weTogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGF0KTtcbiAgICAodGhpcy5kZXRhY2hlZEJhc2UgPz89IG5ldyBXZWFrU2V0PG9iamVjdD4oKSkuYWRkKGNvcHkpO1xuICAgIF9zZXQodGhpcy5iYXNlU25hcHNob3QsIHBhdGgsIGNvcHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcmVhZHMgKDkuMjkuMCk6IG1ha2UgdGhlIHZhbHVlIGF0IGBwYXRoYCB0aGUgc3RhZ2UncyBvd24gYmVmb3JlXG4gICAqIGEgcmVhZCBoYW5kcyBpdCBvdXQg4oCUIHNvIGEgcmVhZCBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBiZWhhdmVzXG4gICAqIGV4YWN0bHkgYXMgaXQgZGlkIHdoZW4gdGhlIGJ1ZmZlciBiZWdhbiB3aXRoIGEgZGVlcCBjbG9uZSBvZiB0aGUgd2hvbGVcbiAgICogc3RhdGUuIEFuIGluLXBsYWNlIGVkaXQgb2Ygd2hhdCB0aGUgcmVhZCByZXR1cm5lZCAob3V0IG9mIGNvbnRyYWN0IOKAlFxuICAgKiByZWFkcyBhcmUgYm9ycm93ZWQpIHN0YXlzIGluc2lkZSB0aGUgYnVmZmVyLCBhbmQgY29tbWl0dGVkIHN0YXRlIGlzIG5ldmVyXG4gICAqIHRvdWNoZWQuIFdoZXRoZXIgdGhlIFJFQ09SRCBrZWVwcyBpdCBpcyB0aGUgYWRtaXR0ZWQgcmVjb3JkJ3MgbGF3XG4gICAqICg5LjMwLjAsIG93bmVyIHJ1bGluZyBSMSDigJQgdGhlIHJlY29yZCBrZWVwcyB3aGF0IHRoZSBzdGFnZSByZWFkIGJhY2spOiBpdFxuICAgKiBpcyBrZXB0IHdoZW4gdGhlIGVkaXRlZCB2YWx1ZSBsaWVzIGF0IG9yIGJlbG93IGEgcGF0aCB0aGUgc3RhZ2Ugd3JvdGUgaW5cbiAgICogdGhpcyBzdGFnZSDigJQgc2V0LCBtZXJnZWQgb3Igd3JpdHRlbiBiYWNrIGFsaWtlIOKAlCBhbmQgbG9zdCBvdGhlcndpc2UuXG4gICAqXG4gICAqIFdhbGtpbmcgdGhlIHBhdGggZnJvbSB0aGUgKG93bmVkKSByb290OlxuICAgKiAgLSBhIGNvbnRhaW5lciBzdGlsbCBTSEFSRUQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXQgdGhlIHNhbWUgcG9zaXRpb24gaXNcbiAgICogICAgcmVwbGFjZWQgYnkgYSBwcml2YXRlIGRlZXAgY29weSB3aGVuIGl0IGlzIHRoZSB2YWx1ZSByZWFkLCBvciBieSBhXG4gICAqICAgIHNoYWxsb3cgY29weSB3aGVuIGl0IGlzIGEgY29udGFpbmVyIG9uIHRoZSB3YXkgdG8gaXQgKHNvIGEgcmVhZCBvZlxuICAgKiAgICBga2AgdW5kZXIgYSBmb3JrIGNoaWxkJ3MgYWRkcmVzcyBjb3BpZXMgYGtgLCBub3QgZXZlcnkgY2hpbGQncyBuYW1lc3BhY2UpO1xuICAgKiAgLSBhIGNvbnRhaW5lciB0aGUgc3RhZ2UgU1RBR0VEIChvciBhbnl0aGluZyBlbHNlIHRoZSBidWZmZXIgZGlkIG5vdFxuICAgKiAgICB0YWtlIGZyb20gY29tbWl0dGVkIHN0YXRlKSBpcyBoYW5kZWQgYmFjayBieSByZWZlcmVuY2UsIGFzIGJlZm9yZTtcbiAgICogIC0gYSBjb250YWluZXIgdGhlIGJ1ZmZlciBvd25zIGlzIHdhbGtlZCBvbiDigJQgYW5kIHdoZW4gaXQgaXMgdGhlIHZhbHVlXG4gICAqICAgIHJlYWQsIGl0cyBzdGlsbC1zaGFyZWQgZGVzY2VuZGFudHMgYXJlIHByaXZhdGlzZWRcbiAgICogICAgKHtAbGluayBwcml2YXRpc2VCZWxvd30pLlxuICAgKlxuICAgKiBDb3N0OiBPKHBhdGgpIHBlciByZWFkLCBwbHVzIE8odmFsdWUpIE9OQ0UgcGVyIHNoYXJlZCBjb250YWluZXIgYSBzdGFnZVxuICAgKiByZWFkcyBhZnRlciBpdHMgZmlyc3Qgd3JpdGUuIEEgc3RhZ2UgdGhhdCBuZXZlciByZWFkcyBhZnRlciB3cml0aW5nIHBheXNcbiAgICogbm90aGluZzsgYSByZWFkIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgbmV2ZXIgcmVhY2hlcyB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIC8vIFJlc29sdmUgZmlyc3Q6IGEgcmVhZCB0aGF0IGxhbmRzIG9uIG5vdGhpbmcgKGEgbWlzc2luZyBrZXksIGEgcmVmdXNlZFxuICAgIC8vIHNlZ21lbnQsIGEgcHJpbWl0aXZlKSByZXR1cm5zIG5vdGhpbmcgYW5kIG11c3QgY29weSBub3RoaW5nLlxuICAgIGNvbnN0IGNoYWluOiBvYmplY3RbXSA9IFtdO1xuICAgIGxldCBhdDogdW5rbm93biA9IHRoaXMud29ya2luZ0NvcHk7XG4gICAgZm9yIChjb25zdCBrIG9mIHBhdGgpIHtcbiAgICAgIGF0ID0gb3duQ2hpbGQoYXQsIGspO1xuICAgICAgaWYgKCFpc0NvbnRhaW5lcihhdCkpIHJldHVybjtcbiAgICAgIGNoYWluLnB1c2goYXQpO1xuICAgIH1cbiAgICBsZXQgcGFyZW50OiBhbnkgPSB0aGlzLndvcmtpbmdDb3B5O1xuICAgIGxldCBiYXNlOiB1bmtub3duID0gdGhpcy5iYXNlU25hcHNob3Q7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gcGF0aFtpXTtcbiAgICAgIGNvbnN0IGF0QmFzZSA9IG93bkNoaWxkKGJhc2UsIGspO1xuICAgICAgbGV0IHZhbHVlID0gY2hhaW5baV07XG4gICAgICBpZiAoIXRoaXMub3duZWQuaGFzKHZhbHVlKSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IGF0QmFzZSB8fCB0aGlzLnN0YWdlZC5oYXModmFsdWUpKSByZXR1cm47XG4gICAgICAgIGlmIChpID09PSBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBwdXRPd24ocGFyZW50LCBrLCB0aGlzLnByaXZhdGVDb3B5T2YodmFsdWUpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBzaGFsbG93Q29weSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub3duZWQuYWRkKHZhbHVlKTtcbiAgICAgICAgcHV0T3duKHBhcmVudCwgaywgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gdmFsdWU7XG4gICAgICBiYXNlID0gYXRCYXNlO1xuICAgIH1cbiAgICB0aGlzLnByaXZhdGlzZUJlbG93KHBhcmVudCwgYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gT1dORUQgY29udGFpbmVyIGlzIGFib3V0IHRvIGJlIHJlYWQgd2hvbGUgKGEgcGF0aCBjb3B5IGEgbmVzdGVkIHdyaXRlXG4gICAqIG1hZGUsIHNheSk6IGl0cyBkZXNjZW5kYW50cyBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXJlXG4gICAqIHJlcGxhY2VkIGJ5IHByaXZhdGUgZGVlcCBjb3BpZXMsIHNvIG5vdGhpbmcgdGhlIHJlYWQgaGFuZHMgb3V0IGlzXG4gICAqIGNvbW1pdHRlZCBzdGF0ZS4gV2Fsa3Mgb3duZWQgY29udGFpbmVycyBvbmx5OyBtYXJrcyBlYWNoIG9uZSBmaW5pc2hlZFxuICAgKiAoe0BsaW5rIHByaXZhdGVUcmVlc30pLCBzbyBhIGNvbnRhaW5lciBpcyBzY2FubmVkIG9uY2UgcGVyIHN0YWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2VCZWxvdyhjb250YWluZXI6IG9iamVjdCwgYmFzZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHdvcms6IEFycmF5PFtvYmplY3QsIHVua25vd25dPiA9IFtbY29udGFpbmVyLCBiYXNlXV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW25vZGUsIG5vZGVCYXNlXSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKHRoaXMucHJpdmF0ZVRyZWVzLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKG5vZGUsIGtleSk7XG4gICAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQobm9kZUJhc2UsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLm93bmVkLmhhcyhjaGlsZCkpIHdvcmsucHVzaChbY2hpbGQsIGF0QmFzZV0pO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCA9PT0gYXRCYXNlICYmICF0aGlzLnN0YWdlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgcHV0T3duKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleSwgdGhpcy5wcml2YXRlQ29weU9mKGNoaWxkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQSBwcml2YXRlIGRlZXAgY29weSBvZiBhIGNvbW1pdHRlZCBjb250YWluZXIg4oCUIG93bmVkIHRocm91Z2ggYW5kIHRocm91Z2guICovXG4gIHByaXZhdGUgcHJpdmF0ZUNvcHlPZih2YWx1ZTogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICBhZG9wdChjb3B5LCB0aGlzLm93bmVkKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQoY29weSk7XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIGFueSBzdGFnZWQgb3AgdG91Y2ggYHBhdGhgLCBvciBhIHBhdGggYWJvdmUgb3IgYmVsb3cgaXQ/XG4gICAqXG4gICAqIFRoZSBkZXYtbW9kZSBib3Jyb3dlZC1yZWFkIGNoZWNrIChgU3RhZ2VDb250ZXh0LmNvbW1pdGApIGFza3MgdGhpcyBiZWZvcmVcbiAgICogYWNjdXNpbmcgYSBzdGFnZSBvZiBtdXRhdGluZyBhIHZhbHVlIGluIHBsYWNlOiBhIGtleSB0aGUgc3RhZ2UgbGVnaXRpbWF0ZWx5XG4gICAqIFdST1RFIGlzIGV4cGVjdGVkIHRvIGRpZmZlciBmcm9tIHdoYXQgaXQgcmVhZCwgYW5kIHdyaXRlcyByZWFjaCB0aGUgYnVmZmVyXG4gICAqIGZyb20gcGF0aHMgdGhhdCBieXBhc3MgdXNlci1sZXZlbCB3cml0ZSB0cmFja2luZyB0b28gKHRoZSBzdWJmbG93IHNlZWQsXG4gICAqIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIHRoZSByZXN1bWUgcmUtc2VlZCkuIERldi1tb2RlIG9ubHkg4oCUIG5vdGhpbmcgb25cbiAgICogdGhlIGhvdCBwYXRoIGNhbGxzIGl0LlxuICAgKi9cbiAgd2FzU3RhZ2VkKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgICBjb25zdCB0YXJnZXQgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICAvLyBPbiB0aGUgcGF0aCwgYmVsb3cgaXQgb3IgYWJvdmUgaXQg4oCUIHRoZSBvbmUgcGF0aCByZWxhdGlvbiBldmVyeSBrZXkgcXVlcnkgYXNrcy5cbiAgICAgIGlmIChyZWxhdGlvbihvcC5wYXRoLCB0YXJnZXQpICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggYWxsIHN0YWdlZCBtdXRhdGlvbnMgYW5kIHJldHVybiB0aGUgY29tbWl0IGJ1bmRsZSDigJQgcmVjb3JkaW5nIHRoZVxuICAgKiBzdGFnZSdzIE5FVCBDSEFOR0UsIG5vdCBpdHMgcmF3IHdyaXRlIGxvZy5cbiAgICpcbiAgICog4pSA4pSAIFdIWSAodGhlIGRlZmVjdCB0aGlzIGZpeGVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogUHJldmlvdXNseSBldmVyeSBgc2V0YC9gbWVyZ2VgIHdhcyByZWNvcmRlZCB2ZXJiYXRpbSwgc28gdGhlIGNvbW1pdCBidW5kbGVcbiAgICogd2FzIGEgbG9nIG9mICpvcGVyYXRpb25zKiByYXRoZXIgdGhhbiAqY2hhbmdlcyouIFR3byBvcGVyYXRpb25zIHByb2R1Y2Ugbm9cbiAgICogbmV0IGNoYW5nZSB5ZXQgd2VyZSBzdGlsbCBjb21taXR0ZWQgYXMgXCJtdXRhdGlvbnNcIjpcbiAgICpcbiAgICogICAxLiBOby1vcCB3cml0ZSAgIOKAlCB3cml0aW5nIGEga2V5IHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhvbGRzIChlLmcuIGFuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFnZW50IGNvbnRleHQgc2xvdCByZS1lbWl0dGluZyBpZGVudGljYWwgY29udGVudCBldmVyeVxuICAgKiAgICAgICAgICAgICAgICAgICAgICB0dXJuKS4gYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTEuXG4gICAqICAgMi4gV3JpdGUtcmV2ZXJ0ICDigJQgY2hhbmdpbmcgdGhlbiByZXN0b3JpbmcgYSBrZXkgd2l0aGluIG9uZSBzdGFnZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTIgdGhlbiBLPTEuXG4gICAqXG4gICAqIFJlY29yZGluZyB0aGVzZSBhcyBtdXRhdGlvbnMgKGEpIGJsb2F0ZWQgY2F1c2FsIHNsaWNpbmcgLyBiYWNrdHJhY2tpbmcgd2l0aFxuICAgKiBzcHVyaW91cyBkZXBlbmRlbmNpZXMgb24gaW50ZXJtZWRpYXRlIHZhbHVlcyB0aGF0IG5ldmVyIHJlYWNoIGZpbmFsIHN0YXRlLFxuICAgKiBhbmQgKGIpIG1hZGUgZG93bnN0cmVhbSBcIndoYXQgY2hhbmdlZCBoZXJlP1wiIGNvbnN1bWVycyBsaWdodCB1cCBzdGFnZXMgdGhhdFxuICAgKiBjaGFuZ2VkIG5vdGhpbmcg4oCUIG1vc3QgdmlzaWJseSB0aGUgbGVucyBoaWdobGlnaHQgZmxhZ2dpbmcgZXZlcnkgc2xvdC5cbiAgICpcbiAgICog4pSA4pSAIEhPVyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogQXQgY29tbWl0IHdlIGhvbGQgQk9USCBgYmFzZVNuYXBzaG90YCAoc3RhdGUgd2hlbiB0aGUgc3RhZ2UgYmVnYW4pIGFuZFxuICAgKiBgd29ya2luZ0NvcHlgIChzdGF0ZSBhZnRlciBhbGwgaXRzIHdyaXRlcykuIEZvciBlYWNoIHBhdGggdGhlIHN0YWdlIHRvdWNoZWRcbiAgICogd2Uga2VlcCBpdCBpbiB0aGUgYnVuZGxlIE9OTFkgaWYgaXRzIGZpbmFsIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZVxuICAgKiB2YWx1ZSAoe0BsaW5rIGRlZXBFcXVhbH0pLiBOby1vcCBBTkQgd3JpdGUtcmV2ZXJ0IHBhdGhzIGRyb3Agb3V0LCBiZWNhdXNlXG4gICAqIGJvdGggY29tcGFyZSBlcXVhbCB0byBiYXNlLiBUaGlzIGlzIGEgc2luZ2xlIG5ldC1kZWx0YSBkaWZmIGF0IGNvbW1pdCB0aW1lXG4gICAqIOKAlCBvbmUgZGVlcCBjb21wYXJlIHBlciB0b3VjaGVkIHBhdGgsIE8oY2hhbmdlZCBzdGF0ZSksIHBhaWQgb25jZSBwZXIgc3RhZ2VcbiAgICogKE5PVCBwZXIgd3JpdGUpLiBBIG5haXZlIHBlci13cml0ZSBkZWVwLWVxdWFsIHNraXAgd291bGQgYmUgbW9yZSBleHBlbnNpdmVcbiAgICogYW5kIHdvdWxkIHN0aWxsIG1pc3Mgd3JpdGUtcmV2ZXJ0ICh0aGUgaW50ZXJtZWRpYXRlIHdyaXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICogdmFsdWUgcHJlc2VudCBhdCB0aGUgbW9tZW50IG9mIHdyaXRpbmcpLlxuICAgKlxuICAgKiDilIDilIAgVFdPIEhPTkVTVCBUSUVSUyAoYnkgZGVzaWduIOKAlCBkbyBub3QgXCJ1bmlmeVwiIHRoZW0pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiAgIOKAoiBjb21taXQgKGhlcmUpICAgPSBDSEFOR0UtbGV2ZWwg4oCUIHRydXRoZnVsIG5ldCBkZWx0YS4gRmVlZHMgdGhlIGNvbW1pdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbG9nLCBjYXVzYWwgY2hhaW4sIG5hcnJhdGl2ZSwgYW5kIHRoZSBsZW5zIGhpZ2hsaWdodC5cbiAgICogICDigKIgYG9uV3JpdGVgIGV2ZW50ID0gT1AtbGV2ZWwg4oCUIGZpcmVzIG9uIEVWRVJZIHdyaXRlIGF0dGVtcHQgcmVnYXJkbGVzcyBvZlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbmV0IGNoYW5nZS4gRmVlZHMgbWV0cmljcyAvIGJlaGF2aW91cmFsIG9ic2VydmFiaWxpdHlcbiAgICogICAgICAgICAgICAgICAgICAgICAgIChhIGRlYnVnZ2VyIHdhbnRzIHRvIHNlZSBcIndyb3RlIDIsIHRoZW4gcmV2ZXJ0ZWRcIikuXG4gICAqIGBvbldyaXRlYCBpcyB1bmNoYW5nZWQgYnkgdGhpcyBtZXRob2Q7IG9ubHkgdGhlIENPTU1JVCBiZWNvbWVzIGNoYW5nZS1vbmx5LlxuICAgKlxuICAgKiDilIDilIAgRU1QVFkgQ09NTUlUUyBBUkUgSU5URU5USU9OQUwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEEgc3RhZ2UgdGhhdCBuZXRzIG5vIGNoYW5nZSBjb21taXRzIGFuIEVNUFRZIHBhdGNoIOKAlCBOT1Qgbm90aGluZy5cbiAgICoge0BsaW5rIFN0YWdlQ29udGV4dC5jb21taXR9IHN0aWxsIHJlY29yZHMgdGhlIGJ1bmRsZSB1bmNvbmRpdGlvbmFsbHksIHNvXG4gICAqIGV2ZXJ5IGV4ZWN1dGVkIHN0YWdlIHJlbWFpbnMgYSB0aW1lLXRyYXZlbCBjdXJzb3Igc3RvcCAoaXRzIGBydW50aW1lU3RhZ2VJZGBcbiAgICogbWFya2VyIGlzIHByZXNlcnZlZCk7IG9ubHkgaXRzIFBBVENIIGlzIGVtcHR5LiBUaGlzIGlzIHdoYXQga2VlcHMgdGhlXG4gICAqIGNvbW1pdC1pbmRleGVkIHNsaWRlciBzdGFibGUgd2hpbGUgbWFraW5nIHRoZSBoaWdobGlnaHQgdHJ1dGhmdWwuXG4gICAqXG4gICAqIOKUgOKUgCBLTk9XTiBMSU1JVEFUSU9OUyAvIEZVVFVSRSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgRXhwbGljaXQga2V5IERFTEVUSU9OIHVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIGlzIHN0aWxsXG4gICAqICAgICBmbGF0dGVuZWQgdG8gc2V0LW9mLWB1bmRlZmluZWRgIChhIHJlbW92ZWQga2V5IGNhbm5vdCBiZSBleHByZXNzZWRcbiAgICogICAgIGluIE1lbW9yeVBhdGNoIGFsb25lKS4gQ0xPU0VEIHVuZGVyIGBjb21taXRWYWx1ZXM6ICdkZWx0YSdgICgjMTNjLUIpOlxuICAgKiAgICAge0BsaW5rIGRlbGV0ZX0gc3RhZ2VzIGEgZGlzdGluY3Qgb3AgYW5kIHRoZSBidW5kbGUgY2FycmllcyBhIHJlYWxcbiAgICogICAgIGBkZWxldGVgIHRyYWNlIHZlcmIgd2hvc2UgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIH0ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmNvbW1pdFZhbHVlcyA9PT0gJ2RlbHRhJyA/IHRoaXMudG9EZWx0YVBheWxvYWQoKSA6IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuICAgIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSB0aGlzLnN1cnZpdmluZ1JlZGFjdGVkUGF0aHMobmV3IFNldChyb3dzLnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSkpO1xuICAgIC8vIFRoZSBidW5kbGUncyBrZXkgb3JkZXIgaXMgYHJlY29yZENvbW1pdGAnczsgYSBkaXJlY3QgY2FsbGVyIGtlZXBzIHRoaXMgc2FtZSBvcmRlci5cbiAgICBjb25zdCBwYXlsb2FkID0geyBvdmVyd3JpdGU6IHJvd3Mub3ZlcndyaXRlLCB1cGRhdGVzOiByb3dzLnVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlOiByb3dzLnRyYWNlIH07XG5cbiAgICB0aGlzLm92ZXJ3cml0ZVBhdGNoID0ge307XG4gICAgdGhpcy51cGRhdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMub3BUcmFjZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkYWN0ZWRQYXRocy5jbGVhcigpO1xuICAgIHRoaXMuaGVsZFJlZnMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG4gICAgdGhpcy5vd25lZCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5vd25lZC5hZGQodGhpcy53b3JraW5nQ29weSk7XG4gICAgdGhpcy5zdGFnZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMucHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnN0YWdlZE1lcmdlcyA9IDA7XG4gICAgdGhpcy5uZXN0ZWRPcHMgPSAwO1xuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBvdmVyd3JpdGUgLyB1cGRhdGVzIC8gdHJhY2Uga2VlcGluZyBPTkxZIHBhdGhzIHdob3NlIGZpbmFsIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSB2YWx1ZSDigJQgaS5lLiB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlLiBTZWVcbiAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdH0gZm9yIHRoZSByYXRpb25hbGUuXG4gICAqXG4gICAqIFBhdGhzIGFyZSBjb21wYXJlZCBhdCB0aGUgZXhhY3QgZ3JhbnVsYXJpdHkgdGhleSB3ZXJlIHdyaXR0ZW4gKGVhY2ggdHJhY2VcbiAgICogZW50cnkncyBwYXRoKSwgYWdhaW5zdCBgd29ya2luZ0NvcHlgIChmaW5hbCkgdnMgYGJhc2VTbmFwc2hvdGAgKHN0YXJ0KS5cbiAgICogU3Vydml2aW5nIGBzZXRgIHBhdGhzIGNvcHkgdGhlaXIgZmluYWwgdmFsdWUgZnJvbSBgb3ZlcndyaXRlUGF0Y2hgO1xuICAgKiBzdXJ2aXZpbmcgYG1lcmdlYCBwYXRocyBjb3B5IHRoZWlyIGFjY3VtdWxhdGVkIGRlbHRhIGZyb20gYHVwZGF0ZVBhdGNoYCxcbiAgICoga2VlcGluZyB0aGUgc2V0LXZzLW1lcmdlIHZlcmIg4oCUIGFuZCB0aGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KTpcbiAgICogYSBmYW1pbHkgb2Ygcm93cyB3aG9zZSByZXBsYXkgZG9lcyBub3QgZ2l2ZSBiYWNrIHdoYXQgdGhlIHN0YWdlIHJlYWQgaXNcbiAgICogcmVjb3JkZWQgYXMgYHNldGAgcm93cyBvZiB0aGUgcmVhZC1iYWNrIGluc3RlYWQgKDkuMzAuMCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIERFRkFVTFQgKGBjb21taXRWYWx1ZXM6ICdmdWxsJ2ApIHBheWxvYWQsIGluY2x1ZGluZyB0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nIG9mIHN0YWdlZCBgZGVsZXRlYCBvcHMgaW50byBgc2V0YC1vZi1gdW5kZWZpbmVkYFxuICAgKiB0cmFjZSBlbnRyaWVzLiBUaGUgZGVsdGEgZW5jb2RpbmcgbGl2ZXMgaW4ge0BsaW5rIHRvRGVsdGFQYXlsb2FkfS5cbiAgICpcbiAgICogV29yaywgbm90IGJ5dGVzICg5LjIyLjEpOiB0aGUgbmV0LWNoYW5nZSB2ZXJkaWN0IGlzIHBhaWQgb25jZSBwZXIgUEFUSFxuICAgKiBhbmQgdGhlIGNsb25lIG9uY2UgcGVyIENPTlNFQ1VUSVZFIHJ1biBvZiBvcHMgb24gYSBwYXRoLCBub3Qgb25jZSBwZXIgb3BcbiAgICog4oCUIHNlZSB0aGUgdHdvIG1lbW9zIGluc2lkZS4gUGlubmVkIGJ5XG4gICAqIHRlc3QvbGliL21lbW9yeS9zY2VuYXJpby9yZXBlYXRlZC1wYXRoLWJ5dGUtaWRlbnRpdHkudGVzdC50cyBhZ2FpbnN0IHRoZVxuICAgKiA5LjIyLjAgYnl0ZXMuIFNpbmNlIDkuMjMuMCB0aGF0IGNsb25lIGlzIFRIRSBjbG9uZTogdGhlIHBhdGNoIHRyZWVzIGhvbGRcbiAgICogdGhlIGNhbGxlcidzIHJlZmVyZW5jZXMgKHNlZSB0aGUgY2xhc3MgaGVhZGVyKSwgc28gdGhpcyBsb29wIGlzIHRoZSBvbmVcbiAgICogcGxhY2UgdGhlIHJlY29yZCBpcyBkZXRhY2hlZCBmcm9tIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIHRvQ2hhbmdlT25seVBheWxvYWQoKTogUm93cyB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaXQoKGxvc3N5KSA9PiB0aGlzLmNoYW5nZU9ubHlSb3dzKGxvc3N5KSk7XG4gIH1cblxuICAvKiogVGhlICdmdWxsJyByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VPbmx5Um93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpOiBSb3dzIHtcbiAgICBjb25zdCByb3dzOiBSb3dzID0geyBvdmVyd3JpdGU6IHt9LCB1cGRhdGVzOiB7fSwgdHJhY2U6IFtdIH07XG4gICAgY29uc3QgeyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHRyYWNlIH0gPSByb3dzO1xuICAgIC8vIFBlciBQQVRILCBkZWNpZGVkIG9uY2UgKDkuMjIuMSk6IGJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZSBmaXhlZCBhdFxuICAgIC8vIGNvbW1pdCwgc28gZXZlcnkgbGF0ZXIgb3Agb24gYSBwYXRoIGdldHMgdGhlIHZlcmRpY3QgaXRzIGZpcnN0IG9wIGdvdC5cbiAgICAvLyBgdW5kZWZpbmVkYCA9IG5vdCB5ZXQgZGVjaWRlZDsgdGhlIHN1cnZpdmluZyBwYXRocyBhcmUgdGhlIGB0cnVlYCBrZXlzLlxuICAgIGNvbnN0IHN1cnZpdmVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgLy8gVGhlIHBhdGggdGhlIExBU1Qgc3Vydml2aW5nIG9wIGNvcGllZCBpbnRvIGVhY2ggcGF0Y2ggdHJlZSAoOS4yMi4xKS5cbiAgICAvLyBUaGUgdmFsdWUgYXQgYSBwYXRoIGlzIGZpeGVkIGF0IGNvbW1pdCwgc28gYW4gb3Agd2hvc2UgcHJlZGVjZXNzb3Igb25cbiAgICAvLyB0aGUgU0FNRSB0cmVlIGFscmVhZHkgY29waWVkIHRoYXQgcGF0aCB3b3VsZCB3cml0ZSB0aGUgc2FtZSBieXRlcyBvdmVyXG4gICAgLy8gdGhlIHNhbWUga2V5IOKAlCBpdCBrZWVwcyBpdHMgdHJhY2Ugcm93ICh0aGUgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsKSBhbmRcbiAgICAvLyBwYXlzIG5vIHNlY29uZCBjbG9uZS4gVGhlIDkuMjIuMCBlbGVtZW50LXdyaXRlIGZ1bm5lbCBzdGFnZXMgTlxuICAgIC8vIHdob2xlLWFycmF5IHNldHMgb24gT05FIHBhdGg7IHRoaXMgaXMgd2hhdCBtYWtlcyB0aGF0IGNvbW1pdCBPKE4pXG4gICAgLy8gaW5zdGVhZCBvZiBPKE4gw5cgb3BzKS4gQ09OU0VDVVRJVkUgb25seSDigJQgYW4gb3Agb24gYW5vdGhlciBwYXRoIGluXG4gICAgLy8gYmV0d2VlbiBtYXkgaGF2ZSBjb2VyY2VkIG9yIGdyb3duIHRoaXMgb25lJ3MgY29udGFpbmVyIChhIGRlc2NlbmRhbnRcbiAgICAvLyBgbmF0aXZlU2V0YCB0aHJvdWdoIGEgcHJpbWl0aXZlLCBhIGBrZXk6IHVuZGVmaW5lZGAgc2hlbGwpIGFuZCB0aGVcbiAgICAvLyByZS1jb3B5IGlzIHdoYXQgcmVwYWlycyBpdDsgYSBgbWVyZ2VgIGJldHdlZW4gdHdvIHNldHMgdG91Y2hlcyB0aGVcbiAgICAvLyBvdGhlciB0cmVlIGFuZCBkb2VzIG5vdCBjb3VudC4gU2FtZSBsYXcgYXMgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICAgIGxldCBsYXN0U2V0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0TWVyZ2VQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBmYW1pbHkgPSBsb3NzeT8uZmFtaWxpZXMuZ2V0KGxvc3N5LnJvb3RPZi5nZXQob3AucGF0aCkgYXMgc3RyaW5nKTtcbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaSA9PT0gZmFtaWx5LnNsb3QpIHtcbiAgICAgICAgICB0aGlzLmVtaXRSZWFkQmFjayhmYW1pbHksIHJvd3MsICdmdWxsJyk7XG4gICAgICAgICAgbGFzdFNldFBhdGggPSBsYXN0TWVyZ2VQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGtlZXAgPSBzdXJ2aXZlcy5nZXQob3AucGF0aCk7XG4gICAgICBpZiAoa2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtlZXAgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpO1xuICAgICAgICBzdXJ2aXZlcy5zZXQob3AucGF0aCwga2VlcCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtlZXApIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKGZsYXR0ZW5lZFRyYWNlUm93KG9wKSk7XG4gICAgICBpZiAob3AudmVyYiA9PT0gJ21lcmdlJykge1xuICAgICAgICBpZiAobGFzdE1lcmdlUGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RNZXJnZVBhdGggPSBvcC5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsYXN0U2V0UGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RTZXRQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGVsdGEtZW5jb2RlZCBwYXlsb2FkIChgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCwgIzEzYy1CKSDigJQgc2FtZSBuZXQtY2hhbmdlXG4gICAqIGZpbHRlciBhcyB7QGxpbmsgdG9DaGFuZ2VPbmx5UGF5bG9hZH0sIHRocmVlIGVuY29kaW5nIGRpZmZlcmVuY2VzOlxuICAgKlxuICAgKiAxLiAqKk9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgqKiAodGhlIMKnMi41IGRlZHVwIHJ1bGUg4oCUIGBhcHBlbmRgXG4gICAqICAgIGlzIE5PVCBpZGVtcG90ZW50IG9uIHJlcGxheSwgc28gZHVwbGljYXRlIGVudHJpZXMgd291bGQgbXVsdGlwbHlcbiAgICogICAgdGFpbHMpLiBUaGUgdmVyYiBpcyByZXNvbHZlZCBmcm9tIHRoZSBwYXRoJ3Mgb3AgbWl4ICsgYmFzZeKGkmZpbmFsXG4gICAqICAgIHJlbGF0aW9uc2hpcDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLFxuICAgKiAgICBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocy5cbiAgICogMi4gKipWZXJiIHJlc29sdXRpb24gcGVyIHBhdGgqKiDigJQgZm9yIGEgcGF0aCB3aXRoIE5PIHN1cnZpdmluZyByZWxhdGl2ZVxuICAgKiAgICAoc2VlIDMpOlxuICAgKiAgICAtIGxhc3Qgb3AgYCdkZWxldGUnYCBBTkQgZmluYWwgdmFsdWUgZ29uZSDihpIgYGRlbGV0ZWAgKHRoZSBwYXRoIHN0YXlzXG4gICAqICAgICAgZW51bWVyYXRlZCBpbiBgb3ZlcndyaXRlYCB3aXRoIGB1bmRlZmluZWRgIGZvciBrZXktc2V0IGNvbnN1bWVycykuXG4gICAqICAgICAgUmVxdWlyZXMgdGhlIHBhcmVudCB0byBiZSBhIHJlYWwgY29udGFpbmVyIGluIHRoZSBiYXNlIOKAlCByZXBsYXkgdXNlc1xuICAgKiAgICAgIGBuYXRpdmVEZWxldGVgLCB3aGljaCBpcyBpbmVydCBvbiBhIHByaW1pdGl2ZS9hYnNlbnQgcGFyZW50LCB3aGVyZWFzXG4gICAqICAgICAgdGhlIGAnZnVsbCdgIGZsYXR0ZW5pbmcgKGBfc2V0YCBvZiBgdW5kZWZpbmVkYCkgQ09FUkNFUyB0aGF0IHBhcmVudFxuICAgKiAgICAgIGludG8gYW4gb2JqZWN0OyB3aGVuIHRoZXkgd291bGQgZGlzYWdyZWUgd2Uga2VlcCB0aGUgZmxhdHRlbmluZztcbiAgICogICAgLSBPTkxZIGAnbWVyZ2UnYCBvcHMg4oaSIGBtZXJnZWAgd2l0aCB0aGUgYWNjdW11bGF0ZWQgYHVwZGF0ZVBhdGNoYFxuICAgKiAgICAgIGRlbHRhO1xuICAgKiAgICAtIG90aGVyd2lzZSAoYHNldGAvbWl4ZWQpOiB0aGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSB0aGVcbiAgICogICAgICBwYXRoICh7QGxpbmsgZnVsbFJvd3NWYWx1ZX0pLiBJZiBiYXNlIGFuZCB0aGF0IHZhbHVlIGFyZSBhcnJheXMgYW5kXG4gICAqICAgICAgYmFzZSBpcyBhIFNUUklDVCBQUkVGSVgg4oaSIGBhcHBlbmRgIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgZWxzZSBgc2V0YFxuICAgKiAgICAgIHN0b3JpbmcgdGhlIGZ1bGwgdmFsdWUuXG4gICAqIDMuICoqT1ZFUkxBUCBGQU1JTElFUyB0YWtlIHRoZSBmdWxsLXZhbHVlIGZhbGxiYWNrLioqIGBvdmVyd3JpdGVgIC9cbiAgICogICAgYHVwZGF0ZXNgIGFyZSBuZXN0ZWQgcGF0aCBUUkVFUywgc28gdHdvIHN1cnZpdmluZyBwYXRocyB3aGVyZSBvbmUgaXNcbiAgICogICAgYW4gYW5jZXN0b3Igb2YgdGhlIG90aGVyIChgYWAgYW5kIGBhLnBgKSBzaGFyZSBzdG9yYWdlLiBEZWx0YSdzXG4gICAqICAgIHBlci1wYXRoIGVuY29kaW5ncyB3b3VsZCBjbG9iYmVyIGVhY2ggb3RoZXIgdGhlcmUgKGFuIGBhcHBlbmRgXG4gICAqICAgIGFuY2VzdG9yIHN0b3JlcyBvbmx5IGEgVEFJTCwgYSBgZGVsZXRlYCBhbmNlc3RvciBgdW5kZWZpbmVkYCksIHNvIGV2ZXJ5XG4gICAqICAgIHBhdGggdGhhdCBoYXMgYSBzdXJ2aXZpbmcgYW5jZXN0b3IvZGVzY2VuZGFudCBpcyBjb21taXR0ZWQgYXMgYSBwbGFpblxuICAgKiAgICBgc2V0YCBvZiB0aGUgdmFsdWUgdGhlICdmdWxsJyByb3dzIGdpdmUgaXQsIGFuZCB0aGUgZmFtaWx5J3NcbiAgICogICAgc2hhbGxvd2VzdCBwYXRoICh3aG9zZSBzZXQgY292ZXJzIHRoZSB3aG9sZSBzdWJ0cmVlKSBpcyBlbWl0dGVkIExBU1QuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgaXMgQURNSVRURUQgKHtAbGluayBhZG1pdH0pIGxpa2UgdGhlICdmdWxsJyBwYXlsb2FkOiBhIGNvbXBhY3RcbiAgICogcm93IGlzIGtlcHQgb25seSB3aGVyZSB0aGUgYnVuZGxlIHByb3ZhYmx5IGZvbGRzIGJhY2ssIGFuZCBhIGZhbWlseSB0aGF0XG4gICAqIGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQuIFNvIGJvdGggZW5jb2RpbmdzIGNvbW1pdCB0aGVcbiAgICogdmFsdWUgdGhlIHN0YWdlIHJlYWQ7IGJlZm9yZSA5LjMwLjAgdGhleSBzaGFyZWQgYSByZXBsYXkgdGhhdCBkaWQgbm90XG4gICAqIChgcmVwbGF5UGF0aFZlcmJzYCAvIGByZXBsYXlGYW1pbHlWZXJic2AsIGRlbGV0ZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0RlbHRhUGF5bG9hZCgpOiBSb3dzIHtcbiAgICBjb25zdCBmdWxsVmFsdWVBdCA9IHRoaXMuZnVsbFJvd3NWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5kZWx0YVJvd3MobG9zc3ksIGZ1bGxWYWx1ZUF0KSk7XG4gIH1cblxuICAvKiogVGhlIGRlbHRhIHJvd3M7IGEgZmFtaWx5IGluIGBsb3NzeWAgaXMgd3JpdHRlbiBhcyBpdHMgcmVhZC1iYWNrLCBhdCBpdHMgbGFzdCB0b3VjaCAoe0BsaW5rIGVtaXRSZWFkQmFja30pLiAqL1xuICBwcml2YXRlIGRlbHRhUm93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQsIGZ1bGxWYWx1ZUF0OiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICBjb25zdCBpbkxvc3N5ID0gKHBhdGg6IHN0cmluZykgPT4gbG9zc3k/LmZhbWlsaWVzLmhhcyhsb3NzeS5yb290T2YuZ2V0KHBhdGgpIGFzIHN0cmluZykgPT09IHRydWU7XG4gICAgY29uc3Qgc3Vydml2b3JzID0gdGhpcy5uZXRDaGFuZ2VTdXJ2aXZvcnModGhpcy5vcHNCeVBhdGgoKSkuZmlsdGVyKChzKSA9PiAhaW5Mb3NzeShzLnBhdGgpKTtcbiAgICBjb25zdCB7IHJvb3RPZiwgYnlSb290IH0gPSBncm91cEludG9GYW1pbGllcyhzdXJ2aXZvcnMsIG5ldyBTZXQoc3Vydml2b3JzLm1hcCgocykgPT4gcy5wYXRoKSkpO1xuXG4gICAgLy8gVEhFIFZFUkIgQ0hPSUNFIOKAlCB0aGUgZGVsdGEgZW5jb2RlciBwaWNrcyBhIHZlcmIgcGVyIHBhdGg7IHRoZSBWQUxVRVNcbiAgICAvLyBpdCBlbmNvZGVzIGNvbWUgZnJvbSB0aGUgb25lIHJlcGxheSAoYGZ1bGxWYWx1ZUF0YCksIG5ldmVyIGEgcmVwbGljYSBvZlxuICAgIC8vIHRoZSB2ZXJiIGxhdyAoOS4zMC4wOiBDTEFVREUubWQncyB2ZXJiLXN3aXRjaCByZXBsaWNhcyBsb3N0IHR3byBoZXJlKS5cbiAgICBjb25zdCBlbWl0ID0gKHM6IFN1cnZpdm9yKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgYmVmb3JlIH0gPSBzO1xuICAgICAgY29uc3QgcHJvdiA9IHByb3ZlbmFuY2Uocy5yZWFkS2V5cyk7XG4gICAgICBpZiAoKGJ5Um9vdC5nZXQocm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpIGFzIFN1cnZpdm9yW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gUnVsZSAzIOKAlCBvbmUgY29oZXJlbnQgdHJlZTogZXZlcnkgbWVtYmVyIGEgc2V0IG9mIGl0cyB2YWx1ZS5cbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShmdWxsVmFsdWVBdChzZWdtZW50cykpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdFZlcmIgPSB2ZXJic1t2ZXJicy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChsYXN0VmVyYiA9PT0gJ2RlbGV0ZScgJiYgcy5hZnRlciA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50cykpIHtcbiAgICAgICAgLy8gUmVhbCBkZWxldGlvbiDigJQgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS4gS2VlcCB0aGUgcGF0aCBlbnVtZXJhdGVkXG4gICAgICAgIC8vIGluIGBvdmVyd3JpdGVgICh1bmRlZmluZWQpIHNvIE9iamVjdC5rZXlzIGNvbnN1bWVycyBzZWUgaXQuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnZGVsZXRlJywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCB1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmICh2ZXJicy5ldmVyeSgodikgPT4gdiA9PT0gJ21lcmdlJykpIHtcbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdtZXJnZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQodXBkYXRlcywgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFZhbHVlUm93KHJvd3MsIHBhdGgsIHNlZ21lbnRzLCBiZWZvcmUsIGZ1bGxWYWx1ZUF0KHNlZ21lbnRzKSwgcHJvdiwgdGhpcy5tYXJrZWRCZWxvdyhwYXRoKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEEgZmFtaWx5IHRoYXQgZGlkIG5vdCBmb2xkIGJhY2sgdGFrZXMgaXRzIHBsYWNlIGJ5IGl0cyBsYXN0IHRvdWNoLlxuICAgIGNvbnN0IHBlbmRpbmcgPSBsb3NzeSA9PT0gdW5kZWZpbmVkID8gW10gOiBbLi4ubG9zc3kuZmFtaWxpZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IGEuc2xvdCAtIGIuc2xvdCk7XG4gICAgbGV0IG5leHQgPSAwO1xuICAgIGNvbnN0IGZsdXNoQmVmb3JlID0gKHRvdWNoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHdoaWxlIChuZXh0IDwgcGVuZGluZy5sZW5ndGggJiYgcGVuZGluZ1tuZXh0XS5zbG90IDwgdG91Y2gpIHRoaXMuZW1pdFJlYWRCYWNrKHBlbmRpbmdbbmV4dCsrXSwgcm93cywgJ2RlbHRhJyk7XG4gICAgfTtcbiAgICBlbWl0SW5GYW1pbHlPcmRlcihzdXJ2aXZvcnMsIHJvb3RPZiwgYnlSb290LCBlbWl0LCBmbHVzaEJlZm9yZSk7XG4gICAgZmx1c2hCZWZvcmUoSW5maW5pdHkpO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBhZG1pdHRlZCByZWNvcmQgKDkuMzAuMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRIRSBBRE1JU1NJT04g4oCUIGEgY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFnZSdzIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkLiBgYnVpbGRgXG4gICAqIGxheXMgdGhlIHJvd3Mgb3V0IChvbmUgZW5jb2RlcjogYCdmdWxsJ2Agb3IgYCdkZWx0YSdgKTsgdGhlIGNhbmRpZGF0ZSBpc1xuICAgKiBjaGVja2VkICh7QGxpbmsgbG9zc3lGYW1pbGllc30pLCBhbmQgd2hlbiBzb21lIGZhbWlseSdzIHJvd3MgZG8gbm90IGZvbGRcbiAgICogYmFjayB0aGUgcm93cyBhcmUgbGFpZCBvdXQgYWdhaW4gd2l0aCB0aG9zZSBmYW1pbGllcyB3cml0dGVuIGFzIHdoYXQgdGhlXG4gICAqIHN0YWdlIHJlYWQgKHtAbGluayBlbWl0UmVhZEJhY2t9KSDigJQgZXZlcnkgb3RoZXIgZmFtaWx5J3MgYnl0ZXMgZXhhY3RseSBhc1xuICAgKiB0aGUgZmlyc3QgbGF5b3V0IG1hZGUgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgYWRtaXQoYnVpbGQ6IChsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpID0+IFJvd3MpOiBSb3dzIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBidWlsZCh1bmRlZmluZWQpO1xuICAgIGNvbnN0IGxvc3N5ID0gdGhpcy5sb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSk7XG4gICAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyBjYW5kaWRhdGUgOiBidWlsZChsb3NzeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZG8gbm90IGZvbGQgYmFjayB0byB3aGF0IHRoZSBzdGFnZSByZWFkIOKAlFxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChgYWRtaXNzaW9uLnRzIMK3IGxvc3N5RmFtaWxpZXNgOiB0aGVcbiAgICogY2FuZGlkYXRlIHJlcGxheWVkIG9udG8gdGhlIGRpZmYgYmFzZSBieSBgZHJ5Rm9sZGAsIGV2ZXJ5IGZhbWlseSBvZlxuICAgKiB0b3VjaGVkIHBhdGhzIGNvbXBhcmVkIHdpdGggdGhlIHdvcmtpbmcgY29weSBhdCBpdHMgcm9vdCBhbmQgb24gdGhlIHdheVxuICAgKiBkb3duIHRvIGl0KS5cbiAgICpcbiAgICogV2l0aG91dCBhIGZvbGQsIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBubyBgbWVyZ2VgIGFuZCBubyBuZXN0ZWQgb3A6IGl0c1xuICAgKiByb3dzIGFyZSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXIgaXRzIGFkZHJlc3MsIGVhY2hcbiAgICogd3JpdGluZyB0aGUgU0FNRSB2YWx1ZSBpbnRvIGB3b3JraW5nQ29weWAgYW5kIGBvdmVyd3JpdGVQYXRjaGAg4oCUIHRoZVxuICAgKiByZWNvcmQgaXMgdGhlIHJlYWQtYmFjayBieSBjb25zdHJ1Y3Rpb24gKHRoZSBwcm9wZXJ0eSdzIFJPT1QtT05MWSBhcm1cbiAgICogcGlucyB0aGlzKS4gVGhhdCBrZWVwcyB0aGUgY29tbWl0IG9mIHRoZSB0eXBlZCBzY29wZSdzIHJvb3Qta2V5IHdyaXRlc1xuICAgKiBleGFjdGx5IGFzIGNoZWFwIGFzIGl0IHdhcy5cbiAgICovXG4gIHByaXZhdGUgbG9zc3lGYW1pbGllcyhjYW5kaWRhdGU6IFJvd3MpOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBsb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSwgdGhpcy5iYXNlU25hcHNob3QsIHRoaXMud29ya2luZ0NvcHksIHRoaXMub3BUcmFjZSwgdGhpcy5hZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhbWlseSB3aG9zZSByb3dzIGRpZCBub3QgZm9sZCBiYWNrLCB3cml0dGVuIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQ6XG4gICAqIG9uZSBgc2V0YCByb3cgcGVyIG1lbWJlciB0aGF0IGNoYW5nZWQgKGRlc2NlbmRhbnRzIGJ5IGxhc3QgdG91Y2gsIGVhY2hcbiAgICogd2l0aCBpdHMgb3duIHJlYWQgcHJlZml4KSwgdGhlIFJPT1QgbGFzdCwgYW5kIHRoZSByb290J3MgcmVhZC1iYWNrIHZhbHVlXG4gICAqIGluIGBvdmVyd3JpdGVgIOKAlCBvbmUgY29oZXJlbnQgdHJlZSwgc28gbm8gcm93IGNhbiBjbG9iYmVyIGFub3RoZXIuIFRoZVxuICAgKiByb290J3Mgcm93IGlzIHdyaXR0ZW4gZXZlbiB3aGVuIHRoZSByb290IGl0c2VsZiBkaWQgbm90IGNoYW5nZTogaXQgaXMgdGhlXG4gICAqIHJvdyB0aGF0IGNhcnJpZXMgdGhlIGZhbWlseSdzIHJlYWQtYmFjayAoYW5kIHRoZSBjb250YWluZXJzIEwtMSdzIGRyb3BwZWRcbiAgICogb3AgbGVmdCkuIEEgbG9uZSByb290IHVuZGVyIGAnZGVsdGEnYCBrZWVwcyB0aGUgY29tcGFjdCBgYXBwZW5kYCB3aGVuIHRoZVxuICAgKiB2YWx1ZSBpdCByZWFkIGlzIGl0cyBiYXNlIHBsdXMgYSB0YWlsLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UmVhZEJhY2soZmFtaWx5OiBGYW1pbHksIHJvd3M6IFJvd3MsIGVuY29kaW5nOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgbGV0IHJvb3Q6IE1lbWJlciA9IGZhbWlseS5tZW1iZXJzWzBdO1xuICAgIGxldCBjaGFuZ2VkID0gMDtcbiAgICBmb3IgKGNvbnN0IG0gb2YgZmFtaWx5Lm1lbWJlcnMpIHtcbiAgICAgIGlmIChtLnBhdGggPT09IGZhbWlseS5yb290KSB7XG4gICAgICAgIHJvb3QgPSBtO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG0ucGF0aC5zcGxpdChERUxJTSkpKSBjb250aW51ZTtcbiAgICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IG0ucGF0aCwgdmVyYjogJ3NldCcsIC4uLnByb3ZlbmFuY2UobS5yZWFkS2V5cykgfSk7XG4gICAgICBjaGFuZ2VkKys7XG4gICAgfVxuICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdkZWx0YScgJiYgY2hhbmdlZCA9PT0gMCAmJiBhZnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICAgIHB1c2hWYWx1ZVJvdyhcbiAgICAgICAgcm93cyxcbiAgICAgICAgZmFtaWx5LnJvb3QsXG4gICAgICAgIGZhbWlseS5yb290U2VnbWVudHMsXG4gICAgICAgIGJlZm9yZSxcbiAgICAgICAgYWZ0ZXIsXG4gICAgICAgIHByb3ZlbmFuY2Uocm9vdC5yZWFkS2V5cyksXG4gICAgICAgIHRoaXMubWFya2VkQmVsb3coZmFtaWx5LnJvb3QpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcm93cy50cmFjZS5wdXNoKHsgcGF0aDogZmFtaWx5LnJvb3QsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpIH0pO1xuICAgIC8vIFRoZSBjbG9uZSB0aGUgY2hlY2sgdG9vayAoYGFkbWlzc2lvbi50cyDCtyBmb2xkc0JhY2tgKSwgd2hlbiBpdCB0b29rIG9uZS5cbiAgICBfc2V0KHJvd3Mub3ZlcndyaXRlLCBmYW1pbHkucm9vdFNlZ21lbnRzLCBmYW1pbHkuaGVsZCAhPT0gdW5kZWZpbmVkID8gZmFtaWx5LmhlbGQudmFsdWUgOiBzdHJ1Y3R1cmVkQ2xvbmUoYWZ0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSBhIHBhdGgg4oCUIHdoYXQgdGhlIGRlbHRhIGVuY29kZXJcbiAgICogY29tbWl0cyBmb3IgYSBmYW1pbHkgbWVtYmVyIG9yIGEgcGF0aCB3aXRoIGEgYHNldGAg4oCUIHJlYWQgZnJvbSBPTkVcbiAgICoge0BsaW5rIGRyeUZvbGR9IG9mIHRob3NlIHJvd3Mgb3ZlciB0aGUgcGF0Y2ggdHJlZXMgdGhlbXNlbHZlcywgdGFrZW4gdGhlXG4gICAqIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQuIEJ5IHJlZmVyZW5jZSwgYXMgdGhlIHN0YWdlIGhlbGQgdGhlbTogYW4gZWxlbWVudFxuICAgKiBhIGBzZXRgIGFuZCBhIGBtZXJnZWAgb2Ygb25lIHBhdGggc2hhcmUgc3RheXMgb25lIGVsZW1lbnQuIEEgc3RhZ2UgdGhhdFxuICAgKiBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wIG5lZWRzIG5vIGZvbGQg4oCUIGEgcGF0aCdzIHZhbHVlIGlzIGl0c1xuICAgKiBsYXN0IHN0YWdlZCB2YWx1ZS4gKEJlZm9yZSA5LjMwLjA6IHR3byByZXBsaWNhcyBvZiB0aGUgdmVyYiBsYXcsXG4gICAqIGByZXBsYXlQYXRoVmVyYnNgIGFuZCBgcmVwbGF5RmFtaWx5VmVyYnNgLilcbiAgICovXG4gIHByaXZhdGUgZnVsbFJvd3NWYWx1ZSgpOiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duIHtcbiAgICBpZiAodGhpcy5zdGFnZWRNZXJnZXMgPT09IDAgJiYgdGhpcy5uZXN0ZWRPcHMgPT09IDApIHJldHVybiAoc2VnbWVudHMpID0+IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpO1xuICAgIGxldCBmb2xkOiB1bmtub3duO1xuICAgIHJldHVybiAoc2VnbWVudHMpID0+IHtcbiAgICAgIGZvbGQgPz89IGRyeUZvbGQodGhpcy5iYXNlU25hcHNob3QsIHRoaXMudXBkYXRlUGF0Y2gsIHRoaXMub3ZlcndyaXRlUGF0Y2gsIHRoaXMuZnVsbFJvd3MoKSk7XG4gICAgICByZXR1cm4gX2dldChmb2xkLCBzZWdtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2UncyAnZnVsbCcgcm93czogZXZlcnkgb3Agb24gYSBwYXRoIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBrZWVwcywgYSBgZGVsZXRlYCBzcGVsbGVkIGBzZXRgLiAqL1xuICBwcml2YXRlIGZ1bGxSb3dzKCk6IFRyYWNlRW50cnlbXSB7XG4gICAgY29uc3Qga2VlcCA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIGNvbnN0IHJvd3M6IFRyYWNlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBsZXQgayA9IGtlZXAuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGsgPT09IHVuZGVmaW5lZCkga2VlcC5zZXQob3AucGF0aCwgKGsgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpKSk7XG4gICAgICBpZiAoaykgcm93cy5wdXNoKHsgcGF0aDogb3AucGF0aCwgdmVyYjogb3AudmVyYiA9PT0gJ21lcmdlJyA/ICdtZXJnZScgOiAnc2V0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSBzdGFnZSBjaGFuZ2UgdGhlIHZhbHVlIGF0IGBzZWdtZW50c2A/IEJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZVxuICAgKiBmaXhlZCBhdCBjb21taXQsIHNvIHRoaXMgaXMgdGhlIE9ORSBuZXQtY2hhbmdlIHZlcmRpY3QgYm90aCBwYXlsb2FkXG4gICAqIGVuY29kaW5ncyBhcHBseSAoYSBuby1vcCB3cml0ZSBhbmQgYSB3cml0ZS10aGVuLXJldmVydCBib3RoIGZhaWwgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkU2luY2VCYXNlKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGVlcEVxdWFsKF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKSwgX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGgg4oaSIGl0cyBvcC12ZXJiIHNlcXVlbmNlLCBvcmRlcmVkIGJ5IExBU1QgdG91Y2ggKGRlbGV0ZSArIHJlLWluc2VydFxuICAgKiBtb3ZlcyBhIHJlLXRvdWNoZWQgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBNYXAncyBpbnNlcnRpb24gb3JkZXIg4oCUXG4gICAqIHByZXNlcnZpbmcgbGFzdC13cml0ZXItd2lucyBmb3IgbmVzdGVkL292ZXJsYXBwaW5nIHBhdGhzKS4gUGVyLXdyaXRlXG4gICAqIHByb3ZlbmFuY2UgKCNQMSk6IHRoZSBMQVNUIG9wJ3MgcmVhZEtleXMgaXMga2VwdCDigJQgcmVhZCBwcmVmaXhlcyBvbmx5IGdyb3dcbiAgICogd2l0aGluIGEgc3RhZ2UsIHNvIGxhc3QgPT0gdW5pb24gYWNyb3NzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBvcHNCeVBhdGgoKTogTWFwPHN0cmluZywgeyB2ZXJiczogT3BWZXJiW107IHJlYWRLZXlzPzogc3RyaW5nW107IGxhc3Q6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBwcmV2ID0gYnlQYXRoLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHByZXYudmVyYnMucHVzaChvcC52ZXJiKTtcbiAgICAgICAgcHJldi5sYXN0ID0gaTtcbiAgICAgICAgaWYgKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQpIHByZXYucmVhZEtleXMgPSBvcC5yZWFkS2V5cztcbiAgICAgICAgYnlQYXRoLmRlbGV0ZShvcC5wYXRoKTtcbiAgICAgICAgYnlQYXRoLnNldChvcC5wYXRoLCBwcmV2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwge1xuICAgICAgICAgIHZlcmJzOiBbb3AudmVyYl0sXG4gICAgICAgICAgbGFzdDogaSxcbiAgICAgICAgICAuLi4ob3AucmVhZEtleXMgIT09IHVuZGVmaW5lZCAmJiB7IHJlYWRLZXlzOiBvcC5yZWFkS2V5cyB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBieVBhdGg7XG4gIH1cblxuICAvKiogVGhlIG5ldC1jaGFuZ2UgZmlsdGVyIOKAlCBpZGVudGljYWwgdG8gJ2Z1bGwnICh7QGxpbmsgY2hhbmdlZFNpbmNlQmFzZX0pLiBTdXJ2aXZvcnMga2VlcCBsYXN0LXRvdWNoIG9yZGVyLiAqL1xuICBwcml2YXRlIG5ldENoYW5nZVN1cnZpdm9ycyhieVBhdGg6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4pOiBTdXJ2aXZvcltdIHtcbiAgICBjb25zdCBzdXJ2aXZvcnM6IFN1cnZpdm9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCB7IHZlcmJzLCByZWFkS2V5cywgbGFzdCB9XSBvZiBieVBhdGgpIHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50cykpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIHN1cnZpdm9ycy5wdXNoKHsgcGF0aCwgc2VnbWVudHMsIHZlcmJzLCByZWFkS2V5cywgbGFzdCwgYmVmb3JlLCBhZnRlciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cnZpdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXkgYSBzdGFnZWQgYGRlbGV0ZWAgYXQgdGhpcyBwYXRoIGNvbW1pdCBhcyB0aGUgYCdkZWxldGUnYCB2ZXJiP1xuICAgKlxuICAgKiBPbmx5IHdoZW4gcmVtb3ZpbmcgdGhlIGtleSBhbmQgdGhlIGAnZnVsbCdgIG1vZGUncyBmbGF0dGVuaW5nIChgX3NldGAgb2ZcbiAgICogYHVuZGVmaW5lZGApIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuIFRoZXkgZGl2ZXJnZSB3aGVuIHRoZSBwYXJlbnQgaXMgbm90XG4gICAqIGEgY29udGFpbmVyOiBgbmF0aXZlRGVsZXRlYCB3YWxrcyBhd2F5IHVudG91Y2hlZCwgd2hpbGUgYG5hdGl2ZVNldGBcbiAgICogQ09FUkNFUyB0aGUgcHJpbWl0aXZlIHBhcmVudCBpbnRvIGFuIG9iamVjdCB0byBob2xkIHRoZSBrZXkuIENvbW1pdHRpbmdcbiAgICogYGRlbGV0ZWAgdGhlcmUgd291bGQgc2lsZW50bHkgZHJvcCBhIHN0YXRlIGNoYW5nZSB0aGUgc3RhZ2UgcmVhbGx5IG1hZGUsXG4gICAqIHNvIHRob3NlIChwYXRob2xvZ2ljYWwpIGRlbGV0ZXMga2VlcCB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVSZXBsYXlzQXNGbGF0dGVuaW5nKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlOyAvLyBwYXJlbnQgaXMgdGhlIHN0YXRlIHJvb3Qg4oCUIGFsd2F5cyBhIGNvbnRhaW5lclxuICAgIGNvbnN0IHBhcmVudCA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzLnNsaWNlKDAsIC0xKSk7XG4gICAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyZW50ID09PSAnb2JqZWN0JztcbiAgfVxufVxuXG4vKipcbiAqIEhpc3RvcmljYWwgZmxhdHRlbmluZyBmb3IgdGhlIGAnZnVsbCdgIHBheWxvYWQ6IGFuIGV4cGxpY2l0IGRlbGV0ZSBjb21taXRzXG4gKiBhcyBzZXQtb2YtdW5kZWZpbmVkLiBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKSByaWRlcyBlYWNoIHN1cnZpdmluZyBlbnRyeVxuICogdW50b3VjaGVkLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuZWRUcmFjZVJvdyhvcDogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9KTogVHJhY2VFbnRyeSB7XG4gIHJldHVybiBvcC52ZXJiID09PSAnZGVsZXRlJ1xuICAgID8geyBwYXRoOiBvcC5wYXRoLCB2ZXJiOiAnc2V0JyBhcyBjb25zdCwgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSkgfVxuICAgIDogb3A7XG59XG5cbi8qKiBBIHJvdydzIGByZWFkS2V5c2AgZnJhZ21lbnQg4oCUIGFic2VudCB1bmxlc3MgdGhlIHByb3ZlbmFuY2UgZGlhbCByZWNvcmRlZCBvbmUgKCNQMSkuICovXG5mdW5jdGlvbiBwcm92ZW5hbmNlKHJlYWRLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHsgcmVhZEtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVhZEtleXMgIT09IHVuZGVmaW5lZCA/IHsgcmVhZEtleXMgfSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
|
|
3
|
-
*
|
|
3
|
+
* only the own-slot writer): `deepSmartMerge`, the law every replay, fold and reader
|
|
4
4
|
* of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
|
|
5
5
|
* moved.
|
|
6
6
|
*/
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
|
|
3
|
-
*
|
|
3
|
+
* only the own-slot writer): `deepSmartMerge`, the law every replay, fold and reader
|
|
4
4
|
* of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
|
|
5
5
|
* moved.
|
|
6
6
|
*/
|
|
7
|
+
import { putOwn } from '../capture/ownData.js';
|
|
7
8
|
/**
|
|
8
9
|
* Deep union merge helper.
|
|
9
10
|
* - Arrays (non-empty): union without duplicates (encounter order preserved)
|
|
@@ -43,18 +44,9 @@ function mergeGuarded(dst, src, inFlight) {
|
|
|
43
44
|
for (const k of Object.keys(src)) {
|
|
44
45
|
const owns = Object.prototype.hasOwnProperty.call(out, k);
|
|
45
46
|
const value = mergeGuarded(owns ? out[k] : undefined, src[k], inFlight);
|
|
46
|
-
|
|
47
|
-
// assigned too, unless an inherited key (notably __proto__) intercepts
|
|
48
|
-
// the write. Keep that key as DATA, rather than dropping it or invoking
|
|
49
|
-
// a setter; Reflect.has tests existence without reading an inherited getter.
|
|
50
|
-
if (!owns && Reflect.has(out, k)) {
|
|
51
|
-
Object.defineProperty(out, k, { value, enumerable: true, writable: true, configurable: true });
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
out[k] = value;
|
|
55
|
-
}
|
|
47
|
+
putOwn(out, k, value);
|
|
56
48
|
}
|
|
57
49
|
inFlight.delete(src);
|
|
58
50
|
return out;
|
|
59
51
|
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFRLEVBQUUsR0FBUTtJQUMvQyxPQUFPLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxHQUFRLEVBQUUsR0FBUSxFQUFFLFFBQTBDO0lBQ2xGLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFeEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjtRQUNoRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztJQUUzRixNQUFNLEdBQUcsR0FBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQyxRQUFRLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0MsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBtZXJnZS50cyDigJQgdGhlIHVuaW9uIG1lcmdlIHRoZSBgbWVyZ2VgIHZlcmIgYXBwbGllcy4gQSBsZWFmIChMMCwgaW1wb3J0c1xuICogb25seSB0aGUgb3duLXNsb3Qgd3JpdGVyKTogYGRlZXBTbWFydE1lcmdlYCwgdGhlIGxhdyBldmVyeSByZXBsYXksIGZvbGQgYW5kIHJlYWRlclxuICogb2YgYSByZWNvcmRlZCBgbWVyZ2VgIHJvdyBydW5zLiBSZS1leHBvcnRlZCBmcm9tIGB1dGlscy50c2AsIHNvIG5vIGltcG9ydGVyXG4gKiBtb3ZlZC5cbiAqL1xuXG5pbXBvcnQgeyBwdXRPd24gfSBmcm9tICcuLi9jYXB0dXJlL293bkRhdGEuanMnO1xuXG4vKipcbiAqIERlZXAgdW5pb24gbWVyZ2UgaGVscGVyLlxuICogLSBBcnJheXMgKG5vbi1lbXB0eSk6IHVuaW9uIHdpdGhvdXQgZHVwbGljYXRlcyAoZW5jb3VudGVyIG9yZGVyIHByZXNlcnZlZClcbiAqIC0gQXJyYXlzIChlbXB0eSk6ICAgICByZXBsYWNlIOKAlCBzcmMgYFtdYCBjbGVhcnMgdGhlIGRlc3RpbmF0aW9uIGFycmF5LlxuICogICBSYXRpb25hbGU6IHdyaXRpbmcgYHNjb3BlLnRhZ3MgPSBbXWAgbWVhbnMgXCJjbGVhciB0YWdzXCIsIG5vdCBcImFwcGVuZCBub3RoaW5nXCIuXG4gKiAgIFdpdGhvdXQgdGhpcyBydWxlLCBhbiBlbXB0eS1hcnJheSB3cml0ZSBzaWxlbnRseSBiZWNvbWVzIGEgbm8tb3Agd2hpY2ggaXNcbiAqICAgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBmcm9tIGEgYnVnLlxuICogLSBPYmplY3RzOiByZWN1cnNpdmUgbWVyZ2Ugb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleXMsIGluY2x1ZGluZyBzcGVjaWFsIGtleXM7XG4gKiAgIGluaGVyaXRlZCBkZXN0aW5hdGlvbiB2YWx1ZXMgYW5kIHNldHRlcnMgbmV2ZXIgcGFydGljaXBhdGUuXG4gKiAtIFByaW1pdGl2ZXM6IHNvdXJjZSB3aW5zXG4gKlxuICogVGVybWluYXRlcyBvbiBhIENZQ0xJQyBgc3JjYCAoOS4xOC4xLCBzYW1lIGxhdyBhcyB7QGxpbmsgZGVlcEVxdWFsfTogYVxuICogc3RhdGUgdmFsdWUgc3Vydml2ZXMgYHN0cnVjdHVyZWRDbG9uZWAsIHdoaWNoIHByZXNlcnZlcyBjeWNsZXMpLiBBIGBzcmNgXG4gKiBvYmplY3QgcmUtZW50ZXJlZCB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZyBtZXJnZWQgaGlnaGVyIHVwIHRoZSBzdGFjayBoYW5kc1xuICogYmFjayB0aGUgb3V0cHV0IGJlaW5nIGJ1aWx0IGZvciBpdCwgc28gdGhlIG1lcmdlZCB2YWx1ZSBtaXJyb3JzIHRoZSBjeWNsZVxuICogaW5zdGVhZCBvZiB1bnJvbGxpbmcgaXQgZm9yZXZlci4gT25seSB0aGUgYW5jZXN0b3JzIG9uIHRoZSBzdGFjayBhcmVcbiAqIGd1YXJkZWQg4oCUIGEgc2hhcmVkIChhY3ljbGljKSBgc3JjYCByZWZlcmVuY2UgbWV0IGFnYWluIGF0IGEgZGlmZmVyZW50XG4gKiBgZHN0YCBtZXJnZXMgYWdhaW5zdCBUSEFUIGBkc3RgLCBleGFjdGx5IGFzIGJlZm9yZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBTbWFydE1lcmdlKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIHJldHVybiBtZXJnZUd1YXJkZWQoZHN0LCBzcmMsIHVuZGVmaW5lZCk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlR3VhcmRlZChkc3Q6IGFueSwgc3JjOiBhbnksIGluRmxpZ2h0OiBXZWFrTWFwPG9iamVjdCwgYW55PiB8IHVuZGVmaW5lZCk6IGFueSB7XG4gIGlmIChzcmMgPT09IG51bGwgfHwgdHlwZW9mIHNyYyAhPT0gJ29iamVjdCcpIHJldHVybiBzcmM7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIGlmIChzcmMubGVuZ3RoID09PSAwKSByZXR1cm4gW107IC8vIGVtcHR5IHNyYyA9IGNsZWFyLCBub3Qgbm8tb3BcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkc3QpKSByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmRzdCwgLi4uc3JjXSldO1xuICAgIHJldHVybiBbLi4uc3JjXTtcbiAgfVxuXG4gIGlmIChpbkZsaWdodD8uaGFzKHNyYykpIHJldHVybiBpbkZsaWdodC5nZXQoc3JjKTsgLy8gY3ljbGUg4oCUIHJlLWVudGVyIHRoZSB2YWx1ZSBiZWluZyBidWlsdFxuXG4gIGNvbnN0IG91dDogYW55ID0geyAuLi4oZHN0ICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8gZHN0IDoge30pIH07XG4gIChpbkZsaWdodCA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHNyYywgb3V0KTtcbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNyYykpIHtcbiAgICBjb25zdCBvd25zID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG91dCwgayk7XG4gICAgY29uc3QgdmFsdWUgPSBtZXJnZUd1YXJkZWQob3ducyA/IG91dFtrXSA6IHVuZGVmaW5lZCwgc3JjW2tdLCBpbkZsaWdodCk7XG4gICAgcHV0T3duKG91dCwgaywgdmFsdWUpO1xuICB9XG4gIGluRmxpZ2h0LmRlbGV0ZShzcmMpO1xuICByZXR1cm4gb3V0O1xufVxuIl19
|
|
@@ -5,17 +5,16 @@
|
|
|
5
5
|
* segments (__proto__, constructor, prototype). Each operation's traversal
|
|
6
6
|
* contract is explicit below; merely using this module is not a sandbox.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* containers. It can follow an inherited object under an ordinary key.
|
|
8
|
+
* Selector operations read only own fields. Writers preflight the whole path
|
|
9
|
+
* before creating or copying any container, then place through putOwn.
|
|
11
10
|
* - nativeGet — DENIED check + hasOwnProperty at every step.
|
|
12
11
|
* - nativeHas — own-property existence only, including own denied names
|
|
13
12
|
* and own undefined values; it does not use the DENIED rule.
|
|
14
|
-
* - mergeContextWins —
|
|
15
|
-
*
|
|
13
|
+
* - mergeContextWins — own-enumerable source keys, DENIED check, own-only
|
|
14
|
+
* destination precedence. Inherited fields are never destination data.
|
|
16
15
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* Diagnostic writers retain their distinct creation/merge laws in utils.ts,
|
|
17
|
+
* using the same isDeniedSegment predicate and shared own-slot writer.
|
|
19
18
|
*
|
|
20
19
|
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
21
20
|
*/
|
|
@@ -30,7 +29,11 @@ export declare function isDeniedSegment(segment: string | number): boolean;
|
|
|
30
29
|
* `defaultValue` instead of leaking Object.prototype / the Object constructor.
|
|
31
30
|
*/
|
|
32
31
|
export declare function nativeGet(obj: any, path: string | (string | number)[], defaultValue?: any): any;
|
|
33
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Set an own path in a writer-owned container, creating missing intermediates.
|
|
34
|
+
* A denied selector is a no-op BEFORE any prefix is created. Inherited values
|
|
35
|
+
* and accessors do not participate; existing own accessors keep normal behavior.
|
|
36
|
+
*/
|
|
34
37
|
export declare function nativeSet(obj: any, path: string | (string | number)[], value: any): any;
|
|
35
38
|
/**
|
|
36
39
|
* Remove the own property at `path` in `obj` (the replay primitive for the
|
|
@@ -73,10 +76,10 @@ export declare function shallowCopy<T extends object>(container: T): T;
|
|
|
73
76
|
*
|
|
74
77
|
* `root` must already be owned. Walking down, every container the writer did
|
|
75
78
|
* not create (`owned` does not hold it) is replaced, in its parent, by its
|
|
76
|
-
* {@link shallowCopy}, which the writer then owns.
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
79
|
+
* {@link shallowCopy}, which the writer then owns. A denied segment anywhere
|
|
80
|
+
* refuses the entire walk before copying. Otherwise the walk stops at a
|
|
81
|
+
* missing / inherited / primitive intermediate (`nativeSet` makes a fresh
|
|
82
|
+
* own container from that point on). The leaf itself is never copied — the
|
|
80
83
|
* write replaces it.
|
|
81
84
|
*
|
|
82
85
|
* Cost: one shallow copy per container on the path that this writer has not
|