footprintjs 9.45.0 → 9.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +9 -9
- package/dist/esm/lib/memory/RecordFrame.d.ts +197 -0
- package/dist/esm/lib/memory/RecordFrame.js +265 -0
- package/dist/esm/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/esm/lib/memory/SharedMemory.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +52 -143
- package/dist/esm/lib/memory/StageContext.js +106 -223
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +2 -2
- package/dist/esm/lib/memory/TransactionBuffer.js +3 -3
- package/dist/esm/lib/memory/utils.d.ts +2 -2
- package/dist/esm/lib/memory/utils.js +3 -3
- package/dist/esm/lib/reactive/structuralWrite.d.ts +1 -1
- package/dist/esm/lib/reactive/structuralWrite.js +2 -2
- package/dist/lib/memory/RecordFrame.js +269 -0
- package/dist/lib/memory/SharedMemory.js +2 -2
- package/dist/lib/memory/StageContext.js +106 -223
- package/dist/lib/memory/TransactionBuffer.js +3 -3
- package/dist/lib/memory/utils.js +3 -3
- package/dist/lib/reactive/structuralWrite.js +2 -2
- package/dist/types/lib/memory/RecordFrame.d.ts +197 -0
- package/dist/types/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +52 -143
- package/dist/types/lib/memory/TransactionBuffer.d.ts +2 -2
- package/dist/types/lib/memory/utils.d.ts +2 -2
- package/dist/types/lib/reactive/structuralWrite.d.ts +1 -1
- package/package.json +1 -1
|
@@ -235,8 +235,8 @@ export declare class TransactionBuffer {
|
|
|
235
235
|
* Keep the diff base exact under a read the working copy cannot answer.
|
|
236
236
|
*
|
|
237
237
|
* When `workingCopy` holds nothing at `path` — the stage deleted or unset
|
|
238
|
-
* it, or a write replaced a container above it — `
|
|
239
|
-
*
|
|
238
|
+
* it, or a write replaced a container above it — `RecordFrame · read`
|
|
239
|
+
* serves the read from LIVE committed state, exactly as 9.28.0
|
|
240
240
|
* did, so the value it hands out is committed state itself. On 9.28.0 the
|
|
241
241
|
* diff base was a whole-state clone taken at the stage's first write, and
|
|
242
242
|
* an in-place edit of that value (out of contract — reads are borrowed)
|
|
@@ -353,8 +353,8 @@ export class TransactionBuffer {
|
|
|
353
353
|
* Keep the diff base exact under a read the working copy cannot answer.
|
|
354
354
|
*
|
|
355
355
|
* When `workingCopy` holds nothing at `path` — the stage deleted or unset
|
|
356
|
-
* it, or a write replaced a container above it — `
|
|
357
|
-
*
|
|
356
|
+
* it, or a write replaced a container above it — `RecordFrame · read`
|
|
357
|
+
* serves the read from LIVE committed state, exactly as 9.28.0
|
|
358
358
|
* did, so the value it hands out is committed state itself. On 9.28.0 the
|
|
359
359
|
* diff base was a whole-state clone taken at the stage's first write, and
|
|
360
360
|
* an in-place edit of that value (out of contract — reads are borrowed)
|
|
@@ -943,4 +943,4 @@ function flattenedTraceRow(op) {
|
|
|
943
943
|
function provenance(readKeys) {
|
|
944
944
|
return readKeys !== undefined ? { readKeys } : undefined;
|
|
945
945
|
}
|
|
946
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0RHO0FBRUgsT0FBTyxFQUFtRCxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEgsT0FBTyxFQUE4QixpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFNBQVMsSUFBSSxJQUFJLEVBQ2pCLFNBQVMsSUFBSSxJQUFJLEVBQ2pCLEdBQUcsRUFDSCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFFBQVEsRUFDUixXQUFXLEdBQ1osTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEYsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixD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QUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDdEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUM7QUFFRCwwRkFBMEY7QUFDMUYsU0FBUyxVQUFVLENBQUMsUUFBOEI7SUFDaEQsT0FBTyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWZmZXIg4oCUIFBlci1zdGFnZSBTVEFHSU5HIGJ1ZmZlciBmb3Igc3RhdGUgbXV0YXRpb25zXG4gKlxuICogV2hhdCBpdCBJUzogYSBzdGFnaW5nIGJ1ZmZlciB3aXRoIHJlYWQteW91ci13cml0ZXMgYW5kIG5ldC1jaGFuZ2UgY29tbWl0cy5cbiAqIC0gQ2hhbmdlcyBhcmUgc3RhZ2VkIGhlcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbiBhbmQgZmx1c2hlZCB0b1xuICogICBTaGFyZWRNZW1vcnkgaW4gT05FIGJhdGNoIHBlciBzdGFnZSAoYGNvbW1pdCgpYCkg4oCUIG90aGVyIHN0YWdlcyBhbmRcbiAqICAgcGFyYWxsZWwgc2libGluZ3MgbmV2ZXIgb2JzZXJ2ZSBhIHN0YWdlJ3MgaGFsZi1maW5pc2hlZCB3cml0ZXMuXG4gKiAtIFJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3kgd2l0aGluIGEgc3RhZ2Ug4oCUIGEgc3RhZ2Ugc2VlcyBpdHMgb3duXG4gKiAgIHN0YWdlZCB3cml0ZXMgaW1tZWRpYXRlbHkuXG4gKiAtIGBjb21taXQoKWAgcmVjb3JkcyB0aGUgc3RhZ2UncyBORVQgY2hhbmdlIChzZWUge0BsaW5rIGNvbW1pdH0pLCBwbHVzIGFuXG4gKiAgIG9wZXJhdGlvbiB0cmFjZSBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuXG4gKlxuICogV2hhdCBpdCBpcyBOT1Q6IGEgcm9sbGJhY2sgbWVjaGFuaXNtLiBEZXNwaXRlIHRoZSBuYW1lLCB0aGVyZSBpcyBub1xuICogYWJvcnQvcm9sbGJhY2sgcGF0aCDigJQgd2hlbiBhIHN0YWdlIFRIUk9XUywgdGhlIGVuZ2luZSBzdGlsbCBjb21taXRzXG4gKiBldmVyeXRoaW5nIHN0YWdlZCBzbyBmYXIgYmVmb3JlIHJlLXRocm93aW5nIChjb21taXQtb24tZXJyb3IgaW5cbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXJgKS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgYXVkaXQgdHJhaWwgbXVzdCByZWNvcmRcbiAqIHdoYXQgdGhlIGZhaWxpbmcgc3RhZ2UgY2hhbmdlZC4gRG8gbm90IHJlbHkgb24gXCJzdGFnZSBmYWlsZWQg4oaSIGl0c1xuICogd3JpdGVzIHZhbmlzaGVkXCIuXG4gKlxuICogVGhlIHBhdGNoIHRyZWVzIGhvbGQgUkVGRVJFTkNFUyB1bnRpbCBjb21taXQgKDkuMjMuMCkuIEEgYHNldGAgc3RvcmVzIHRoZVxuICogY2FsbGVyJ3Mgb3duIHZhbHVlIGluIGBvdmVyd3JpdGVQYXRjaGAgZXhhY3RseSBhcyBpdCBhbHdheXMgZGlkIGluXG4gKiBgd29ya2luZ0NvcHlgOyB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHRha2VuIE9OQ0UgcGVyIHN1cnZpdmluZyBwYXRoXG4gKiB3aGVuIHRoZSBwYXlsb2FkIGxlYXZlcyB0aGUgYnVmZmVyIChgdG9DaGFuZ2VPbmx5UGF5bG9hZGAgL1xuICogYHRvRGVsdGFQYXlsb2FkYCDigJQgZXZlcnkgdmFsdWUgdGhleSBlbWl0IHBhc3NlcyB0aHJvdWdoIGBzdHJ1Y3R1cmVkQ2xvbmVgXG4gKiB0aGVyZSkuIFRoZSBsYXcgXCJ0aGUgcmVjb3JkIG5ldmVyIGFsaWFzZXMgYSBjYWxsZXIncyBvYmplY3RcIiBpcyBrZXB0IGF0XG4gKiB0aGUgY29tbWl0IGJvdW5kYXJ5IGluc3RlYWQgb2YgYXQgZXZlcnkgd3JpdGUsIHdoaWNoIGlzIHdoYXQgbWFrZXMgTlxuICogd3JpdGVzIHRvIG9uZSBwYXRoIE8oTikgaW5zdGVhZCBvZiBPKE4gw5cgc2l6ZSkuIENvbnNlcXVlbmNlLCBieSBkZXNpZ246IGFcbiAqIGNhbGxlciB3aG8gbXV0YXRlcyBpdHMgb3duIG9iamVjdCBBRlRFUiB0aGUgd3JpdGUgYW5kIEJFRk9SRSB0aGUgc3RhZ2VcbiAqIGVuZHMgY29tbWl0cyB0aGUgdmFsdWUgYXMgdGhlIHN0YWdlIHJlYWQgaXQgYmFjayDigJQgdGhlIHJlY29yZCBhZ3JlZXMgd2l0aFxuICogdGhlIHN0YWdlIChDTEFVREUubWQgbGFuZG1pbmUgMydzIGZpcnN0IGJpdGUsIGNsb3NlZCkuIFRoZSBvbmUgcGxhY2UgdGhlXG4gKiBlbmdpbmUgaXRzZWxmIGVkaXRzIFRIUk9VR0ggYSBzdGFnZWQgdmFsdWUg4oCUIGEgbGF0ZXIgbmVzdGVkIG9wIHVuZGVyIGFcbiAqIGBzZXRgIHBhdGgg4oCUIGRldGFjaGVzIHRoYXQgdmFsdWUgZmlyc3QgKHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfSksIHNvXG4gKiBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIG5ldmVyIHNoYXJlIGEgY29udGFpbmVyIHRoZSBlbmdpbmVcbiAqIG11dGF0ZXMgb24gb25lIHNpZGUgb25seS5cbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLiBUaGVcbiAqIGJ1ZmZlciBubyBsb25nZXIgY2xvbmVzIHRoZSBjb21taXR0ZWQgc3RhdGUgaXQgc3RhcnRzIGZyb20uIGBiYXNlU25hcHNob3RgXG4gKiBJUyB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQgKGhlbGQgYnkgcmVmZXJlbmNlIOKAlFxuICogY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwKSwgYW5kIGB3b3JraW5nQ29weWAgc3RhcnRzIGFzIGFcbiAqIGNvcHkgb2YgaXRzIFJPT1Qgb25seTogZWFjaCB3cml0ZSBjb3BpZXMgdGhlIGNvbnRhaW5lcnMgb24gaXRzIG93biBwYXRoXG4gKiAoe0BsaW5rIG93blNwaW5lfSksIGFuZCB0aGUgZmlyc3QgUkVBRCBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBvZiBhXG4gKiBjb250YWluZXIgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlIHRha2VzIGEgcHJpdmF0ZSBkZWVwIGNvcHkgb2ZcbiAqIGl0ICh7QGxpbmsgcHJpdmF0aXNlfSkg4oCUIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBldmVyeVxuICogcmVhZCwgc28gYW4gaW4tcGxhY2UgZWRpdCBvZiBhIHJlYWQgdmFsdWUgc3RheXMgcHJpdmF0ZSBleGFjdGx5IGFzIGl0IGRpZC5cbiAqIEEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIgaXMgc2VydmVkIGZyb20gbGl2ZSBzdGF0ZSBieSB0aGVcbiAqIGNhbGxlciwgYXMgYmVmb3JlOyB0aGUgYnVmZmVyIHRoZW4gcmVwbGFjZXMgdGhhdCBwYXRoIG9mIGl0cyBkaWZmIGJhc2VcbiAqIHdpdGggYSBwcml2YXRlIGNvcHkgKHtAbGluayBkZXRhY2hCYXNlfSksIGFzIHRoZSBjbG9uZSBoYWQgaXQuXG4gKlxuICogVEhFIEFETUlUVEVEIFJFQ09SRCAoOS4zMC4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZCkuIEFcbiAqIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGUgc3RhZ2Unc1xuICogcmVhZC15b3VyLXdyaXRlcyB2aWV3IGF0IGV2ZXJ5IHBhdGggdGhlIHN0YWdlIHRvdWNoZWQgKGFuZCBhdCBldmVyeVxuICogY29udGFpbmVyIGl0cyB3cml0ZXMgY3JlYXRlZCBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzKS5cbiAqIEJvdGggZW5jb2RlcnMgY29tbWl0IHRoZSB2YWx1ZSB0aGUgc3RhZ2UgcmVhZDogYSBjb21wYWN0IHJvdyDigJQgYSBgbWVyZ2VgXG4gKiBkZWx0YSwgYW4gYGFwcGVuZGAgdGFpbCDigJQgaXMga2VwdCB3aGVyZSBpdCBwcm92YWJseSBmb2xkcyBiYWNrOyBhIGZhbWlseSBvZlxuICogcm93cyB0aGF0IGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHZhbHVlcyB0aGUgc3RhZ2UgcmVhZFxuICogKHtAbGluayBhZG1pdH0pLiBCZWZvcmUgOS4zMC4wIHRoZSBvbmUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgcGVyIHBhdGggd2FzXG4gKiByZXBsYXllZCBhdCBldmVyeSBgbWVyZ2VgIHJvdyBvZiB0aGF0IHBhdGgsIHdoaWNoIGxpZWQgYWNyb3NzIGEgaGFyZCB3cml0ZVxuICogKGAkdXBkYXRlKGsse3h9KTsgayA9IHt5fTsgJHVwZGF0ZShrLHt6fSlgIGNvbW1pdHRlZCBge3ksIHgsIHp9YCBmb3IgYVxuICogcmVhZC1iYWNrIG9mIGB7eSwgen1gKSwgYW4gYFtdYCBjbGVhciwgYSBraW5kIGNoYW5nZSBvciBhbiBhcnJheSB1bmlvblxuICogZGVkdXBsaWNhdGVkIGJ5IHJlZmVyZW5jZS4gVmVyaWZpZWQgd2hlbiB0aGUgc3RhZ2Ugc3RhZ2VkIGEgYG1lcmdlYCBvciBhXG4gKiBuZXN0ZWQgb3A7IGEgc3RhZ2UgdGhhdCBzdGFnZWQgb25seSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXJcbiAqIGl0cyBhZGRyZXNzIGlzIGNvaGVyZW50IGJ5IGNvbnN0cnVjdGlvbiDigJQgYm90aCB0cmVlcyByZWNlaXZlIHRoZSBzYW1lXG4gKiB3cml0ZSDigJQgYW5kIGlzIGFkbWl0dGVkIHdpdGhvdXQgdGhlIGZvbGQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBGYW1pbHksIHR5cGUgTG9zc3ksIHR5cGUgTWVtYmVyLCB0eXBlIFJvd3MsIGFkZHJlc3NEZXB0aE9mLCBsb3NzeUZhbWlsaWVzIH0gZnJvbSAnLi9hZG1pc3Npb24uanMnO1xuaW1wb3J0IHsgdHlwZSBPcFZlcmIsIHR5cGUgU3Vydml2b3IsIGVtaXRJbkZhbWlseU9yZGVyLCBncm91cEludG9GYW1pbGllcywgcHVzaFZhbHVlUm93IH0gZnJvbSAnLi9kZWx0YUVuY29kaW5nLmpzJztcbmltcG9ydCB7IHJlbGF0aW9uIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQge1xuICBhZG9wdCxcbiAgaXNDb250YWluZXIsXG4gIG5hdGl2ZUdldCBhcyBfZ2V0LFxuICBuYXRpdmVTZXQgYXMgX3NldCxcbiAgb3duLFxuICBvd25DaGlsZCxcbiAgb3duZWRSb290T2YsXG4gIG93blNwaW5lLFxuICBzaGFsbG93Q29weSxcbn0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGVlcFNtYXJ0TWVyZ2UsIERFTElNLCBkcnlGb2xkLCBub3JtYWxpc2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gIC8qKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBkaWZmIGJhc2U6IHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3RcbiAgICogdG91Y2hlZCwgYnkgcmVmZXJlbmNlIOKAlCBleGNlcHQgd2hlcmUge0BsaW5rIGRldGFjaEJhc2V9IHJlcGxhY2VkIGEgcGF0aFxuICAgKiBvZiBpdCB3aXRoIGEgcHJpdmF0ZSBjb3B5IChpdHMgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBhcmVcbiAgICogdGhlbiBjb3BpZXMgdG9vLCBvd25lZCBieSB7QGxpbmsgYmFzZU93bmVkfSkuXG4gICAqL1xuICBwcml2YXRlIGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFBhdGhzIHdob3NlIGBvdmVyd3JpdGVQYXRjaGAgdmFsdWUgaXMgdGhlIGNhbGxlcidzIG93biBvYmplY3QgKDkuMjMuMCk6XG4gICAqIGEgYHNldGAgb2YgYSBjb250YWluZXIgc3RvcmVzIHRoZSByZWZlcmVuY2UsIGFuZCB0aGlzIGlzIHRoZSBsZWRnZXIgb2ZcbiAgICogd2hpY2ggb25lcyBhcmUgc3RpbGwgc2hhcmVkIHdpdGggdGhlIGNhbGxlciAoYW5kIHdpdGggYHdvcmtpbmdDb3B5YCkuXG4gICAqIENvbnN1bHRlZCBvbmx5IGJ5IHRoZSBlbmdpbmUncyBuZXN0ZWQgb3BzIOKAlCBzZWVcbiAgICoge0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9OyB0aGUgY29tbWl0IHBheWxvYWQgY2xvbmVzIGV2ZXJ5IHN1cnZpdmluZ1xuICAgKiB2YWx1ZSBhbnl3YXkgYW5kIG5ldmVyIGFza3MuIENsZWFyZWQgd2l0aCB0aGUgcmVzdCBhdCBgY29tbWl0KClgLlxuICAgKi9cbiAgcHJpdmF0ZSBoZWxkUmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKiogQ29tbWl0LXZhbHVlIGVuY29kaW5nIHBvbGljeSAoIzEzYy1CKS4gYCdmdWxsJ2AgPSBoaXN0b3JpY2FsIGJ5dGVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcblxuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBzb3VyY2UgKCNQMSkuIFdoZW4gc2V0ICh0aGVcbiAgICogIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgZXZlcnkgc3RhZ2VkIG9wIHNuYXBzaG90cyB0aGVcbiAgICogIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciDigJQgdGhlIHRlbXBvcmFsLXByZWZpeCBhdHRyaWJ1dGlvbiBjb25zdW1lZCBieVxuICAgKiAgY2F1c2FsIHNsaWNpbmcuIFVuZGVmaW5lZCAoZGVmYXVsdCkgPSB6ZXJvIGNvc3QsIGJ5dGUtaWRlbnRpY2FsIG9wcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIGluIGB3b3JraW5nQ29weWAgdGhpcyBidWZmZXIgQ1JFQVRFRDogaXRzIHJvb3QgY29weSwgdGhlXG4gICAqIHBhdGggY29waWVzIGl0cyB3cml0ZXMgbWFkZSwgdGhlIG1lcmdlIHJlc3VsdHMgaXQgYnVpbHQsIGFuZCBldmVyeVxuICAgKiBjb250YWluZXIgb2YgdGhlIHByaXZhdGUgY29waWVzIGl0cyByZWFkcyB0b29rLiBBIHdyaXRlIGVkaXRzIHRoZXNlIGluXG4gICAqIHBsYWNlLiBFdmVyeXRoaW5nIGVsc2UgaW4gYHdvcmtpbmdDb3B5YCBpcyBTSEFSRUQg4oCUIHdpdGggdGhlIGNvbW1pdHRlZFxuICAgKiBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkLCBvciB3aXRoIGEgdmFsdWUgdGhlIHN0YWdlIHN0YWdlZCDigJRcbiAgICogYW5kIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCAoe0BsaW5rIG93blNwaW5lfSkuXG4gICAqL1xuICBwcml2YXRlIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgdmFsdWVzIHRoZSBzdGFnZSBzdGFnZWQgd2l0aCB7QGxpbmsgc2V0fSDigJQgaXRzIG93biBvYmplY3RzLFxuICAgKiBoZWxkIGJ5IHJlZmVyZW5jZSAoOS4yMy4wKS4gQSByZWFkIGhhbmRzIHRoZW0gYmFjayBhcyB0aGV5IGFyZSwgZXhhY3RseVxuICAgKiBhcyB0aGUgcHJpdmF0ZSB3b3JraW5nIGNvcHkgYWx3YXlzIGRpZCwgYW5kIG5ldmVyIHByaXZhdGlzZXMgdGhlbTogYVxuICAgKiBwcml2YXRlIGNvcHkgb2YgYSBzdGFnZWQgdmFsdWUgd291bGQgbGVhdmUgYHdvcmtpbmdDb3B5YCBhbmRcbiAgICogYG92ZXJ3cml0ZVBhdGNoYCBkaXNhZ3JlZWluZyBhYm91dCBhIHZhbHVlIHRoZSBzdGFnZSB3cm90ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBPd25lZCBjb250YWluZXJzIHdpdGggbm8gY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZVxuICAgKiBhbnl3aGVyZSBiZWxvdyB0aGVtIChhIHByaXZhdGUgZGVlcCBjb3B5LCBhIG1lcmdlIHJlc3VsdCBidWlsdCBvbiBhXG4gICAqIHByaXZhdGUgYmFzZSwgYSBwYXRoIGNvcHkgd2hvc2Ugc2hhcmVkIGNoaWxkcmVuIHdlcmUgcHJpdmF0aXNlZCkuIEEgcmVhZFxuICAgKiB0aGF0IGxhbmRzIG9uIG9uZSBuZWVkcyBubyB3YWxrIOKAlCBzZWUge0BsaW5rIHByaXZhdGlzZUJlbG93fS5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBvZiB7QGxpbmsgYmFzZVNuYXBzaG90fSB0aGF0IHtAbGluayBkZXRhY2hCYXNlfSBjcmVhdGVkOlxuICAgKiBpdHMgcm9vdCBjb3B5IGFuZCB0aGUgY29waWVzIG9uIHRoZSB3YXkgdG8gYSBkZXRhY2hlZCBwYXRoLiBBbGxvY2F0ZWRcbiAgICogb25seSBieSB0aGUgZmlyc3QgZGV0YWNoIOKAlCB0aGUgaW4tY29udHJhY3Qgc3RhZ2UgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gICAqL1xuICBwcml2YXRlIGJhc2VPd25lZD86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgZGVlcCBjb3BpZXMge0BsaW5rIGRldGFjaEJhc2V9IHB1dCBpbnRvIHRoZSBkaWZmIGJhc2U6IG5vdGhpbmdcbiAgICogYXQgb3IgYmVsb3cgb25lIGlzIGNvbW1pdHRlZCBzdGF0ZSwgc28gYSBsYXRlciBkZXRhY2ggaW5zaWRlIGl0IGlzIGEgbm8tb3AuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaGVkQmFzZT86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIHN0YWdlIHdyaXRlcyAoOS4zMC4wKTogYSBwYXRoIHByZWZpeCBpdHMgZnJhbWUgY29tcHV0ZWQgYW5kXG4gICAqIGhhbmRzIG92ZXIgYXMgZGF0YSAoQzIg4oCUIGZvciB0aGUgZW5naW5lLCB0aGUgZnJhbWUncyBydW4gbmFtZXNwYWNlLCBvclxuICAgKiBgW11gIGZvciB0aGUgcm9vdCkuIEl0cyBjb250YWluZXJzIGFyZSB0aGUgc3RhZ2UncyBBRERSRVNTLCBub3QgYSB2YWx1ZVxuICAgKiB0aGUgc3RhZ2UgcmVhZHMgKGV2ZXJ5IHJlYWQgaXQgbWFrZXMgaXMgYSBrZXkgYmVsb3cgaXQpLCBzbyBhIHNoZWxsIGFcbiAgICogd3JpdGUgbGVhdmVzIHRoZXJlIGlzIG5vIHBhcnQgb2YgdGhlIHJlYWQtYmFjayB0aGUgcmVjb3JkIG11c3QgaG9sZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIGBtZXJnZWAgb3BzIHN0YWdlZCBzaW5jZSB0aGUgbGFzdCBjb21taXQg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIHN0YWdlZE1lcmdlcyA9IDA7XG4gIC8qKiBPcHMgc3RhZ2VkIGRlZXBlciB0aGFuIG9uZSBrZXkgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcyDigJQgc2VlIHtAbGluayBhZG1pdH0uICovXG4gIHByaXZhdGUgbmVzdGVkT3BzID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBiYXNlOiBhbnksXG4gICAgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlID0gJ2Z1bGwnLFxuICAgIHJlYWRLZXlzUHJvdmlkZXI/OiAoKSA9PiBzdHJpbmdbXSxcbiAgICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICApIHtcbiAgICAvLyBgYmFzZWAgaXMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIOKAlFxuICAgIC8vIGltbXV0YWJsZS1hZnRlci1zd2FwLCB0aGUgaW52YXJpYW50IHRoZSBmaXJzdC10b3VjaCB2aWV3IGFscmVhZHkgcmVzdHNcbiAgICAvLyBvbiDigJQgc28gdGhlIGRpZmYgYmFzZSBpcyBoZWxkIGJ5IFJFRkVSRU5DRSwgYW5kIHRoZSB3b3JraW5nIGNvcHkgc3RhcnRzXG4gICAgLy8gYXMgYSBjb3B5IG9mIGl0cyBST09UIG9ubHkuIEJlZm9yZSA5LjI5LjAgdGhlc2UgdHdvIGxpbmVzIHdlcmUgdHdvXG4gICAgLy8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSB3aG9sZSBzdGF0ZSwgcGFpZCBieSBldmVyeSBzdGFnZSB0aGF0IHdyb3RlLlxuICAgIHRoaXMuYmFzZVNuYXBzaG90ID0gYmFzZTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0gb3duZWRSb290T2YoYmFzZSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5jb21taXRWYWx1ZXMgPSBjb21taXRWYWx1ZXM7XG4gICAgdGhpcy5yZWFkS2V5c1Byb3ZpZGVyID0gcmVhZEtleXNQcm92aWRlcjtcbiAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFN0YW1wIHRoZSBjdXJyZW50IHJlYWQgcHJlZml4IG9udG8gYSBzdGFnZWQgb3Ag4oCUIG9ubHkgd2hlbiB0aGVcbiAgICogIHByb3ZlbmFuY2UgZGlhbCBpcyBvbiAocHJvdmlkZXIgcHJlc2VudCksIHNvIHRoZSBkZWZhdWx0IHBhdGggYWxsb2NhdGVzXG4gICAqICBub3RoaW5nIGFuZCBjb21taXQgYnVuZGxlcyBzdGF5IGJ5dGUtaWRlbnRpY2FsLiAqL1xuICBwcml2YXRlIHN0YW1wUmVhZEtleXMob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IHR5cGVvZiBvcCB7XG4gICAgaWYgKHRoaXMucmVhZEtleXNQcm92aWRlcikgb3AucmVhZEtleXMgPSB0aGlzLnJlYWRLZXlzUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gb3A7XG4gIH1cblxuICAvKiogU3RhZ2UgYW4gb3AgaW50byBgb3BUcmFjZWAsIGNvdW50aW5nIHdoYXQgZGVjaWRlcyB3aGV0aGVyIHtAbGluayBhZG1pdH0gbXVzdCBmb2xkLiAqL1xuICBwcml2YXRlIHN0YWdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGtleTogc3RyaW5nLCB2ZXJiOiBPcFZlcmIpOiB2b2lkIHtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgdGhpcy5zdGFnZWRNZXJnZXMrKztcbiAgICBpZiAocGF0aC5sZW5ndGggLSBhZGRyZXNzRGVwdGhPZihwYXRoLCB0aGlzLmFkZHJlc3MpID4gMSkgdGhpcy5uZXN0ZWRPcHMrKztcbiAgICB0aGlzLm9wVHJhY2UucHVzaCh0aGlzLnN0YW1wUmVhZEtleXMoeyBwYXRoOiBrZXksIHZlcmIgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQgb3ZlcndyaXRlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gU3RvcmVzIHRoZSBSRUZFUkVOQ0UgaW4gYm90aCB0cmVlc1xuICAgKiAoOS4yMy4wKSDigJQgdGhlIHJlY29yZCdzIGNvcHkgaXMgdGFrZW4gb25jZSwgYXQgY29tbWl0OyBzZWUgdGhlIGhlYWRlci5cbiAgICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgdmFsdWUpO1xuICAgIGlmIChpc0NvbnRhaW5lcih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaGVsZFJlZnMuYWRkKGtleSk7XG4gICAgICB0aGlzLnN0YWdlZC5hZGQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnc2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSBuZXN0ZWQgb3AgaXMgYWJvdXQgdG8gd3JpdGUgVEhST1VHSCBhIHBhdGggd2hvc2UgYG92ZXJ3cml0ZVBhdGNoYFxuICAgKiB2YWx1ZSBpcyBhIGhlbGQgcmVmZXJlbmNlICg5LjIzLjApLiBUb2RheSdzIGxhdyBpcyB0aGF0IHRoZSB0d28gdHJlZXNcbiAgICogcmVjZWl2ZSB0aGUgc2FtZSBuZXN0ZWQgYHNldGAvYGRlbGV0ZWAgbXV0YXRpb25zIGJ1dCBPTkxZIGB3b3JraW5nQ29weWBcbiAgICogcmVjZWl2ZXMgYSBuZXN0ZWQgYG1lcmdlYCdzIHJlc3VsdCAoYHVwZGF0ZVBhdGNoYCBnZXRzIHRoZSBkZWx0YSkg4oCUIHNvIGFcbiAgICogY29udGFpbmVyIHNoYXJlZCBiZXR3ZWVuIHRoZSB0cmVlcyB3b3VsZCBsZWFrIHRoZSBtZXJnZWQgdmFsdWUgaW50byB0aGVcbiAgICogb3ZlcndyaXRlIHBheWxvYWQsIGFuZCBhIHNoYXJlZCBjb250YWluZXIgaXMgYWxzbyB0aGUgY2FsbGVyJ3Mgb3duXG4gICAqIG9iamVjdCwgd2hpY2ggdGhlIGVuZ2luZSBtdXN0IG5vdCBlZGl0IG9uIHRoZSByZWNvcmQncyBiZWhhbGYuIFJlcGxhY2luZ1xuICAgKiB0aGUgaGVsZCBhbmNlc3RvciB3aXRoIGl0cyBjbG9uZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIHJlc3RvcmVzIGV4YWN0bHlcbiAgICogdGhlIHByaXZhdGUgdHJlZSB0aGUgcGVyLXdyaXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBpdCwgcGFpZCBvbmNlIHBlclxuICAgKiBhbmNlc3RvciBhbmQgb25seSBvbiB0aGUgbmVzdGVkLW9wIHBhdGggdGhlIHB1YmxpYyBzdXJmYWNlIG5ldmVyIHRha2VzXG4gICAqICh0aGUgc2NvcGUgcHJveHkgd3JpdGVzIFJPT1Qga2V5cykuIGB3b3JraW5nQ29weWAga2VlcHMgdGhlIHJlZmVyZW5jZSxcbiAgICogYXMgaXQgYWx3YXlzIGRpZC5cbiAgICovXG4gIHByaXZhdGUgZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVsZFJlZnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW5jZXN0b3IgPSBwYXRoLnNsaWNlKDAsIGkpO1xuICAgICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChhbmNlc3Rvcik7XG4gICAgICBpZiAoIXRoaXMuaGVsZFJlZnMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaGVsZCA9IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgYW5jZXN0b3IpO1xuICAgICAgaWYgKGhlbGQgIT09IG51bGwgJiYgdHlwZW9mIGhlbGQgPT09ICdvYmplY3QnKSBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yLCBzdHJ1Y3R1cmVkQ2xvbmUoaGVsZCkpO1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwbGljaXQga2V5IGRlbGV0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCAoIzEzYy1COyBhYnNvcmJzIGJhY2tsb2cgQjgpLlxuICAgKlxuICAgKiBTdGFnZXMgRVhBQ1RMWSB0aGUgc2FtZSBidWZmZXIgbXV0YXRpb25zIGFzIGBzZXQocGF0aCwgdW5kZWZpbmVkKWAg4oCUXG4gICAqIGB3b3JraW5nQ29weWAvYG92ZXJ3cml0ZVBhdGNoYCBnZXQgYW4gb3duIGB1bmRlZmluZWRgIGF0IHRoZSBwYXRoICh0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nLCBwcmVzZXJ2aW5nIHJlYWQgYmVoYXZpb3IgYW5kIHRoZSBkZWR1cCBkaWZmIGJhc2VcbiAgICogYWNyb3NzIG1vZGVzKSDigJQgYnV0IHJlY29yZHMgdGhlIG9wIHZlcmIgYXMgYCdkZWxldGUnYC4gQXQgY29tbWl0OlxuICAgKiBgJ2Z1bGwnYCBtb2RlIG1hcHMgaXQgYmFjayB0byBhIGAnc2V0J2AgdHJhY2UgZW50cnkgKGJ5dGUtaWRlbnRpY2FsIHRvXG4gICAqIHRvZGF5KTsgYCdkZWx0YSdgIG1vZGUgZW1pdHMgYSByZWFsIGAnZGVsZXRlJ2AgZW50cnkgd2hvc2UgcmVwbGF5XG4gICAqIFJFTU9WRVMgdGhlIGtleSBpbnN0ZWFkIG9mIGxlYXZpbmcgYGtleTogdW5kZWZpbmVkYCBiZWhpbmQuXG4gICAqXG4gICAqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciByZWFkcyB0aGF0IHN0YWdlZCBvd24gYHVuZGVmaW5lZGAgYXMgQUJTRU5UXG4gICAqIChgZGVlcEVxdWFsYCwgOS4xOS4xKSDigJQgc28gdW5kZXIgYCdkZWx0YSdgLCB3aG9zZSBjb21taXR0ZWQgc3RhdGUgcmVhbGx5XG4gICAqIGxhY2tzIHRoZSBrZXksIGRlbGV0aW5nIGFuIGFic2VudCBrZXkgaW5zaWRlIGEgY29udGFpbmVyIHRoZSBzdGFnZSBhbHNvXG4gICAqIHJlLXdyb3RlIGlzIHRoZSBuby1vcCBpdCBpcywgbm90IGEgYHNldGAgb2YgdGhlIHdob2xlIGNvbnRhaW5lci5cbiAgICovXG4gIGRlbGV0ZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdW5kZWZpbmVkKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnZGVsZXRlJyk7XG4gIH1cblxuICAvKiogRGVlcCB1bmlvbiBtZXJnZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIGBkZWVwU21hcnRNZXJnZWAgYnVpbGRzIGZyZXNoXG4gICAqICBjb250YWluZXJzLCBzbyBuZWl0aGVyIHRyZWUgZXZlciBob2xkcyB0aGUgbWVyZ2UgSU5QVVQgYnkgcmVmZXJlbmNlO1xuICAgKiAgdGhlIG5lc3RlZC1vcCBkZXRhY2ggZ3VhcmRzIHRoZSBhbmNlc3RvciBpdCB3cml0ZXMgSU5UTy5cbiAgICpcbiAgICogIFRoZSB2YWx1ZSBtZXJnZWQgSU5UTyBpcyBtYWRlIHByaXZhdGUgZmlyc3QgKGBwcml2YXRpc2VgKSwgYXMgdGhlXG4gICAqICB3aG9sZS1zdGF0ZSBjbG9uZSBtYWRlIGl0IGJlZm9yZSA5LjI5LjAuIE5vdCBvbmx5IGZvciB0aGUgcmVhZHMgdGhhdFxuICAgKiAgZm9sbG93OiBgZGVlcFNtYXJ0TWVyZ2VgIHVuaW9ucyBhcnJheXMgQlkgUkVGRVJFTkNFLCBzbyB3aGV0aGVyIGFuXG4gICAqICBlbGVtZW50IHRoZSBzdGFnZSBwYXNzZXMgaW4gaXMgXCJhbHJlYWR5IHRoZXJlXCIgZGVwZW5kcyBvbiB3aGljaCBvYmplY3RzXG4gICAqICB0aGUgYmFzZSBob2xkcyDigJQgYSBjb21taXR0ZWQgYXJyYXkgd291bGQgZGVkdXAgYW4gZWxlbWVudCB0aGUgc3RhZ2VcbiAgICogIHJlYWQgZnJvbSBpdCBiZWZvcmUgaXRzIGZpcnN0IHdyaXRlLCB3aGVyZSB0aGUgcHJpdmF0ZSBjb3B5IChhbmRcbiAgICogIDkuMjguMCkgYXBwZW5kcyBpdC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICB0aGlzLnByaXZhdGlzZShwYXRoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBvd24obWVyZ2VkLCB0aGlzLm93bmVkKTtcbiAgICBpZiAoaXNDb250YWluZXIobWVyZ2VkKSkgdGhpcy5wcml2YXRlVHJlZXMuYWRkKG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBtZXJnZWQpO1xuICAgIF9zZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCwgZGVlcFNtYXJ0TWVyZ2UoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoKSA/PyB7fSwgdmFsdWUpKTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gKDkuMTkuMCk6IG1hcmsgZG90LXBhdGhzIElOU0lERSB0aGUgdmFsdWUgc3RhZ2VkIGF0XG4gICAqIGBwYXRoYCBhcyBzZWNyZXQsIHNvIGBzY3J1YlBhdGNoYCBzY3J1YnMgdGhlbSBpbiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlXG4gICAqIG1pcnJvciB0aGUgc2FtZSB3YXkgYSB3aG9sZS1rZXkgcmVkYWN0aW9uIGlzIHNjcnViYmVkLiBBIGZpZWxkIGlzXG4gICAqIHJlZ2lzdGVyZWQgYXMgYSBsaXRlcmFsIGtleSBBTkQsIHdoZW4gZG90dGVkLCBhcyB0aGUgbmVzdGVkIHBhdGggaXRcbiAgICogbmFtZXMg4oCUIHdoaWNoZXZlciBleGlzdHMgaW4gdGhlIHBhdGNoIGlzIHRoZSBvbmUgYHNjcnViUGF0Y2hgIGZpbmRzLlxuICAgKiBNYXJrZWQgcGF0aHMgc3Vydml2ZSBjb21taXQgb25seSB3aGlsZSB0aGUgb3AgcGF0aCB0aGV5IHNpdCB1bmRlciBkb2VzXG4gICAqIChzZWUge0BsaW5rIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHN9KS5cbiAgICovXG4gIG1hcmtSZWRhY3RlZEZpZWxkcyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgZmllbGRdKSk7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoJy4nKSkgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKFsuLi5wYXRoLCAuLi5maWVsZC5zcGxpdCgnLicpXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIGEgcmVkYWN0aW9uIG1hcmsgYWRkcmVzcyBhbiBhcnJheSBFTEVNRU5UIHJpZ2h0IGJlbG93IGBwYXRoYFxuICAgKiAoYGxpc3QuMS50b2tlbmApPyBBbiBgYXBwZW5kYCByb3cgcmUtYmFzZXMgdGhlIGluZGljZXMgb250byB0aGUgdGFpbCwgc29cbiAgICogc3VjaCBhIHBhdGggdGFrZXMgdGhlIHdob2xlLXZhbHVlIGBzZXRgIChgZGVsdGFFbmNvZGluZyDCtyBwdXNoVmFsdWVSb3dgKS5cbiAgICogQSBtYXJrIGJ5IE5BTUUgYmVsb3cgYW4gYXJyYXkgKGBvYmoueWApIG1lYW5zIHRoZSBzYW1lIHRoaW5nIG9uIHRoZSB0YWlsXG4gICAqIGFzIG9uIHRoZSB3aG9sZSB2YWx1ZSwgc28gdGhlIGNvbXBhY3Qgcm93IHN0YXlzIChieXRlLWlkZW50aWNhbCkuXG4gICAqL1xuICBwcml2YXRlIG1hcmtlZEJlbG93KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHBhdGggKyBERUxJTTtcbiAgICBmb3IgKGNvbnN0IG1hcmtlZCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmICghbWFya2VkLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0ID0gbWFya2VkLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KERFTElNKVswXTtcbiAgICAgIGlmICgvXigwfFsxLTldXFxkKikkLy50ZXN0KG5leHQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3RlZCBwYXRocyB0aGF0IHN1cnZpdmUgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyOiBhIHBhdGggc3Vydml2ZXNcbiAgICogd2hlbiBpdCBJUyBhIHN1cnZpdmluZyBvcCBwYXRoIChhIHdob2xlLWtleSByZWRhY3Rpb24pIG9yIHNpdHMgVU5ERVIgb25lXG4gICAqIChhIGZpZWxkIGluc2lkZSBhIHN1cnZpdmluZyB3cml0ZSkuIEEgZHJvcHBlZCBvcCB0YWtlcyBpdHMgZmllbGRzIHdpdGggaXQuXG4gICAqL1xuICBwcml2YXRlIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHMoc3Vydml2aW5nUGF0aHM6IFNldDxzdHJpbmc+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmIChzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHN1cnZpdmluZ1BhdGhzKSB7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgob3AgKyBERUxJTSkpIHtcbiAgICAgICAgICBvdXQuYWRkKHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBjdXJyZW50IHZhbHVlIGF0IHBhdGggKGluY2x1ZGVzIHVuY29tbWl0dGVkIGNoYW5nZXMpLiBUaGUgdmFsdWUgaXNcbiAgICogdGhlIHN0YWdlJ3Mgb3duIOKAlCBwcml2YXRlIHRvIGl0LCBhcyB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBldmVyeSByZWFkXG4gICAqIGFmdGVyIHRoZSBmaXJzdCB3cml0ZSBiZWZvcmUgOS4yOS4wIChgcHJpdmF0aXNlYCkuXG4gICAqL1xuICBnZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KSB7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSB3b3JraW5nIGNvcHkgYXQgYHBhdGhgIFdJVEhPVVQgdGFraW5nIGEgcHJpdmF0ZSBjb3B5IOKAlCBmb3IgYVxuICAgKiByZWFkZXIgdGhhdCBvbmx5IGNvbXBhcmVzICh0aGUgZGV2LW1vZGUgYm9ycm93ZWQtbXV0YXRpb24gcmVwb3J0IGluXG4gICAqIGBTdGFnZUNvbnRleHQuY29tbWl0YCksIG5ldmVyIGZvciBhIHZhbHVlIGhhbmRlZCB0byBhIHN0YWdlLlxuICAgKi9cbiAgcGVlayhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcCB0aGUgZGlmZiBiYXNlIGV4YWN0IHVuZGVyIGEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIuXG4gICAqXG4gICAqIFdoZW4gYHdvcmtpbmdDb3B5YCBob2xkcyBub3RoaW5nIGF0IGBwYXRoYCDigJQgdGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXRcbiAgICogaXQsIG9yIGEgd3JpdGUgcmVwbGFjZWQgYSBjb250YWluZXIgYWJvdmUgaXQg4oCUIGBTdGFnZUNvbnRleHQgwrdcbiAgICogcmVhZFN0YXRlYCBzZXJ2ZXMgdGhlIHJlYWQgZnJvbSBMSVZFIGNvbW1pdHRlZCBzdGF0ZSwgZXhhY3RseSBhcyA5LjI4LjBcbiAgICogZGlkLCBzbyB0aGUgdmFsdWUgaXQgaGFuZHMgb3V0IGlzIGNvbW1pdHRlZCBzdGF0ZSBpdHNlbGYuIE9uIDkuMjguMCB0aGVcbiAgICogZGlmZiBiYXNlIHdhcyBhIHdob2xlLXN0YXRlIGNsb25lIHRha2VuIGF0IHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlLCBhbmRcbiAgICogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGF0IHZhbHVlIChvdXQgb2YgY29udHJhY3Qg4oCUIHJlYWRzIGFyZSBib3Jyb3dlZClcbiAgICogY291bGQgbm90IG1vdmUgaXQ6IHdyaXR0ZW4gYmFjaywgdGhlIGVkaXQgd2FzIHJlY29yZGVkLiBIZXJlIHRoZSBkaWZmXG4gICAqIGJhc2UgSVMgYSBjb21taXR0ZWQgZ2VuZXJhdGlvbiwgYW5kIGl0IHZlcnkgb2Z0ZW4gaG9sZHMgdGhhdCBzYW1lXG4gICAqIGNvbnRhaW5lciBhdCBgcGF0aGAg4oCUIHRoZSBlZGl0IHdvdWxkIG1vdmUgdGhlIGJhc2Ugd2l0aCBpdCwgYW5kIHRoZVxuICAgKiB3cml0ZS1iYWNrIHdvdWxkIGNvbW1pdCBubyBjaGFuZ2UuIFNvIGJlZm9yZSB0aGUgdmFsdWUgZ29lcyBvdXQsIHRoZVxuICAgKiBiYXNlJ3MgdmFsdWUgYXQgYHBhdGhgIGlzIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgKHRoZSBiYXNlJ3NcbiAgICogcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBjb3BpZWQgc2hhbGxvd2x5KSDigJQgd2hhdCA5LjI4LjAnc1xuICAgKiBiYXNlIGhlbGQgdGhlcmUuIFRoZSBjb21taXQncyBuZXQtY2hhbmdlIHRlc3QgY29tcGFyZXMgYWdhaW5zdCBpdCBhbmRcbiAgICogdGhlIGRlbHRhIGVuY29kZXIgcmVwbGF5cyBmcm9tIGl0OyB0aGUgdmFsdWUgaGFuZGVkIG91dCBzdGF5cyB0aGUgbGl2ZVxuICAgKiBvbmUsIHNvIHdoYXRldmVyIGVsc2UgYW4gZWRpdCBvZiBpdCByZWFjaGVzIChsaXZlIHN0YXRlLCB0aGUgbmV4dFxuICAgKiBnZW5lcmF0aW9uKSBiZWhhdmVzIGFzIG9uIDkuMjguMCB0b28uXG4gICAqXG4gICAqIE5vdCBgcHJpdmF0aXNlYDogYSBwcml2YXRlIGNvcHkgaGFuZGVkIHRvIHRoZSBzdGFnZSB3b3VsZCBhbHNvIGtlZXAgdGhlXG4gICAqIGVkaXQgb3V0IG9mIGxpdmUgc3RhdGUsIHdoZXJlIDkuMjguMCBsZXQgaXQgaW4g4oCUIGEgcnVuLW5hbWVzcGFjZWQgcmVhZFxuICAgKiB0aGF0IGZhbGxzIGJhY2sgdG8gYSBnbG9iYWwga2V5IHdvdWxkIHRoZW4gZW5kIGRpZmZlcmVudGx5ICh0aGVcbiAgICogZGlmZmVyZW50aWFsJ3MgTkVTVEVEIGZhbWlseSBmYWlscyB3aXRoaW4gMTAwIHByb2dyYW1zIHRoYXQgd2F5KS5cbiAgICpcbiAgICogQ29waWVzIG5vdGhpbmcgd2hlbiB0aGUgYmFzZSBob2xkcyBubyBjb250YWluZXIgYXQgYHBhdGhgLCBhbmQgbm90aGluZ1xuICAgKiB0d2ljZTogYSBwYXRoIGF0IG9yIGJlbG93IGFuIGVhcmxpZXIgZGV0YWNoIGlzIGFscmVhZHkgcHJpdmF0ZS4gTyhwYXRoKVxuICAgKiBvdGhlcndpc2UsIHBsdXMgTyh2YWx1ZSkgb25jZSBwZXIgZGV0YWNoZWQgcGF0aC5cbiAgICovXG4gIGRldGFjaEJhc2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCB8fCAhaXNDb250YWluZXIodGhpcy5iYXNlU25hcHNob3QpKSByZXR1cm47XG4gICAgbGV0IGF0OiBvYmplY3QgPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSByZXR1cm47XG4gICAgICBhdCA9IGNoaWxkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXRhY2hlZEJhc2U/LmhhcyhhdCkpIHJldHVybjtcbiAgICBjb25zdCBvd25lZCA9ICh0aGlzLmJhc2VPd25lZCA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKTtcbiAgICBpZiAoIW93bmVkLmhhcyh0aGlzLmJhc2VTbmFwc2hvdCkpIHRoaXMuYmFzZVNuYXBzaG90ID0gb3duZWRSb290T2YodGhpcy5iYXNlU25hcHNob3QsIG93bmVkKTtcbiAgICBvd25TcGluZSh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgb3duZWQpO1xuICAgIGNvbnN0IGNvcHk6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShhdCk7XG4gICAgKHRoaXMuZGV0YWNoZWRCYXNlID8/PSBuZXcgV2Vha1NldDxvYmplY3Q+KCkpLmFkZChjb3B5KTtcbiAgICBfc2V0KHRoaXMuYmFzZVNuYXBzaG90LCBwYXRoLCBjb3B5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIHJlYWRzICg5LjI5LjApOiBtYWtlIHRoZSB2YWx1ZSBhdCBgcGF0aGAgdGhlIHN0YWdlJ3Mgb3duIGJlZm9yZVxuICAgKiBhIHJlYWQgaGFuZHMgaXQgb3V0IOKAlCBzbyBhIHJlYWQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgYmVoYXZlc1xuICAgKiBleGFjdGx5IGFzIGl0IGRpZCB3aGVuIHRoZSBidWZmZXIgYmVnYW4gd2l0aCBhIGRlZXAgY2xvbmUgb2YgdGhlIHdob2xlXG4gICAqIHN0YXRlLiBBbiBpbi1wbGFjZSBlZGl0IG9mIHdoYXQgdGhlIHJlYWQgcmV0dXJuZWQgKG91dCBvZiBjb250cmFjdCDigJRcbiAgICogcmVhZHMgYXJlIGJvcnJvd2VkKSBzdGF5cyBpbnNpZGUgdGhlIGJ1ZmZlciwgYW5kIGNvbW1pdHRlZCBzdGF0ZSBpcyBuZXZlclxuICAgKiB0b3VjaGVkLiBXaGV0aGVyIHRoZSBSRUNPUkQga2VlcHMgaXQgaXMgdGhlIGFkbWl0dGVkIHJlY29yZCdzIGxhd1xuICAgKiAoOS4zMC4wLCBvd25lciBydWxpbmcgUjEg4oCUIHRoZSByZWNvcmQga2VlcHMgd2hhdCB0aGUgc3RhZ2UgcmVhZCBiYWNrKTogaXRcbiAgICogaXMga2VwdCB3aGVuIHRoZSBlZGl0ZWQgdmFsdWUgbGllcyBhdCBvciBiZWxvdyBhIHBhdGggdGhlIHN0YWdlIHdyb3RlIGluXG4gICAqIHRoaXMgc3RhZ2Ug4oCUIHNldCwgbWVyZ2VkIG9yIHdyaXR0ZW4gYmFjayBhbGlrZSDigJQgYW5kIGxvc3Qgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBXYWxraW5nIHRoZSBwYXRoIGZyb20gdGhlIChvd25lZCkgcm9vdDpcbiAgICogIC0gYSBjb250YWluZXIgc3RpbGwgU0hBUkVEIHdpdGggY29tbWl0dGVkIHN0YXRlIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGlzXG4gICAqICAgIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgd2hlbiBpdCBpcyB0aGUgdmFsdWUgcmVhZCwgb3IgYnkgYVxuICAgKiAgICBzaGFsbG93IGNvcHkgd2hlbiBpdCBpcyBhIGNvbnRhaW5lciBvbiB0aGUgd2F5IHRvIGl0IChzbyBhIHJlYWQgb2ZcbiAgICogICAgYGtgIHVuZGVyIGEgZm9yayBjaGlsZCdzIGFkZHJlc3MgY29waWVzIGBrYCwgbm90IGV2ZXJ5IGNoaWxkJ3MgbmFtZXNwYWNlKTtcbiAgICogIC0gYSBjb250YWluZXIgdGhlIHN0YWdlIFNUQUdFRCAob3IgYW55dGhpbmcgZWxzZSB0aGUgYnVmZmVyIGRpZCBub3RcbiAgICogICAgdGFrZSBmcm9tIGNvbW1pdHRlZCBzdGF0ZSkgaXMgaGFuZGVkIGJhY2sgYnkgcmVmZXJlbmNlLCBhcyBiZWZvcmU7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBidWZmZXIgb3ducyBpcyB3YWxrZWQgb24g4oCUIGFuZCB3aGVuIGl0IGlzIHRoZSB2YWx1ZVxuICAgKiAgICByZWFkLCBpdHMgc3RpbGwtc2hhcmVkIGRlc2NlbmRhbnRzIGFyZSBwcml2YXRpc2VkXG4gICAqICAgICh7QGxpbmsgcHJpdmF0aXNlQmVsb3d9KS5cbiAgICpcbiAgICogQ29zdDogTyhwYXRoKSBwZXIgcmVhZCwgcGx1cyBPKHZhbHVlKSBPTkNFIHBlciBzaGFyZWQgY29udGFpbmVyIGEgc3RhZ2VcbiAgICogcmVhZHMgYWZ0ZXIgaXRzIGZpcnN0IHdyaXRlLiBBIHN0YWdlIHRoYXQgbmV2ZXIgcmVhZHMgYWZ0ZXIgd3JpdGluZyBwYXlzXG4gICAqIG5vdGhpbmc7IGEgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIG5ldmVyIHJlYWNoZXMgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0aXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAvLyBSZXNvbHZlIGZpcnN0OiBhIHJlYWQgdGhhdCBsYW5kcyBvbiBub3RoaW5nIChhIG1pc3Npbmcga2V5LCBhIHJlZnVzZWRcbiAgICAvLyBzZWdtZW50LCBhIHByaW1pdGl2ZSkgcmV0dXJucyBub3RoaW5nIGFuZCBtdXN0IGNvcHkgbm90aGluZy5cbiAgICBjb25zdCBjaGFpbjogb2JqZWN0W10gPSBbXTtcbiAgICBsZXQgYXQ6IHVua25vd24gPSB0aGlzLndvcmtpbmdDb3B5O1xuICAgIGZvciAoY29uc3QgayBvZiBwYXRoKSB7XG4gICAgICBhdCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoYXQpKSByZXR1cm47XG4gICAgICBjaGFpbi5wdXNoKGF0KTtcbiAgICB9XG4gICAgbGV0IHBhcmVudDogYW55ID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBsZXQgYmFzZTogdW5rbm93biA9IHRoaXMuYmFzZVNuYXBzaG90O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IHBhdGhbaV07XG4gICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChiYXNlLCBrKTtcbiAgICAgIGxldCB2YWx1ZSA9IGNoYWluW2ldO1xuICAgICAgaWYgKCF0aGlzLm93bmVkLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBhdEJhc2UgfHwgdGhpcy5zdGFnZWQuaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoaSA9PT0gcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcGFyZW50W2tdID0gdGhpcy5wcml2YXRlQ29weU9mKHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBzaGFsbG93Q29weSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub3duZWQuYWRkKHZhbHVlKTtcbiAgICAgICAgcGFyZW50W2tdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSB2YWx1ZTtcbiAgICAgIGJhc2UgPSBhdEJhc2U7XG4gICAgfVxuICAgIHRoaXMucHJpdmF0aXNlQmVsb3cocGFyZW50LCBiYXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBPV05FRCBjb250YWluZXIgaXMgYWJvdXQgdG8gYmUgcmVhZCB3aG9sZSAoYSBwYXRoIGNvcHkgYSBuZXN0ZWQgd3JpdGVcbiAgICogbWFkZSwgc2F5KTogaXRzIGRlc2NlbmRhbnRzIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhcmVcbiAgICogcmVwbGFjZWQgYnkgcHJpdmF0ZSBkZWVwIGNvcGllcywgc28gbm90aGluZyB0aGUgcmVhZCBoYW5kcyBvdXQgaXNcbiAgICogY29tbWl0dGVkIHN0YXRlLiBXYWxrcyBvd25lZCBjb250YWluZXJzIG9ubHk7IG1hcmtzIGVhY2ggb25lIGZpbmlzaGVkXG4gICAqICh7QGxpbmsgcHJpdmF0ZVRyZWVzfSksIHNvIGEgY29udGFpbmVyIGlzIHNjYW5uZWQgb25jZSBwZXIgc3RhZ2UuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZUJlbG93KGNvbnRhaW5lcjogb2JqZWN0LCBiYXNlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgd29yazogQXJyYXk8W29iamVjdCwgdW5rbm93bl0+ID0gW1tjb250YWluZXIsIGJhc2VdXTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbbm9kZSwgbm9kZUJhc2VdID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAodGhpcy5wcml2YXRlVHJlZXMuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gb3duQ2hpbGQobm9kZSwga2V5KTtcbiAgICAgICAgaWYgKCFpc0NvbnRhaW5lcihjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChub2RlQmFzZSwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMub3duZWQuaGFzKGNoaWxkKSkgd29yay5wdXNoKFtjaGlsZCwgYXRCYXNlXSk7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkID09PSBhdEJhc2UgJiYgIXRoaXMuc3RhZ2VkLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHRoaXMucHJpdmF0ZUNvcHlPZihjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQSBwcml2YXRlIGRlZXAgY29weSBvZiBhIGNvbW1pdHRlZCBjb250YWluZXIg4oCUIG93bmVkIHRocm91Z2ggYW5kIHRocm91Z2guICovXG4gIHByaXZhdGUgcHJpdmF0ZUNvcHlPZih2YWx1ZTogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICBhZG9wdChjb3B5LCB0aGlzLm93bmVkKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQoY29weSk7XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIGFueSBzdGFnZWQgb3AgdG91Y2ggYHBhdGhgLCBvciBhIHBhdGggYWJvdmUgb3IgYmVsb3cgaXQ/XG4gICAqXG4gICAqIFRoZSBkZXYtbW9kZSBib3Jyb3dlZC1yZWFkIGNoZWNrIChgU3RhZ2VDb250ZXh0LmNvbW1pdGApIGFza3MgdGhpcyBiZWZvcmVcbiAgICogYWNjdXNpbmcgYSBzdGFnZSBvZiBtdXRhdGluZyBhIHZhbHVlIGluIHBsYWNlOiBhIGtleSB0aGUgc3RhZ2UgbGVnaXRpbWF0ZWx5XG4gICAqIFdST1RFIGlzIGV4cGVjdGVkIHRvIGRpZmZlciBmcm9tIHdoYXQgaXQgcmVhZCwgYW5kIHdyaXRlcyByZWFjaCB0aGUgYnVmZmVyXG4gICAqIGZyb20gcGF0aHMgdGhhdCBieXBhc3MgdXNlci1sZXZlbCB3cml0ZSB0cmFja2luZyB0b28gKHRoZSBzdWJmbG93IHNlZWQsXG4gICAqIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIHRoZSByZXN1bWUgcmUtc2VlZCkuIERldi1tb2RlIG9ubHkg4oCUIG5vdGhpbmcgb25cbiAgICogdGhlIGhvdCBwYXRoIGNhbGxzIGl0LlxuICAgKi9cbiAgd2FzU3RhZ2VkKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgICBjb25zdCB0YXJnZXQgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICAvLyBPbiB0aGUgcGF0aCwgYmVsb3cgaXQgb3IgYWJvdmUgaXQg4oCUIHRoZSBvbmUgcGF0aCByZWxhdGlvbiBldmVyeSBrZXkgcXVlcnkgYXNrcy5cbiAgICAgIGlmIChyZWxhdGlvbihvcC5wYXRoLCB0YXJnZXQpICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggYWxsIHN0YWdlZCBtdXRhdGlvbnMgYW5kIHJldHVybiB0aGUgY29tbWl0IGJ1bmRsZSDigJQgcmVjb3JkaW5nIHRoZVxuICAgKiBzdGFnZSdzIE5FVCBDSEFOR0UsIG5vdCBpdHMgcmF3IHdyaXRlIGxvZy5cbiAgICpcbiAgICog4pSA4pSAIFdIWSAodGhlIGRlZmVjdCB0aGlzIGZpeGVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogUHJldmlvdXNseSBldmVyeSBgc2V0YC9gbWVyZ2VgIHdhcyByZWNvcmRlZCB2ZXJiYXRpbSwgc28gdGhlIGNvbW1pdCBidW5kbGVcbiAgICogd2FzIGEgbG9nIG9mICpvcGVyYXRpb25zKiByYXRoZXIgdGhhbiAqY2hhbmdlcyouIFR3byBvcGVyYXRpb25zIHByb2R1Y2Ugbm9cbiAgICogbmV0IGNoYW5nZSB5ZXQgd2VyZSBzdGlsbCBjb21taXR0ZWQgYXMgXCJtdXRhdGlvbnNcIjpcbiAgICpcbiAgICogICAxLiBOby1vcCB3cml0ZSAgIOKAlCB3cml0aW5nIGEga2V5IHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhvbGRzIChlLmcuIGFuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFnZW50IGNvbnRleHQgc2xvdCByZS1lbWl0dGluZyBpZGVudGljYWwgY29udGVudCBldmVyeVxuICAgKiAgICAgICAgICAgICAgICAgICAgICB0dXJuKS4gYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTEuXG4gICAqICAgMi4gV3JpdGUtcmV2ZXJ0ICDigJQgY2hhbmdpbmcgdGhlbiByZXN0b3JpbmcgYSBrZXkgd2l0aGluIG9uZSBzdGFnZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTIgdGhlbiBLPTEuXG4gICAqXG4gICAqIFJlY29yZGluZyB0aGVzZSBhcyBtdXRhdGlvbnMgKGEpIGJsb2F0ZWQgY2F1c2FsIHNsaWNpbmcgLyBiYWNrdHJhY2tpbmcgd2l0aFxuICAgKiBzcHVyaW91cyBkZXBlbmRlbmNpZXMgb24gaW50ZXJtZWRpYXRlIHZhbHVlcyB0aGF0IG5ldmVyIHJlYWNoIGZpbmFsIHN0YXRlLFxuICAgKiBhbmQgKGIpIG1hZGUgZG93bnN0cmVhbSBcIndoYXQgY2hhbmdlZCBoZXJlP1wiIGNvbnN1bWVycyBsaWdodCB1cCBzdGFnZXMgdGhhdFxuICAgKiBjaGFuZ2VkIG5vdGhpbmcg4oCUIG1vc3QgdmlzaWJseSB0aGUgbGVucyBoaWdobGlnaHQgZmxhZ2dpbmcgZXZlcnkgc2xvdC5cbiAgICpcbiAgICog4pSA4pSAIEhPVyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogQXQgY29tbWl0IHdlIGhvbGQgQk9USCBgYmFzZVNuYXBzaG90YCAoc3RhdGUgd2hlbiB0aGUgc3RhZ2UgYmVnYW4pIGFuZFxuICAgKiBgd29ya2luZ0NvcHlgIChzdGF0ZSBhZnRlciBhbGwgaXRzIHdyaXRlcykuIEZvciBlYWNoIHBhdGggdGhlIHN0YWdlIHRvdWNoZWRcbiAgICogd2Uga2VlcCBpdCBpbiB0aGUgYnVuZGxlIE9OTFkgaWYgaXRzIGZpbmFsIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZVxuICAgKiB2YWx1ZSAoe0BsaW5rIGRlZXBFcXVhbH0pLiBOby1vcCBBTkQgd3JpdGUtcmV2ZXJ0IHBhdGhzIGRyb3Agb3V0LCBiZWNhdXNlXG4gICAqIGJvdGggY29tcGFyZSBlcXVhbCB0byBiYXNlLiBUaGlzIGlzIGEgc2luZ2xlIG5ldC1kZWx0YSBkaWZmIGF0IGNvbW1pdCB0aW1lXG4gICAqIOKAlCBvbmUgZGVlcCBjb21wYXJlIHBlciB0b3VjaGVkIHBhdGgsIE8oY2hhbmdlZCBzdGF0ZSksIHBhaWQgb25jZSBwZXIgc3RhZ2VcbiAgICogKE5PVCBwZXIgd3JpdGUpLiBBIG5haXZlIHBlci13cml0ZSBkZWVwLWVxdWFsIHNraXAgd291bGQgYmUgbW9yZSBleHBlbnNpdmVcbiAgICogYW5kIHdvdWxkIHN0aWxsIG1pc3Mgd3JpdGUtcmV2ZXJ0ICh0aGUgaW50ZXJtZWRpYXRlIHdyaXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICogdmFsdWUgcHJlc2VudCBhdCB0aGUgbW9tZW50IG9mIHdyaXRpbmcpLlxuICAgKlxuICAgKiDilIDilIAgVFdPIEhPTkVTVCBUSUVSUyAoYnkgZGVzaWduIOKAlCBkbyBub3QgXCJ1bmlmeVwiIHRoZW0pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiAgIOKAoiBjb21taXQgKGhlcmUpICAgPSBDSEFOR0UtbGV2ZWwg4oCUIHRydXRoZnVsIG5ldCBkZWx0YS4gRmVlZHMgdGhlIGNvbW1pdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbG9nLCBjYXVzYWwgY2hhaW4sIG5hcnJhdGl2ZSwgYW5kIHRoZSBsZW5zIGhpZ2hsaWdodC5cbiAgICogICDigKIgYG9uV3JpdGVgIGV2ZW50ID0gT1AtbGV2ZWwg4oCUIGZpcmVzIG9uIEVWRVJZIHdyaXRlIGF0dGVtcHQgcmVnYXJkbGVzcyBvZlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbmV0IGNoYW5nZS4gRmVlZHMgbWV0cmljcyAvIGJlaGF2aW91cmFsIG9ic2VydmFiaWxpdHlcbiAgICogICAgICAgICAgICAgICAgICAgICAgIChhIGRlYnVnZ2VyIHdhbnRzIHRvIHNlZSBcIndyb3RlIDIsIHRoZW4gcmV2ZXJ0ZWRcIikuXG4gICAqIGBvbldyaXRlYCBpcyB1bmNoYW5nZWQgYnkgdGhpcyBtZXRob2Q7IG9ubHkgdGhlIENPTU1JVCBiZWNvbWVzIGNoYW5nZS1vbmx5LlxuICAgKlxuICAgKiDilIDilIAgRU1QVFkgQ09NTUlUUyBBUkUgSU5URU5USU9OQUwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEEgc3RhZ2UgdGhhdCBuZXRzIG5vIGNoYW5nZSBjb21taXRzIGFuIEVNUFRZIHBhdGNoIOKAlCBOT1Qgbm90aGluZy5cbiAgICoge0BsaW5rIFN0YWdlQ29udGV4dC5jb21taXR9IHN0aWxsIHJlY29yZHMgdGhlIGJ1bmRsZSB1bmNvbmRpdGlvbmFsbHksIHNvXG4gICAqIGV2ZXJ5IGV4ZWN1dGVkIHN0YWdlIHJlbWFpbnMgYSB0aW1lLXRyYXZlbCBjdXJzb3Igc3RvcCAoaXRzIGBydW50aW1lU3RhZ2VJZGBcbiAgICogbWFya2VyIGlzIHByZXNlcnZlZCk7IG9ubHkgaXRzIFBBVENIIGlzIGVtcHR5LiBUaGlzIGlzIHdoYXQga2VlcHMgdGhlXG4gICAqIGNvbW1pdC1pbmRleGVkIHNsaWRlciBzdGFibGUgd2hpbGUgbWFraW5nIHRoZSBoaWdobGlnaHQgdHJ1dGhmdWwuXG4gICAqXG4gICAqIOKUgOKUgCBLTk9XTiBMSU1JVEFUSU9OUyAvIEZVVFVSRSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgRXhwbGljaXQga2V5IERFTEVUSU9OIHVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIGlzIHN0aWxsXG4gICAqICAgICBmbGF0dGVuZWQgdG8gc2V0LW9mLWB1bmRlZmluZWRgIChhIHJlbW92ZWQga2V5IGNhbm5vdCBiZSBleHByZXNzZWRcbiAgICogICAgIGluIE1lbW9yeVBhdGNoIGFsb25lKS4gQ0xPU0VEIHVuZGVyIGBjb21taXRWYWx1ZXM6ICdkZWx0YSdgICgjMTNjLUIpOlxuICAgKiAgICAge0BsaW5rIGRlbGV0ZX0gc3RhZ2VzIGEgZGlzdGluY3Qgb3AgYW5kIHRoZSBidW5kbGUgY2FycmllcyBhIHJlYWxcbiAgICogICAgIGBkZWxldGVgIHRyYWNlIHZlcmIgd2hvc2UgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIH0ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmNvbW1pdFZhbHVlcyA9PT0gJ2RlbHRhJyA/IHRoaXMudG9EZWx0YVBheWxvYWQoKSA6IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuICAgIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSB0aGlzLnN1cnZpdmluZ1JlZGFjdGVkUGF0aHMobmV3IFNldChyb3dzLnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSkpO1xuICAgIC8vIFRoZSBidW5kbGUncyBrZXkgb3JkZXIgaXMgYHJlY29yZENvbW1pdGAnczsgYSBkaXJlY3QgY2FsbGVyIGtlZXBzIHRoaXMgc2FtZSBvcmRlci5cbiAgICBjb25zdCBwYXlsb2FkID0geyBvdmVyd3JpdGU6IHJvd3Mub3ZlcndyaXRlLCB1cGRhdGVzOiByb3dzLnVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlOiByb3dzLnRyYWNlIH07XG5cbiAgICB0aGlzLm92ZXJ3cml0ZVBhdGNoID0ge307XG4gICAgdGhpcy51cGRhdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMub3BUcmFjZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkYWN0ZWRQYXRocy5jbGVhcigpO1xuICAgIHRoaXMuaGVsZFJlZnMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG4gICAgdGhpcy5vd25lZCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5vd25lZC5hZGQodGhpcy53b3JraW5nQ29weSk7XG4gICAgdGhpcy5zdGFnZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMucHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnN0YWdlZE1lcmdlcyA9IDA7XG4gICAgdGhpcy5uZXN0ZWRPcHMgPSAwO1xuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBvdmVyd3JpdGUgLyB1cGRhdGVzIC8gdHJhY2Uga2VlcGluZyBPTkxZIHBhdGhzIHdob3NlIGZpbmFsIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSB2YWx1ZSDigJQgaS5lLiB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlLiBTZWVcbiAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdH0gZm9yIHRoZSByYXRpb25hbGUuXG4gICAqXG4gICAqIFBhdGhzIGFyZSBjb21wYXJlZCBhdCB0aGUgZXhhY3QgZ3JhbnVsYXJpdHkgdGhleSB3ZXJlIHdyaXR0ZW4gKGVhY2ggdHJhY2VcbiAgICogZW50cnkncyBwYXRoKSwgYWdhaW5zdCBgd29ya2luZ0NvcHlgIChmaW5hbCkgdnMgYGJhc2VTbmFwc2hvdGAgKHN0YXJ0KS5cbiAgICogU3Vydml2aW5nIGBzZXRgIHBhdGhzIGNvcHkgdGhlaXIgZmluYWwgdmFsdWUgZnJvbSBgb3ZlcndyaXRlUGF0Y2hgO1xuICAgKiBzdXJ2aXZpbmcgYG1lcmdlYCBwYXRocyBjb3B5IHRoZWlyIGFjY3VtdWxhdGVkIGRlbHRhIGZyb20gYHVwZGF0ZVBhdGNoYCxcbiAgICoga2VlcGluZyB0aGUgc2V0LXZzLW1lcmdlIHZlcmIg4oCUIGFuZCB0aGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KTpcbiAgICogYSBmYW1pbHkgb2Ygcm93cyB3aG9zZSByZXBsYXkgZG9lcyBub3QgZ2l2ZSBiYWNrIHdoYXQgdGhlIHN0YWdlIHJlYWQgaXNcbiAgICogcmVjb3JkZWQgYXMgYHNldGAgcm93cyBvZiB0aGUgcmVhZC1iYWNrIGluc3RlYWQgKDkuMzAuMCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIERFRkFVTFQgKGBjb21taXRWYWx1ZXM6ICdmdWxsJ2ApIHBheWxvYWQsIGluY2x1ZGluZyB0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nIG9mIHN0YWdlZCBgZGVsZXRlYCBvcHMgaW50byBgc2V0YC1vZi1gdW5kZWZpbmVkYFxuICAgKiB0cmFjZSBlbnRyaWVzLiBUaGUgZGVsdGEgZW5jb2RpbmcgbGl2ZXMgaW4ge0BsaW5rIHRvRGVsdGFQYXlsb2FkfS5cbiAgICpcbiAgICogV29yaywgbm90IGJ5dGVzICg5LjIyLjEpOiB0aGUgbmV0LWNoYW5nZSB2ZXJkaWN0IGlzIHBhaWQgb25jZSBwZXIgUEFUSFxuICAgKiBhbmQgdGhlIGNsb25lIG9uY2UgcGVyIENPTlNFQ1VUSVZFIHJ1biBvZiBvcHMgb24gYSBwYXRoLCBub3Qgb25jZSBwZXIgb3BcbiAgICog4oCUIHNlZSB0aGUgdHdvIG1lbW9zIGluc2lkZS4gUGlubmVkIGJ5XG4gICAqIHRlc3QvbGliL21lbW9yeS9zY2VuYXJpby9yZXBlYXRlZC1wYXRoLWJ5dGUtaWRlbnRpdHkudGVzdC50cyBhZ2FpbnN0IHRoZVxuICAgKiA5LjIyLjAgYnl0ZXMuIFNpbmNlIDkuMjMuMCB0aGF0IGNsb25lIGlzIFRIRSBjbG9uZTogdGhlIHBhdGNoIHRyZWVzIGhvbGRcbiAgICogdGhlIGNhbGxlcidzIHJlZmVyZW5jZXMgKHNlZSB0aGUgY2xhc3MgaGVhZGVyKSwgc28gdGhpcyBsb29wIGlzIHRoZSBvbmVcbiAgICogcGxhY2UgdGhlIHJlY29yZCBpcyBkZXRhY2hlZCBmcm9tIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIHRvQ2hhbmdlT25seVBheWxvYWQoKTogUm93cyB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaXQoKGxvc3N5KSA9PiB0aGlzLmNoYW5nZU9ubHlSb3dzKGxvc3N5KSk7XG4gIH1cblxuICAvKiogVGhlICdmdWxsJyByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VPbmx5Um93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpOiBSb3dzIHtcbiAgICBjb25zdCByb3dzOiBSb3dzID0geyBvdmVyd3JpdGU6IHt9LCB1cGRhdGVzOiB7fSwgdHJhY2U6IFtdIH07XG4gICAgY29uc3QgeyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHRyYWNlIH0gPSByb3dzO1xuICAgIC8vIFBlciBQQVRILCBkZWNpZGVkIG9uY2UgKDkuMjIuMSk6IGJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZSBmaXhlZCBhdFxuICAgIC8vIGNvbW1pdCwgc28gZXZlcnkgbGF0ZXIgb3Agb24gYSBwYXRoIGdldHMgdGhlIHZlcmRpY3QgaXRzIGZpcnN0IG9wIGdvdC5cbiAgICAvLyBgdW5kZWZpbmVkYCA9IG5vdCB5ZXQgZGVjaWRlZDsgdGhlIHN1cnZpdmluZyBwYXRocyBhcmUgdGhlIGB0cnVlYCBrZXlzLlxuICAgIGNvbnN0IHN1cnZpdmVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgLy8gVGhlIHBhdGggdGhlIExBU1Qgc3Vydml2aW5nIG9wIGNvcGllZCBpbnRvIGVhY2ggcGF0Y2ggdHJlZSAoOS4yMi4xKS5cbiAgICAvLyBUaGUgdmFsdWUgYXQgYSBwYXRoIGlzIGZpeGVkIGF0IGNvbW1pdCwgc28gYW4gb3Agd2hvc2UgcHJlZGVjZXNzb3Igb25cbiAgICAvLyB0aGUgU0FNRSB0cmVlIGFscmVhZHkgY29waWVkIHRoYXQgcGF0aCB3b3VsZCB3cml0ZSB0aGUgc2FtZSBieXRlcyBvdmVyXG4gICAgLy8gdGhlIHNhbWUga2V5IOKAlCBpdCBrZWVwcyBpdHMgdHJhY2Ugcm93ICh0aGUgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsKSBhbmRcbiAgICAvLyBwYXlzIG5vIHNlY29uZCBjbG9uZS4gVGhlIDkuMjIuMCBlbGVtZW50LXdyaXRlIGZ1bm5lbCBzdGFnZXMgTlxuICAgIC8vIHdob2xlLWFycmF5IHNldHMgb24gT05FIHBhdGg7IHRoaXMgaXMgd2hhdCBtYWtlcyB0aGF0IGNvbW1pdCBPKE4pXG4gICAgLy8gaW5zdGVhZCBvZiBPKE4gw5cgb3BzKS4gQ09OU0VDVVRJVkUgb25seSDigJQgYW4gb3Agb24gYW5vdGhlciBwYXRoIGluXG4gICAgLy8gYmV0d2VlbiBtYXkgaGF2ZSBjb2VyY2VkIG9yIGdyb3duIHRoaXMgb25lJ3MgY29udGFpbmVyIChhIGRlc2NlbmRhbnRcbiAgICAvLyBgbmF0aXZlU2V0YCB0aHJvdWdoIGEgcHJpbWl0aXZlLCBhIGBrZXk6IHVuZGVmaW5lZGAgc2hlbGwpIGFuZCB0aGVcbiAgICAvLyByZS1jb3B5IGlzIHdoYXQgcmVwYWlycyBpdDsgYSBgbWVyZ2VgIGJldHdlZW4gdHdvIHNldHMgdG91Y2hlcyB0aGVcbiAgICAvLyBvdGhlciB0cmVlIGFuZCBkb2VzIG5vdCBjb3VudC4gU2FtZSBsYXcgYXMgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICAgIGxldCBsYXN0U2V0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0TWVyZ2VQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBmYW1pbHkgPSBsb3NzeT8uZmFtaWxpZXMuZ2V0KGxvc3N5LnJvb3RPZi5nZXQob3AucGF0aCkgYXMgc3RyaW5nKTtcbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaSA9PT0gZmFtaWx5LnNsb3QpIHtcbiAgICAgICAgICB0aGlzLmVtaXRSZWFkQmFjayhmYW1pbHksIHJvd3MsICdmdWxsJyk7XG4gICAgICAgICAgbGFzdFNldFBhdGggPSBsYXN0TWVyZ2VQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGtlZXAgPSBzdXJ2aXZlcy5nZXQob3AucGF0aCk7XG4gICAgICBpZiAoa2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtlZXAgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpO1xuICAgICAgICBzdXJ2aXZlcy5zZXQob3AucGF0aCwga2VlcCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtlZXApIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKGZsYXR0ZW5lZFRyYWNlUm93KG9wKSk7XG4gICAgICBpZiAob3AudmVyYiA9PT0gJ21lcmdlJykge1xuICAgICAgICBpZiAobGFzdE1lcmdlUGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RNZXJnZVBhdGggPSBvcC5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsYXN0U2V0UGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RTZXRQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGVsdGEtZW5jb2RlZCBwYXlsb2FkIChgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCwgIzEzYy1CKSDigJQgc2FtZSBuZXQtY2hhbmdlXG4gICAqIGZpbHRlciBhcyB7QGxpbmsgdG9DaGFuZ2VPbmx5UGF5bG9hZH0sIHRocmVlIGVuY29kaW5nIGRpZmZlcmVuY2VzOlxuICAgKlxuICAgKiAxLiAqKk9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgqKiAodGhlIMKnMi41IGRlZHVwIHJ1bGUg4oCUIGBhcHBlbmRgXG4gICAqICAgIGlzIE5PVCBpZGVtcG90ZW50IG9uIHJlcGxheSwgc28gZHVwbGljYXRlIGVudHJpZXMgd291bGQgbXVsdGlwbHlcbiAgICogICAgdGFpbHMpLiBUaGUgdmVyYiBpcyByZXNvbHZlZCBmcm9tIHRoZSBwYXRoJ3Mgb3AgbWl4ICsgYmFzZeKGkmZpbmFsXG4gICAqICAgIHJlbGF0aW9uc2hpcDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLFxuICAgKiAgICBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocy5cbiAgICogMi4gKipWZXJiIHJlc29sdXRpb24gcGVyIHBhdGgqKiDigJQgZm9yIGEgcGF0aCB3aXRoIE5PIHN1cnZpdmluZyByZWxhdGl2ZVxuICAgKiAgICAoc2VlIDMpOlxuICAgKiAgICAtIGxhc3Qgb3AgYCdkZWxldGUnYCBBTkQgZmluYWwgdmFsdWUgZ29uZSDihpIgYGRlbGV0ZWAgKHRoZSBwYXRoIHN0YXlzXG4gICAqICAgICAgZW51bWVyYXRlZCBpbiBgb3ZlcndyaXRlYCB3aXRoIGB1bmRlZmluZWRgIGZvciBrZXktc2V0IGNvbnN1bWVycykuXG4gICAqICAgICAgUmVxdWlyZXMgdGhlIHBhcmVudCB0byBiZSBhIHJlYWwgY29udGFpbmVyIGluIHRoZSBiYXNlIOKAlCByZXBsYXkgdXNlc1xuICAgKiAgICAgIGBuYXRpdmVEZWxldGVgLCB3aGljaCBpcyBpbmVydCBvbiBhIHByaW1pdGl2ZS9hYnNlbnQgcGFyZW50LCB3aGVyZWFzXG4gICAqICAgICAgdGhlIGAnZnVsbCdgIGZsYXR0ZW5pbmcgKGBfc2V0YCBvZiBgdW5kZWZpbmVkYCkgQ09FUkNFUyB0aGF0IHBhcmVudFxuICAgKiAgICAgIGludG8gYW4gb2JqZWN0OyB3aGVuIHRoZXkgd291bGQgZGlzYWdyZWUgd2Uga2VlcCB0aGUgZmxhdHRlbmluZztcbiAgICogICAgLSBPTkxZIGAnbWVyZ2UnYCBvcHMg4oaSIGBtZXJnZWAgd2l0aCB0aGUgYWNjdW11bGF0ZWQgYHVwZGF0ZVBhdGNoYFxuICAgKiAgICAgIGRlbHRhO1xuICAgKiAgICAtIG90aGVyd2lzZSAoYHNldGAvbWl4ZWQpOiB0aGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSB0aGVcbiAgICogICAgICBwYXRoICh7QGxpbmsgZnVsbFJvd3NWYWx1ZX0pLiBJZiBiYXNlIGFuZCB0aGF0IHZhbHVlIGFyZSBhcnJheXMgYW5kXG4gICAqICAgICAgYmFzZSBpcyBhIFNUUklDVCBQUkVGSVgg4oaSIGBhcHBlbmRgIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgZWxzZSBgc2V0YFxuICAgKiAgICAgIHN0b3JpbmcgdGhlIGZ1bGwgdmFsdWUuXG4gICAqIDMuICoqT1ZFUkxBUCBGQU1JTElFUyB0YWtlIHRoZSBmdWxsLXZhbHVlIGZhbGxiYWNrLioqIGBvdmVyd3JpdGVgIC9cbiAgICogICAgYHVwZGF0ZXNgIGFyZSBuZXN0ZWQgcGF0aCBUUkVFUywgc28gdHdvIHN1cnZpdmluZyBwYXRocyB3aGVyZSBvbmUgaXNcbiAgICogICAgYW4gYW5jZXN0b3Igb2YgdGhlIG90aGVyIChgYWAgYW5kIGBhLnBgKSBzaGFyZSBzdG9yYWdlLiBEZWx0YSdzXG4gICAqICAgIHBlci1wYXRoIGVuY29kaW5ncyB3b3VsZCBjbG9iYmVyIGVhY2ggb3RoZXIgdGhlcmUgKGFuIGBhcHBlbmRgXG4gICAqICAgIGFuY2VzdG9yIHN0b3JlcyBvbmx5IGEgVEFJTCwgYSBgZGVsZXRlYCBhbmNlc3RvciBgdW5kZWZpbmVkYCksIHNvIGV2ZXJ5XG4gICAqICAgIHBhdGggdGhhdCBoYXMgYSBzdXJ2aXZpbmcgYW5jZXN0b3IvZGVzY2VuZGFudCBpcyBjb21taXR0ZWQgYXMgYSBwbGFpblxuICAgKiAgICBgc2V0YCBvZiB0aGUgdmFsdWUgdGhlICdmdWxsJyByb3dzIGdpdmUgaXQsIGFuZCB0aGUgZmFtaWx5J3NcbiAgICogICAgc2hhbGxvd2VzdCBwYXRoICh3aG9zZSBzZXQgY292ZXJzIHRoZSB3aG9sZSBzdWJ0cmVlKSBpcyBlbWl0dGVkIExBU1QuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgaXMgQURNSVRURUQgKHtAbGluayBhZG1pdH0pIGxpa2UgdGhlICdmdWxsJyBwYXlsb2FkOiBhIGNvbXBhY3RcbiAgICogcm93IGlzIGtlcHQgb25seSB3aGVyZSB0aGUgYnVuZGxlIHByb3ZhYmx5IGZvbGRzIGJhY2ssIGFuZCBhIGZhbWlseSB0aGF0XG4gICAqIGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQuIFNvIGJvdGggZW5jb2RpbmdzIGNvbW1pdCB0aGVcbiAgICogdmFsdWUgdGhlIHN0YWdlIHJlYWQ7IGJlZm9yZSA5LjMwLjAgdGhleSBzaGFyZWQgYSByZXBsYXkgdGhhdCBkaWQgbm90XG4gICAqIChgcmVwbGF5UGF0aFZlcmJzYCAvIGByZXBsYXlGYW1pbHlWZXJic2AsIGRlbGV0ZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0RlbHRhUGF5bG9hZCgpOiBSb3dzIHtcbiAgICBjb25zdCBmdWxsVmFsdWVBdCA9IHRoaXMuZnVsbFJvd3NWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5kZWx0YVJvd3MobG9zc3ksIGZ1bGxWYWx1ZUF0KSk7XG4gIH1cblxuICAvKiogVGhlIGRlbHRhIHJvd3M7IGEgZmFtaWx5IGluIGBsb3NzeWAgaXMgd3JpdHRlbiBhcyBpdHMgcmVhZC1iYWNrLCBhdCBpdHMgbGFzdCB0b3VjaCAoe0BsaW5rIGVtaXRSZWFkQmFja30pLiAqL1xuICBwcml2YXRlIGRlbHRhUm93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQsIGZ1bGxWYWx1ZUF0OiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICBjb25zdCBpbkxvc3N5ID0gKHBhdGg6IHN0cmluZykgPT4gbG9zc3k/LmZhbWlsaWVzLmhhcyhsb3NzeS5yb290T2YuZ2V0KHBhdGgpIGFzIHN0cmluZykgPT09IHRydWU7XG4gICAgY29uc3Qgc3Vydml2b3JzID0gdGhpcy5uZXRDaGFuZ2VTdXJ2aXZvcnModGhpcy5vcHNCeVBhdGgoKSkuZmlsdGVyKChzKSA9PiAhaW5Mb3NzeShzLnBhdGgpKTtcbiAgICBjb25zdCB7IHJvb3RPZiwgYnlSb290IH0gPSBncm91cEludG9GYW1pbGllcyhzdXJ2aXZvcnMsIG5ldyBTZXQoc3Vydml2b3JzLm1hcCgocykgPT4gcy5wYXRoKSkpO1xuXG4gICAgLy8gVEhFIFZFUkIgQ0hPSUNFIOKAlCB0aGUgZGVsdGEgZW5jb2RlciBwaWNrcyBhIHZlcmIgcGVyIHBhdGg7IHRoZSBWQUxVRVNcbiAgICAvLyBpdCBlbmNvZGVzIGNvbWUgZnJvbSB0aGUgb25lIHJlcGxheSAoYGZ1bGxWYWx1ZUF0YCksIG5ldmVyIGEgcmVwbGljYSBvZlxuICAgIC8vIHRoZSB2ZXJiIGxhdyAoOS4zMC4wOiBDTEFVREUubWQncyB2ZXJiLXN3aXRjaCByZXBsaWNhcyBsb3N0IHR3byBoZXJlKS5cbiAgICBjb25zdCBlbWl0ID0gKHM6IFN1cnZpdm9yKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgYmVmb3JlIH0gPSBzO1xuICAgICAgY29uc3QgcHJvdiA9IHByb3ZlbmFuY2Uocy5yZWFkS2V5cyk7XG4gICAgICBpZiAoKGJ5Um9vdC5nZXQocm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpIGFzIFN1cnZpdm9yW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gUnVsZSAzIOKAlCBvbmUgY29oZXJlbnQgdHJlZTogZXZlcnkgbWVtYmVyIGEgc2V0IG9mIGl0cyB2YWx1ZS5cbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShmdWxsVmFsdWVBdChzZWdtZW50cykpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdFZlcmIgPSB2ZXJic1t2ZXJicy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChsYXN0VmVyYiA9PT0gJ2RlbGV0ZScgJiYgcy5hZnRlciA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50cykpIHtcbiAgICAgICAgLy8gUmVhbCBkZWxldGlvbiDigJQgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS4gS2VlcCB0aGUgcGF0aCBlbnVtZXJhdGVkXG4gICAgICAgIC8vIGluIGBvdmVyd3JpdGVgICh1bmRlZmluZWQpIHNvIE9iamVjdC5rZXlzIGNvbnN1bWVycyBzZWUgaXQuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnZGVsZXRlJywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCB1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmICh2ZXJicy5ldmVyeSgodikgPT4gdiA9PT0gJ21lcmdlJykpIHtcbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdtZXJnZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQodXBkYXRlcywgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFZhbHVlUm93KHJvd3MsIHBhdGgsIHNlZ21lbnRzLCBiZWZvcmUsIGZ1bGxWYWx1ZUF0KHNlZ21lbnRzKSwgcHJvdiwgdGhpcy5tYXJrZWRCZWxvdyhwYXRoKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEEgZmFtaWx5IHRoYXQgZGlkIG5vdCBmb2xkIGJhY2sgdGFrZXMgaXRzIHBsYWNlIGJ5IGl0cyBsYXN0IHRvdWNoLlxuICAgIGNvbnN0IHBlbmRpbmcgPSBsb3NzeSA9PT0gdW5kZWZpbmVkID8gW10gOiBbLi4ubG9zc3kuZmFtaWxpZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IGEuc2xvdCAtIGIuc2xvdCk7XG4gICAgbGV0IG5leHQgPSAwO1xuICAgIGNvbnN0IGZsdXNoQmVmb3JlID0gKHRvdWNoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHdoaWxlIChuZXh0IDwgcGVuZGluZy5sZW5ndGggJiYgcGVuZGluZ1tuZXh0XS5zbG90IDwgdG91Y2gpIHRoaXMuZW1pdFJlYWRCYWNrKHBlbmRpbmdbbmV4dCsrXSwgcm93cywgJ2RlbHRhJyk7XG4gICAgfTtcbiAgICBlbWl0SW5GYW1pbHlPcmRlcihzdXJ2aXZvcnMsIHJvb3RPZiwgYnlSb290LCBlbWl0LCBmbHVzaEJlZm9yZSk7XG4gICAgZmx1c2hCZWZvcmUoSW5maW5pdHkpO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBhZG1pdHRlZCByZWNvcmQgKDkuMzAuMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRIRSBBRE1JU1NJT04g4oCUIGEgY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFnZSdzIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkLiBgYnVpbGRgXG4gICAqIGxheXMgdGhlIHJvd3Mgb3V0IChvbmUgZW5jb2RlcjogYCdmdWxsJ2Agb3IgYCdkZWx0YSdgKTsgdGhlIGNhbmRpZGF0ZSBpc1xuICAgKiBjaGVja2VkICh7QGxpbmsgbG9zc3lGYW1pbGllc30pLCBhbmQgd2hlbiBzb21lIGZhbWlseSdzIHJvd3MgZG8gbm90IGZvbGRcbiAgICogYmFjayB0aGUgcm93cyBhcmUgbGFpZCBvdXQgYWdhaW4gd2l0aCB0aG9zZSBmYW1pbGllcyB3cml0dGVuIGFzIHdoYXQgdGhlXG4gICAqIHN0YWdlIHJlYWQgKHtAbGluayBlbWl0UmVhZEJhY2t9KSDigJQgZXZlcnkgb3RoZXIgZmFtaWx5J3MgYnl0ZXMgZXhhY3RseSBhc1xuICAgKiB0aGUgZmlyc3QgbGF5b3V0IG1hZGUgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgYWRtaXQoYnVpbGQ6IChsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpID0+IFJvd3MpOiBSb3dzIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBidWlsZCh1bmRlZmluZWQpO1xuICAgIGNvbnN0IGxvc3N5ID0gdGhpcy5sb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSk7XG4gICAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyBjYW5kaWRhdGUgOiBidWlsZChsb3NzeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZG8gbm90IGZvbGQgYmFjayB0byB3aGF0IHRoZSBzdGFnZSByZWFkIOKAlFxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChgYWRtaXNzaW9uLnRzIMK3IGxvc3N5RmFtaWxpZXNgOiB0aGVcbiAgICogY2FuZGlkYXRlIHJlcGxheWVkIG9udG8gdGhlIGRpZmYgYmFzZSBieSBgZHJ5Rm9sZGAsIGV2ZXJ5IGZhbWlseSBvZlxuICAgKiB0b3VjaGVkIHBhdGhzIGNvbXBhcmVkIHdpdGggdGhlIHdvcmtpbmcgY29weSBhdCBpdHMgcm9vdCBhbmQgb24gdGhlIHdheVxuICAgKiBkb3duIHRvIGl0KS5cbiAgICpcbiAgICogV2l0aG91dCBhIGZvbGQsIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBubyBgbWVyZ2VgIGFuZCBubyBuZXN0ZWQgb3A6IGl0c1xuICAgKiByb3dzIGFyZSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXIgaXRzIGFkZHJlc3MsIGVhY2hcbiAgICogd3JpdGluZyB0aGUgU0FNRSB2YWx1ZSBpbnRvIGB3b3JraW5nQ29weWAgYW5kIGBvdmVyd3JpdGVQYXRjaGAg4oCUIHRoZVxuICAgKiByZWNvcmQgaXMgdGhlIHJlYWQtYmFjayBieSBjb25zdHJ1Y3Rpb24gKHRoZSBwcm9wZXJ0eSdzIFJPT1QtT05MWSBhcm1cbiAgICogcGlucyB0aGlzKS4gVGhhdCBrZWVwcyB0aGUgY29tbWl0IG9mIHRoZSB0eXBlZCBzY29wZSdzIHJvb3Qta2V5IHdyaXRlc1xuICAgKiBleGFjdGx5IGFzIGNoZWFwIGFzIGl0IHdhcy5cbiAgICovXG4gIHByaXZhdGUgbG9zc3lGYW1pbGllcyhjYW5kaWRhdGU6IFJvd3MpOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBsb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSwgdGhpcy5iYXNlU25hcHNob3QsIHRoaXMud29ya2luZ0NvcHksIHRoaXMub3BUcmFjZSwgdGhpcy5hZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhbWlseSB3aG9zZSByb3dzIGRpZCBub3QgZm9sZCBiYWNrLCB3cml0dGVuIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQ6XG4gICAqIG9uZSBgc2V0YCByb3cgcGVyIG1lbWJlciB0aGF0IGNoYW5nZWQgKGRlc2NlbmRhbnRzIGJ5IGxhc3QgdG91Y2gsIGVhY2hcbiAgICogd2l0aCBpdHMgb3duIHJlYWQgcHJlZml4KSwgdGhlIFJPT1QgbGFzdCwgYW5kIHRoZSByb290J3MgcmVhZC1iYWNrIHZhbHVlXG4gICAqIGluIGBvdmVyd3JpdGVgIOKAlCBvbmUgY29oZXJlbnQgdHJlZSwgc28gbm8gcm93IGNhbiBjbG9iYmVyIGFub3RoZXIuIFRoZVxuICAgKiByb290J3Mgcm93IGlzIHdyaXR0ZW4gZXZlbiB3aGVuIHRoZSByb290IGl0c2VsZiBkaWQgbm90IGNoYW5nZTogaXQgaXMgdGhlXG4gICAqIHJvdyB0aGF0IGNhcnJpZXMgdGhlIGZhbWlseSdzIHJlYWQtYmFjayAoYW5kIHRoZSBjb250YWluZXJzIEwtMSdzIGRyb3BwZWRcbiAgICogb3AgbGVmdCkuIEEgbG9uZSByb290IHVuZGVyIGAnZGVsdGEnYCBrZWVwcyB0aGUgY29tcGFjdCBgYXBwZW5kYCB3aGVuIHRoZVxuICAgKiB2YWx1ZSBpdCByZWFkIGlzIGl0cyBiYXNlIHBsdXMgYSB0YWlsLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UmVhZEJhY2soZmFtaWx5OiBGYW1pbHksIHJvd3M6IFJvd3MsIGVuY29kaW5nOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgbGV0IHJvb3Q6IE1lbWJlciA9IGZhbWlseS5tZW1iZXJzWzBdO1xuICAgIGxldCBjaGFuZ2VkID0gMDtcbiAgICBmb3IgKGNvbnN0IG0gb2YgZmFtaWx5Lm1lbWJlcnMpIHtcbiAgICAgIGlmIChtLnBhdGggPT09IGZhbWlseS5yb290KSB7XG4gICAgICAgIHJvb3QgPSBtO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG0ucGF0aC5zcGxpdChERUxJTSkpKSBjb250aW51ZTtcbiAgICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IG0ucGF0aCwgdmVyYjogJ3NldCcsIC4uLnByb3ZlbmFuY2UobS5yZWFkS2V5cykgfSk7XG4gICAgICBjaGFuZ2VkKys7XG4gICAgfVxuICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdkZWx0YScgJiYgY2hhbmdlZCA9PT0gMCAmJiBhZnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICAgIHB1c2hWYWx1ZVJvdyhcbiAgICAgICAgcm93cyxcbiAgICAgICAgZmFtaWx5LnJvb3QsXG4gICAgICAgIGZhbWlseS5yb290U2VnbWVudHMsXG4gICAgICAgIGJlZm9yZSxcbiAgICAgICAgYWZ0ZXIsXG4gICAgICAgIHByb3ZlbmFuY2Uocm9vdC5yZWFkS2V5cyksXG4gICAgICAgIHRoaXMubWFya2VkQmVsb3coZmFtaWx5LnJvb3QpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcm93cy50cmFjZS5wdXNoKHsgcGF0aDogZmFtaWx5LnJvb3QsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpIH0pO1xuICAgIC8vIFRoZSBjbG9uZSB0aGUgY2hlY2sgdG9vayAoYGFkbWlzc2lvbi50cyDCtyBmb2xkc0JhY2tgKSwgd2hlbiBpdCB0b29rIG9uZS5cbiAgICBfc2V0KHJvd3Mub3ZlcndyaXRlLCBmYW1pbHkucm9vdFNlZ21lbnRzLCBmYW1pbHkuaGVsZCAhPT0gdW5kZWZpbmVkID8gZmFtaWx5LmhlbGQudmFsdWUgOiBzdHJ1Y3R1cmVkQ2xvbmUoYWZ0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSBhIHBhdGgg4oCUIHdoYXQgdGhlIGRlbHRhIGVuY29kZXJcbiAgICogY29tbWl0cyBmb3IgYSBmYW1pbHkgbWVtYmVyIG9yIGEgcGF0aCB3aXRoIGEgYHNldGAg4oCUIHJlYWQgZnJvbSBPTkVcbiAgICoge0BsaW5rIGRyeUZvbGR9IG9mIHRob3NlIHJvd3Mgb3ZlciB0aGUgcGF0Y2ggdHJlZXMgdGhlbXNlbHZlcywgdGFrZW4gdGhlXG4gICAqIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQuIEJ5IHJlZmVyZW5jZSwgYXMgdGhlIHN0YWdlIGhlbGQgdGhlbTogYW4gZWxlbWVudFxuICAgKiBhIGBzZXRgIGFuZCBhIGBtZXJnZWAgb2Ygb25lIHBhdGggc2hhcmUgc3RheXMgb25lIGVsZW1lbnQuIEEgc3RhZ2UgdGhhdFxuICAgKiBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wIG5lZWRzIG5vIGZvbGQg4oCUIGEgcGF0aCdzIHZhbHVlIGlzIGl0c1xuICAgKiBsYXN0IHN0YWdlZCB2YWx1ZS4gKEJlZm9yZSA5LjMwLjA6IHR3byByZXBsaWNhcyBvZiB0aGUgdmVyYiBsYXcsXG4gICAqIGByZXBsYXlQYXRoVmVyYnNgIGFuZCBgcmVwbGF5RmFtaWx5VmVyYnNgLilcbiAgICovXG4gIHByaXZhdGUgZnVsbFJvd3NWYWx1ZSgpOiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duIHtcbiAgICBpZiAodGhpcy5zdGFnZWRNZXJnZXMgPT09IDAgJiYgdGhpcy5uZXN0ZWRPcHMgPT09IDApIHJldHVybiAoc2VnbWVudHMpID0+IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpO1xuICAgIGxldCBmb2xkOiB1bmtub3duO1xuICAgIHJldHVybiAoc2VnbWVudHMpID0+IHtcbiAgICAgIGZvbGQgPz89IGRyeUZvbGQodGhpcy5iYXNlU25hcHNob3QsIHRoaXMudXBkYXRlUGF0Y2gsIHRoaXMub3ZlcndyaXRlUGF0Y2gsIHRoaXMuZnVsbFJvd3MoKSk7XG4gICAgICByZXR1cm4gX2dldChmb2xkLCBzZWdtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2UncyAnZnVsbCcgcm93czogZXZlcnkgb3Agb24gYSBwYXRoIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBrZWVwcywgYSBgZGVsZXRlYCBzcGVsbGVkIGBzZXRgLiAqL1xuICBwcml2YXRlIGZ1bGxSb3dzKCk6IFRyYWNlRW50cnlbXSB7XG4gICAgY29uc3Qga2VlcCA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIGNvbnN0IHJvd3M6IFRyYWNlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBsZXQgayA9IGtlZXAuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGsgPT09IHVuZGVmaW5lZCkga2VlcC5zZXQob3AucGF0aCwgKGsgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpKSk7XG4gICAgICBpZiAoaykgcm93cy5wdXNoKHsgcGF0aDogb3AucGF0aCwgdmVyYjogb3AudmVyYiA9PT0gJ21lcmdlJyA/ICdtZXJnZScgOiAnc2V0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSBzdGFnZSBjaGFuZ2UgdGhlIHZhbHVlIGF0IGBzZWdtZW50c2A/IEJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZVxuICAgKiBmaXhlZCBhdCBjb21taXQsIHNvIHRoaXMgaXMgdGhlIE9ORSBuZXQtY2hhbmdlIHZlcmRpY3QgYm90aCBwYXlsb2FkXG4gICAqIGVuY29kaW5ncyBhcHBseSAoYSBuby1vcCB3cml0ZSBhbmQgYSB3cml0ZS10aGVuLXJldmVydCBib3RoIGZhaWwgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkU2luY2VCYXNlKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGVlcEVxdWFsKF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKSwgX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGgg4oaSIGl0cyBvcC12ZXJiIHNlcXVlbmNlLCBvcmRlcmVkIGJ5IExBU1QgdG91Y2ggKGRlbGV0ZSArIHJlLWluc2VydFxuICAgKiBtb3ZlcyBhIHJlLXRvdWNoZWQgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBNYXAncyBpbnNlcnRpb24gb3JkZXIg4oCUXG4gICAqIHByZXNlcnZpbmcgbGFzdC13cml0ZXItd2lucyBmb3IgbmVzdGVkL292ZXJsYXBwaW5nIHBhdGhzKS4gUGVyLXdyaXRlXG4gICAqIHByb3ZlbmFuY2UgKCNQMSk6IHRoZSBMQVNUIG9wJ3MgcmVhZEtleXMgaXMga2VwdCDigJQgcmVhZCBwcmVmaXhlcyBvbmx5IGdyb3dcbiAgICogd2l0aGluIGEgc3RhZ2UsIHNvIGxhc3QgPT0gdW5pb24gYWNyb3NzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBvcHNCeVBhdGgoKTogTWFwPHN0cmluZywgeyB2ZXJiczogT3BWZXJiW107IHJlYWRLZXlzPzogc3RyaW5nW107IGxhc3Q6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBwcmV2ID0gYnlQYXRoLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHByZXYudmVyYnMucHVzaChvcC52ZXJiKTtcbiAgICAgICAgcHJldi5sYXN0ID0gaTtcbiAgICAgICAgaWYgKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQpIHByZXYucmVhZEtleXMgPSBvcC5yZWFkS2V5cztcbiAgICAgICAgYnlQYXRoLmRlbGV0ZShvcC5wYXRoKTtcbiAgICAgICAgYnlQYXRoLnNldChvcC5wYXRoLCBwcmV2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwge1xuICAgICAgICAgIHZlcmJzOiBbb3AudmVyYl0sXG4gICAgICAgICAgbGFzdDogaSxcbiAgICAgICAgICAuLi4ob3AucmVhZEtleXMgIT09IHVuZGVmaW5lZCAmJiB7IHJlYWRLZXlzOiBvcC5yZWFkS2V5cyB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBieVBhdGg7XG4gIH1cblxuICAvKiogVGhlIG5ldC1jaGFuZ2UgZmlsdGVyIOKAlCBpZGVudGljYWwgdG8gJ2Z1bGwnICh7QGxpbmsgY2hhbmdlZFNpbmNlQmFzZX0pLiBTdXJ2aXZvcnMga2VlcCBsYXN0LXRvdWNoIG9yZGVyLiAqL1xuICBwcml2YXRlIG5ldENoYW5nZVN1cnZpdm9ycyhieVBhdGg6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4pOiBTdXJ2aXZvcltdIHtcbiAgICBjb25zdCBzdXJ2aXZvcnM6IFN1cnZpdm9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCB7IHZlcmJzLCByZWFkS2V5cywgbGFzdCB9XSBvZiBieVBhdGgpIHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50cykpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIHN1cnZpdm9ycy5wdXNoKHsgcGF0aCwgc2VnbWVudHMsIHZlcmJzLCByZWFkS2V5cywgbGFzdCwgYmVmb3JlLCBhZnRlciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cnZpdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXkgYSBzdGFnZWQgYGRlbGV0ZWAgYXQgdGhpcyBwYXRoIGNvbW1pdCBhcyB0aGUgYCdkZWxldGUnYCB2ZXJiP1xuICAgKlxuICAgKiBPbmx5IHdoZW4gcmVtb3ZpbmcgdGhlIGtleSBhbmQgdGhlIGAnZnVsbCdgIG1vZGUncyBmbGF0dGVuaW5nIChgX3NldGAgb2ZcbiAgICogYHVuZGVmaW5lZGApIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuIFRoZXkgZGl2ZXJnZSB3aGVuIHRoZSBwYXJlbnQgaXMgbm90XG4gICAqIGEgY29udGFpbmVyOiBgbmF0aXZlRGVsZXRlYCB3YWxrcyBhd2F5IHVudG91Y2hlZCwgd2hpbGUgYG5hdGl2ZVNldGBcbiAgICogQ09FUkNFUyB0aGUgcHJpbWl0aXZlIHBhcmVudCBpbnRvIGFuIG9iamVjdCB0byBob2xkIHRoZSBrZXkuIENvbW1pdHRpbmdcbiAgICogYGRlbGV0ZWAgdGhlcmUgd291bGQgc2lsZW50bHkgZHJvcCBhIHN0YXRlIGNoYW5nZSB0aGUgc3RhZ2UgcmVhbGx5IG1hZGUsXG4gICAqIHNvIHRob3NlIChwYXRob2xvZ2ljYWwpIGRlbGV0ZXMga2VlcCB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVSZXBsYXlzQXNGbGF0dGVuaW5nKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlOyAvLyBwYXJlbnQgaXMgdGhlIHN0YXRlIHJvb3Qg4oCUIGFsd2F5cyBhIGNvbnRhaW5lclxuICAgIGNvbnN0IHBhcmVudCA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzLnNsaWNlKDAsIC0xKSk7XG4gICAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyZW50ID09PSAnb2JqZWN0JztcbiAgfVxufVxuXG4vKipcbiAqIEhpc3RvcmljYWwgZmxhdHRlbmluZyBmb3IgdGhlIGAnZnVsbCdgIHBheWxvYWQ6IGFuIGV4cGxpY2l0IGRlbGV0ZSBjb21taXRzXG4gKiBhcyBzZXQtb2YtdW5kZWZpbmVkLiBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKSByaWRlcyBlYWNoIHN1cnZpdmluZyBlbnRyeVxuICogdW50b3VjaGVkLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuZWRUcmFjZVJvdyhvcDogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9KTogVHJhY2VFbnRyeSB7XG4gIHJldHVybiBvcC52ZXJiID09PSAnZGVsZXRlJ1xuICAgID8geyBwYXRoOiBvcC5wYXRoLCB2ZXJiOiAnc2V0JyBhcyBjb25zdCwgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSkgfVxuICAgIDogb3A7XG59XG5cbi8qKiBBIHJvdydzIGByZWFkS2V5c2AgZnJhZ21lbnQg4oCUIGFic2VudCB1bmxlc3MgdGhlIHByb3ZlbmFuY2UgZGlhbCByZWNvcmRlZCBvbmUgKCNQMSkuICovXG5mdW5jdGlvbiBwcm92ZW5hbmNlKHJlYWRLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHsgcmVhZEtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVhZEtleXMgIT09IHVuZGVmaW5lZCA/IHsgcmVhZEtleXMgfSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
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==
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
|
|
12
12
|
* The log's scrub, `redactPatch`, moved to its owner `redaction.ts` in 9.33.0.
|
|
13
13
|
* The writers take an ADDRESS, a path prefix their caller computed, and never
|
|
14
|
-
* name one (C2: the engine decides where a stage writes, `StageContext ·
|
|
14
|
+
* name one (C2: the engine decides where a stage writes, `StageContext.ts · runAddress`).
|
|
15
15
|
* Zero external dependencies.
|
|
16
16
|
*/
|
|
17
17
|
export { deepEqual } from './equality.js';
|
|
@@ -25,7 +25,7 @@ type NestedObject = {
|
|
|
25
25
|
* The two places a value at `path` can sit: under `address` (`runPath`, absent
|
|
26
26
|
* for the root address `[]`) and at the root (`globalPath`). `address` is a
|
|
27
27
|
* path prefix the caller computed — for the engine, a frame's run namespace
|
|
28
|
-
* (`StageContext ·
|
|
28
|
+
* (`StageContext.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
|
|
29
29
|
*/
|
|
30
30
|
export declare function getRunAndGlobalPaths(address?: readonly string[], path?: (string | number)[]): {
|
|
31
31
|
runPath: (string | number)[] | undefined;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
|
|
12
12
|
* The log's scrub, `redactPatch`, moved to its owner `redaction.ts` in 9.33.0.
|
|
13
13
|
* The writers take an ADDRESS, a path prefix their caller computed, and never
|
|
14
|
-
* name one (C2: the engine decides where a stage writes, `StageContext ·
|
|
14
|
+
* name one (C2: the engine decides where a stage writes, `StageContext.ts · runAddress`).
|
|
15
15
|
* Zero external dependencies.
|
|
16
16
|
*/
|
|
17
17
|
import { nativeGet as _get } from './pathOps.js';
|
|
@@ -23,7 +23,7 @@ export { applySmartMerge, applySmartMergeInto, dryFold, nextGeneration, supersed
|
|
|
23
23
|
* The two places a value at `path` can sit: under `address` (`runPath`, absent
|
|
24
24
|
* for the root address `[]`) and at the root (`globalPath`). `address` is a
|
|
25
25
|
* path prefix the caller computed — for the engine, a frame's run namespace
|
|
26
|
-
* (`StageContext ·
|
|
26
|
+
* (`StageContext.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
|
|
27
27
|
*/
|
|
28
28
|
export function getRunAndGlobalPaths(address = [], path = []) {
|
|
29
29
|
return {
|
|
@@ -129,4 +129,4 @@ export function getNestedValue(root, path, field) {
|
|
|
129
129
|
}
|
|
130
130
|
return undefined;
|
|
131
131
|
}
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBd0MsTUFBTSxjQUFjLENBQUM7QUFJdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJaEg7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBNkIsRUFBRSxFQUFFLE9BQTRCLEVBQUU7SUFDbEcsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELG9IQUFvSDtBQUNwSCxTQUFTLFNBQVMsQ0FBQyxPQUEwQjtJQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FDakIsd0RBQXdELE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FDckcsQ0FBQztBQUNKLENBQUM7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WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNqRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBUyxFQUFFLElBQXlCLEVBQUUsS0FBdUI7SUFDMUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBuZXN0ZWQtb2JqZWN0IGhlbHBlcnMgZm9yIHRoZSBoZWFwLCBhbmQgdGhlIG1lbW9yeSBsZWF2ZXMnIG9uZVxuICogcmUtZXhwb3J0IHN1cmZhY2UuXG4gKlxuICogVGhlIGhlbHBlcnMgaGVyZSAoYHNldE5lc3RlZFZhbHVlYCwgYHVwZGF0ZU5lc3RlZFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCxcbiAqIGBnZXROZXN0ZWRWYWx1ZWApIHdhbGsgYSBuZXN0ZWQgb2JqZWN0IGJ5IHBhdGggd2l0aFxuICogcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgdGhpcyBmaWxlIHVzZWQgdG8gaG9sZCBoYXMgYW5cbiAqIG93bmVyIG9mIGl0cyBvd24gYW5kIGlzIHJlLWV4cG9ydGVkLCBzbyBubyBpbXBvcnRlciBtb3ZlZDogdGhlIHBhdGggY29kZWNcbiAqIChgcGF0aHMudHNgKSwgc3RydWN0dXJhbCBlcXVhbGl0eSAoYGVxdWFsaXR5LnRzYCkgYW5kIHRoZSB1bmlvbiBtZXJnZVxuICogKGBtZXJnZS50c2ApIGF0IEwwLCBhbmQgdGhlIHZlcmIgbGF3IChgdmVyYnMudHNgKSBhdCBMMSDigJQgYGFwcGx5U21hcnRNZXJnZWAsXG4gKiBgbmV4dEdlbmVyYXRpb25gLCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIGBkcnlGb2xkYCwgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICogVGhlIGxvZydzIHNjcnViLCBgcmVkYWN0UGF0Y2hgLCBtb3ZlZCB0byBpdHMgb3duZXIgYHJlZGFjdGlvbi50c2AgaW4gOS4zMy4wLlxuICogVGhlIHdyaXRlcnMgdGFrZSBhbiBBRERSRVNTLCBhIHBhdGggcHJlZml4IHRoZWlyIGNhbGxlciBjb21wdXRlZCwgYW5kIG5ldmVyXG4gKiBuYW1lIG9uZSAoQzI6IHRoZSBlbmdpbmUgZGVjaWRlcyB3aGVyZSBhIHN0YWdlIHdyaXRlcywgYFN0YWdlQ29udGV4dCDCtyBhZGRyZXNzYCkuXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlSGFzIGFzIF9oYXMsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vZXF1YWxpdHkuanMnO1xuZXhwb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmV4cG9ydCB7IERFTElNLCBub3JtYWxpc2VQYXRoLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmV4cG9ydCB7IGFwcGx5U21hcnRNZXJnZSwgYXBwbHlTbWFydE1lcmdlSW50bywgZHJ5Rm9sZCwgbmV4dEdlbmVyYXRpb24sIHN1cGVyc2VkZWRCeU5leHRTZXQgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFRoZSB0d28gcGxhY2VzIGEgdmFsdWUgYXQgYHBhdGhgIGNhbiBzaXQ6IHVuZGVyIGBhZGRyZXNzYCAoYHJ1blBhdGhgLCBhYnNlbnRcbiAqIGZvciB0aGUgcm9vdCBhZGRyZXNzIGBbXWApIGFuZCBhdCB0aGUgcm9vdCAoYGdsb2JhbFBhdGhgKS4gYGFkZHJlc3NgIGlzIGFcbiAqIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWQg4oCUIGZvciB0aGUgZW5naW5lLCBhIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZVxuICogKGBTdGFnZUNvbnRleHQgwrcgYWRkcmVzc2AsIEMyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBpID09PSBhZGRyZXNzLmxlbmd0aCAtIDEgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpW2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIERlZXAtbWVyZ2VzIGEgdmFsdWUgaW50byB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOyAvLyBjbGVhcjogW10gcmVwbGFjZXMgd2hhdGV2ZXIgd2FzIHRoZXJlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9O1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB3aXRoIHByb3RvdHlwZS1wb2xsdXRpb24gcHJvdGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlKHJvb3Q6IGFueSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGQ/OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuICBjb25zdCBub2RlID0gcGF0aCAmJiBwYXRoLmxlbmd0aCA+IDAgPyBfZ2V0KHJvb3QsIHBhdGgpIDogcm9vdDtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUgIT09IG51bGwgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBmaWVsZCkpIHtcbiAgICByZXR1cm4gbm9kZVtmaWVsZF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBd0MsTUFBTSxjQUFjLENBQUM7QUFJdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJaEg7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBNkIsRUFBRSxFQUFFLE9BQTRCLEVBQUU7SUFDbEcsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELG9IQUFvSDtBQUNwSCxTQUFTLFNBQVMsQ0FBQyxPQUEwQjtJQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FDakIsd0RBQXdELE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FDckcsQ0FBQztBQUNKLENBQUM7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WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNqRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBUyxFQUFFLElBQXlCLEVBQUUsS0FBdUI7SUFDMUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBuZXN0ZWQtb2JqZWN0IGhlbHBlcnMgZm9yIHRoZSBoZWFwLCBhbmQgdGhlIG1lbW9yeSBsZWF2ZXMnIG9uZVxuICogcmUtZXhwb3J0IHN1cmZhY2UuXG4gKlxuICogVGhlIGhlbHBlcnMgaGVyZSAoYHNldE5lc3RlZFZhbHVlYCwgYHVwZGF0ZU5lc3RlZFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCxcbiAqIGBnZXROZXN0ZWRWYWx1ZWApIHdhbGsgYSBuZXN0ZWQgb2JqZWN0IGJ5IHBhdGggd2l0aFxuICogcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgdGhpcyBmaWxlIHVzZWQgdG8gaG9sZCBoYXMgYW5cbiAqIG93bmVyIG9mIGl0cyBvd24gYW5kIGlzIHJlLWV4cG9ydGVkLCBzbyBubyBpbXBvcnRlciBtb3ZlZDogdGhlIHBhdGggY29kZWNcbiAqIChgcGF0aHMudHNgKSwgc3RydWN0dXJhbCBlcXVhbGl0eSAoYGVxdWFsaXR5LnRzYCkgYW5kIHRoZSB1bmlvbiBtZXJnZVxuICogKGBtZXJnZS50c2ApIGF0IEwwLCBhbmQgdGhlIHZlcmIgbGF3IChgdmVyYnMudHNgKSBhdCBMMSDigJQgYGFwcGx5U21hcnRNZXJnZWAsXG4gKiBgbmV4dEdlbmVyYXRpb25gLCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIGBkcnlGb2xkYCwgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICogVGhlIGxvZydzIHNjcnViLCBgcmVkYWN0UGF0Y2hgLCBtb3ZlZCB0byBpdHMgb3duZXIgYHJlZGFjdGlvbi50c2AgaW4gOS4zMy4wLlxuICogVGhlIHdyaXRlcnMgdGFrZSBhbiBBRERSRVNTLCBhIHBhdGggcHJlZml4IHRoZWlyIGNhbGxlciBjb21wdXRlZCwgYW5kIG5ldmVyXG4gKiBuYW1lIG9uZSAoQzI6IHRoZSBlbmdpbmUgZGVjaWRlcyB3aGVyZSBhIHN0YWdlIHdyaXRlcywgYFN0YWdlQ29udGV4dC50cyDCtyBydW5BZGRyZXNzYCkuXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlSGFzIGFzIF9oYXMsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vZXF1YWxpdHkuanMnO1xuZXhwb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmV4cG9ydCB7IERFTElNLCBub3JtYWxpc2VQYXRoLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmV4cG9ydCB7IGFwcGx5U21hcnRNZXJnZSwgYXBwbHlTbWFydE1lcmdlSW50bywgZHJ5Rm9sZCwgbmV4dEdlbmVyYXRpb24sIHN1cGVyc2VkZWRCeU5leHRTZXQgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFRoZSB0d28gcGxhY2VzIGEgdmFsdWUgYXQgYHBhdGhgIGNhbiBzaXQ6IHVuZGVyIGBhZGRyZXNzYCAoYHJ1blBhdGhgLCBhYnNlbnRcbiAqIGZvciB0aGUgcm9vdCBhZGRyZXNzIGBbXWApIGFuZCBhdCB0aGUgcm9vdCAoYGdsb2JhbFBhdGhgKS4gYGFkZHJlc3NgIGlzIGFcbiAqIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWQg4oCUIGZvciB0aGUgZW5naW5lLCBhIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZVxuICogKGBTdGFnZUNvbnRleHQudHMgwrcgcnVuQWRkcmVzc2AsIEMyKSwgaGVsZCBieSBpdHMgcmVjb3JkIGZyYW1lIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIEMzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBpID09PSBhZGRyZXNzLmxlbmd0aCAtIDEgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpW2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIERlZXAtbWVyZ2VzIGEgdmFsdWUgaW50byB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOyAvLyBjbGVhcjogW10gcmVwbGFjZXMgd2hhdGV2ZXIgd2FzIHRoZXJlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9O1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB3aXRoIHByb3RvdHlwZS1wb2xsdXRpb24gcHJvdGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlKHJvb3Q6IGFueSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGQ/OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuICBjb25zdCBub2RlID0gcGF0aCAmJiBwYXRoLmxlbmd0aCA+IDAgPyBfZ2V0KHJvb3QsIHBhdGgpIDogcm9vdDtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUgIT09IG51bGwgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBmaWVsZCkpIHtcbiAgICByZXR1cm4gbm9kZVtmaWVsZF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* path inside the value I read, put this". The value it read is BORROWED —
|
|
6
6
|
* before a stage's first staged write it is a bare reference into committed
|
|
7
7
|
* shared memory, and committed state is immutable-after-swap (see
|
|
8
|
-
* `
|
|
8
|
+
* `RecordFrame · firstTouch`). Editing it in place would corrupt every
|
|
9
9
|
* in-flight stage AND leave the commit log with nothing to record.
|
|
10
10
|
*
|
|
11
11
|
* So the write path never mutates. It COPIES the containers along the path
|