turbogui-angular 15.3.0 → 16.0.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.
@@ -234,8 +234,9 @@ export class DialogService extends SingletoneStrictClass {
234
234
  * - modal: True (default) if selecting an option is mandatory to close the dialog, false if the dialog can be closed
235
235
  * by the user clicking outside it
236
236
  * - texts: A list with strings containing the dialog texts, sorted by importance. When dialog has a title, this should
237
- * be placed first, subtitle second and so (Each dialog may accept different number of texts).
237
+ * be placed first, subtitle second and so (Each dialog may accept a different custom number of texts).
238
238
  * - options: A list of strings that will be used as button captions for each one of the accepted dialog options
239
+ * - data: An object that we can use to pass any extra data that we want to the dialog
239
240
  * - viewContainerRef: This is important if we want to propagate providers from a parent component to this dialog. We must specify
240
241
  * this reference to make sure the same services injected on the parent are available too at the child dialog
241
242
  *
@@ -250,6 +251,7 @@ export class DialogService extends SingletoneStrictClass {
250
251
  properties.modal = properties.modal ?? true;
251
252
  properties.texts = properties.texts ?? [];
252
253
  properties.options = properties.options ?? [];
254
+ properties.data = properties.data ?? {};
253
255
  // Generate a string to uniquely identify this dialog on the list of active dialogs
254
256
  // A dialog is considered as unique if the dialog id and texts are exactly the same. We do not take options into consideration
255
257
  // as there may be dialogs with a big amount of options available.
@@ -269,7 +271,7 @@ export class DialogService extends SingletoneStrictClass {
269
271
  autoFocus: false,
270
272
  closeOnNavigation: !properties.modal,
271
273
  viewContainerRef: properties.viewContainerRef,
272
- data: { texts: properties.texts, options: properties.options }
274
+ data: { texts: properties.texts, options: properties.options, data: properties.data }
273
275
  });
274
276
  // Assign the dialog ID only if specifically set on properties
275
277
  if (properties.id && properties.id !== undefined) {
@@ -403,4 +405,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImpor
403
405
  providedIn: 'root',
404
406
  }]
405
407
  }], ctorParameters: () => [{ type: i0.RendererFactory2 }, { type: i1.MatSnackBar }, { type: i2.MatDialog }, { type: i0.Injector }, { type: i0.ApplicationRef }, { type: i0.ComponentFactoryResolver }] });
406
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL2NvbnRyb2xsZXIvZGlhbG9nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFRLFVBQVUsRUFBcUcsTUFBTSxlQUFlLENBQUM7QUFHcEosT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwRUFBMEUsQ0FBQztBQUN4SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7OztBQUcvRTs7R0FFRztBQUlILE1BQU0sT0FBTyxhQUFjLFNBQVEscUJBQXFCO0lBeUZwRCxZQUFZLGVBQWlDLEVBQ2hCLFdBQXdCLEVBQ3hCLFNBQW9CLEVBQ3BCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLHdCQUFrRDtRQUVqRixLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFOVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUEzRi9FOzs7O1dBSUc7UUFDSCxrQ0FBNkIsR0FBaUMsc0JBQXNCLENBQUM7UUFHckY7O1dBRUc7UUFDSyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRzFCOztXQUVHO1FBQ0ssd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBR3BDOzs7O1dBSUc7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LHdCQUF3QixLQUFLLElBQUksRUFBRTtZQUV4QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEtBQUssSUFBSSxFQUFFO1lBRTFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7U0FDMUM7UUFFRCxJQUFJLElBQUksQ0FBQyw0QkFBNEIsS0FBSyxJQUFJLEVBQUU7WUFFNUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUMxQztJQUNMLENBQUM7OEdBcGlCUSxhQUFhO2tIQUFiLGFBQWEsY0FGWixNQUFNOzsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUdXJib0dVSSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEFycmF5VXRpbHMsIE51bWVyaWNVdGlscyB9IGZyb20gJ3R1cmJvY29tbW9ucy10cyc7XHJcbmltcG9ydCB7IFR5cGUsIEluamVjdGFibGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgSW5qZWN0b3IsIEFwcGxpY2F0aW9uUmVmLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciwgTWF0U25hY2tCYXJDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBCdXN5U3RhdGVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2J1c3ktc3RhdGUtYmFzZS9idXN5LXN0YXRlLWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBEb21Qb3J0YWxPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgRGlhbG9nQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL3ZpZXcvY29tcG9uZW50cy9kaWFsb2ctYmFzZS9kaWFsb2ctYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEaWFsb2dEYXRlU2VsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2RpYWxvZy1kYXRlLXNlbGVjdGlvbi9kaWFsb2ctZGF0ZS1zZWxlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2luZ2xldG9uZVN0cmljdENsYXNzIH0gZnJvbSAnLi4vbW9kZWwvY2xhc3Nlcy9TaW5nbGV0b25lU3RyaWN0Q2xhc3MnO1xuXHJcblxyXG4vKipcclxuICogTWFuYWdlcyB0aGUgYXBwbGljYXRpb24gbW9kYWwgYW5kIG5vbiBtb2RhbCBmbG9hdGluZyBlbGVtZW50c1xyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIERpYWxvZ1NlcnZpY2UgZXh0ZW5kcyBTaW5nbGV0b25lU3RyaWN0Q2xhc3Mge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gbW9kaWZ5IHRoZSBidXN5IHN0YXRlIGNvbXBvbmVudCB0aGF0IGlzIHNob3duIGJ5IGRlZmF1bHQgYnkgdGhlIGFkZE1vZGFsQnVzeVN0YXRlKCkgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgdGhpcy5hZGRNb2RhbEJ1c3lTdGF0ZSgpXHJcbiAgICAgKi9cclxuICAgIGN1c3RvbUJ1c3lTdGF0ZUNvbXBvbmVudENsYXNzOiBUeXBlPEJ1c3lTdGF0ZUJhc2VDb21wb25lbnQ+ID0gQnVzeVN0YXRlQmFzZUNvbXBvbmVudDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBwdWJsaWMgZ2V0dGVyIGZvciBkb2NzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzRW5hYmxlZCA9IHRydWU7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhlIG1haW4gYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHNob3dpbmcgYSBidXN5IHN0YXRlIHRoYXQgYmxvY2tzIGFsbCB1c2VyIGludGVyYWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd2luZ0J1c3lTdGF0ZSA9IGZhbHNlO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtb2RhbCBidXN5IHN0YXRlIGNvbXBvbmVudCB0aGF0IGlzIGluaXRpYWxpemVkIG9ubHkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIChUbyBhcHBlbmQgdGhlIGJ1c3kgc3RhdGUgZHluYW1pY2FsbHksIHdlIHVzZSB0aGUgUG9ydGFsIGNvbmNlcHQgZnJvbSB0aGUgYW5ndWxhciBtYXRlcmlhbCBsaWJyYXJ5KVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jb21wb25lbnRQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxCdXN5U3RhdGVCYXNlQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtb2RhbCBidXN5IHN0YXRlIGNvbnRhaW5lciB3aGVyZSB0aGUgY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbW9kYWxCdXN5U3RhdGVIb3N0OiBEb21Qb3J0YWxPdXRsZXQgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGUgbWFuYWdlciBpcyBjdXJyZW50bHkgc2hvd2luZyBhIHNuYWNrYmFyIGVsZW1lbnQgb3Igbm90XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd2luZ1NuYWNrQmFyID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGFpbnMgYSBsaXN0IG9mIHRoZSBkaWFsb2dzIHRoYXQgYXJlIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLlxyXG4gICAgICogRWFjaCBpdGVtIGluIHRoaXMgbGlzdCBpcyBhIGhhc2ggdGhhdCBpcyBjb21wdXRlZCB3aGVuIGRpYWxvZyBpcyBjcmVhdGVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGl0LlxyXG4gICAgICpcclxuICAgICAqIEVtcHR5IGxpc3QgbWVhbnMgbm8gZGlhbG9ncyBhcmUgY3VycmVudGx5IHZpc2libGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfYWN0aXZlRGlhbG9nczogc3RyaW5nW10gPSBbXTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyBhIGxpc3Qgd2l0aCBhbGwgdGhlIE1hdERpYWxvZyBpbnN0YW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IHZpc2libGUgdG8gdGhlIHVzZXIuXHJcbiAgICAgKiBUaGUgbGlzdCB1c2VzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBsaXN0IG9mIF9hY3RpdmVEaWFsb2dzIGhhc2ggdmFsdWVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2FjdGl2ZURpYWxvZ0luc3RhbmNlczogTWF0RGlhbG9nUmVmPERpYWxvZ0Jhc2VDb21wb25lbnQ+W10gPSBbXTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBpbml0aWFsaXplZCBSZW5kZXJlciAyIGluc3RhbmNlIHRoYXQgaXMgdXNlZCBieSB0aGlzIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyOiBSZW5kZXJlcjI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHRoYXQgaXMgdXNlZCB0byBkZWxldGUgdGhlIHdpbmRvdyBiZWZvcmV1bmxvYWQgZXZlbnQgbGlzdGVuZXIgb25jZSBub3QgdXNlZCBhbnltb3JlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdGhhdCBpcyB1c2VkIHRvIGRlbGV0ZSB0aGUgZG9jdW1lbnQga2V5ZG93biBldmVudCBsaXN0ZW5lciBvbmNlIG5vdCB1c2VkIGFueW1vcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRLZXlkb3duVW5saXN0ZW46ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBkb2N1bWVudCBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgb25jZSBub3QgdXNlZCBhbnltb3JlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW46ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBkb2N1bWVudCBwb2ludGVyZG93biBldmVudCBsaXN0ZW5lciBvbmNlIG5vdCB1c2VkIGFueW1vcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IocmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtYXRTbmFja0JhcjogTWF0U25hY2tCYXIsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1hdERpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcclxuXHJcblx0XHRzdXBlcihEaWFsb2dTZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhpcyBkaWFsb2cgc2VydmljZSBpcyBlbmFibGVkIG9yIG5vdC4gSWYgZGlhbG9nIHNlcnZpY2UgaXMgZGlzYWJsZWQsIG5vbmUgb2YgaXQncyBmZWF0dXJlcyB3aWxsIHdvcmtcclxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBibG9jayBhbGwgZGlhbG9nIGZlYXR1cmVzIG5vcm1hbGx5IHdoZW4gc2h1dHRpbmcgZG93biB0aGUgYXBwbGljYXRpb25cclxuICAgICAqXHJcbiAgICAgKiBVc2Ugd2l0aCBjYXV0aW9uLiBXaGVuIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCBkaWFsb2cgc2VydmljZSBzdG9wcyB3b3JraW5nLlxyXG4gICAgICovXHJcbiAgICBzZXQgaXNFbmFibGVkKHY6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNFbmFibGVkID0gdjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIGEgd2FybmluZyB0aGF0IHdpbGwgYmUgc2hvd24gdG8gdGhlIHVzZXIgd2hlbiBoZS9zaGUgdHJpZXMgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgICogVGhpcyB3YXJuaW5nIHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGNvbnRpbnVlIHdpdGggdGhlIGV4aXQgcHJvY2VzcyBvciBjYW5jZWwgaXQuXHJcbiAgICAgKiBUaGUgc3BlY2lmaWMgdGV4dHMgb2YgdGhpcyBtZXNzYWdlIGFyZSBhIGdlbmVyaWMgb25lcyBhbmQgY2Fubm90IGJlIGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogSU1QT1JUQU5UOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbWFpbiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBpbml0aWFsaXplZCBpbiBvcmRlciB0byB3b3JrLFxyXG4gICAgICogb3RoZXJ3aXNlIGl0IHdpbGwgZG8gbm90aGluZy5cclxuICAgICAqL1xyXG4gICAgYWRkQ2xvc2VBcHBsaWNhdGlvbldhcm5pbmcoKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRVbkxpc3RlbiA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdiZWZvcmV1bmxvYWQnLFxyXG4gICAgICAgICAgICAgICAgKGV2ZW50KSA9PiBldmVudC5yZXR1cm5WYWx1ZSA9IHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgdGhlIGNsb3NlIGFwcGxpY2F0aW9uIHdhcm5pbmcgbWVzc2FnZSBpZiBwcmV2aW91c2x5IGFzc2lnbmVkXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUNsb3NlQXBwbGljYXRpb25XYXJuaW5nKCkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW4gIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlIHRoZSBhcHBsaWNhdGlvbiB2aXN1YWwgYXBwZWFyYW5jZSBzbyB0aGUgdXNlciBwZXJjZWl2ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gaXNcclxuICAgICAqIGN1cnJlbnRseSBidXN5LiBXaGlsZSBtb2RhbCBidXN5IHN0YXRlIGlzIGVuYWJsZWQsIG5vIHVzZXIgaW5wdXQgaXMgcG9zc2libGUgbmVpdGhlciB2aWFcclxuICAgICAqIGtleWJvYXJkLCBtb3VzZSBvciB0b3VjaC4gVXNlIHRoaXMgc3RhdGUgd2hlbiBwZXJmb3JtaW5nIHNlcnZlciByZXF1ZXN0cyBvciBvcGVyYXRpb25zIHRoYXRcclxuICAgICAqIG11c3QgYmxvY2sgdGhlIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgYXBwbGljYXRpb24uIFRvIGFsbG93IHVzZXIgaW50ZXJhY3Rpb24gYWdhaW4sIHlvdSBtdXN0XHJcbiAgICAgKiBjYWxsIHJlbW92ZU1vZGFsQnVzeVN0YXRlKClcclxuICAgICAqXHJcbiAgICAgKiBOb3RpY2U6IFdlIGNhbiBtb2RpZnkgdGhlIGJ1c3kgc3RhdGUgdmlzdWFsIGNvbXBvbmVudCB0aGF0IGlzIHNob3duIGJ5IHRoaXMgbWV0aG9kLiBUbyBkbyBpdCwgd2UgbXVzdFxyXG4gICAgICogc2V0IHRoaXMuY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3MgcHJvcGVydHkgd2l0aCBvdXIgb3duIGN1c3RvbSBidXN5IHN0YXRlIGNvbXBvbmVudCBjbGFzcy4gKFdlIGNhbiBkbyBpdCBhdFxyXG4gICAgICogb3VyIG1haW4gYXBwbGljYXRpb24gY29tcG9uZW50IGNvbnN0cnVjdG9yIGZvciBleGFtcGxlKS4gT3VyIGN1c3RvbSBjb21wb25lbnQgbXVzdCBleHRlbmQgdGhlXHJcbiAgICAgKiBCdXN5U3RhdGVCYXNlQ29tcG9uZW50IG9uZSB0byBhZGQgaXRzIG93biB2aXN1YWwgYXBwZWFyYW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHRoaXMuY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3NcclxuICAgICAqL1xyXG4gICAgYWRkTW9kYWxCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkIHx8IHRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZVVzZXJJbnRlcmFjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBEeW5hbWljYWxseSBjcmVhdGUgdGhlIGJ1c3kgc3RhdGUgY29tcG9uZW50IHJlZmVyZW5jZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudFBvcnRhbCA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbCh0aGlzLmN1c3RvbUJ1c3lTdGF0ZUNvbXBvbmVudENsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIFBvcnRhbEhvc3Qgd2l0aCBkb2N1bWVudC5ib2R5IGFzIGl0cyBhbmNob3IgZWxlbWVudFxyXG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgPSBuZXcgRG9tUG9ydGFsT3V0bGV0KFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluamVjdG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICh0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgYXMgRG9tUG9ydGFsT3V0bGV0KS5hdHRhY2godGhpcy5fY29tcG9uZW50UG9ydGFsKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNTaG93aW5nQnVzeVN0YXRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGUgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IGxvY2tlZCBpbiBhIG1vZGFsIGJ1c3kgc3RhdGUgKGNhdXNlZCBieSBhbiBhZGRNb2RhbEJ1c3lTdGF0ZSgpIGNhbGwpXHJcbiAgICAgKi9cclxuICAgIGdldCBpc1Nob3dpbmdCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Nob3dpbmdCdXN5U3RhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FuY2VsIHRoZSBhcHBsaWNhdGlvbiBidXN5IHN0YXRlIGFuZCByZXN0b3JlIGl0IGJhY2sgdG8gbm9ybWFsIHNvIHVzZXIgaW50ZXJhY3Rpb24gaXMgYWxsb3dlZCBhZ2FpblxyXG4gICAgICovXHJcbiAgICByZW1vdmVNb2RhbEJ1c3lTdGF0ZSgpIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQgfHwgIXRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudFBvcnRhbCAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgKHRoaXMuX21vZGFsQnVzeVN0YXRlSG9zdCBhcyBEb21Qb3J0YWxPdXRsZXQpLmRldGFjaCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZW5hYmxlVXNlckludGVyYWN0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVE9ETyAtIGFkYXB0IGZyb20gVFMgdmVyc2lvblxyXG4gICAgICovXHJcbiAgICBhZGRUb29sVGlwKCkge1xyXG5cclxuICAgICAgICAvLyBUT0RPIC0gYWRhcHQgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBhIG5vbiBtb2RhbCBzbmFja2JhciBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIgKE9ubHkgb25lIHNuYWNrLWJhciBjYW4gZXZlciBiZSBvcGVuZWQgYXQgdGhlIHNhbWUgdGltZSkuXHJcbiAgICAgKlxyXG4gICAgICogU25hY2tiYXJzIGluZm9ybSB1c2VycyBvZiBhIHByb2Nlc3MgdGhhdCBhbiBhcHAgaGFzIHBlcmZvcm1lZCBvciB3aWxsIHBlcmZvcm0uIFRoZXkgYXBwZWFyIHRlbXBvcmFyaWx5LCB0b3dhcmRzIHRoZSBib3R0b20gb3IgdG9wIG9mIHRoZSBzY3JlZW4uXHJcbiAgICAgKiBUaGV5IHNob3VsZG7igJl0IGludGVycnVwdCB0aGUgdXNlciBleHBlcmllbmNlLCBhbmQgdGhleSBkb27igJl0IHJlcXVpcmUgdXNlciBpbnB1dCB0byBkaXNhcHBlYXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbmZpZyBBIE1hdFNuYWNrQmFyQ29uZmlnIGluc3RhbmNlIHdpdGggdGhlIGN1c3RvbWl6YXRpb25zIHdlIHdhbnQgZm9yIHRoaXMgc25hY2tiYXJcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNob3cgb24gdGhlIHNuYWNrYmFyXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uIElmIG5vdCBlbXB0eSwgdGhlIHRleHQgdG8gcGxhY2Ugb24gdGhlIHNuYWNrYmFyIGNvbmZpcm1hdGlvbiBidXR0b25cclxuICAgICAqIEBwYXJhbSBhY3Rpb25DYWxsYmFjayBBIG1ldGhvZCB0byBleGVjdXRlIG9uY2UgdGhlIHVzZXIgY2xpY2tzIGludG8gdGhlIGFjdGlvbiBidXR0b24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKi9cclxuICAgIGFkZFNuYWNrQmFyKGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcsIG1lc3NhZ2U6IHN0cmluZywgYWN0aW9uID0gJycsIGFjdGlvbkNhbGxiYWNrOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd2luZ1NuYWNrQmFyKSB7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBzaG93IGEgc25hY2tiYXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgc3RpbGwgdmlzaWJsZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNTaG93aW5nU25hY2tCYXIgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBzbmFja0JhclJlZiA9IHRoaXMubWF0U25hY2tCYXIub3BlbihtZXNzYWdlLCBhY3Rpb24gPT09ICcnID8gdW5kZWZpbmVkIDogYWN0aW9uLCBjb25maWcpO1xyXG5cclxuICAgICAgICBpZiAoYWN0aW9uQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHNuYWNrQmFyUmVmLm9uQWN0aW9uKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBhY3Rpb25DYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBzaG93aW5nIGEgc25hY2tiYXIgb3Igbm90XHJcbiAgICAgKi9cclxuICAgIGdldCBpc1Nob3dpbmdTbmFja0JhcigpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2hvd2luZ1NuYWNrQmFyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvcmNlIHRoZSByZW1vdmFsIG9mIHRoZSBzbmFjayBiYXIgZGlhbG9nIGlmIGl0IGV4aXN0cy5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBzbmFja2JhciBpcyBjdXJyZW50bHkgdmlzaWJsZSwgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVNuYWNrQmFyKCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCB8fCAhdGhpcy5faXNTaG93aW5nU25hY2tCYXIpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWF0U25hY2tCYXIuZGlzbWlzcygpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc1Nob3dpbmdTbmFja0JhciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgYSBkaWFsb2cgd2l0aCBvbmUgb3IgbW9yZSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2xvc2UgaXQuIFdlIGNhbiB1c2UgYW55IG9mIHRoZSBwcmVkZWZpbmVkIGRpYWxvZyB0eXBlcyB0aGF0IGFyZSBidW5kbGVkIHdpdGhcclxuICAgICAqIHRoaXMgbGlicmFyeSBvciBleHRlbmQgRGlhbG9nQmFzZUNvbXBvbmVudCB0byBjcmVhdGUgb3VyIG93biBjdXN0b20gb25lcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGlhbG9nQ29tcG9uZW50Q2xhc3MgQSBjbGFzcyBmb3IgYSBjb21wb25lbnQgdGhhdCBleHRlbmRzIERpYWxvZ0Jhc2VDb21wb25lbnQsIHdoaWNoIHdpbGwgYmUgdGhlIGRpYWxvZyB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVudCB2aXN1YWwgYW5kIHRleHR1YWwgb3B0aW9ucyB0aGF0IHRoaXMgZGlhbG9nIGFsbG93czpcclxuICAgICAqICAgICAgICAgICAgLSBpZDogVGhlIGh0bWwgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBvbmNlIGNyZWF0ZWQuIElmIG5vdCBzcGVjaWZpZWQsIG5vIGlkIHdpbGwgYmUgZXhwbGljaXRseSBzZXRcclxuICAgICAqICAgICAgICAgICAgLSB3aWR0aDogNTAlIGJ5IGRlZmF1bHQuIFNwZWNpZnkgdGhlIGNzcyB2YWx1ZSBmb3IgdGhlIGRlZmF1bHQgZGlhbG9nIHdpZHRoLiBBcyB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpdmUsIHRoZSB2YWx1ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcclxuICAgICAqICAgICAgICAgICAgICByZWR1Y2VkIGlmIHRoZSBhdmFpbGFibGUgc2NyZWVuIGlzIG5vdCBlbm91Z2gsIGFuZCB3aWxsIHJlYWNoIHRoZSBkZXNpcmVkIHZhbHVlIG90aGVyd2lzZS4gV2UgY2FuIHNldCBhbnkgY3NzIHVuaXQgbGlrZSBwaXhlbHMsIFxyXG4gICAgICogICAgICAgICAgICAgICUsIHZoLCB2dywgb3IgYW55IG90aGVyLiBGb3IgZXhhbXBsZTogJzQwMHB4JywgJzUwJScsIGV0Yy5cclxuICAgICAqICAgICAgICAgICAgLSBtYXhXaWR0aDogRGVmaW5lcyB0aGUgbWF4aW11bSB3aWR0aCB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIHJlZ2FyZGluZyB0aGUgdmlld3BvcnQuIFdlIGNhbiBzcGVjaWZ5IGl0IGluICUgb3IgdncsIGp1c3QgbGlrZSBpcyBkb25lIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgY3NzLiBCeSBkZWZhdWx0IGl0IGlzIGRlZmluZWQgYXMgOTZ2dywgd2hpY2ggd2lsbCBmaXQgOTYlIG9mIHRoZSB2aWV3cG9ydCBvbiBzbWFsbCBkZXZpY2VzXHJcbiAgICAgKiAgICAgICAgICAgIC0gaGVpZ2h0OiBUT0RPIGRvY3NcclxuICAgICAqICAgICAgICAgICAgLSBtYXhIZWlnaHQ6IFRPRE8gZG9jc1xyXG4gICAgICogICAgICAgICAgICAtIG1vZGFsOiBUcnVlIChkZWZhdWx0KSBpZiBzZWxlY3RpbmcgYW4gb3B0aW9uIGlzIG1hbmRhdG9yeSB0byBjbG9zZSB0aGUgZGlhbG9nLCBmYWxzZSBpZiB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWRcclxuICAgICAqICAgICAgICAgICAgICBieSB0aGUgdXNlciBjbGlja2luZyBvdXRzaWRlIGl0IFxyXG4gICAgICogICAgICAgICAgICAtIHRleHRzOiBBIGxpc3Qgd2l0aCBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGRpYWxvZyB0ZXh0cywgc29ydGVkIGJ5IGltcG9ydGFuY2UuIFdoZW4gZGlhbG9nIGhhcyBhIHRpdGxlLCB0aGlzIHNob3VsZFxyXG4gICAgICogICAgICAgICAgICAgIGJlIHBsYWNlZCBmaXJzdCwgc3VidGl0bGUgc2Vjb25kIGFuZCBzbyAoRWFjaCBkaWFsb2cgbWF5IGFjY2VwdCBkaWZmZXJlbnQgbnVtYmVyIG9mIHRleHRzKS5cclxuICAgICAqICAgICAgICAgICAgLSBvcHRpb25zOiBBIGxpc3Qgb2Ygc3RyaW5ncyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBidXR0b24gY2FwdGlvbnMgZm9yIGVhY2ggb25lIG9mIHRoZSBhY2NlcHRlZCBkaWFsb2cgb3B0aW9uc1xyXG4gICAgICogICAgICAgICAgICAtIHZpZXdDb250YWluZXJSZWY6IFRoaXMgaXMgaW1wb3J0YW50IGlmIHdlIHdhbnQgdG8gcHJvcGFnYXRlIHByb3ZpZGVycyBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCB0byB0aGlzIGRpYWxvZy4gV2UgbXVzdCBzcGVjaWZ5IFxyXG5cdCAqICAgICAgICAgICAgICB0aGlzIHJlZmVyZW5jZSB0byBtYWtlIHN1cmUgdGhlIHNhbWUgc2VydmljZXMgaW5qZWN0ZWQgb24gdGhlIHBhcmVudCBhcmUgYXZhaWxhYmxlIHRvbyBhdCB0aGUgY2hpbGQgZGlhbG9nIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBJdCB3aWxsIHJlY2VpdmUgYSBzZWxlY3Rpb24gb2JqZWN0IHdpdGggdHdvIHByb3BlcnRpZXM6IGluZGV4IGFuZCB2YWx1ZS4gVGhvc2UgXHJcbiAgICAgKiAgICAgICAgd2lsbCBjb250YWluIHRoZSBpbmRleCBhbmQgdmFsdWUgZnJvbSB0aGUgb3B0aW9ucyBhcnJheSB0aGF0J3Mgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIGlmIG5vIG9wdGlvbiBzZWxlY3RlZCwgaW5kZXggd2lsbCBiZSAtMSBhbmQgdmFsdWUgbnVsbFxyXG4gICAgICovXHJcbiAgICBhZGREaWFsb2coZGlhbG9nQ29tcG9uZW50Q2xhc3M6IFR5cGU8RGlhbG9nQmFzZUNvbXBvbmVudD4sXHJcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge2lkPzogc3RyaW5nLFxyXG5cdFx0XHRcdFx0XHQgICB3aWR0aD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD86IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRzPzogc3RyaW5nW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM/OiBzdHJpbmdbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZj86IFZpZXdDb250YWluZXJSZWZ9LCBcclxuICAgICAgICAgICAgICBjYWxsYmFjazogbnVsbCB8ICgoc2VsZWN0aW9uOiB7aW5kZXg6bnVtYmVyLCB2YWx1ZT86IGFueX0pID0+IHZvaWQpID0gbnVsbCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBub24gc3BlY2lmaWVkIHByb3BlcnRpZXNcclxuICAgICAgICBwcm9wZXJ0aWVzLm1vZGFsID0gcHJvcGVydGllcy5tb2RhbCA/PyB0cnVlO1xyXG4gICAgICAgIHByb3BlcnRpZXMudGV4dHMgPSBwcm9wZXJ0aWVzLnRleHRzID8/IFtdO1xyXG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHByb3BlcnRpZXMub3B0aW9ucyA/PyBbXTtcclxuXHJcbiAgICAgICAgLy8gR2VuZXJhdGUgYSBzdHJpbmcgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBkaWFsb2cgb24gdGhlIGxpc3Qgb2YgYWN0aXZlIGRpYWxvZ3NcclxuICAgICAgICAvLyBBIGRpYWxvZyBpcyBjb25zaWRlcmVkIGFzIHVuaXF1ZSBpZiB0aGUgZGlhbG9nIGlkIGFuZCB0ZXh0cyBhcmUgZXhhY3RseSB0aGUgc2FtZS4gV2UgZG8gbm90IHRha2Ugb3B0aW9ucyBpbnRvIGNvbnNpZGVyYXRpb25cclxuICAgICAgICAvLyBhcyB0aGVyZSBtYXkgYmUgZGlhbG9ncyB3aXRoIGEgYmlnIGFtb3VudCBvZiBvcHRpb25zIGF2YWlsYWJsZS5cclxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gKGRpYWxvZ0NvbXBvbmVudENsYXNzIGFzIGFueSkuRElBTE9HX0NMQVNTX05BTUU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYoY2xhc3NOYW1lID09PSAnJyl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHN0YXRpYyBwcm9wZXJ0eSBESUFMT0dfQ0xBU1NfTkFNRSBpcyBub3QgZGVmaW5lZCBvciBpcyBlbXB0eSBmb3IgdGhpcyBkaWFsb2cgY29tcG9uZW50ICgke2RpYWxvZ0NvbXBvbmVudENsYXNzfSlgKTsgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBkaWFsb2dIYXNoID0gY2xhc3NOYW1lICsgcHJvcGVydGllcy50ZXh0cy5qb2luKCcnKTtcclxuXHJcbiAgICAgICAgLy8gaWRlbnRpY2FsIGRpYWxvZ3Mgd29uJ3QgYmUgYWxsb3dlZCBhdCB0aGUgc2FtZSB0aW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZURpYWxvZ3MuaW5jbHVkZXMoZGlhbG9nSGFzaCkpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4oZGlhbG9nQ29tcG9uZW50Q2xhc3MsIHtcclxuICAgICAgICAgICAgd2lkdGg6IHByb3BlcnRpZXMud2lkdGggPz8gXCI1MCVcIixcclxuICAgICAgICAgICAgbWF4V2lkdGg6IHByb3BlcnRpZXMubWF4V2lkdGggPz8gXCI5NnZ3XCIsXHJcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogcHJvcGVydGllcy5tb2RhbCxcclxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcclxuICAgICAgICAgICAgY2xvc2VPbk5hdmlnYXRpb246ICFwcm9wZXJ0aWVzLm1vZGFsLFxyXG4gICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmOiBwcm9wZXJ0aWVzLnZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgICAgIGRhdGE6IHsgdGV4dHM6IHByb3BlcnRpZXMudGV4dHMsIG9wdGlvbnM6IHByb3BlcnRpZXMub3B0aW9ucyB9XHJcbiAgICAgICAgICB9KTsgICAgICBcclxuXHRcdFxyXG5cdFx0Ly8gQXNzaWduIHRoZSBkaWFsb2cgSUQgb25seSBpZiBzcGVjaWZpY2FsbHkgc2V0IG9uIHByb3BlcnRpZXNcclxuXHRcdGlmKHByb3BlcnRpZXMuaWQgJiYgcHJvcGVydGllcy5pZCAhPT0gdW5kZWZpbmVkKXtcclxuXHRcdFx0XHJcblx0XHRcdGRpYWxvZ1JlZi5pZCA9IHByb3BlcnRpZXMuaWQ7XHJcblx0XHR9XHJcblx0XHRcclxuICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dzLnB1c2goZGlhbG9nSGFzaCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzLnB1c2goZGlhbG9nUmVmKTtcclxuXHJcbiAgICAgICAgZGlhbG9nUmVmLmJlZm9yZUNsb3NlZCgpLnN1YnNjcmliZSgoc2VsZWN0aW9uOntpbmRleDpudW1iZXIsIHZhbHVlPzphbnl9KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dzID0gQXJyYXlVdGlscy5yZW1vdmVFbGVtZW50KHRoaXMuX2FjdGl2ZURpYWxvZ3MsIGRpYWxvZ0hhc2gpO1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dJbnN0YW5jZXMgPSBBcnJheVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzLCBkaWFsb2dSZWYpO1xyXG5cclxuICAgICAgICAgICAgaWYoIXByb3BlcnRpZXMubW9kYWwgJiYgc2VsZWN0aW9uID09PSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHsgaW5kZXg6IC0xIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ZWxzZSBpZiAoIU51bWVyaWNVdGlscy5pc0ludGVnZXIoc2VsZWN0aW9uLmluZGV4KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2xvc2VEaWFsb2coKSBleHBlY3RzIGluZGV4IHRvIGJlIGFuIGludGVnZXJgKTsgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoc2VsZWN0aW9uLmluZGV4ID49IDAgJiYgc2VsZWN0aW9uLnZhbHVlID09PSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24udmFsdWUgPSBwcm9wZXJ0aWVzLm9wdGlvbnMhW3NlbGVjdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgKGNhbGxiYWNrIGFzICgoc2VsZWN0aW9uOntpbmRleDpudW1iZXIsIHZhbHVlPzphbnl9KSA9PiB2b2lkKSkoc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBhIGRpYWxvZyB3aXRoIGEgY2FsZW5kYXIgdG8gbGV0IHRoZSB1c2VyIHBpY2sgYSBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkaWZmZXJlbnQgdmlzdWFsIGFuZCB0ZXh0dWFsIG9wdGlvbnMgdGhhdCB0aGlzIGRpYWxvZyBhbGxvd3M6XHJcbiAgICAgKiAgICAgICAgICAgIC0gaWQ6IFRoZSBodG1sIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgb25jZSBjcmVhdGVkLiBJZiBub3Qgc3BlY2lmaWVkLCBubyBpZCB3aWxsIGJlIGV4cGxpY2l0bHkgc2V0XHJcbiAgICAgKiAgICAgICAgICAgIC0gd2lkdGg6IFNwZWNpZnkgdGhlIGNzcyB2YWx1ZSBmb3IgdGhlIGRlZmF1bHQgZGlhbG9nIHdpZHRoLiBBcyB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpdmUsIHRoZSB2YWx1ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcclxuICAgICAqICAgICAgICAgICAgICByZWR1Y2VkIGlmIHRoZSBhdmFpbGFibGUgc2NyZWVuIGlzIG5vdCBlbm91Z2gsIGFuZCB3aWxsIHJlYWNoIHRoZSBkZXNpcmVkIHZhbHVlIG90aGVyd2lzZS4gV2UgY2FuIHNldCBhbnkgY3NzIHVuaXQgbGlrZSBwaXhlbHMsIFxyXG4gICAgICogICAgICAgICAgICAgICUsIHZoLCB2dywgb3IgYW55IG90aGVyLiBGb3IgZXhhbXBsZTogJzQwMHB4JywgJzUwJScsIGV0Yy5cclxuICAgICAqICAgICAgICAgICAgLSBtYXhXaWR0aDogRGVmaW5lcyB0aGUgbWF4aW11bSB3aWR0aCB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIHJlZ2FyZGluZyB0aGUgdmlld3BvcnQuIFdlIGNhbiBzcGVjaWZ5IGl0IGluICUgb3IgdncsIGp1c3QgbGlrZSBpcyBkb25lIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgY3NzLiBCeSBkZWZhdWx0IGl0IGlzIGRlZmluZWQgYXMgOTZ2dywgd2hpY2ggd2lsbCBmaXQgOTYlIG9mIHRoZSB2aWV3cG9ydCBvbiBzbWFsbCBkZXZpY2VzXHJcbiAgICAgKiAgICAgICAgICAgIC0gaGVpZ2h0OiBUT0RPIGRvY3NcclxuICAgICAqICAgICAgICAgICAgLSBtYXhIZWlnaHQ6IFRPRE8gZG9jc1xyXG4gICAgICogICAgICAgICAgICAtIG1vZGFsOiBUcnVlIChkZWZhdWx0KSBpZiBzZWxlY3RpbmcgYW4gb3B0aW9uIGlzIG1hbmRhdG9yeSB0byBjbG9zZSB0aGUgZGlhbG9nLCBmYWxzZSBpZiB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWRcclxuICAgICAqICAgICAgICAgICAgICBieSB0aGUgdXNlciBjbGlja2luZyBvdXRzaWRlIGl0IFxyXG4gICAgICogICAgICAgICAgICAtIHRpdGxlOiBBbiBvcHRpb25hbCBkaWFsb2cgdGl0bGVcclxuICAgICAqICAgICAgICAgICAgLSB2aWV3Q29udGFpbmVyUmVmOiBUaGlzIGlzIGltcG9ydGFudCB0byBwcm9wYWdhdGUgcHJvdmlkZXJzIGZyb20gYSBwYXJlbnQgY29tcG9uZW50IHRvIHRoaXMgZGlhbG9nLiBXZSBtdXN0IHNwZWNpZnkgXHJcblx0ICogICAgICAgICAgICAgIHRoaXMgcmVmZXJlbmNlIHRvIG1ha2Ugc3VyZSB0aGUgc2FtZSBzZXJ2aWNlcyBpbmplY3RlZCBvbiB0aGUgcGFyZW50IGFyZSBhdmFpbGFibGUgdG9vIGF0IHRoZSBjaGlsZCBkaWFsb2cgXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQuIEl0IHdpbGwgcmVjZWl2ZSBhIERhdGUoKSBvYmplY3Qgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgb3IgbnVsbCBpZiBubyBzZWxlY3Rpb24gaGFwcGVuZWRcclxuICAgICAqL1xyXG4gICAgYWRkRGF0ZVNlbGVjdGlvbkRpYWxvZyhwcm9wZXJ0aWVzOiB7aWQ/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoPzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw/OiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdFx0dmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAoKHNlbGVjdGVkRGF0ZTogbnVsbCB8IERhdGUpID0+IHZvaWQpKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYWRkRGlhbG9nKERpYWxvZ0RhdGVTZWxlY3Rpb25Db21wb25lbnQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiBwcm9wZXJ0aWVzLmlkID8/IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wZXJ0aWVzLndpZHRoID8/IFwiNTAlXCIsXHJcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogcHJvcGVydGllcy5tYXhXaWR0aCA/PyBcIjk2dndcIixcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcHJvcGVydGllcy5oZWlnaHQgPz8gXCI1MCVcIixcclxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogcHJvcGVydGllcy5tYXhIZWlnaHQgPz8gXCI5MnZ3XCIsXHJcbiAgICAgICAgICAgICAgICBtb2RhbDogcHJvcGVydGllcy5tb2RhbCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRleHRzOiBbcHJvcGVydGllcy50aXRsZSA/PyAnJ10sXHJcbiAgICAgICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmOiBwcm9wZXJ0aWVzLnZpZXdDb250YWluZXJSZWZcclxuICAgICAgICAgICAgfSwoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGVjdGlvbi5pbmRleCA9PT0gLTEgPyBudWxsIDogKHNlbGVjdGlvbi52YWx1ZSBhcyBEYXRlKSk7ICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZSB0aGUgcmVtb3ZhbCBvZiBhbGwgdGhlIGRpYWxvZ3MgdGhhdCBhcmUgY3VycmVudGx5IHZpc2libGUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gZGlhbG9ncyBhcmUgY3VycmVudGx5IHZpc2libGUsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZ1xyXG4gICAgICovXHJcbiAgICByZW1vdmVBbGxEaWFsb2dzKCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBkaWFsb2dSZWYgb2YgdGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzKSB7XHJcblxyXG4gICAgICAgICAgICBkaWFsb2dSZWYuY2xvc2Uoe2luZGV4Oi0xfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZURpYWxvZ3MgPSBbXTtcclxuICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dJbnN0YW5jZXMgPSBbXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUT0RPIC0gdHJhbnNsYXRlIGZyb20gVFMgdmVyc2lvblxyXG4gICAgICovXHJcbi8vICAgIGFkZFNpZGVOYXYoKXtcclxuLy9cclxuLy8gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE8gLSB0cmFuc2xhdGUgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICAgKi9cclxuLy8gICAgZ2V0IGlzU2hvd2luZ1NpZGVOYXYoKXtcclxuLy9cclxuLy8gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE8gLSB0cmFuc2xhdGUgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICAgKi9cclxuLy8gICAgcmVtb3ZlU2lkZU5hdigpe1xyXG4vL1xyXG4vLyAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCbG9jayBhbGwgdGhlIHVzZXIgaW50ZXJhY3Rpb25zIHdpdGggdGhlIGFwcGxpY2F0aW9uIChrZXlib2FyZCwgdG91Y2gsIG1vdXNlLCAuLi4pXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2Rpc2FibGVVc2VySW50ZXJhY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudEtleWRvd25Vbmxpc3RlbiA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRLZXlkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlZG93bicsIChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuID09PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudFBvaW50ZXJkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdG9yZSB0aGUgdXNlciBpbnRlcmFjdGlvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgZGlzYWJsZWQgd2l0aCBfZGlzYWJsZVVzZXJJbnRlcmFjdGlvbiBtZXRob2RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZW5hYmxlVXNlckludGVyYWN0aW9uKCkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnRLZXlkb3duVW5saXN0ZW4gIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50S2V5ZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50S2V5ZG93blVubGlzdGVuID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudE1vdXNlZG93blVubGlzdGVuICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudE1vdXNlZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50UG9pbnRlcmRvd25Vbmxpc3RlbiAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL2NvbnRyb2xsZXIvZGlhbG9nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFRLFVBQVUsRUFBcUcsTUFBTSxlQUFlLENBQUM7QUFHcEosT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwRUFBMEUsQ0FBQztBQUN4SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7OztBQUcvRTs7R0FFRztBQUlILE1BQU0sT0FBTyxhQUFjLFNBQVEscUJBQXFCO0lBeUZwRCxZQUFZLGVBQWlDLEVBQ2hCLFdBQXdCLEVBQ3hCLFNBQW9CLEVBQ3BCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLHdCQUFrRDtRQUVqRixLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFOVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUEzRi9FOzs7O1dBSUc7UUFDSCxrQ0FBNkIsR0FBaUMsc0JBQXNCLENBQUM7UUFHckY7O1dBRUc7UUFDSyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRzFCOztXQUVHO1FBQ0ssd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBR3BDOzs7O1dBSUc7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QUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQzNIO0lBQ0wsQ0FBQztJQUdEOztPQUVHO0lBQ0ssc0JBQXNCO1FBRTFCLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLElBQUksRUFBRTtZQUV4QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEtBQUssSUFBSSxFQUFFO1lBRTFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7U0FDMUM7UUFFRCxJQUFJLElBQUksQ0FBQyw0QkFBNEIsS0FBSyxJQUFJLEVBQUU7WUFFNUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUMxQztJQUNMLENBQUM7OEdBdmlCUSxhQUFhO2tIQUFiLGFBQWEsY0FGWixNQUFNOzsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUdXJib0dVSSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEFycmF5VXRpbHMsIE51bWVyaWNVdGlscyB9IGZyb20gJ3R1cmJvY29tbW9ucy10cyc7XHJcbmltcG9ydCB7IFR5cGUsIEluamVjdGFibGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgSW5qZWN0b3IsIEFwcGxpY2F0aW9uUmVmLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciwgTWF0U25hY2tCYXJDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBCdXN5U3RhdGVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2J1c3ktc3RhdGUtYmFzZS9idXN5LXN0YXRlLWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBEb21Qb3J0YWxPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgRGlhbG9nQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL3ZpZXcvY29tcG9uZW50cy9kaWFsb2ctYmFzZS9kaWFsb2ctYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEaWFsb2dEYXRlU2VsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2RpYWxvZy1kYXRlLXNlbGVjdGlvbi9kaWFsb2ctZGF0ZS1zZWxlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2luZ2xldG9uZVN0cmljdENsYXNzIH0gZnJvbSAnLi4vbW9kZWwvY2xhc3Nlcy9TaW5nbGV0b25lU3RyaWN0Q2xhc3MnO1xuXHJcblxyXG4vKipcclxuICogTWFuYWdlcyB0aGUgYXBwbGljYXRpb24gbW9kYWwgYW5kIG5vbiBtb2RhbCBmbG9hdGluZyBlbGVtZW50c1xyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIERpYWxvZ1NlcnZpY2UgZXh0ZW5kcyBTaW5nbGV0b25lU3RyaWN0Q2xhc3Mge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gbW9kaWZ5IHRoZSBidXN5IHN0YXRlIGNvbXBvbmVudCB0aGF0IGlzIHNob3duIGJ5IGRlZmF1bHQgYnkgdGhlIGFkZE1vZGFsQnVzeVN0YXRlKCkgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgdGhpcy5hZGRNb2RhbEJ1c3lTdGF0ZSgpXHJcbiAgICAgKi9cclxuICAgIGN1c3RvbUJ1c3lTdGF0ZUNvbXBvbmVudENsYXNzOiBUeXBlPEJ1c3lTdGF0ZUJhc2VDb21wb25lbnQ+ID0gQnVzeVN0YXRlQmFzZUNvbXBvbmVudDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBwdWJsaWMgZ2V0dGVyIGZvciBkb2NzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzRW5hYmxlZCA9IHRydWU7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhlIG1haW4gYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHNob3dpbmcgYSBidXN5IHN0YXRlIHRoYXQgYmxvY2tzIGFsbCB1c2VyIGludGVyYWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd2luZ0J1c3lTdGF0ZSA9IGZhbHNlO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtb2RhbCBidXN5IHN0YXRlIGNvbXBvbmVudCB0aGF0IGlzIGluaXRpYWxpemVkIG9ubHkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIChUbyBhcHBlbmQgdGhlIGJ1c3kgc3RhdGUgZHluYW1pY2FsbHksIHdlIHVzZSB0aGUgUG9ydGFsIGNvbmNlcHQgZnJvbSB0aGUgYW5ndWxhciBtYXRlcmlhbCBsaWJyYXJ5KVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jb21wb25lbnRQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxCdXN5U3RhdGVCYXNlQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtb2RhbCBidXN5IHN0YXRlIGNvbnRhaW5lciB3aGVyZSB0aGUgY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbW9kYWxCdXN5U3RhdGVIb3N0OiBEb21Qb3J0YWxPdXRsZXQgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGUgbWFuYWdlciBpcyBjdXJyZW50bHkgc2hvd2luZyBhIHNuYWNrYmFyIGVsZW1lbnQgb3Igbm90XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd2luZ1NuYWNrQmFyID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGFpbnMgYSBsaXN0IG9mIHRoZSBkaWFsb2dzIHRoYXQgYXJlIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLlxyXG4gICAgICogRWFjaCBpdGVtIGluIHRoaXMgbGlzdCBpcyBhIGhhc2ggdGhhdCBpcyBjb21wdXRlZCB3aGVuIGRpYWxvZyBpcyBjcmVhdGVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGl0LlxyXG4gICAgICpcclxuICAgICAqIEVtcHR5IGxpc3QgbWVhbnMgbm8gZGlhbG9ncyBhcmUgY3VycmVudGx5IHZpc2libGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfYWN0aXZlRGlhbG9nczogc3RyaW5nW10gPSBbXTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyBhIGxpc3Qgd2l0aCBhbGwgdGhlIE1hdERpYWxvZyBpbnN0YW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IHZpc2libGUgdG8gdGhlIHVzZXIuXHJcbiAgICAgKiBUaGUgbGlzdCB1c2VzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBsaXN0IG9mIF9hY3RpdmVEaWFsb2dzIGhhc2ggdmFsdWVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2FjdGl2ZURpYWxvZ0luc3RhbmNlczogTWF0RGlhbG9nUmVmPERpYWxvZ0Jhc2VDb21wb25lbnQ+W10gPSBbXTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBpbml0aWFsaXplZCBSZW5kZXJlciAyIGluc3RhbmNlIHRoYXQgaXMgdXNlZCBieSB0aGlzIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyOiBSZW5kZXJlcjI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHRoYXQgaXMgdXNlZCB0byBkZWxldGUgdGhlIHdpbmRvdyBiZWZvcmV1bmxvYWQgZXZlbnQgbGlzdGVuZXIgb25jZSBub3QgdXNlZCBhbnltb3JlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdGhhdCBpcyB1c2VkIHRvIGRlbGV0ZSB0aGUgZG9jdW1lbnQga2V5ZG93biBldmVudCBsaXN0ZW5lciBvbmNlIG5vdCB1c2VkIGFueW1vcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRLZXlkb3duVW5saXN0ZW46ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBkb2N1bWVudCBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgb25jZSBub3QgdXNlZCBhbnltb3JlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW46ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBkb2N1bWVudCBwb2ludGVyZG93biBldmVudCBsaXN0ZW5lciBvbmNlIG5vdCB1c2VkIGFueW1vcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IocmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtYXRTbmFja0JhcjogTWF0U25hY2tCYXIsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1hdERpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcclxuXHJcblx0XHRzdXBlcihEaWFsb2dTZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhpcyBkaWFsb2cgc2VydmljZSBpcyBlbmFibGVkIG9yIG5vdC4gSWYgZGlhbG9nIHNlcnZpY2UgaXMgZGlzYWJsZWQsIG5vbmUgb2YgaXQncyBmZWF0dXJlcyB3aWxsIHdvcmtcclxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBibG9jayBhbGwgZGlhbG9nIGZlYXR1cmVzIG5vcm1hbGx5IHdoZW4gc2h1dHRpbmcgZG93biB0aGUgYXBwbGljYXRpb25cclxuICAgICAqXHJcbiAgICAgKiBVc2Ugd2l0aCBjYXV0aW9uLiBXaGVuIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCBkaWFsb2cgc2VydmljZSBzdG9wcyB3b3JraW5nLlxyXG4gICAgICovXHJcbiAgICBzZXQgaXNFbmFibGVkKHY6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNFbmFibGVkID0gdjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIGEgd2FybmluZyB0aGF0IHdpbGwgYmUgc2hvd24gdG8gdGhlIHVzZXIgd2hlbiBoZS9zaGUgdHJpZXMgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgICogVGhpcyB3YXJuaW5nIHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGNvbnRpbnVlIHdpdGggdGhlIGV4aXQgcHJvY2VzcyBvciBjYW5jZWwgaXQuXHJcbiAgICAgKiBUaGUgc3BlY2lmaWMgdGV4dHMgb2YgdGhpcyBtZXNzYWdlIGFyZSBhIGdlbmVyaWMgb25lcyBhbmQgY2Fubm90IGJlIGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogSU1QT1JUQU5UOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbWFpbiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBpbml0aWFsaXplZCBpbiBvcmRlciB0byB3b3JrLFxyXG4gICAgICogb3RoZXJ3aXNlIGl0IHdpbGwgZG8gbm90aGluZy5cclxuICAgICAqL1xyXG4gICAgYWRkQ2xvc2VBcHBsaWNhdGlvbldhcm5pbmcoKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRVbkxpc3RlbiA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdiZWZvcmV1bmxvYWQnLFxyXG4gICAgICAgICAgICAgICAgKGV2ZW50KSA9PiBldmVudC5yZXR1cm5WYWx1ZSA9IHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgdGhlIGNsb3NlIGFwcGxpY2F0aW9uIHdhcm5pbmcgbWVzc2FnZSBpZiBwcmV2aW91c2x5IGFzc2lnbmVkXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUNsb3NlQXBwbGljYXRpb25XYXJuaW5nKCkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW4gIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlIHRoZSBhcHBsaWNhdGlvbiB2aXN1YWwgYXBwZWFyYW5jZSBzbyB0aGUgdXNlciBwZXJjZWl2ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gaXNcclxuICAgICAqIGN1cnJlbnRseSBidXN5LiBXaGlsZSBtb2RhbCBidXN5IHN0YXRlIGlzIGVuYWJsZWQsIG5vIHVzZXIgaW5wdXQgaXMgcG9zc2libGUgbmVpdGhlciB2aWFcclxuICAgICAqIGtleWJvYXJkLCBtb3VzZSBvciB0b3VjaC4gVXNlIHRoaXMgc3RhdGUgd2hlbiBwZXJmb3JtaW5nIHNlcnZlciByZXF1ZXN0cyBvciBvcGVyYXRpb25zIHRoYXRcclxuICAgICAqIG11c3QgYmxvY2sgdGhlIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgYXBwbGljYXRpb24uIFRvIGFsbG93IHVzZXIgaW50ZXJhY3Rpb24gYWdhaW4sIHlvdSBtdXN0XHJcbiAgICAgKiBjYWxsIHJlbW92ZU1vZGFsQnVzeVN0YXRlKClcclxuICAgICAqXHJcbiAgICAgKiBOb3RpY2U6IFdlIGNhbiBtb2RpZnkgdGhlIGJ1c3kgc3RhdGUgdmlzdWFsIGNvbXBvbmVudCB0aGF0IGlzIHNob3duIGJ5IHRoaXMgbWV0aG9kLiBUbyBkbyBpdCwgd2UgbXVzdFxyXG4gICAgICogc2V0IHRoaXMuY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3MgcHJvcGVydHkgd2l0aCBvdXIgb3duIGN1c3RvbSBidXN5IHN0YXRlIGNvbXBvbmVudCBjbGFzcy4gKFdlIGNhbiBkbyBpdCBhdFxyXG4gICAgICogb3VyIG1haW4gYXBwbGljYXRpb24gY29tcG9uZW50IGNvbnN0cnVjdG9yIGZvciBleGFtcGxlKS4gT3VyIGN1c3RvbSBjb21wb25lbnQgbXVzdCBleHRlbmQgdGhlXHJcbiAgICAgKiBCdXN5U3RhdGVCYXNlQ29tcG9uZW50IG9uZSB0byBhZGQgaXRzIG93biB2aXN1YWwgYXBwZWFyYW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHRoaXMuY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3NcclxuICAgICAqL1xyXG4gICAgYWRkTW9kYWxCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkIHx8IHRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZVVzZXJJbnRlcmFjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBEeW5hbWljYWxseSBjcmVhdGUgdGhlIGJ1c3kgc3RhdGUgY29tcG9uZW50IHJlZmVyZW5jZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudFBvcnRhbCA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbCh0aGlzLmN1c3RvbUJ1c3lTdGF0ZUNvbXBvbmVudENsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIFBvcnRhbEhvc3Qgd2l0aCBkb2N1bWVudC5ib2R5IGFzIGl0cyBhbmNob3IgZWxlbWVudFxyXG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgPSBuZXcgRG9tUG9ydGFsT3V0bGV0KFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluamVjdG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICh0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgYXMgRG9tUG9ydGFsT3V0bGV0KS5hdHRhY2godGhpcy5fY29tcG9uZW50UG9ydGFsKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNTaG93aW5nQnVzeVN0YXRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGUgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IGxvY2tlZCBpbiBhIG1vZGFsIGJ1c3kgc3RhdGUgKGNhdXNlZCBieSBhbiBhZGRNb2RhbEJ1c3lTdGF0ZSgpIGNhbGwpXHJcbiAgICAgKi9cclxuICAgIGdldCBpc1Nob3dpbmdCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Nob3dpbmdCdXN5U3RhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FuY2VsIHRoZSBhcHBsaWNhdGlvbiBidXN5IHN0YXRlIGFuZCByZXN0b3JlIGl0IGJhY2sgdG8gbm9ybWFsIHNvIHVzZXIgaW50ZXJhY3Rpb24gaXMgYWxsb3dlZCBhZ2FpblxyXG4gICAgICovXHJcbiAgICByZW1vdmVNb2RhbEJ1c3lTdGF0ZSgpIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQgfHwgIXRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudFBvcnRhbCAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgKHRoaXMuX21vZGFsQnVzeVN0YXRlSG9zdCBhcyBEb21Qb3J0YWxPdXRsZXQpLmRldGFjaCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZW5hYmxlVXNlckludGVyYWN0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVE9ETyAtIGFkYXB0IGZyb20gVFMgdmVyc2lvblxyXG4gICAgICovXHJcbiAgICBhZGRUb29sVGlwKCkge1xyXG5cclxuICAgICAgICAvLyBUT0RPIC0gYWRhcHQgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBhIG5vbiBtb2RhbCBzbmFja2JhciBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIgKE9ubHkgb25lIHNuYWNrLWJhciBjYW4gZXZlciBiZSBvcGVuZWQgYXQgdGhlIHNhbWUgdGltZSkuXHJcbiAgICAgKlxyXG4gICAgICogU25hY2tiYXJzIGluZm9ybSB1c2VycyBvZiBhIHByb2Nlc3MgdGhhdCBhbiBhcHAgaGFzIHBlcmZvcm1lZCBvciB3aWxsIHBlcmZvcm0uIFRoZXkgYXBwZWFyIHRlbXBvcmFyaWx5LCB0b3dhcmRzIHRoZSBib3R0b20gb3IgdG9wIG9mIHRoZSBzY3JlZW4uXHJcbiAgICAgKiBUaGV5IHNob3VsZG7igJl0IGludGVycnVwdCB0aGUgdXNlciBleHBlcmllbmNlLCBhbmQgdGhleSBkb27igJl0IHJlcXVpcmUgdXNlciBpbnB1dCB0byBkaXNhcHBlYXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbmZpZyBBIE1hdFNuYWNrQmFyQ29uZmlnIGluc3RhbmNlIHdpdGggdGhlIGN1c3RvbWl6YXRpb25zIHdlIHdhbnQgZm9yIHRoaXMgc25hY2tiYXJcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNob3cgb24gdGhlIHNuYWNrYmFyXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uIElmIG5vdCBlbXB0eSwgdGhlIHRleHQgdG8gcGxhY2Ugb24gdGhlIHNuYWNrYmFyIGNvbmZpcm1hdGlvbiBidXR0b25cclxuICAgICAqIEBwYXJhbSBhY3Rpb25DYWxsYmFjayBBIG1ldGhvZCB0byBleGVjdXRlIG9uY2UgdGhlIHVzZXIgY2xpY2tzIGludG8gdGhlIGFjdGlvbiBidXR0b24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKi9cclxuICAgIGFkZFNuYWNrQmFyKGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcsIG1lc3NhZ2U6IHN0cmluZywgYWN0aW9uID0gJycsIGFjdGlvbkNhbGxiYWNrOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd2luZ1NuYWNrQmFyKSB7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBzaG93IGEgc25hY2tiYXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgc3RpbGwgdmlzaWJsZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNTaG93aW5nU25hY2tCYXIgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBzbmFja0JhclJlZiA9IHRoaXMubWF0U25hY2tCYXIub3BlbihtZXNzYWdlLCBhY3Rpb24gPT09ICcnID8gdW5kZWZpbmVkIDogYWN0aW9uLCBjb25maWcpO1xyXG5cclxuICAgICAgICBpZiAoYWN0aW9uQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHNuYWNrQmFyUmVmLm9uQWN0aW9uKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBhY3Rpb25DYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBzaG93aW5nIGEgc25hY2tiYXIgb3Igbm90XHJcbiAgICAgKi9cclxuICAgIGdldCBpc1Nob3dpbmdTbmFja0JhcigpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2hvd2luZ1NuYWNrQmFyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvcmNlIHRoZSByZW1vdmFsIG9mIHRoZSBzbmFjayBiYXIgZGlhbG9nIGlmIGl0IGV4aXN0cy5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBzbmFja2JhciBpcyBjdXJyZW50bHkgdmlzaWJsZSwgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVNuYWNrQmFyKCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCB8fCAhdGhpcy5faXNTaG93aW5nU25hY2tCYXIpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWF0U25hY2tCYXIuZGlzbWlzcygpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc1Nob3dpbmdTbmFja0JhciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgYSBkaWFsb2cgd2l0aCBvbmUgb3IgbW9yZSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2xvc2UgaXQuIFdlIGNhbiB1c2UgYW55IG9mIHRoZSBwcmVkZWZpbmVkIGRpYWxvZyB0eXBlcyB0aGF0IGFyZSBidW5kbGVkIHdpdGhcclxuICAgICAqIHRoaXMgbGlicmFyeSBvciBleHRlbmQgRGlhbG9nQmFzZUNvbXBvbmVudCB0byBjcmVhdGUgb3VyIG93biBjdXN0b20gb25lcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGlhbG9nQ29tcG9uZW50Q2xhc3MgQSBjbGFzcyBmb3IgYSBjb21wb25lbnQgdGhhdCBleHRlbmRzIERpYWxvZ0Jhc2VDb21wb25lbnQsIHdoaWNoIHdpbGwgYmUgdGhlIGRpYWxvZyB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVudCB2aXN1YWwgYW5kIHRleHR1YWwgb3B0aW9ucyB0aGF0IHRoaXMgZGlhbG9nIGFsbG93czpcclxuICAgICAqICAgICAgICAgICAgLSBpZDogVGhlIGh0bWwgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBvbmNlIGNyZWF0ZWQuIElmIG5vdCBzcGVjaWZpZWQsIG5vIGlkIHdpbGwgYmUgZXhwbGljaXRseSBzZXRcclxuICAgICAqICAgICAgICAgICAgLSB3aWR0aDogNTAlIGJ5IGRlZmF1bHQuIFNwZWNpZnkgdGhlIGNzcyB2YWx1ZSBmb3IgdGhlIGRlZmF1bHQgZGlhbG9nIHdpZHRoLiBBcyB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpdmUsIHRoZSB2YWx1ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcclxuICAgICAqICAgICAgICAgICAgICByZWR1Y2VkIGlmIHRoZSBhdmFpbGFibGUgc2NyZWVuIGlzIG5vdCBlbm91Z2gsIGFuZCB3aWxsIHJlYWNoIHRoZSBkZXNpcmVkIHZhbHVlIG90aGVyd2lzZS4gV2UgY2FuIHNldCBhbnkgY3NzIHVuaXQgbGlrZSBwaXhlbHMsIFxyXG4gICAgICogICAgICAgICAgICAgICUsIHZoLCB2dywgb3IgYW55IG90aGVyLiBGb3IgZXhhbXBsZTogJzQwMHB4JywgJzUwJScsIGV0Yy5cclxuICAgICAqICAgICAgICAgICAgLSBtYXhXaWR0aDogRGVmaW5lcyB0aGUgbWF4aW11bSB3aWR0aCB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIHJlZ2FyZGluZyB0aGUgdmlld3BvcnQuIFdlIGNhbiBzcGVjaWZ5IGl0IGluICUgb3IgdncsIGp1c3QgbGlrZSBpcyBkb25lIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgY3NzLiBCeSBkZWZhdWx0IGl0IGlzIGRlZmluZWQgYXMgOTZ2dywgd2hpY2ggd2lsbCBmaXQgOTYlIG9mIHRoZSB2aWV3cG9ydCBvbiBzbWFsbCBkZXZpY2VzXHJcbiAgICAgKiAgICAgICAgICAgIC0gaGVpZ2h0OiBUT0RPIGRvY3NcclxuICAgICAqICAgICAgICAgICAgLSBtYXhIZWlnaHQ6IFRPRE8gZG9jc1xyXG4gICAgICogICAgICAgICAgICAtIG1vZGFsOiBUcnVlIChkZWZhdWx0KSBpZiBzZWxlY3RpbmcgYW4gb3B0aW9uIGlzIG1hbmRhdG9yeSB0byBjbG9zZSB0aGUgZGlhbG9nLCBmYWxzZSBpZiB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWRcclxuICAgICAqICAgICAgICAgICAgICBieSB0aGUgdXNlciBjbGlja2luZyBvdXRzaWRlIGl0IFxyXG4gICAgICogICAgICAgICAgICAtIHRleHRzOiBBIGxpc3Qgd2l0aCBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGRpYWxvZyB0ZXh0cywgc29ydGVkIGJ5IGltcG9ydGFuY2UuIFdoZW4gZGlhbG9nIGhhcyBhIHRpdGxlLCB0aGlzIHNob3VsZFxyXG4gICAgICogICAgICAgICAgICAgIGJlIHBsYWNlZCBmaXJzdCwgc3VidGl0bGUgc2Vjb25kIGFuZCBzbyAoRWFjaCBkaWFsb2cgbWF5IGFjY2VwdCBhIGRpZmZlcmVudCBjdXN0b20gbnVtYmVyIG9mIHRleHRzKS5cclxuICAgICAqICAgICAgICAgICAgLSBvcHRpb25zOiBBIGxpc3Qgb2Ygc3RyaW5ncyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBidXR0b24gY2FwdGlvbnMgZm9yIGVhY2ggb25lIG9mIHRoZSBhY2NlcHRlZCBkaWFsb2cgb3B0aW9uc1xyXG4gICAgICogICAgICAgICAgICAtIGRhdGE6IEFuIG9iamVjdCB0aGF0IHdlIGNhbiB1c2UgdG8gcGFzcyBhbnkgZXh0cmEgZGF0YSB0aGF0IHdlIHdhbnQgdG8gdGhlIGRpYWxvZ1xyXG4gICAgICogICAgICAgICAgICAtIHZpZXdDb250YWluZXJSZWY6IFRoaXMgaXMgaW1wb3J0YW50IGlmIHdlIHdhbnQgdG8gcHJvcGFnYXRlIHByb3ZpZGVycyBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCB0byB0aGlzIGRpYWxvZy4gV2UgbXVzdCBzcGVjaWZ5IFxyXG5cdCAqICAgICAgICAgICAgICB0aGlzIHJlZmVyZW5jZSB0byBtYWtlIHN1cmUgdGhlIHNhbWUgc2VydmljZXMgaW5qZWN0ZWQgb24gdGhlIHBhcmVudCBhcmUgYXZhaWxhYmxlIHRvbyBhdCB0aGUgY2hpbGQgZGlhbG9nIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBJdCB3aWxsIHJlY2VpdmUgYSBzZWxlY3Rpb24gb2JqZWN0IHdpdGggdHdvIHByb3BlcnRpZXM6IGluZGV4IGFuZCB2YWx1ZS4gVGhvc2UgXHJcbiAgICAgKiAgICAgICAgd2lsbCBjb250YWluIHRoZSBpbmRleCBhbmQgdmFsdWUgZnJvbSB0aGUgb3B0aW9ucyBhcnJheSB0aGF0J3Mgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIGlmIG5vIG9wdGlvbiBzZWxlY3RlZCwgaW5kZXggd2lsbCBiZSAtMSBhbmQgdmFsdWUgbnVsbFxyXG4gICAgICovXHJcbiAgICBhZGREaWFsb2coZGlhbG9nQ29tcG9uZW50Q2xhc3M6IFR5cGU8RGlhbG9nQmFzZUNvbXBvbmVudD4sXHJcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge2lkPzogc3RyaW5nLFxyXG5cdFx0XHRcdFx0XHQgICB3aWR0aD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD86IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRzPzogc3RyaW5nW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM/OiBzdHJpbmdbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT86IGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZj86IFZpZXdDb250YWluZXJSZWZ9LCBcclxuICAgICAgICAgICAgICBjYWxsYmFjazogbnVsbCB8ICgoc2VsZWN0aW9uOiB7aW5kZXg6bnVtYmVyLCB2YWx1ZT86IGFueX0pID0+IHZvaWQpID0gbnVsbCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBub24gc3BlY2lmaWVkIHByb3BlcnRpZXNcclxuICAgICAgICBwcm9wZXJ0aWVzLm1vZGFsID0gcHJvcGVydGllcy5tb2RhbCA/PyB0cnVlO1xyXG4gICAgICAgIHByb3BlcnRpZXMudGV4dHMgPSBwcm9wZXJ0aWVzLnRleHRzID8/IFtdO1xyXG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHByb3BlcnRpZXMub3B0aW9ucyA/PyBbXTtcclxuICAgICAgICBwcm9wZXJ0aWVzLmRhdGEgPSBwcm9wZXJ0aWVzLmRhdGEgPz8ge307XHJcblxyXG4gICAgICAgIC8vIEdlbmVyYXRlIGEgc3RyaW5nIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgZGlhbG9nIG9uIHRoZSBsaXN0IG9mIGFjdGl2ZSBkaWFsb2dzXHJcbiAgICAgICAgLy8gQSBkaWFsb2cgaXMgY29uc2lkZXJlZCBhcyB1bmlxdWUgaWYgdGhlIGRpYWxvZyBpZCBhbmQgdGV4dHMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuIFdlIGRvIG5vdCB0YWtlIG9wdGlvbnMgaW50byBjb25zaWRlcmF0aW9uXHJcbiAgICAgICAgLy8gYXMgdGhlcmUgbWF5IGJlIGRpYWxvZ3Mgd2l0aCBhIGJpZyBhbW91bnQgb2Ygb3B0aW9ucyBhdmFpbGFibGUuXHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IChkaWFsb2dDb21wb25lbnRDbGFzcyBhcyBhbnkpLkRJQUxPR19DTEFTU19OQU1FO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKGNsYXNzTmFtZSA9PT0gJycpe1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzdGF0aWMgcHJvcGVydHkgRElBTE9HX0NMQVNTX05BTUUgaXMgbm90IGRlZmluZWQgb3IgaXMgZW1wdHkgZm9yIHRoaXMgZGlhbG9nIGNvbXBvbmVudCAoJHtkaWFsb2dDb21wb25lbnRDbGFzc30pYCk7ICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZGlhbG9nSGFzaCA9IGNsYXNzTmFtZSArIHByb3BlcnRpZXMudGV4dHMuam9pbignJyk7XHJcblxyXG4gICAgICAgIC8vIGlkZW50aWNhbCBkaWFsb2dzIHdvbid0IGJlIGFsbG93ZWQgYXQgdGhlIHNhbWUgdGltZVxyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVEaWFsb2dzLmluY2x1ZGVzKGRpYWxvZ0hhc2gpKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLm1hdERpYWxvZy5vcGVuKGRpYWxvZ0NvbXBvbmVudENsYXNzLCB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBwcm9wZXJ0aWVzLndpZHRoID8/IFwiNTAlXCIsXHJcbiAgICAgICAgICAgIG1heFdpZHRoOiBwcm9wZXJ0aWVzLm1heFdpZHRoID8/IFwiOTZ2d1wiLFxyXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHByb3BlcnRpZXMubW9kYWwsXHJcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgICAgICAgIGNsb3NlT25OYXZpZ2F0aW9uOiAhcHJvcGVydGllcy5tb2RhbCxcclxuICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZjogcHJvcGVydGllcy52aWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgICBkYXRhOiB7IHRleHRzOiBwcm9wZXJ0aWVzLnRleHRzLCBvcHRpb25zOiBwcm9wZXJ0aWVzLm9wdGlvbnMsIGRhdGE6IHByb3BlcnRpZXMuZGF0YSB9XHJcbiAgICAgICAgICB9KTsgICAgICBcclxuXHRcdFxyXG5cdFx0Ly8gQXNzaWduIHRoZSBkaWFsb2cgSUQgb25seSBpZiBzcGVjaWZpY2FsbHkgc2V0IG9uIHByb3BlcnRpZXNcclxuXHRcdGlmKHByb3BlcnRpZXMuaWQgJiYgcHJvcGVydGllcy5pZCAhPT0gdW5kZWZpbmVkKXtcclxuXHRcdFx0XHJcblx0XHRcdGRpYWxvZ1JlZi5pZCA9IHByb3BlcnRpZXMuaWQ7XHJcblx0XHR9XHJcblx0XHRcclxuICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dzLnB1c2goZGlhbG9nSGFzaCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzLnB1c2goZGlhbG9nUmVmKTtcclxuXHJcbiAgICAgICAgZGlhbG9nUmVmLmJlZm9yZUNsb3NlZCgpLnN1YnNjcmliZSgoc2VsZWN0aW9uOntpbmRleDpudW1iZXIsIHZhbHVlPzphbnl9KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dzID0gQXJyYXlVdGlscy5yZW1vdmVFbGVtZW50KHRoaXMuX2FjdGl2ZURpYWxvZ3MsIGRpYWxvZ0hhc2gpO1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dJbnN0YW5jZXMgPSBBcnJheVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzLCBkaWFsb2dSZWYpO1xyXG5cclxuICAgICAgICAgICAgaWYoIXByb3BlcnRpZXMubW9kYWwgJiYgc2VsZWN0aW9uID09PSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHsgaW5kZXg6IC0xIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ZWxzZSBpZiAoIU51bWVyaWNVdGlscy5pc0ludGVnZXIoc2VsZWN0aW9uLmluZGV4KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2xvc2VEaWFsb2coKSBleHBlY3RzIGluZGV4IHRvIGJlIGFuIGludGVnZXJgKTsgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoc2VsZWN0aW9uLmluZGV4ID49IDAgJiYgc2VsZWN0aW9uLnZhbHVlID09PSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24udmFsdWUgPSBwcm9wZXJ0aWVzLm9wdGlvbnMhW3NlbGVjdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgKGNhbGxiYWNrIGFzICgoc2VsZWN0aW9uOntpbmRleDpudW1iZXIsIHZhbHVlPzphbnl9KSA9PiB2b2lkKSkoc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBhIGRpYWxvZyB3aXRoIGEgY2FsZW5kYXIgdG8gbGV0IHRoZSB1c2VyIHBpY2sgYSBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkaWZmZXJlbnQgdmlzdWFsIGFuZCB0ZXh0dWFsIG9wdGlvbnMgdGhhdCB0aGlzIGRpYWxvZyBhbGxvd3M6XHJcbiAgICAgKiAgICAgICAgICAgIC0gaWQ6IFRoZSBodG1sIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgb25jZSBjcmVhdGVkLiBJZiBub3Qgc3BlY2lmaWVkLCBubyBpZCB3aWxsIGJlIGV4cGxpY2l0bHkgc2V0XHJcbiAgICAgKiAgICAgICAgICAgIC0gd2lkdGg6IFNwZWNpZnkgdGhlIGNzcyB2YWx1ZSBmb3IgdGhlIGRlZmF1bHQgZGlhbG9nIHdpZHRoLiBBcyB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpdmUsIHRoZSB2YWx1ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcclxuICAgICAqICAgICAgICAgICAgICByZWR1Y2VkIGlmIHRoZSBhdmFpbGFibGUgc2NyZWVuIGlzIG5vdCBlbm91Z2gsIGFuZCB3aWxsIHJlYWNoIHRoZSBkZXNpcmVkIHZhbHVlIG90aGVyd2lzZS4gV2UgY2FuIHNldCBhbnkgY3NzIHVuaXQgbGlrZSBwaXhlbHMsIFxyXG4gICAgICogICAgICAgICAgICAgICUsIHZoLCB2dywgb3IgYW55IG90aGVyLiBGb3IgZXhhbXBsZTogJzQwMHB4JywgJzUwJScsIGV0Yy5cclxuICAgICAqICAgICAgICAgICAgLSBtYXhXaWR0aDogRGVmaW5lcyB0aGUgbWF4aW11bSB3aWR0aCB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIHJlZ2FyZGluZyB0aGUgdmlld3BvcnQuIFdlIGNhbiBzcGVjaWZ5IGl0IGluICUgb3IgdncsIGp1c3QgbGlrZSBpcyBkb25lIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgY3NzLiBCeSBkZWZhdWx0IGl0IGlzIGRlZmluZWQgYXMgOTZ2dywgd2hpY2ggd2lsbCBmaXQgOTYlIG9mIHRoZSB2aWV3cG9ydCBvbiBzbWFsbCBkZXZpY2VzXHJcbiAgICAgKiAgICAgICAgICAgIC0gaGVpZ2h0OiBUT0RPIGRvY3NcclxuICAgICAqICAgICAgICAgICAgLSBtYXhIZWlnaHQ6IFRPRE8gZG9jc1xyXG4gICAgICogICAgICAgICAgICAtIG1vZGFsOiBUcnVlIChkZWZhdWx0KSBpZiBzZWxlY3RpbmcgYW4gb3B0aW9uIGlzIG1hbmRhdG9yeSB0byBjbG9zZSB0aGUgZGlhbG9nLCBmYWxzZSBpZiB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWRcclxuICAgICAqICAgICAgICAgICAgICBieSB0aGUgdXNlciBjbGlja2luZyBvdXRzaWRlIGl0IFxyXG4gICAgICogICAgICAgICAgICAtIHRpdGxlOiBBbiBvcHRpb25hbCBkaWFsb2cgdGl0bGVcclxuICAgICAqICAgICAgICAgICAgLSB2aWV3Q29udGFpbmVyUmVmOiBUaGlzIGlzIGltcG9ydGFudCB0byBwcm9wYWdhdGUgcHJvdmlkZXJzIGZyb20gYSBwYXJlbnQgY29tcG9uZW50IHRvIHRoaXMgZGlhbG9nLiBXZSBtdXN0IHNwZWNpZnkgXHJcblx0ICogICAgICAgICAgICAgIHRoaXMgcmVmZXJlbmNlIHRvIG1ha2Ugc3VyZSB0aGUgc2FtZSBzZXJ2aWNlcyBpbmplY3RlZCBvbiB0aGUgcGFyZW50IGFyZSBhdmFpbGFibGUgdG9vIGF0IHRoZSBjaGlsZCBkaWFsb2cgXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQuIEl0IHdpbGwgcmVjZWl2ZSBhIERhdGUoKSBvYmplY3Qgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgb3IgbnVsbCBpZiBubyBzZWxlY3Rpb24gaGFwcGVuZWRcclxuICAgICAqL1xyXG4gICAgYWRkRGF0ZVNlbGVjdGlvbkRpYWxvZyhwcm9wZXJ0aWVzOiB7aWQ/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoPzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw/OiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdFx0dmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAoKHNlbGVjdGVkRGF0ZTogbnVsbCB8IERhdGUpID0+IHZvaWQpKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYWRkRGlhbG9nKERpYWxvZ0RhdGVTZWxlY3Rpb25Db21wb25lbnQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiBwcm9wZXJ0aWVzLmlkID8/IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wZXJ0aWVzLndpZHRoID8/IFwiNTAlXCIsXHJcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogcHJvcGVydGllcy5tYXhXaWR0aCA/PyBcIjk2dndcIixcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcHJvcGVydGllcy5oZWlnaHQgPz8gXCI1MCVcIixcclxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogcHJvcGVydGllcy5tYXhIZWlnaHQgPz8gXCI5MnZ3XCIsXHJcbiAgICAgICAgICAgICAgICBtb2RhbDogcHJvcGVydGllcy5tb2RhbCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRleHRzOiBbcHJvcGVydGllcy50aXRsZSA/PyAnJ10sXHJcbiAgICAgICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmOiBwcm9wZXJ0aWVzLnZpZXdDb250YWluZXJSZWZcclxuICAgICAgICAgICAgfSwoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGVjdGlvbi5pbmRleCA9PT0gLTEgPyBudWxsIDogKHNlbGVjdGlvbi52YWx1ZSBhcyBEYXRlKSk7ICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZSB0aGUgcmVtb3ZhbCBvZiBhbGwgdGhlIGRpYWxvZ3MgdGhhdCBhcmUgY3VycmVudGx5IHZpc2libGUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gZGlhbG9ncyBhcmUgY3VycmVudGx5IHZpc2libGUsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZ1xyXG4gICAgICovXHJcbiAgICByZW1vdmVBbGxEaWFsb2dzKCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBkaWFsb2dSZWYgb2YgdGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzKSB7XHJcblxyXG4gICAgICAgICAgICBkaWFsb2dSZWYuY2xvc2Uoe2luZGV4Oi0xfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZURpYWxvZ3MgPSBbXTtcclxuICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dJbnN0YW5jZXMgPSBbXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUT0RPIC0gdHJhbnNsYXRlIGZyb20gVFMgdmVyc2lvblxyXG4gICAgICovXHJcbi8vICAgIGFkZFNpZGVOYXYoKXtcclxuLy9cclxuLy8gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE8gLSB0cmFuc2xhdGUgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICAgKi9cclxuLy8gICAgZ2V0IGlzU2hvd2luZ1NpZGVOYXYoKXtcclxuLy9cclxuLy8gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE8gLSB0cmFuc2xhdGUgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICAgKi9cclxuLy8gICAgcmVtb3ZlU2lkZU5hdigpe1xyXG4vL1xyXG4vLyAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCbG9jayBhbGwgdGhlIHVzZXIgaW50ZXJhY3Rpb25zIHdpdGggdGhlIGFwcGxpY2F0aW9uIChrZXlib2FyZCwgdG91Y2gsIG1vdXNlLCAuLi4pXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2Rpc2FibGVVc2VySW50ZXJhY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudEtleWRvd25Vbmxpc3RlbiA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRLZXlkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlZG93bicsIChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuID09PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudFBvaW50ZXJkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdG9yZSB0aGUgdXNlciBpbnRlcmFjdGlvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgZGlzYWJsZWQgd2l0aCBfZGlzYWJsZVVzZXJJbnRlcmFjdGlvbiBtZXRob2RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZW5hYmxlVXNlckludGVyYWN0aW9uKCkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnRLZXlkb3duVW5saXN0ZW4gIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50S2V5ZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50S2V5ZG93blVubGlzdGVuID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudE1vdXNlZG93blVubGlzdGVuICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudE1vdXNlZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50UG9pbnRlcmRvd25Vbmxpc3RlbiAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
@@ -109,6 +109,8 @@ export class LocalesService extends SingletoneStrictClass {
109
109
  }
110
110
  /**
111
111
  * Initializes the translation system by loading and parsing bundle files from the specified translations path.
112
+ * After the promise finishes, the class will contain all the translation data and will be ready to translate any
113
+ * provided key.
112
114
  *
113
115
  * @param translationsPath - Url where the translations Json structure of libraries/bundles/locales/keys is available.
114
116
  * @param locales An array of locale codes (e.g., ['en_US', 'es_ES', 'fr_FR']) to load. These will be added to the translation
@@ -206,8 +208,8 @@ export class LocalesService extends SingletoneStrictClass {
206
208
  * @param string key The key we want to read from the specified resource bundle
207
209
  * @param string bundlePath A string with the format 'library_name/bundle_name' that is used to locate the bundle were the key to translate is found
208
210
  * @param array replaceWildcards A list of values that will replace wildcards that may be found on the translated text. Each wildcard
209
- * will be replaced with the element whose index on toReplace matches it. Check the documentation for this.wildCardsFormat
210
- * property to know more about how to setup wildcards.
211
+ * will be replaced with the element whose index on replaceWildcards matches it. Check the documentation for this.wildCardsFormat
212
+ * property to know more about how to setup wildcards on your translations.
211
213
  *
212
214
  * @see setWildCardsFormat()
213
215
  *
@@ -489,4 +491,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImpor
489
491
  providedIn: 'root',
490
492
  }]
491
493
  }], ctorParameters: () => [] });
492
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9jb250cm9sbGVyL2xvY2FsZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFHL0U7O0dBRUc7QUFJSCxNQUFNLE9BQU8sY0FBZSxTQUFRLHFCQUFxQjtJQXNEckQ7O09BRUc7SUFDSDtRQUVJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQXhEMUI7O1dBRUc7UUFDSyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUcvQjs7V0FFRztRQUNLLGFBQVEsR0FBWSxFQUFFLENBQUM7UUFHL0I7O1dBRUc7UUFDSyxlQUFVLEdBQVksRUFBRSxDQUFDO1FBR2pDOztXQUVHO1FBQ0ssd0JBQW1CLEdBQU8sRUFBRSxDQUFDO1FBR3JDOztXQUVHO1FBQ0ssb0JBQWUsR0FBTyxFQUFFLENBQUM7UUFHakM7O1dBRUc7UUFDSyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHakM7O1dBRUc7UUFDSyxzQkFBaUIsR0FBRyxZQUFZLENBQUM7UUFHekM7Ozs7O1dBS0c7UUFDSyx5QkFBb0IsR0FBRyxFQUFFLENBQUM7SUFTbEMsQ0FBQztJQUdEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILGtCQUFrQixDQUFDLEtBQVk7UUFFM0IsSUFBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUM7WUFFcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FB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LG1EQUFtRDtRQUNuRCxJQUFHLENBQUMsUUFBUSxFQUFDO1lBRVQsMENBQTBDO1lBQzFDLElBQUcsTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksRUFBRSxFQUFDO2dCQUU5QixPQUFPLElBQUksQ0FBQzthQUNmO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUdEOzs7T0FHRztJQUNLLG9CQUFvQixDQUFDLEtBQVMsRUFBRSxTQUFTLEdBQUcsRUFBRSxFQUFFLFlBQVksR0FBRyw0QkFBNEI7UUFFL0YsSUFBSSxRQUFRLEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQyxDQUFDO1FBRXRFLElBQUcsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBQztZQUVqQyxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUM7U0FDbkQ7SUFDTCxDQUFDOzhHQWxvQlEsY0FBYztrSEFBZCxjQUFjLGNBRmIsTUFBTTs7MkZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogTGljZW5zZSBVcmwgOiAtPiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICogQ29weVJpZ2h0IDogLT4gQ29weXJpZ2h0IDIwMTggRWRlcnRvbmUgQWR2YW5kZWQgU29sdXRpb25zLiBodHRwczovL3d3dy5lZGVydG9uZS5jb21cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNpbmdsZXRvbmVTdHJpY3RDbGFzcyB9IGZyb20gJy4uL21vZGVsL2NsYXNzZXMvU2luZ2xldG9uZVN0cmljdENsYXNzJztcclxuXHJcblxyXG4vKipcclxuICogTWFuYWdlcyBhcHBsaWNhdGlvbiB0ZXh0IHRyYW5zbGF0aW9ucyBhbmQgbGFuZ3VhZ2VzXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9jYWxlc1NlcnZpY2UgZXh0ZW5kcyBTaW5nbGV0b25lU3RyaWN0Q2xhc3Mge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIGlmIHRoZSBjbGFzcyBoYXMgYmVlbiBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgYW5kIHRyYW5zbGF0aW9ucyBoYXZlIGJlZW4gY29ycmVjdGx5IGxvYWRlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc2VlIGdldExvY2FsZXMoKVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2NhbGVzOnN0cmluZ1tdID0gW107XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAc2VlIGdldExhbmd1YWdlcygpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xhbmd1YWdlczpzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyBhbGwgdGhlIGxvYWRlZCBsb2NhbGl6YXRpb24gZGF0YSBieSBsaWJyYXJ5IG5hbWUsIGJ1bmRsZSBuYW1lLCBrZXkgYW5kIGxvY2FsZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9hZGVkVHJhbnNsYXRpb25zOmFueSA9IHt9O1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU3RvcmVzIGEgbWVtb3J5IGNhY2hlIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBvdXRwdXRpbmcgdHJhbnNsYXRpb25zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2tleVZhbHVlc0NhY2hlOmFueSA9IHt9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzZWUgc2V0V2lsZENhcmRzRm9ybWF0KClcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfd2lsZENhcmRzRm9ybWF0ID0gJ3tOfSc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHNlZSBzZXRNaXNzaW5nS2V5Rm9ybWF0KClcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbWlzc2luZ0tleUZvcm1hdCA9ICckZXhjZXB0aW9uJztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9yZXMgYSBoYXNoIHZhbHVlIHRoYXQgaXMgdXNlZCB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBmb3IgdHJhbnNsYXRpb24gdCgpIG1ldGhvZHMuXHJcbiAgICAgKiBUaGlzIGlzIGNvbXB1dGVkIGJhc2VkIG9uIF93aWxkQ2FyZHNGb3JtYXQgcGx1cyBfbWlzc2luZ0tleUZvcm1hdCBwbHVzIHRoZSBjdXJyZW50IHByaW1hcnkgbG9jYWxlXHJcbiAgICAgKiBNZXRob2RzIHRoYXQgY2hhbmdlIHRoZXNlIHZhbHVlcyB3aWxsIHJlY2FsY3VsYXRlIHRoZSBoYXNoIHN0cmluZywgc28gd2hlbiBjYWxsaW5nIHRyYW5zbGF0aW9uIG1ldGhvZHMsIHRoZVxyXG4gICAgICogcGVyZm9ybWFuY2Ugd2lsbCBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jYWNoZUhhc2hCYXNlU3RyaW5nID0gJyc7XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBGdWxseSBmZWF0dXJlZCB0cmFuc2xhdGlvbiBtYW5hZ2VyIHRvIGJlIHVzZWQgd2l0aCBhbnkgYXBwbGljYXRpb24gdGhhdCByZXF1aXJlcyB0ZXh0IGludGVybmF0aW9uYWxpemF0aW9uLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoTG9jYWxlc1NlcnZpY2UpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogV2lsZGNhcmRzIGFyZSBzdHJpbmcgZnJhZ21lbnRzIHRoYXQgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIHRyYW5zbGF0ZWQgdGV4dHMuIFRoZWlyIG1haW4gcHVycG9zZSBpcyB0byBiZSByZXBsYWNlZCBhdFxyXG4gICAgICogcnVudGltZSBieSBjdXN0b20gdmFsdWVzIGxpa2UgZm9yIGV4YW1wbGUgYSB1c2VyIG5hbWUsIGEgZGF0ZSwgYSBudW1lcmljIHZhbHVlLCBldGMuLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgY2xhc3MgaGVscHMgd2l0aCB0aGlzIHByb2Nlc3MgYnkgaW5jbHVkaW5nIGEgcGFyYW1ldGVyIGNhbGxlZCAndG9SZXBsYWNlJyBvbiBhbGwgLT50IG1ldGhvZHMgd2hpY2ggYWxsb3dzIHVzXHJcbiAgICAgKiB0byBzcGVjaWZ5IGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgcmVzcGVjdGl2ZSB3aWxkY2FyZHMgb24gdGhlIHRyYW5zbGF0ZWQgdGV4dC4gRWFjaCB3aWxkY2FyZFxyXG4gICAgICogbXVzdCBmb2xsb3cgdGhlIGZvcm1hdCBzcGVjaWZpZWQgaGVyZSwgYW5kIGNvbnRhaW4gYSBudW1lcmljIGRpZ2l0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIHJlcGxhY2VtZW50IHRleHQgYXQgdGhlXHJcbiAgICAgKiAndG9SZXBsYWNlJyBsaXN0LiBGb3IgZXhhbXBsZSwgaWYgd2UgZGVmaW5lICROIGFzIHRoZSB3aWxkY2FyZCBmb3JtYXQsIGFuZCB3ZSBoYXZlIGEgdHJhbnNsYXRpb24gdGhhdCBjb250YWlucyAkMCwgJDEsICQyLFxyXG4gICAgICogJDAgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9uIHRvUmVwbGFjZSwgJDEgd2l0aCB0aGUgc2Vjb25kIGFuZCBzby5cclxuICAgICAqXHJcbiAgICAgKiBXZSB1c3VhbGx5IHNldCB0aGlzIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIGNsYXNzIHRyYW5zbGF0aW9uIGRhdGFcclxuICAgICAqXHJcbiAgICAgKiBOb3RpY2UgdGhhdCBOIGlzIG1hbmRheW9yeSBvbiB0aGUgd2lsZGNhcmRzIGZvcm1hdCBhbmQgdGhlIGZpcnN0IGluZGV4IHZhbHVlIGlzIDAuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB3aWxkY2FyZHMgZm9ybWF0IHdlIHdhbnQgdG8gc2V0XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIFRoZSB2YWx1ZSB0aGF0J3MgYmVlbiBzZXRcclxuICAgICAqL1xyXG4gICAgc2V0V2lsZENhcmRzRm9ybWF0KHZhbHVlOnN0cmluZykge1xyXG5cclxuICAgICAgICBpZighdmFsdWUuaW5jbHVkZXMoJ04nKSl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk4gaXMgbWFuZGF0b3J5IHRvIHJlcGxhY2Ugd2lsZGNhcmRzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY2FjaGVIYXNoQmFzZVN0cmluZyA9IHZhbHVlICsgdGhpcy5fbWlzc2luZ0tleUZvcm1hdCArICgodGhpcy5fbG9jYWxlcy5sZW5ndGggPiAwKSA/IHRoaXMuX2xvY2FsZXNbMF0gOiAnJyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3dpbGRDYXJkc0Zvcm1hdCA9IHZhbHVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIGJlaGF2aW91ciBmb3IgZ2V0KCksIGdldFN0YXJ0Q2FzZSgpLCBldGMuLi4gbWV0aG9kcyB3aGVuIGEga2V5IGlzIG5vdCBmb3VuZCBvblxyXG4gICAgICogYSBidW5kbGUgb3IgdGhlIGJ1bmRsZSBkb2VzIG5vdCBleGlzdFxyXG4gICAgICpcclxuICAgICAqIElmIG1pc3NpbmdLZXlGb3JtYXQgaXMgYW4gZW1wdHkgc3RyaW5nLCBhbGwgbWlzc2luZyBrZXlzIHdpbGwgcmV0dXJuIGFuIGVtcHR5IHZhbHVlIChub3QgcmVjb21tZW5kZWQpXHJcbiAgICAgKlxyXG4gICAgICogSWYgbWlzc2luZ0tleUZvcm1hdCBjb250YWlucyBhIHN0cmluZywgdGhhdCBzdHJpbmcgd2lsbCBiZSBhbHdheXMgcmV0dXJuZWQgZm9yIG1pc3Npbmcga2V5c1xyXG4gICAgICpcclxuICAgICAqIElmIG1pc3NpbmdLZXlGb3JtYXQgY29udGFpbnMgYSBzdHJpbmcgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwcmVkZWZpbmVkIHdpbGRjYXJkczo8YnI+XHJcbiAgICAgKiAgICAtICRrZXkgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGtleSBuYW1lLiBFeGFtcGxlOiBnZXQoXCJOQU1FXCIpIHdpbGwgb3V0cHV0IFtOQU1FXSBpZiBrZXkgaXMgbm90IGZvdW5kIGFuZCBtaXNzaW5nS2V5Rm9ybWF0ID0gJ1ska2V5XSc8YnI+XHJcbiAgICAgKiAgICAtICRleGNlcHRpb24gKGRlZmF1bHQgdmFsdWUpIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggdGhlIHByb2JsZW0gY2F1c2UgZGVzY3JpcHRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBtaXNzaW5nIGtleSBmb3JtYXQgd2Ugd2FudCB0byBzZXRcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIHRoYXQncyBiZWVuIHNldFxyXG4gICAgICovXHJcbiAgICBzZXRNaXNzaW5nS2V5Rm9ybWF0KHZhbHVlOnN0cmluZykge1xyXG5cclxuICAgICAgICB0aGlzLl9jYWNoZUhhc2hCYXNlU3RyaW5nID0gdGhpcy5fd2lsZENhcmRzRm9ybWF0ICsgdmFsdWUgKyAoKHRoaXMuX2xvY2FsZXMubGVuZ3RoID4gMCkgPyB0aGlzLl9sb2NhbGVzWzBdIDogJycpO1xyXG5cclxuICAgICAgICB0aGlzLl9taXNzaW5nS2V5Rm9ybWF0ID0gdmFsdWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQHNlZSBzZXRNaXNzaW5nS2V5Rm9ybWF0KClcclxuICAgICAqL1xyXG4gICAgZ2V0TWlzc2luZ0tleUZvcm1hdCgpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pc3NpbmdLZXlGb3JtYXQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgdHJhbnNsYXRpb24gc3lzdGVtIGJ5IGxvYWRpbmcgYW5kIHBhcnNpbmcgYnVuZGxlIGZpbGVzIGZyb20gdGhlIHNwZWNpZmllZCB0cmFuc2xhdGlvbnMgcGF0aC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHRyYW5zbGF0aW9uc1BhdGggLSBVcmwgd2hlcmUgdGhlIHRyYW5zbGF0aW9ucyBKc29uIHN0cnVjdHVyZSBvZiBsaWJyYXJpZXMvYnVuZGxlcy9sb2NhbGVzL2tleXMgaXMgYXZhaWxhYmxlLlxyXG4gICAgICogQHBhcmFtIGxvY2FsZXMgQW4gYXJyYXkgb2YgbG9jYWxlIGNvZGVzIChlLmcuLCBbJ2VuX1VTJywgJ2VzX0VTJywgJ2ZyX0ZSJ10pIHRvIGxvYWQuIFRoZXNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRyYW5zbGF0aW9uXHJcbiAgICAgKiAgICAgICAgcGF0aCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdDogdHJhbnNsYXRpb25zUGF0aC9lbl9VUy1lc19FUy1mcl9GUi4gVGhlIG9yZGVyIG9mIHRoaXMgYXJyYXkgd2lsbCBkZXRlcm1pbmUgdGhlXHJcbiAgICAgKiAgICAgICAgdHJhbnNsYXRpb24gcHJpb3JpdHlcclxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFueSBleHRyYSBwYXJhbWV0ZXJzIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSB0cmFuc2xhdGlvbnNQYXRoIGFmdGVyIHRoZSBsb2NhbGVzIGxpa2UgL3BhcmFtMS9wYXJhbTIvIGV0Y1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSBpZiB0aGUgdHJhbnNsYXRpb25zIGdldCBjb3JyZWN0bHkgbG9hZGVkLCBvciByZWplY3Qgd2l0aCBhbiBlcnJvciBpZiBsb2FkIGZhaWxzIFxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXplKHRyYW5zbGF0aW9uc1BhdGg6c3RyaW5nLCBsb2NhbGVzOnN0cmluZ1tdLCBwYXJhbWV0ZXJzOnN0cmluZ1tdKXtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9sb2FkZWRUcmFuc2xhdGlvbnMgPSB7fTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBWYWxpZGF0ZSByZWNlaXZlZCBsb2NhbGVzIGFyZSBjb3JyZWN0XHJcbiAgICAgICAgZm9yKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUxvY2FsZVN0cmluZyhsb2NhbGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBsZXQgdHJhbnNsYXRpb25zRnVsbFBhdGggPSB0cmFuc2xhdGlvbnNQYXRoICsgJy8nICsgbG9jYWxlcy5qb2luKCctJykgKyAnLycgKyBwYXJhbWV0ZXJzLmpvaW4oJy8nKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBmZXRjaCh0cmFuc2xhdGlvbnNGdWxsUGF0aCkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIH0pLnRoZW4oZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlZFRyYW5zbGF0aW9ucyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvY2FsZXMgPSBsb2NhbGVzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2VzID0gbG9jYWxlcy5tYXAoKGw6IHN0cmluZykgPT4gbC5zdWJzdHJpbmcoMCwgMikpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVIYXNoQmFzZVN0cmluZyA9IHRoaXMuX3dpbGRDYXJkc0Zvcm1hdCArIHRoaXMuX21pc3NpbmdLZXlGb3JtYXQgKyB0aGlzLl9sb2NhbGVzWzBdO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEVSUk9SIExPQURJTkcgTE9DQUxFUyBGUk9NOiAke3RyYW5zbGF0aW9uc0Z1bGxQYXRofVxcbmAgKyBlcnJvcikpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIGlmIHRoZSBjbGFzcyBoYXMgYmVlbiBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgYW5kIHRyYW5zbGF0aW9ucyBoYXZlIGJlZW4gY29ycmVjdGx5IGxvYWRlZFxyXG4gICAgICovXHJcbiAgICBpc0luaXRpYWxpemVkKCl7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0luaXRpYWxpemVkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEF1eCBtZXRob2QgdG8gdmVyaWZ5IHRoYXQgdGhpcyBjbGFzcyBpcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2xhdGlvbiBkYXRhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3ZhbGlkYXRlSW5pdGlhbGl6ZWQoKXtcclxuXHJcbiAgICAgICAgaWYoIXRoaXMuX2lzSW5pdGlhbGl6ZWQpe1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGVzTWFuYWdlciBub3QgaW5pdGlhbGl6ZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgY3VycmVudGx5IGxvYWRlZCBmb3IgdGhlIGN1cnJlbnRseSBkZWZpbmVkIGJ1bmRsZXMgYW5kIHBhdGhzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsb2NhbGUgQSBsb2NhbGUgdG8gY2hlY2suIEZvciBleGFtcGxlICdlbl9VUydcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxvY2FsZSBpcyBjdXJyZW50bHkgbG9hZGVkIG9uIHRoZSBjbGFzcywgZmFsc2UgaWYgbm90LlxyXG4gICAgICovXHJcbiAgICBpc0xvY2FsZUxvYWRlZChsb2NhbGU6c3RyaW5nKXtcclxuXHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVMb2NhbGVTdHJpbmcobG9jYWxlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZXMuaW5jbHVkZXMobG9jYWxlKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEF1eCBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCBhIGxvY2FsZSBzdHJpbmcgaXMgY29ycmVjdGx5IGZvcm1hdHRlZFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzdHJpbmcgJGxvY2FsZSBBIGxvY2FsZSBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVMb2NhbGVTdHJpbmcobG9jYWxlOnN0cmluZyl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYoIS9eW2Etel17Mn1fW0EtWl17Mn0kLy50ZXN0KGxvY2FsZSkpIHtcclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9jYWxlIG11c3QgYmUgYSB2YWxpZCB4eF9YWCB2YWx1ZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIDIgZGlnaXQgbGFuZ3VhZ2UgaXMgY3VycmVudGx5IGxvYWRlZCBmb3IgdGhlIGN1cnJlbnRseSBkZWZpbmVkIGJ1bmRsZXMgYW5kIHBhdGhzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBBIGxhbmd1YWdlIHRvIGNoZWNrLiBGb3IgZXhhbXBsZSAnZW4nXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsYW5ndWFnZSBpcyBjdXJyZW50bHkgbG9hZGVkIG9uIHRoZSBjbGFzcywgZmFsc2UgaWYgbm90LlxyXG4gICAgICovXHJcbiAgICBpc0xhbmd1YWdlTG9hZGVkKGxhbmd1YWdlOnN0cmluZyl7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlTGFuZ3VhZ2VTdHJpbmcobGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEF1eCBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCBhIGxhbmd1YWdlIHN0cmluZyBpcyBjb3JyZWN0bHkgZm9ybWF0dGVkXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxhbmd1YWdlIEEgMiBkaWdpdCBsYW5ndWFnZSBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgX3ZhbGlkYXRlTGFuZ3VhZ2VTdHJpbmcobGFuZ3VhZ2U6c3RyaW5nKXtcclxuXHJcbiAgICAgICAgaWYgKCEvXlthLXpdezJ9JC8udGVzdChsYW5ndWFnZSkpIHtcclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbGFuZ3VhZ2UgbXVzdCBiZSBhIHZhbGlkIDIgZGlnaXQgdmFsdWUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHRyYW5zbGF0aW9uIHRvIHRoZSBjdXJyZW50IHByaW1hcnkgbG9jYWxlIGZvciB0aGUgZ2l2ZW4ga2V5LCBsaWJyYXJ5IGFuZCBidW5kbGVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc3RyaW5nIGtleSBUaGUga2V5IHdlIHdhbnQgdG8gcmVhZCBmcm9tIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgYnVuZGxlXHJcbiAgICAgKiBAcGFyYW0gc3RyaW5nIGJ1bmRsZVBhdGggQSBzdHJpbmcgd2l0aCB0aGUgZm9ybWF0ICdsaWJyYXJ5X25hbWUvYnVuZGxlX25hbWUnIHRoYXQgaXMgdXNlZCB0byBsb2NhdGUgdGhlIGJ1bmRsZSB3ZXJlIHRoZSBrZXkgdG8gdHJhbnNsYXRlIGlzIGZvdW5kXHJcbiAgICAgKiBAcGFyYW0gYXJyYXkgcmVwbGFjZVdpbGRjYXJkcyBBIGxpc3Qgb2YgdmFsdWVzIHRoYXQgd2lsbCByZXBsYWNlIHdpbGRjYXJkcyB0aGF0IG1heSBiZSBmb3VuZCBvbiB0aGUgdHJhbnNsYXRlZCB0ZXh0LiBFYWNoIHdpbGRjYXJkXHJcbiAgICAgKiAgICAgICAgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBlbGVtZW50IHdob3NlIGluZGV4IG9uIHRvUmVwbGFjZSBtYXRjaGVzIGl0LiBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcy53aWxkQ2FyZHNGb3JtYXRcclxuICAgICAqICAgICAgICBwcm9wZXJ0eSB0byBrbm93IG1vcmUgYWJvdXQgaG93IHRvIHNldHVwIHdpbGRjYXJkcy5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHNldFdpbGRDYXJkc0Zvcm1hdCgpXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiBUaGUgdHJhbnNsYXRlZCB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHQoa2V5OnN0cmluZywgYnVuZGxlUGF0aDpzdHJpbmcsIHJlcGxhY2VXaWxkY2FyZHM6c3RyaW5nW10gPSBbXSkge1xyXG5cclxuICAgICAgICB0aGlzLl92YWxpZGF0ZUluaXRpYWxpemVkKCk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIGNhY2hlIGtleSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIHdoZW4gcmVxdWVzdGluZyB0aGUgc2FtZSBrZXkgdHJhbnNsYXRpb24gc2V2ZXJhbCB0aW1lc1xyXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dGhpcy5fY2FjaGVIYXNoQmFzZVN0cmluZ30ke2tleX0ke2J1bmRsZVBhdGh9JHtyZXBsYWNlV2lsZGNhcmRzLmpvaW4oJycpfWA7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fa2V5VmFsdWVzQ2FjaGVbY2FjaGVLZXldKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9mb3JjZU5vbkVtcHR5U3RyaW5nKGtleSwgJycsICdrZXkgbXVzdCBiZSBub24gZW1wdHkgc3RyaW5nJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlTm9uRW1wdHlTdHJpbmcoYnVuZGxlUGF0aCwgJycsICdidW5kbGVQYXRoIG11c3QgYmUgbm9uIGVtcHR5IHN0cmluZycpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgW2xpYnJhcnksIGJ1bmRsZV0gPSBidW5kbGVQYXRoLnNwbGl0KCcvJyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9mb3JjZU5vbkVtcHR5U3RyaW5nKGxpYnJhcnksICcnLCAnbm8gbGlicmFyeSBzcGVjaWZpZWQgb24gYnVuZGxlUGF0aCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9mb3JjZU5vbkVtcHR5U3RyaW5nKGJ1bmRsZSwgJycsICdubyBidW5kbGUgc3BlY2lmaWVkIG9uIGJ1bmRsZVBhdGgnKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50c0NvdW50ID0gcmVwbGFjZVdpbGRjYXJkcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAvLyBMb29wIGFsbCB0aGUgbG9jYWxlcyB0byBmaW5kIHRoZSBmaXJzdCBvbmUgd2l0aCBhIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGtleVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiB0aGlzLl9sb2NhbGVzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xvYWRlZFRyYW5zbGF0aW9uc1tsaWJyYXJ5XT8uW2J1bmRsZV0/Lltsb2NhbGVdPy5ba2V5XSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbG9hZGVkVHJhbnNsYXRpb25zW2xpYnJhcnldW2J1bmRsZV1bbG9jYWxlXVtrZXldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGFsbCB3aWxkY2FyZHMgb24gdGhlIHRleHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlcGxhY2VtZW50cyBpZiBhbnlcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcGxhY2VtZW50c0NvdW50OyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX3JlcGxhY2UocmVzdWx0LCB0aGlzLl9yZXBsYWNlKHRoaXMuX3dpbGRDYXJkc0Zvcm1hdCwgJ04nLCBpLnRvU3RyaW5nKCkpLCByZXBsYWNlV2lsZGNhcmRzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleVZhbHVlc0NhY2hlW2NhY2hlS2V5XSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBhbiBleGNlcHRpb24gbmVlZHMgdG8gYmUgdGhyb3duIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIG5vdCBmb3VuZCBvbiB0aGlzIGJ1bmRsZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWlzc2luZ0tleUZvcm1hdC5pbmNsdWRlcygnJGV4Y2VwdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihga2V5IDwke2tleX0+IG5vdCBmb3VuZCBvbiAke2J1bmRsZVBhdGh9YCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2tleVZhbHVlc0NhY2hlW2NhY2hlS2V5XSA9IHRoaXMuX3JlcGxhY2UodGhpcy5fbWlzc2luZ0tleUZvcm1hdCwgJyRrZXknLCBrZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tleVZhbHVlc0NhY2hlW2NhY2hlS2V5XTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGJ1bmRsZSBhcyBhIHN0cmluZyB3aXRoIGFsbCB3b3JkcyBmaXJzdCBjaGFyYWN0ZXIgY2FwaXRhbGl6ZWRcclxuICAgICAqIGFuZCBhbGwgdGhlIHJlc3Qgb2YgdGhlIHdvcmQgd2l0aCBsb3dlciBjYXNlXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSB0KClcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9jYWxpemVkIGFuZCBjYXNlIGZvcm1hdHRlZCB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHRTdGFydENhc2Uoa2V5OnN0cmluZywgYnVuZGxlUGF0aDpzdHJpbmcsIHJlcGxhY2VXaWxkY2FyZHM6c3RyaW5nW10gPSBbXSkge1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy50KGtleSwgYnVuZGxlUGF0aCwgcmVwbGFjZVdpbGRjYXJkcykuc3BsaXQoJyAnKVxyXG4gICAgICAgICAgICAgICAgLm1hcCgod29yZDphbnkpID0+IHdvcmQgPyB3b3JkWzBdLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkgOiAnJykuam9pbignICcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB0cmFuc2xhdGlvbiBmb3IgdGhlIGdpdmVuIGtleSBhbmQgYnVuZGxlIGFzIGFuIGFsbCB1cHBlciBjYXNlIHN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIEBzZWUgdCgpXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIGxvY2FsaXplZCBhbmQgY2FzZSBmb3JtYXR0ZWQgdGV4dFxyXG4gICAgICovXHJcbiAgICB0QWxsVXBwZXJDYXNlKGtleTpzdHJpbmcsIGJ1bmRsZVBhdGg6c3RyaW5nLCByZXBsYWNlV2lsZGNhcmRzOnN0cmluZ1tdID0gW10pIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudChrZXksIGJ1bmRsZVBhdGgsIHJlcGxhY2VXaWxkY2FyZHMpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBidW5kbGUgYXMgYW4gYWxsIGxvd2VyIGNhc2Ugc3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSB0KClcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9jYWxpemVkIGFuZCBjYXNlIGZvcm1hdHRlZCB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHRBbGxMb3dlckNhc2Uoa2V5OnN0cmluZywgYnVuZGxlUGF0aDpzdHJpbmcsIHJlcGxhY2VXaWxkY2FyZHM6c3RyaW5nW10gPSBbXSkge1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy50KGtleSwgYnVuZGxlUGF0aCwgcmVwbGFjZVdpbGRjYXJkcykudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGJ1bmRsZSBhcyBhIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYXMgVXBwZXIgY2FzZVxyXG4gICAgICogYW5kIGFsbCB0aGUgcmVzdCBhcyBsb3dlciBjYXNlXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSB0KClcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9jYWxpemVkIGFuZCBjYXNlIGZvcm1hdHRlZCB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHRGaXJzdFVwcGVyUmVzdExvd2VyKGtleTpzdHJpbmcsIGJ1bmRsZVBhdGg6c3RyaW5nLCByZXBsYWNlV2lsZGNhcmRzOnN0cmluZ1tdID0gW10pe1xyXG5cclxuICAgICAgICBjb25zdCBzdHJpbmcgPSB0aGlzLnQoa2V5LCBidW5kbGVQYXRoLCByZXBsYWNlV2lsZGNhcmRzKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBsb2NhbGVzIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBjbGFzcyB0byB0cmFuc2xhdGUgdGhlIGdpdmVuIGtleXMsIHNvcnRlZCBieSBwcmVmZXJlbmNlLlxyXG4gICAgICogRWFjaCBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIGEgc3RhbmRhcmQgbG9jYWxlIGNvZGUgd2l0aCBsYW5ndWFnZSBhbmQgY291bnRyeSBqb2luZWQgYnkgYW4gdW5kZXJzY29yZSwgbGlrZTogZW5fVVMsIGZyX0ZSXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiBhIGtleSBhbmQgYnVuZGxlIGFyZSByZXF1ZXN0ZWQgZm9yIHRyYW5zbGF0aW9uLCB0aGUgY2xhc3Mgd2lsbCBjaGVjayBvbiB0aGUgZmlyc3QgbGFuZ3VhZ2Ugb2YgdGhpc1xyXG4gICAgICogbGlzdCBmb3IgYSB0cmFuc2xhdGVkIHRleHQuIElmIG1pc3NpbmcsIHRoZSBuZXh0IG9uZSB3aWxsIGJlIHVzZWQsIGFuZCBzby4gVGhpcyBsaXN0IGlzIGNvbnN0cnVjdGVkIGFmdGVyIGluaXRpYWxpemVcclxuICAgICAqIG1ldGhvZHMgaXMgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlOiBBZnRlciBsb2FkaW5nIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiBsb2NhbGVzIFsnZW5fVVMnLCAnZXNfRVMnLCAnZnJfRlInXSBpZiB3ZSBjYWxsIExvY2FsZXNNYW5hZ2VyLnQoJ0hFTExPJywgJ2xpYjEvZ3JlZXRpbmdzJylcclxuICAgICAqIHRoZSBsb2NhbGl6YXRpb24gbWFuYWdlciB3aWxsIHRyeSB0byBsb2NhdGUgdGhlIGVuX1VTIHZhbHVlIGZvciB0aGUgSEVMTE8gdGFnIG9uIHRoZSBncmVldGluZ3MgYnVuZGxlIGZvciB0aGUgbGlicmFyeSBsaWIxLlxyXG4gICAgICogSWYgdGhlIHRhZyBpcyBub3QgZm91bmQgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlIGFuZCBidW5kbGUsIHRoZSBzYW1lIHNlYXJjaCB3aWxsIGJlIHBlcmZvcm1lZCBmb3IgdGhlIGVzX0VTIGxvY2FsZSwgYW5kIHNvLCB0aWxsIGFcclxuICAgICAqIHZhbHVlIGlzIGZvdW5kIG9yIG5vIG1vcmUgbG9jYWxlcyBhcmUgZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgZ2V0TG9jYWxlcygpe1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlcztcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGxhbmd1YWdlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgY2xhc3MgdG8gdHJhbnNsYXRlIHRoZSBnaXZlbiBrZXlzLCBzb3J0ZWQgYnkgcHJlZmVyZW5jZS5cclxuICAgICAqIEVhY2ggc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyBhIDIgZGlnaXQgbGFuZ3VhZ2UgY29kZSwgbGlrZTogZW4sIGZyXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBsb2NhbGVzKCkgb25lLCBidXQgY29udGFpbmluZyBvbmx5IHRoZSBsYW5ndWFnZSBwYXJ0IG9mIGVhY2ggbG9jYWxlICh0aGUgZmlyc3QgdHdvIGRpZ2l0cylcclxuICAgICAqXHJcbiAgICAgKiBAc2VlIGdldExvY2FsZXMoKVxyXG4gICAgICovXHJcbiAgICBnZXRMYW5ndWFnZXMoKXtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlcztcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZmlyc3QgbG9jYWxlIGZyb20gdGhlIGxpc3Qgb2YgbG9hZGVkIGxvY2FsZXMsIHdoaWNoIGlzIHRoZSBjdXJyZW50bHkgdXNlZCB0byBzZWFyY2ggZm9yIHRyYW5zbGF0ZWQgdGV4dHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIGxvY2FsZSB0aGF0IGlzIGRlZmluZWQgYXMgdGhlIHByaW1hcnkgb25lLiBGb3IgZXhhbXBsZTogZW5fVVMsIGVzX0VTLCAuLlxyXG4gICAgICovXHJcbiAgICBnZXRQcmltYXJ5TG9jYWxlKCl7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5pdGlhbGl6ZWQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZXNbMF07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGZpcnN0IGxhbmd1YWdlIGZyb20gdGhlIGxpc3Qgb2YgbG9hZGVkIGxvY2FsZXMsIHdoaWNoIGlzIHRoZSBjdXJyZW50bHkgdXNlZCB0byBzZWFyY2ggZm9yIHRyYW5zbGF0ZWQgdGV4dHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIDIgZGlnaXQgbGFuZ3VhZ2UgY29kZSB0aGF0IGlzIGRlZmluZWQgYXMgdGhlIHByaW1hcnkgb25lLiBGb3IgZXhhbXBsZTogZW4sIGVzLCAuLlxyXG4gICAgICovXHJcbiAgICBnZXRQcmltYXJ5TGFuZ3VhZ2UoKXtcclxuXHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbml0aWFsaXplZCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VzWzBdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIHRoZSBsb2NhbGUgdGhhdCB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgZnJvbnQgb2YgdGhlIGN1cnJlbnRseSBsb2FkZWQgbG9jYWxlcyBsaXN0IChtb3ZpbmcgYWxsIHRoZSBvdGhlcnMgb25lIHBvc2l0aW9uIHRvIHRoZSByaWdodCkuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBsb2NhbGUgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGdldCBhIHRyYW5zbGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsb2NhbGUgQSBjdXJyZW50bHkgbG9hZGVkIGxvY2FsZSB0aGF0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIG9mIHRoZSBsb2FkZWQgbG9jYWxlcyBsaXN0LiBJZiB0aGUgc3BlY2lmaWVkIGxvY2FsZVxyXG4gICAgICogICAgICAgIGlzIG5vdCBjdXJyZW50bHkgbG9hZGVkLCBhbiBleGNlcHRpb24gd2lsbCBoYXBwZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgdm9pZFxyXG4gICAgICovXHJcbiAgICBzZXRQcmltYXJ5TG9jYWxlKGxvY2FsZTpzdHJpbmcpe1xyXG5cclxuICAgICAgICB0aGlzLl92YWxpZGF0ZUluaXRpYWxpemVkKCk7XHJcblxyXG4gICAgICAgIGlmKCF0aGlzLmlzTG9jYWxlTG9hZGVkKGxvY2FsZSkpe1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGxvY2FsZSArICcgbm90IGxvYWRlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtsb2NhbGVdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBsIG9mIHRoaXMuX2xvY2FsZXMpe1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBpZihsICE9PSBsb2NhbGUpe1xyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9sb2NhbGVzID0gcmVzdWx0O1xyXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlcyA9IHRoaXMuX2xvY2FsZXMubWFwKChsOiBzdHJpbmcpID0+IGwuc3Vic3RyaW5nKDAsIDIpKTtcclxuICAgICAgICB0aGlzLl9jYWNoZUhhc2hCYXNlU3RyaW5nID0gdGhpcy5fd2lsZENhcmRzRm9ybWF0ICsgdGhpcy5fbWlzc2luZ0tleUZvcm1hdCArIHRoaXMuX2xvY2FsZXNbMF07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0aGUgc3BlY2lmaWVkIGxvY2FsZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9jYWxlcyBsaXN0LiBUaGlzIGFsc28gYWx0ZXJzIHRoZSB0cmFuc2xhdGlvbiBwcmlvcml0eSBieSBzZXR0aW5nIHRoZSBmaXJzdFxyXG4gICAgICogcHJvdmlkZWQgbG9jYWxlIGFzIHRoZSBtb3N0IHByaW9yaXRhcnksIHRoZSBzZWNvbmQgYXMgdGhlIG5leHQgb25lIGFuZCBzby5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBiYXNpY2FsbHkgd29ya3MgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgc2V0UHJpbWFyeUxvY2FsZSBidXQgbGV0dGluZyB1cyBhZGQgbWFueSBsb2NhbGVzIGF0IG9uY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBzZXRQcmltYXJ5TG9jYWxlKClcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxlcyBBIGxpc3Qgb2YgbG9jYWxlcyB0byBiZSBtb3ZlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2xhdGlvbiBwcmlvcml0eS4gRmlyc3QgbG9jYWxlcyBpdGVtIHdpbGwgYmUgdGhlIHByZWZlcmVkXHJcbiAgICAgKiAgICAgICAgbG9jYWxlIGZvciB0cmFuc2xhdGlvbiwgc2Vjb25kIHdpbGwgYmUgdGhlIG5leHQgb25lIGluIGNhc2Ugc29tZSBrZXkgaXMgbm90IHRyYW5zbGF0ZWQgZm9yIHRoZSBmaXJzdCBvbmUgYW5kIHNvLiBJZiBhbnkgb2YgdGhlXHJcbiAgICAgKiAgICAgICAgc3BlY2lmaWVkIGxvY2FsZXMgaXMgbm90IGN1cnJlbnRseSBsb2FkZWQsIGFuIGV4Y2VwdGlvbiB3aWxsIGhhcHBlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICAgKi9cclxuICAgIHNldFByaW1hcnlMb2NhbGVzKGxvY2FsZXM6c3RyaW5nW10pe1xyXG5cclxuICAgICAgICBpZighQXJyYXkuaXNBcnJheShsb2NhbGVzKSB8fFxyXG4gICAgICAgICAgICAobmV3IFNldChsb2NhbGVzKS5zaXplICE9PSBsb2NhbGVzLmxlbmd0aCkgfHxcclxuICAgICAgICAgICAgbG9jYWxlcy5sZW5ndGggPT09IDApe1xyXG5cclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9jYWxlcyBtdXN0IGJlIG5vbiBlbXB0eSBzdHJpbmcgYXJyYXkgd2l0aCBubyBkdXBsaWNhdGUgZWxlbWVudHMnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSBsb2NhbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldFByaW1hcnlMb2NhbGUobG9jYWxlc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIHRoZSAyIGRpZ2l0IGxhbmd1YWdlIHRoYXQgd2lsbCBiZSBwbGFjZWQgYXQgdGhlIGZyb250IG9mIHRoZSBjdXJyZW50bHkgbG9hZGVkIGxvY2FsZXMgbGlzdCAobW92aW5nIGFsbCB0aGUgb3RoZXJzIG9uZSBwb3NpdGlvbiB0byB0aGUgcmlnaHQpLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgbGFuZ3VhZ2UgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGdldCBhIHRyYW5zbGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBBIDIgZGlnaXQgbGFuZ3VhZ2UgY29kZSB0aGF0IG1hdGNoZXMgd2l0aCBhbnkgb2YgdGhlIGN1cnJlbnRseSBsb2FkZWQgbG9jYWxlcywgd2hpY2ggd2lsbFxyXG4gICAgICogICAgICAgIGJlIG1vdmVkIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgbG9hZGVkIGxvY2FsZXMgbGlzdC4gSWYgdGhlIHNwZWNpZmllZCBsYW5ndWFnZSBkb2VzIG5vdCBtYXRjaCB3aXRoXHJcbiAgICAgKiAgICAgICAgYSBsb2NhbGUgdGhhdCBpcyBjdXJyZW50bHkgbG9hZGVkLCBhbiBleGNlcHRpb24gd2lsbCBoYXBwZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgdm9pZFxyXG4gICAgICovXHJcbiAgICBzZXRQcmltYXJ5TGFuZ3VhZ2UobGFuZ3VhZ2U6c3RyaW5nKXtcclxuXHJcbiAgICAgICAgZm9yKGxldCBsb2NhbGUgb2YgdGhpcy5fbG9jYWxlcyl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKGxvY2FsZS5zdWJzdHJpbmcoMCwgMikgPT09IGxhbmd1YWdlKXtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFByaW1hcnlMb2NhbGUobG9jYWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihsYW5ndWFnZSArICcgbm90IGxvYWRlZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIGxvY2FsZXMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb2NhbGVzIGxpc3QuXHJcbiAgICAgKiBXb3JrcyB0aGUgc2FtZSBhcyBzZXRQcmltYXJ5TG9jYWxlcygpIGJ1dCB3aXRoIGEgbGlzdCBvZiB0aGUgMiBkaWdpdCBsYW5ndWFnZSBjb2RlcyB0aGF0IG1hdGNoIHRoZSByZXNwZWN0aXZlIGxvY2FsZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBzZXRQcmltYXJ5TG9jYWxlKClcclxuICAgICAqIEBzZWUgc2V0UHJpbWFyeUxhbmd1YWdlKClcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VzIEEgbGlzdCBvZiAyIGRpZ2l0IGxhbmd1YWdlIGNvZGVzIHRvIGJlIG1vdmVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zbGF0aW9uIHByaW9yaXR5LiBJZiBhbnkgb2YgdGhlXHJcbiAgICAgKiAgICAgICAgc3BlY2lmaWVkIGxhbmd1YWdlcyBkb2VzIG5vdCBtYXRjaCB3aXRoIGEgbG9jYWxlIHRoYXQgaXMgY3VycmVudGx5IGxvYWRlZCwgYW4gZXhjZXB0aW9uIHdpbGwgaGFwcGVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHZvaWRcclxuICAgICAqL1xyXG4gICAgc2V0UHJpbWFyeUxhbmd1YWdlcyhsYW5ndWFnZXM6c3RyaW5nW10pe1xyXG5cclxuICAgICAgICBpZighQXJyYXkuaXNBcnJheShsYW5ndWFnZXMpIHx8XHJcbiAgICAgICAgICAgKG5ldyBTZXQobGFuZ3VhZ2VzKS5zaXplICE9PSBsYW5ndWFnZXMubGVuZ3RoKSB8fFxyXG4gICAgICAgICAgICBsYW5ndWFnZXMubGVuZ3RoID09PSAwKXtcclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbGFuZ3VhZ2VzIG11c3QgYmUgbm9uIGVtcHR5IHN0cmluZyBhcnJheSB3aXRoIG5vIGR1cGxpY2F0ZSBlbGVtZW50cycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGxhbmd1YWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRQcmltYXJ5TGFuZ3VhZ2UobGFuZ3VhZ2VzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2UgdGhlIGxvYWRlZCBsb2NhbGVzIHRyYW5zbGF0aW9uIHByZWZlcmVuY2Ugb3JkZXIuIFRoZSBzYW1lIGxvY2FsZXMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRlZCBtdXN0IGJlIHBhc3NlZFxyXG4gICAgICogYnV0IHdpdGggYSBkaWZmZXJlbnQgb3JkZXIgdG8gY2hhbmdlIHRoZSB0cmFuc2xhdGlvbiBwcmlvcml0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxlcyBBIGxpc3Qgd2l0aCB0aGUgbmV3IGxvY2FsZXMgdHJhbnNsYXRpb24gcHJpb3JpdHlcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICAgKi9cclxuICAgIHNldExvY2FsZXNPcmRlcihsb2NhbGVzOnN0cmluZ1tdKXtcclxuXHJcbiAgICAgICAgaWYobG9jYWxlcy5sZW5ndGggIT09IHRoaXMuX2xvY2FsZXMubGVuZ3RoKXtcclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9jYWxlcyBtdXN0IGNvbnRhaW4gYWxsIHRoZSBjdXJyZW50bHkgbG9hZGVkIGxvY2FsZXMnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5pdGlhbGl6ZWQoKTtcclxuXHJcbiAgICAgICAgZm9yKGxldCBsb2NhbGUgb2YgbG9jYWxlcyl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmlzTG9jYWxlTG9hZGVkKGxvY2FsZSkpe1xyXG5cclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihsb2NhbGUgKyAnIG5vdCBsb2FkZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fbG9jYWxlcyA9IGxvY2FsZXM7XHJcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VzID0gdGhpcy5fbG9jYWxlcy5tYXAoKGw6IHN0cmluZykgPT4gbC5zdWJzdHJpbmcoMCwgMikpO1xyXG4gICAgICAgIHRoaXMuX2NhY2hlSGFzaEJhc2VTdHJpbmcgPSB0aGlzLl93aWxkQ2FyZHNGb3JtYXQgKyB0aGlzLl9taXNzaW5nS2V5Rm9ybWF0ICsgdGhpcy5fbG9jYWxlc1swXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgYW4gYXV4IG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIFR1cmJvQ29tbW9ucyBTdHJpbmdVdGlscyByZXBsYWNlIG1ldGhvZC5cclxuICAgICAqIEl0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIG9uZSBvbiB0aGUgbGlicmFyeSwgYnV0IHdlIGltcGxlbWVudCBpdCBoZXJlIHRvIGF2b2lkIGhhdmluZyBhIGRlcGVuZGVuY3kgd2l0aCBUdXJib0NvbW1vbnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfcmVwbGFjZShzdHJpbmc6IHN0cmluZywgc2VhcmNoOnN0cmluZywgcmVwbGFjZW1lbnQ6IHN0cmluZykge1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGVzY2FwZWRTZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcclxuICAgICAgICAgICBcclxuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UobmV3IFJlZ0V4cChlc2NhcGVkU2VhcmNoLCAnZycpLCByZXBsYWNlbWVudCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIGFuIGF1eCBtZXRob2QgdG8gaW1wbGVtZW50IHRoZSBUdXJib0NvbW1vbnMgU3RyaW5nVXRpbHMgaXNFbXB0eSBtZXRob2QuXHJcbiAgICAgKiBJdCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBvbmUgb24gdGhlIGxpYnJhcnksIGJ1dCB3ZSBpbXBsZW1lbnQgaXQgaGVyZSB0byBhdm9pZCBoYXZpbmcgYSBkZXBlbmRlbmN5IHdpdGggVHVyYm9Db21tb25zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzRW1wdHkoc3RyaW5nOnN0cmluZykge1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBpc1N0cmluZyA9ICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyB8fCAoc3RyaW5nIGFzIGFueSkgaW5zdGFuY2VvZiBTdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIGlmIG5vbiBzdHJpbmcgdmFsdWUgd2FzIHJlY2VpdmVkXHJcbiAgICAgICAgaWYoIWlzU3RyaW5nKXtcclxuXHJcbiAgICAgICAgICAgIC8vIEVtcHR5IG9yIG51bGwgdmFsdWUgaXMgY29uc2lkZXJlZCBlbXB0eVxyXG4gICAgICAgICAgICBpZihzdHJpbmcgPT0gbnVsbCB8fCBzdHJpbmcgPT0gJycpe1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmFsdWUgaXMgbm90IGEgc3RyaW5nXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bIFxcblxcclxcdF0vZywgJycpID09PSAnJztcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgYW4gYXV4IG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIFR1cmJvQ29tbW9ucyBTdHJpbmdVdGlscyBmb3JjZU5vbkVtcHR5U3RyaW5nIG1ldGhvZC5cclxuICAgICAqIEl0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIG9uZSBvbiB0aGUgbGlicmFyeSwgYnV0IHdlIGltcGxlbWVudCBpdCBoZXJlIHRvIGF2b2lkIGhhdmluZyBhIGRlcGVuZGVuY3kgd2l0aCBUdXJib0NvbW1vbnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZm9yY2VOb25FbXB0eVN0cmluZyh2YWx1ZTphbnksIHZhbHVlTmFtZSA9ICcnLCBlcnJvck1lc3NhZ2UgPSAnbXVzdCBiZSBhIG5vbiBlbXB0eSBzdHJpbmcnKXtcclxuXHJcbiAgICAgICAgbGV0IGlzU3RyaW5nID0gKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKCFpc1N0cmluZyB8fCB0aGlzLl9pc0VtcHR5KHZhbHVlKSl7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodmFsdWVOYW1lICsgJyAnICsgZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
494
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9jb250cm9sbGVyL2xvY2FsZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFHL0U7O0dBRUc7QUFJSCxNQUFNLE9BQU8sY0FBZSxTQUFRLHFCQUFxQjtJQXNEckQ7O09BRUc7SUFDSDtRQUVJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQXhEMUI7O1dBRUc7UUFDSyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUcvQjs7V0FFRztRQUNLLGFBQVEsR0FBWSxFQUFFLENBQUM7UUFHL0I7O1dBRUc7UUFDSyxlQUFVLEdBQVksRUFBRSxDQUFDO1FBR2pDOztXQUVHO1FBQ0ssd0JBQW1CLEdBQU8sRUFBRSxDQUFDO1FBR3JDOztXQUVHO1FBQ0ssb0JBQWUsR0FBTyxFQUFFLENBQUM7UUFHakM7O1dBRUc7UUFDSyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHakM7O1dBRUc7UUFDSyxzQkFBaUIsR0FBRyxZQUFZLENBQUM7UUFHekM7Ozs7O1dBS0c7UUFDSyx5QkFBb0IsR0FBRyxFQUFFLENBQUM7SUFTbEMsQ0FBQztJQUdEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILGtCQUFrQixDQUFDLEtBQVk7UUFFM0IsSUFBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUM7WUFFcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FB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akYsbURBQW1EO1FBQ25ELElBQUcsQ0FBQyxRQUFRLEVBQUM7WUFFVCwwQ0FBMEM7WUFDMUMsSUFBRyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUM7Z0JBRTlCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDNUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBR0Q7OztPQUdHO0lBQ0ssb0JBQW9CLENBQUMsS0FBUyxFQUFFLFNBQVMsR0FBRyxFQUFFLEVBQUUsWUFBWSxHQUFHLDRCQUE0QjtRQUUvRixJQUFJLFFBQVEsR0FBRyxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLFlBQVksTUFBTSxDQUFDLENBQUM7UUFFdEUsSUFBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFDO1lBRWpDLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQztTQUNuRDtJQUNMLENBQUM7OEdBcG9CUSxjQUFjO2tIQUFkLGNBQWMsY0FGYixNQUFNOzsyRkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUdXJib0dVSSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU2luZ2xldG9uZVN0cmljdENsYXNzIH0gZnJvbSAnLi4vbW9kZWwvY2xhc3Nlcy9TaW5nbGV0b25lU3RyaWN0Q2xhc3MnO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBNYW5hZ2VzIGFwcGxpY2F0aW9uIHRleHQgdHJhbnNsYXRpb25zIGFuZCBsYW5ndWFnZXNcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMb2NhbGVzU2VydmljZSBleHRlbmRzIFNpbmdsZXRvbmVTdHJpY3RDbGFzcyB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogaWYgdGhlIGNsYXNzIGhhcyBiZWVuIGNvcnJlY3RseSBpbml0aWFsaXplZCBhbmQgdHJhbnNsYXRpb25zIGhhdmUgYmVlbiBjb3JyZWN0bHkgbG9hZGVkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzZWUgZ2V0TG9jYWxlcygpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2FsZXM6c3RyaW5nW10gPSBbXTtcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEBzZWUgZ2V0TGFuZ3VhZ2VzKClcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbGFuZ3VhZ2VzOnN0cmluZ1tdID0gW107XHJcbiAgICAgICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU3RvcmVzIGFsbCB0aGUgbG9hZGVkIGxvY2FsaXphdGlvbiBkYXRhIGJ5IGxpYnJhcnkgbmFtZSwgYnVuZGxlIG5hbWUsIGtleSBhbmQgbG9jYWxlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2FkZWRUcmFuc2xhdGlvbnM6YW55ID0ge307XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9yZXMgYSBtZW1vcnkgY2FjaGUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSB3aGVuIG91dHB1dGluZyB0cmFuc2xhdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfa2V5VmFsdWVzQ2FjaGU6YW55ID0ge307XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHNlZSBzZXRXaWxkQ2FyZHNGb3JtYXQoKVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF93aWxkQ2FyZHNGb3JtYXQgPSAne059JztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc2VlIHNldE1pc3NpbmdLZXlGb3JtYXQoKVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9taXNzaW5nS2V5Rm9ybWF0ID0gJyRleGNlcHRpb24nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyBhIGhhc2ggdmFsdWUgdGhhdCBpcyB1c2VkIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIGZvciB0cmFuc2xhdGlvbiB0KCkgbWV0aG9kcy5cclxuICAgICAqIFRoaXMgaXMgY29tcHV0ZWQgYmFzZWQgb24gX3dpbGRDYXJkc0Zvcm1hdCBwbHVzIF9taXNzaW5nS2V5Rm9ybWF0IHBsdXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBsb2NhbGVcclxuICAgICAqIE1ldGhvZHMgdGhhdCBjaGFuZ2UgdGhlc2UgdmFsdWVzIHdpbGwgcmVjYWxjdWxhdGUgdGhlIGhhc2ggc3RyaW5nLCBzbyB3aGVuIGNhbGxpbmcgdHJhbnNsYXRpb24gbWV0aG9kcywgdGhlXHJcbiAgICAgKiBwZXJmb3JtYW5jZSB3aWxsIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2NhY2hlSGFzaEJhc2VTdHJpbmcgPSAnJztcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEZ1bGx5IGZlYXR1cmVkIHRyYW5zbGF0aW9uIG1hbmFnZXIgdG8gYmUgdXNlZCB3aXRoIGFueSBhcHBsaWNhdGlvbiB0aGF0IHJlcXVpcmVzIHRleHQgaW50ZXJuYXRpb25hbGl6YXRpb24uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcihMb2NhbGVzU2VydmljZSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBXaWxkY2FyZHMgYXJlIHN0cmluZyBmcmFnbWVudHMgdGhhdCBhcmUgcGxhY2VkIGluc2lkZSB0aGUgdHJhbnNsYXRlZCB0ZXh0cy4gVGhlaXIgbWFpbiBwdXJwb3NlIGlzIHRvIGJlIHJlcGxhY2VkIGF0XHJcbiAgICAgKiBydW50aW1lIGJ5IGN1c3RvbSB2YWx1ZXMgbGlrZSBmb3IgZXhhbXBsZSBhIHVzZXIgbmFtZSwgYSBkYXRlLCBhIG51bWVyaWMgdmFsdWUsIGV0Yy4uXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBjbGFzcyBoZWxwcyB3aXRoIHRoaXMgcHJvY2VzcyBieSBpbmNsdWRpbmcgYSBwYXJhbWV0ZXIgY2FsbGVkICd0b1JlcGxhY2UnIG9uIGFsbCAtPnQgbWV0aG9kcyB3aGljaCBhbGxvd3MgdXNcclxuICAgICAqIHRvIHNwZWNpZnkgYSBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzIHRoYXQgd2lsbCByZXBsYWNlIHRoZSByZXNwZWN0aXZlIHdpbGRjYXJkcyBvbiB0aGUgdHJhbnNsYXRlZCB0ZXh0LiBFYWNoIHdpbGRjYXJkXHJcbiAgICAgKiBtdXN0IGZvbGxvdyB0aGUgZm9ybWF0IHNwZWNpZmllZCBoZXJlLCBhbmQgY29udGFpbiBhIG51bWVyaWMgZGlnaXQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgcmVwbGFjZW1lbnQgdGV4dCBhdCB0aGVcclxuICAgICAqICd0b1JlcGxhY2UnIGxpc3QuIEZvciBleGFtcGxlLCBpZiB3ZSBkZWZpbmUgJE4gYXMgdGhlIHdpbGRjYXJkIGZvcm1hdCwgYW5kIHdlIGhhdmUgYSB0cmFuc2xhdGlvbiB0aGF0IGNvbnRhaW5zICQwLCAkMSwgJDIsXHJcbiAgICAgKiAkMCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb24gdG9SZXBsYWNlLCAkMSB3aXRoIHRoZSBzZWNvbmQgYW5kIHNvLlxyXG4gICAgICpcclxuICAgICAqIFdlIHVzdWFsbHkgc2V0IHRoaXMgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgY2xhc3MgdHJhbnNsYXRpb24gZGF0YVxyXG4gICAgICpcclxuICAgICAqIE5vdGljZSB0aGF0IE4gaXMgbWFuZGF5b3J5IG9uIHRoZSB3aWxkY2FyZHMgZm9ybWF0IGFuZCB0aGUgZmlyc3QgaW5kZXggdmFsdWUgaXMgMC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHdpbGRjYXJkcyBmb3JtYXQgd2Ugd2FudCB0byBzZXRcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIHRoYXQncyBiZWVuIHNldFxyXG4gICAgICovXHJcbiAgICBzZXRXaWxkQ2FyZHNGb3JtYXQodmFsdWU6c3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlmKCF2YWx1ZS5pbmNsdWRlcygnTicpKXtcclxuICAgICAgICBcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTiBpcyBtYW5kYXRvcnkgdG8gcmVwbGFjZSB3aWxkY2FyZHNcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jYWNoZUhhc2hCYXNlU3RyaW5nID0gdmFsdWUgKyB0aGlzLl9taXNzaW5nS2V5Rm9ybWF0ICsgKCh0aGlzLl9sb2NhbGVzLmxlbmd0aCA+IDApID8gdGhpcy5fbG9jYWxlc1swXSA6ICcnKTtcclxuXHJcbiAgICAgICAgdGhpcy5fd2lsZENhcmRzRm9ybWF0ID0gdmFsdWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgYmVoYXZpb3VyIGZvciBnZXQoKSwgZ2V0U3RhcnRDYXNlKCksIGV0Yy4uLiBtZXRob2RzIHdoZW4gYSBrZXkgaXMgbm90IGZvdW5kIG9uXHJcbiAgICAgKiBhIGJ1bmRsZSBvciB0aGUgYnVuZGxlIGRvZXMgbm90IGV4aXN0XHJcbiAgICAgKlxyXG4gICAgICogSWYgbWlzc2luZ0tleUZvcm1hdCBpcyBhbiBlbXB0eSBzdHJpbmcsIGFsbCBtaXNzaW5nIGtleXMgd2lsbCByZXR1cm4gYW4gZW1wdHkgdmFsdWUgKG5vdCByZWNvbW1lbmRlZClcclxuICAgICAqXHJcbiAgICAgKiBJZiBtaXNzaW5nS2V5Rm9ybWF0IGNvbnRhaW5zIGEgc3RyaW5nLCB0aGF0IHN0cmluZyB3aWxsIGJlIGFsd2F5cyByZXR1cm5lZCBmb3IgbWlzc2luZyBrZXlzXHJcbiAgICAgKlxyXG4gICAgICogSWYgbWlzc2luZ0tleUZvcm1hdCBjb250YWlucyBhIHN0cmluZyB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHByZWRlZmluZWQgd2lsZGNhcmRzOjxicj5cclxuICAgICAqICAgIC0gJGtleSB3aWxsIGJlIHJlcGxhY2VkIHdpdGgga2V5IG5hbWUuIEV4YW1wbGU6IGdldChcIk5BTUVcIikgd2lsbCBvdXRwdXQgW05BTUVdIGlmIGtleSBpcyBub3QgZm91bmQgYW5kIG1pc3NpbmdLZXlGb3JtYXQgPSAnWyRrZXldJzxicj5cclxuICAgICAqICAgIC0gJGV4Y2VwdGlvbiAoZGVmYXVsdCB2YWx1ZSkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCB0aGUgcHJvYmxlbSBjYXVzZSBkZXNjcmlwdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG1pc3Npbmcga2V5IGZvcm1hdCB3ZSB3YW50IHRvIHNldFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdGhhdCdzIGJlZW4gc2V0XHJcbiAgICAgKi9cclxuICAgIHNldE1pc3NpbmdLZXlGb3JtYXQodmFsdWU6c3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhY2hlSGFzaEJhc2VTdHJpbmcgPSB0aGlzLl93aWxkQ2FyZHNGb3JtYXQgKyB2YWx1ZSArICgodGhpcy5fbG9jYWxlcy5sZW5ndGggPiAwKSA/IHRoaXMuX2xvY2FsZXNbMF0gOiAnJyk7XHJcblxyXG4gICAgICAgIHRoaXMuX21pc3NpbmdLZXlGb3JtYXQgPSB2YWx1ZTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAc2VlIHNldE1pc3NpbmdLZXlGb3JtYXQoKVxyXG4gICAgICovXHJcbiAgICBnZXRNaXNzaW5nS2V5Rm9ybWF0KCkge1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWlzc2luZ0tleUZvcm1hdDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIHRoZSB0cmFuc2xhdGlvbiBzeXN0ZW0gYnkgbG9hZGluZyBhbmQgcGFyc2luZyBidW5kbGUgZmlsZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHRyYW5zbGF0aW9ucyBwYXRoLlxyXG4gICAgICogQWZ0ZXIgdGhlIHByb21pc2UgZmluaXNoZXMsIHRoZSBjbGFzcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSB0cmFuc2xhdGlvbiBkYXRhIGFuZCB3aWxsIGJlIHJlYWR5IHRvIHRyYW5zbGF0ZSBhbnkgXHJcbiAgICAgKiBwcm92aWRlZCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB0cmFuc2xhdGlvbnNQYXRoIC0gVXJsIHdoZXJlIHRoZSB0cmFuc2xhdGlvbnMgSnNvbiBzdHJ1Y3R1cmUgb2YgbGlicmFyaWVzL2J1bmRsZXMvbG9jYWxlcy9rZXlzIGlzIGF2YWlsYWJsZS5cclxuICAgICAqIEBwYXJhbSBsb2NhbGVzIEFuIGFycmF5IG9mIGxvY2FsZSBjb2RlcyAoZS5nLiwgWydlbl9VUycsICdlc19FUycsICdmcl9GUiddKSB0byBsb2FkLiBUaGVzZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0cmFuc2xhdGlvblxyXG4gICAgICogICAgICAgIHBhdGggdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IHRyYW5zbGF0aW9uc1BhdGgvZW5fVVMtZXNfRVMtZnJfRlIuIFRoZSBvcmRlciBvZiB0aGlzIGFycmF5IHdpbGwgZGV0ZXJtaW5lIHRoZVxyXG4gICAgICogICAgICAgIHRyYW5zbGF0aW9uIHByaW9yaXR5XHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBbnkgZXh0cmEgcGFyYW1ldGVycyB0byBiZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNsYXRpb25zUGF0aCBhZnRlciB0aGUgbG9jYWxlcyBsaWtlIC9wYXJhbTEvcGFyYW0yLyBldGNcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgaWYgdGhlIHRyYW5zbGF0aW9ucyBnZXQgY29ycmVjdGx5IGxvYWRlZCwgb3IgcmVqZWN0IHdpdGggYW4gZXJyb3IgaWYgbG9hZCBmYWlscyBcclxuICAgICAqL1xyXG4gICAgaW5pdGlhbGl6ZSh0cmFuc2xhdGlvbnNQYXRoOnN0cmluZywgbG9jYWxlczpzdHJpbmdbXSwgcGFyYW1ldGVyczpzdHJpbmdbXSl7XHJcbiAgICBcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbG9hZGVkVHJhbnNsYXRpb25zID0ge307XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVmFsaWRhdGUgcmVjZWl2ZWQgbG9jYWxlcyBhcmUgY29ycmVjdFxyXG4gICAgICAgIGZvcihjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVMb2NhbGVTdHJpbmcobG9jYWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHRyYW5zbGF0aW9uc0Z1bGxQYXRoID0gdHJhbnNsYXRpb25zUGF0aCArICcvJyArIGxvY2FsZXMuam9pbignLScpICsgJy8nICsgcGFyYW1ldGVycy5qb2luKCcvJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBcclxuICAgICAgICAgICAgZmV0Y2godHJhbnNsYXRpb25zRnVsbFBhdGgpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkZWRUcmFuc2xhdGlvbnMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGVzID0gbG9jYWxlcztcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xhbmd1YWdlcyA9IGxvY2FsZXMubWFwKChsOiBzdHJpbmcpID0+IGwuc3Vic3RyaW5nKDAsIDIpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSGFzaEJhc2VTdHJpbmcgPSB0aGlzLl93aWxkQ2FyZHNGb3JtYXQgKyB0aGlzLl9taXNzaW5nS2V5Rm9ybWF0ICsgdGhpcy5fbG9jYWxlc1swXTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBFUlJPUiBMT0FESU5HIExPQ0FMRVMgRlJPTTogJHt0cmFuc2xhdGlvbnNGdWxsUGF0aH1cXG5gICsgZXJyb3IpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgY2xhc3MgaGFzIGJlZW4gY29ycmVjdGx5IGluaXRpYWxpemVkIGFuZCB0cmFuc2xhdGlvbnMgaGF2ZSBiZWVuIGNvcnJlY3RseSBsb2FkZWRcclxuICAgICAqL1xyXG4gICAgaXNJbml0aWFsaXplZCgpe1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5faXNJbml0aWFsaXplZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXggbWV0aG9kIHRvIHZlcmlmeSB0aGF0IHRoaXMgY2xhc3MgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIHdpdGggdHJhbnNsYXRpb24gZGF0YVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF92YWxpZGF0ZUluaXRpYWxpemVkKCl7XHJcblxyXG4gICAgICAgIGlmKCF0aGlzLl9pc0luaXRpYWxpemVkKXtcclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxlc01hbmFnZXIgbm90IGluaXRpYWxpemVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgbG9jYWxlIGlzIGN1cnJlbnRseSBsb2FkZWQgZm9yIHRoZSBjdXJyZW50bHkgZGVmaW5lZCBidW5kbGVzIGFuZCBwYXRocy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIHRvIGNoZWNrLiBGb3IgZXhhbXBsZSAnZW5fVVMnXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsb2NhbGUgaXMgY3VycmVudGx5IGxvYWRlZCBvbiB0aGUgY2xhc3MsIGZhbHNlIGlmIG5vdC5cclxuICAgICAqL1xyXG4gICAgaXNMb2NhbGVMb2FkZWQobG9jYWxlOnN0cmluZyl7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlTG9jYWxlU3RyaW5nKGxvY2FsZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGVzLmluY2x1ZGVzKGxvY2FsZSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXggbWV0aG9kIHRvIHZhbGlkYXRlIHRoYXQgYSBsb2NhbGUgc3RyaW5nIGlzIGNvcnJlY3RseSBmb3JtYXR0ZWRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc3RyaW5nICRsb2NhbGUgQSBsb2NhbGUgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3ZhbGlkYXRlTG9jYWxlU3RyaW5nKGxvY2FsZTpzdHJpbmcpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKCEvXlthLXpdezJ9X1tBLVpdezJ9JC8udGVzdChsb2NhbGUpKSB7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvY2FsZSBtdXN0IGJlIGEgdmFsaWQgeHhfWFggdmFsdWUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCAyIGRpZ2l0IGxhbmd1YWdlIGlzIGN1cnJlbnRseSBsb2FkZWQgZm9yIHRoZSBjdXJyZW50bHkgZGVmaW5lZCBidW5kbGVzIGFuZCBwYXRocy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgQSBsYW5ndWFnZSB0byBjaGVjay4gRm9yIGV4YW1wbGUgJ2VuJ1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGFuZ3VhZ2UgaXMgY3VycmVudGx5IGxvYWRlZCBvbiB0aGUgY2xhc3MsIGZhbHNlIGlmIG5vdC5cclxuICAgICAqL1xyXG4gICAgaXNMYW5ndWFnZUxvYWRlZChsYW5ndWFnZTpzdHJpbmcpe1xyXG5cclxuICAgICAgICB0aGlzLl92YWxpZGF0ZUxhbmd1YWdlU3RyaW5nKGxhbmd1YWdlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXggbWV0aG9kIHRvIHZhbGlkYXRlIHRoYXQgYSBsYW5ndWFnZSBzdHJpbmcgaXMgY29ycmVjdGx5IGZvcm1hdHRlZFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBBIDIgZGlnaXQgbGFuZ3VhZ2Ugc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIF92YWxpZGF0ZUxhbmd1YWdlU3RyaW5nKGxhbmd1YWdlOnN0cmluZyl7XHJcblxyXG4gICAgICAgIGlmICghL15bYS16XXsyfSQvLnRlc3QobGFuZ3VhZ2UpKSB7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhbmd1YWdlIG11c3QgYmUgYSB2YWxpZCAyIGRpZ2l0IHZhbHVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB0cmFuc2xhdGlvbiB0byB0aGUgY3VycmVudCBwcmltYXJ5IGxvY2FsZSBmb3IgdGhlIGdpdmVuIGtleSwgbGlicmFyeSBhbmQgYnVuZGxlXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHN0cmluZyBrZXkgVGhlIGtleSB3ZSB3YW50IHRvIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGJ1bmRsZVxyXG4gICAgICogQHBhcmFtIHN0cmluZyBidW5kbGVQYXRoIEEgc3RyaW5nIHdpdGggdGhlIGZvcm1hdCAnbGlicmFyeV9uYW1lL2J1bmRsZV9uYW1lJyB0aGF0IGlzIHVzZWQgdG8gbG9jYXRlIHRoZSBidW5kbGUgd2VyZSB0aGUga2V5IHRvIHRyYW5zbGF0ZSBpcyBmb3VuZFxyXG4gICAgICogQHBhcmFtIGFycmF5IHJlcGxhY2VXaWxkY2FyZHMgQSBsaXN0IG9mIHZhbHVlcyB0aGF0IHdpbGwgcmVwbGFjZSB3aWxkY2FyZHMgdGhhdCBtYXkgYmUgZm91bmQgb24gdGhlIHRyYW5zbGF0ZWQgdGV4dC4gRWFjaCB3aWxkY2FyZFxyXG4gICAgICogICAgICAgIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZWxlbWVudCB3aG9zZSBpbmRleCBvbiByZXBsYWNlV2lsZGNhcmRzIG1hdGNoZXMgaXQuIENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzLndpbGRDYXJkc0Zvcm1hdFxyXG4gICAgICogICAgICAgIHByb3BlcnR5IHRvIGtub3cgbW9yZSBhYm91dCBob3cgdG8gc2V0dXAgd2lsZGNhcmRzIG9uIHlvdXIgdHJhbnNsYXRpb25zLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgc2V0V2lsZENhcmRzRm9ybWF0KClcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIFRoZSB0cmFuc2xhdGVkIHRleHRcclxuICAgICAqL1xyXG4gICAgdChrZXk6c3RyaW5nLCBidW5kbGVQYXRoOnN0cmluZywgcmVwbGFjZVdpbGRjYXJkczpzdHJpbmdbXSA9IFtdKSB7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5pdGlhbGl6ZWQoKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgY2FjaGUga2V5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiByZXF1ZXN0aW5nIHRoZSBzYW1lIGtleSB0cmFuc2xhdGlvbiBzZXZlcmFsIHRpbWVzXHJcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHt0aGlzLl9jYWNoZUhhc2hCYXNlU3RyaW5nfSR7a2V5fSR7YnVuZGxlUGF0aH0ke3JlcGxhY2VXaWxkY2FyZHMuam9pbignJyl9YDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9rZXlWYWx1ZXNDYWNoZVtjYWNoZUtleV0pIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlTm9uRW1wdHlTdHJpbmcoa2V5LCAnJywgJ2tleSBtdXN0IGJlIG5vbiBlbXB0eSBzdHJpbmcnKTtcclxuICAgICAgICAgICAgdGhpcy5fZm9yY2VOb25FbXB0eVN0cmluZyhidW5kbGVQYXRoLCAnJywgJ2J1bmRsZVBhdGggbXVzdCBiZSBub24gZW1wdHkgc3RyaW5nJyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBbbGlicmFyeSwgYnVuZGxlXSA9IGJ1bmRsZVBhdGguc3BsaXQoJy8nKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlTm9uRW1wdHlTdHJpbmcobGlicmFyeSwgJycsICdubyBsaWJyYXJ5IHNwZWNpZmllZCBvbiBidW5kbGVQYXRoJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlTm9uRW1wdHlTdHJpbmcoYnVuZGxlLCAnJywgJ25vIGJ1bmRsZSBzcGVjaWZpZWQgb24gYnVuZGxlUGF0aCcpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnRzQ291bnQgPSByZXBsYWNlV2lsZGNhcmRzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIExvb3AgYWxsIHRoZSBsb2NhbGVzIHRvIGZpbmQgdGhlIGZpcnN0IG9uZSB3aXRoIGEgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIHRoaXMuX2xvY2FsZXMpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbG9hZGVkVHJhbnNsYXRpb25zW2xpYnJhcnldPy5bYnVuZGxlXT8uW2xvY2FsZV0/LltrZXldKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9sb2FkZWRUcmFuc2xhdGlvbnNbbGlicmFyeV1bYnVuZGxlXVtsb2NhbGVdW2tleV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgYWxsIHdpbGRjYXJkcyBvbiB0aGUgdGV4dCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVwbGFjZW1lbnRzIGlmIGFueVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVwbGFjZW1lbnRzQ291bnQ7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fcmVwbGFjZShyZXN1bHQsIHRoaXMuX3JlcGxhY2UodGhpcy5fd2lsZENhcmRzRm9ybWF0LCAnTicsIGkudG9TdHJpbmcoKSksIHJlcGxhY2VXaWxkY2FyZHNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5VmFsdWVzQ2FjaGVbY2FjaGVLZXldID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuIGV4Y2VwdGlvbiBuZWVkcyB0byBiZSB0aHJvd24gaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgbm90IGZvdW5kIG9uIHRoaXMgYnVuZGxlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9taXNzaW5nS2V5Rm9ybWF0LmluY2x1ZGVzKCckZXhjZXB0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBrZXkgPCR7a2V5fT4gbm90IGZvdW5kIG9uICR7YnVuZGxlUGF0aH1gKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fa2V5VmFsdWVzQ2FjaGVbY2FjaGVLZXldID0gdGhpcy5fcmVwbGFjZSh0aGlzLl9taXNzaW5nS2V5Rm9ybWF0LCAnJGtleScsIGtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fa2V5VmFsdWVzQ2FjaGVbY2FjaGVLZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB0cmFuc2xhdGlvbiBmb3IgdGhlIGdpdmVuIGtleSBhbmQgYnVuZGxlIGFzIGEgc3RyaW5nIHdpdGggYWxsIHdvcmRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZFxyXG4gICAgICogYW5kIGFsbCB0aGUgcmVzdCBvZiB0aGUgd29yZCB3aXRoIGxvd2VyIGNhc2VcclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHQoKVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBsb2NhbGl6ZWQgYW5kIGNhc2UgZm9ybWF0dGVkIHRleHRcclxuICAgICAqL1xyXG4gICAgdFN0YXJ0Q2FzZShrZXk6c3RyaW5nLCBidW5kbGVQYXRoOnN0cmluZywgcmVwbGFjZVdpbGRjYXJkczpzdHJpbmdbXSA9IFtdKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnQoa2V5LCBidW5kbGVQYXRoLCByZXBsYWNlV2lsZGNhcmRzKS5zcGxpdCgnICcpXHJcbiAgICAgICAgICAgICAgICAubWFwKCh3b3JkOmFueSkgPT4gd29yZCA/IHdvcmRbMF0udG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSA6ICcnKS5qb2luKCcgJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBidW5kbGUgYXMgYW4gYWxsIHVwcGVyIGNhc2Ugc3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSB0KClcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9jYWxpemVkIGFuZCBjYXNlIGZvcm1hdHRlZCB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHRBbGxVcHBlckNhc2Uoa2V5OnN0cmluZywgYnVuZGxlUGF0aDpzdHJpbmcsIHJlcGxhY2VXaWxkY2FyZHM6c3RyaW5nW10gPSBbXSkge1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy50KGtleSwgYnVuZGxlUGF0aCwgcmVwbGFjZVdpbGRjYXJkcykudG9VcHBlckNhc2UoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGJ1bmRsZSBhcyBhbiBhbGwgbG93ZXIgY2FzZSBzdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHQoKVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBsb2NhbGl6ZWQgYW5kIGNhc2UgZm9ybWF0dGVkIHRleHRcclxuICAgICAqL1xyXG4gICAgdEFsbExvd2VyQ2FzZShrZXk6c3RyaW5nLCBidW5kbGVQYXRoOnN0cmluZywgcmVwbGFjZVdpbGRjYXJkczpzdHJpbmdbXSA9IFtdKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnQoa2V5LCBidW5kbGVQYXRoLCByZXBsYWNlV2lsZGNhcmRzKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB0cmFuc2xhdGlvbiBmb3IgdGhlIGdpdmVuIGtleSBhbmQgYnVuZGxlIGFzIGEgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBhcyBVcHBlciBjYXNlXHJcbiAgICAgKiBhbmQgYWxsIHRoZSByZXN0IGFzIGxvd2VyIGNhc2VcclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHQoKVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBsb2NhbGl6ZWQgYW5kIGNhc2UgZm9ybWF0dGVkIHRleHRcclxuICAgICAqL1xyXG4gICAgdEZpcnN0VXBwZXJSZXN0TG93ZXIoa2V5OnN0cmluZywgYnVuZGxlUGF0aDpzdHJpbmcsIHJlcGxhY2VXaWxkY2FyZHM6c3RyaW5nW10gPSBbXSl7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0cmluZyA9IHRoaXMudChrZXksIGJ1bmRsZVBhdGgsIHJlcGxhY2VXaWxkY2FyZHMpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGxvY2FsZXMgdGhhdCBhcmUgdXNlZCBieSB0aGlzIGNsYXNzIHRvIHRyYW5zbGF0ZSB0aGUgZ2l2ZW4ga2V5cywgc29ydGVkIGJ5IHByZWZlcmVuY2UuXHJcbiAgICAgKiBFYWNoIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgYSBzdGFuZGFyZCBsb2NhbGUgY29kZSB3aXRoIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGpvaW5lZCBieSBhbiB1bmRlcnNjb3JlLCBsaWtlOiBlbl9VUywgZnJfRlJcclxuICAgICAqXHJcbiAgICAgKiBXaGVuIGEga2V5IGFuZCBidW5kbGUgYXJlIHJlcXVlc3RlZCBmb3IgdHJhbnNsYXRpb24sIHRoZSBjbGFzcyB3aWxsIGNoZWNrIG9uIHRoZSBmaXJzdCBsYW5ndWFnZSBvZiB0aGlzXHJcbiAgICAgKiBsaXN0IGZvciBhIHRyYW5zbGF0ZWQgdGV4dC4gSWYgbWlzc2luZywgdGhlIG5leHQgb25lIHdpbGwgYmUgdXNlZCwgYW5kIHNvLiBUaGlzIGxpc3QgaXMgY29uc3RydWN0ZWQgYWZ0ZXIgaW5pdGlhbGl6ZVxyXG4gICAgICogbWV0aG9kcyBpcyBjYWxsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGU6IEFmdGVyIGxvYWRpbmcgdGhlIGZvbGxvd2luZyBsaXN0IG9mIGxvY2FsZXMgWydlbl9VUycsICdlc19FUycsICdmcl9GUiddIGlmIHdlIGNhbGwgTG9jYWxlc01hbmFnZXIudCgnSEVMTE8nLCAnbGliMS9ncmVldGluZ3MnKVxyXG4gICAgICogdGhlIGxvY2FsaXphdGlvbiBtYW5hZ2VyIHdpbGwgdHJ5IHRvIGxvY2F0ZSB0aGUgZW5fVVMgdmFsdWUgZm9yIHRoZSBIRUxMTyB0YWcgb24gdGhlIGdyZWV0aW5ncyBidW5kbGUgZm9yIHRoZSBsaWJyYXJ5IGxpYjEuXHJcbiAgICAgKiBJZiB0aGUgdGFnIGlzIG5vdCBmb3VuZCBmb3IgdGhlIHNwZWNpZmllZCBsb2NhbGUgYW5kIGJ1bmRsZSwgdGhlIHNhbWUgc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVkIGZvciB0aGUgZXNfRVMgbG9jYWxlLCBhbmQgc28sIHRpbGwgYVxyXG4gICAgICogdmFsdWUgaXMgZm91bmQgb3Igbm8gbW9yZSBsb2NhbGVzIGFyZSBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBnZXRMb2NhbGVzKCl7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGVzO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgbGFuZ3VhZ2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBjbGFzcyB0byB0cmFuc2xhdGUgdGhlIGdpdmVuIGtleXMsIHNvcnRlZCBieSBwcmVmZXJlbmNlLlxyXG4gICAgICogRWFjaCBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIGEgMiBkaWdpdCBsYW5ndWFnZSBjb2RlLCBsaWtlOiBlbiwgZnJcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGxpc3QgaXMgdGhlIHNhbWUgYXMgdGhlIGxvY2FsZXMoKSBvbmUsIGJ1dCBjb250YWluaW5nIG9ubHkgdGhlIGxhbmd1YWdlIHBhcnQgb2YgZWFjaCBsb2NhbGUgKHRoZSBmaXJzdCB0d28gZGlnaXRzKVxyXG4gICAgICpcclxuICAgICAqIEBzZWUgZ2V0TG9jYWxlcygpXHJcbiAgICAgKi9cclxuICAgIGdldExhbmd1YWdlcygpe1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VzO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBmaXJzdCBsb2NhbGUgZnJvbSB0aGUgbGlzdCBvZiBsb2FkZWQgbG9jYWxlcywgd2hpY2ggaXMgdGhlIGN1cnJlbnRseSB1c2VkIHRvIHNlYXJjaCBmb3IgdHJhbnNsYXRlZCB0ZXh0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9jYWxlIHRoYXQgaXMgZGVmaW5lZCBhcyB0aGUgcHJpbWFyeSBvbmUuIEZvciBleGFtcGxlOiBlbl9VUywgZXNfRVMsIC4uXHJcbiAgICAgKi9cclxuICAgIGdldFByaW1hcnlMb2NhbGUoKXtcclxuXHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbml0aWFsaXplZCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlc1swXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZmlyc3QgbGFuZ3VhZ2UgZnJvbSB0aGUgbGlzdCBvZiBsb2FkZWQgbG9jYWxlcywgd2hpY2ggaXMgdGhlIGN1cnJlbnRseSB1c2VkIHRvIHNlYXJjaCBmb3IgdHJhbnNsYXRlZCB0ZXh0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgMiBkaWdpdCBsYW5ndWFnZSBjb2RlIHRoYXQgaXMgZGVmaW5lZCBhcyB0aGUgcHJpbWFyeSBvbmUuIEZvciBleGFtcGxlOiBlbiwgZXMsIC4uXHJcbiAgICAgKi9cclxuICAgIGdldFByaW1hcnlMYW5ndWFnZSgpe1xyXG5cclxuICAgICAgICB0aGlzLl92YWxpZGF0ZUluaXRpYWxpemVkKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZXNbMF07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmUgdGhlIGxvY2FsZSB0aGF0IHdpbGwgYmUgcGxhY2VkIGF0IHRoZSBmcm9udCBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBsb2NhbGVzIGxpc3QgKG1vdmluZyBhbGwgdGhlIG90aGVycyBvbmUgcG9zaXRpb24gdG8gdGhlIHJpZ2h0KS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHdpbGwgYmUgdGhlIGZpcnN0IGxvY2FsZSB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gZ2V0IGEgdHJhbnNsYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxvY2FsZSBBIGN1cnJlbnRseSBsb2FkZWQgbG9jYWxlIHRoYXQgd2lsbCBiZSBtb3ZlZCB0byB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGxvYWRlZCBsb2NhbGVzIGxpc3QuIElmIHRoZSBzcGVjaWZpZWQgbG9jYWxlXHJcbiAgICAgKiAgICAgICAgaXMgbm90IGN1cnJlbnRseSBsb2FkZWQsIGFuIGV4Y2VwdGlvbiB3aWxsIGhhcHBlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICAgKi9cclxuICAgIHNldFByaW1hcnlMb2NhbGUobG9jYWxlOnN0cmluZyl7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5pdGlhbGl6ZWQoKTtcclxuXHJcbiAgICAgICAgaWYoIXRoaXMuaXNMb2NhbGVMb2FkZWQobG9jYWxlKSl7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobG9jYWxlICsgJyBub3QgbG9hZGVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVzdWx0ID0gW2xvY2FsZV07XHJcblxyXG4gICAgICAgIGZvciAobGV0IGwgb2YgdGhpcy5fbG9jYWxlcyl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKGwgIT09IGxvY2FsZSl7XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2xvY2FsZXMgPSByZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VzID0gdGhpcy5fbG9jYWxlcy5tYXAoKGw6IHN0cmluZykgPT4gbC5zdWJzdHJpbmcoMCwgMikpO1xyXG4gICAgICAgIHRoaXMuX2NhY2hlSGFzaEJhc2VTdHJpbmcgPSB0aGlzLl93aWxkQ2FyZHNGb3JtYXQgKyB0aGlzLl9taXNzaW5nS2V5Rm9ybWF0ICsgdGhpcy5fbG9jYWxlc1swXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSBzcGVjaWZpZWQgbG9jYWxlcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb2NhbGVzIGxpc3QuIFRoaXMgYWxzbyBhbHRlcnMgdGhlIHRyYW5zbGF0aW9uIHByaW9yaXR5IGJ5IHNldHRpbmcgdGhlIGZpcnN0XHJcbiAgICAgKiBwcm92aWRlZCBsb2NhbGUgYXMgdGhlIG1vc3QgcHJpb3JpdGFyeSwgdGhlIHNlY29uZCBhcyB0aGUgbmV4dCBvbmUgYW5kIHNvLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGJhc2ljYWxseSB3b3JrcyBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBzZXRQcmltYXJ5TG9jYWxlIGJ1dCBsZXR0aW5nIHVzIGFkZCBtYW55IGxvY2FsZXMgYXQgb25jZS5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHNldFByaW1hcnlMb2NhbGUoKVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsb2NhbGVzIEEgbGlzdCBvZiBsb2NhbGVzIHRvIGJlIG1vdmVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zbGF0aW9uIHByaW9yaXR5LiBGaXJzdCBsb2NhbGVzIGl0ZW0gd2lsbCBiZSB0aGUgcHJlZmVyZWRcclxuICAgICAqICAgICAgICBsb2NhbGUgZm9yIHRyYW5zbGF0aW9uLCBzZWNvbmQgd2lsbCBiZSB0aGUgbmV4dCBvbmUgaW4gY2FzZSBzb21lIGtleSBpcyBub3QgdHJhbnNsYXRlZCBmb3IgdGhlIGZpcnN0IG9uZSBhbmQgc28uIElmIGFueSBvZiB0aGVcclxuICAgICAqICAgICAgICBzcGVjaWZpZWQgbG9jYWxlcyBpcyBub3QgY3VycmVudGx5IGxvYWRlZCwgYW4gZXhjZXB0aW9uIHdpbGwgaGFwcGVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHZvaWRcclxuICAgICAqL1xyXG4gICAgc2V0UHJpbWFyeUxvY2FsZXMobG9jYWxlczpzdHJpbmdbXSl7XHJcblxyXG4gICAgICAgIGlmKCFBcnJheS5pc0FycmF5KGxvY2FsZXMpIHx8XHJcbiAgICAgICAgICAgIChuZXcgU2V0KGxvY2FsZXMpLnNpemUgIT09IGxvY2FsZXMubGVuZ3RoKSB8fFxyXG4gICAgICAgICAgICBsb2NhbGVzLmxlbmd0aCA9PT0gMCl7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2NhbGVzIG11c3QgYmUgbm9uIGVtcHR5IHN0cmluZyBhcnJheSB3aXRoIG5vIGR1cGxpY2F0ZSBlbGVtZW50cycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGxvY2FsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0UHJpbWFyeUxvY2FsZShsb2NhbGVzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmUgdGhlIDIgZGlnaXQgbGFuZ3VhZ2UgdGhhdCB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgZnJvbnQgb2YgdGhlIGN1cnJlbnRseSBsb2FkZWQgbG9jYWxlcyBsaXN0IChtb3ZpbmcgYWxsIHRoZSBvdGhlcnMgb25lIHBvc2l0aW9uIHRvIHRoZSByaWdodCkuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBsYW5ndWFnZSB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gZ2V0IGEgdHJhbnNsYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxhbmd1YWdlIEEgMiBkaWdpdCBsYW5ndWFnZSBjb2RlIHRoYXQgbWF0Y2hlcyB3aXRoIGFueSBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBsb2NhbGVzLCB3aGljaCB3aWxsXHJcbiAgICAgKiAgICAgICAgYmUgbW92ZWQgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIG9mIHRoZSBsb2FkZWQgbG9jYWxlcyBsaXN0LiBJZiB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlIGRvZXMgbm90IG1hdGNoIHdpdGhcclxuICAgICAqICAgICAgICBhIGxvY2FsZSB0aGF0IGlzIGN1cnJlbnRseSBsb2FkZWQsIGFuIGV4Y2VwdGlvbiB3aWxsIGhhcHBlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICAgKi9cclxuICAgIHNldFByaW1hcnlMYW5ndWFnZShsYW5ndWFnZTpzdHJpbmcpe1xyXG5cclxuICAgICAgICBmb3IobGV0IGxvY2FsZSBvZiB0aGlzLl9sb2NhbGVzKXtcclxuICAgICAgICBcclxuICAgICAgICAgICAgaWYobG9jYWxlLnN1YnN0cmluZygwLCAyKSA9PT0gbGFuZ3VhZ2Upe1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJpbWFyeUxvY2FsZShsb2NhbGUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGxhbmd1YWdlICsgJyBub3QgbG9hZGVkJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0aGUgbG9jYWxlcyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2VzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvY2FsZXMgbGlzdC5cclxuICAgICAqIFdvcmtzIHRoZSBzYW1lIGFzIHNldFByaW1hcnlMb2NhbGVzKCkgYnV0IHdpdGggYSBsaXN0IG9mIHRoZSAyIGRpZ2l0IGxhbmd1YWdlIGNvZGVzIHRoYXQgbWF0Y2ggdGhlIHJlc3BlY3RpdmUgbG9jYWxlcy5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHNldFByaW1hcnlMb2NhbGUoKVxyXG4gICAgICogQHNlZSBzZXRQcmltYXJ5TGFuZ3VhZ2UoKVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsYW5ndWFnZXMgQSBsaXN0IG9mIDIgZGlnaXQgbGFuZ3VhZ2UgY29kZXMgdG8gYmUgbW92ZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhbnNsYXRpb24gcHJpb3JpdHkuIElmIGFueSBvZiB0aGVcclxuICAgICAqICAgICAgICBzcGVjaWZpZWQgbGFuZ3VhZ2VzIGRvZXMgbm90IG1hdGNoIHdpdGggYSBsb2NhbGUgdGhhdCBpcyBjdXJyZW50bHkgbG9hZGVkLCBhbiBleGNlcHRpb24gd2lsbCBoYXBwZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgdm9pZFxyXG4gICAgICovXHJcbiAgICBzZXRQcmltYXJ5TGFuZ3VhZ2VzKGxhbmd1YWdlczpzdHJpbmdbXSl7XHJcblxyXG4gICAgICAgIGlmKCFBcnJheS5pc0FycmF5KGxhbmd1YWdlcykgfHxcclxuICAgICAgICAgICAobmV3IFNldChsYW5ndWFnZXMpLnNpemUgIT09IGxhbmd1YWdlcy5sZW5ndGgpIHx8XHJcbiAgICAgICAgICAgIGxhbmd1YWdlcy5sZW5ndGggPT09IDApe1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYW5ndWFnZXMgbXVzdCBiZSBub24gZW1wdHkgc3RyaW5nIGFycmF5IHdpdGggbm8gZHVwbGljYXRlIGVsZW1lbnRzJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gbGFuZ3VhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldFByaW1hcnlMYW5ndWFnZShsYW5ndWFnZXNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENoYW5nZSB0aGUgbG9hZGVkIGxvY2FsZXMgdHJhbnNsYXRpb24gcHJlZmVyZW5jZSBvcmRlci4gVGhlIHNhbWUgbG9jYWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGVkIG11c3QgYmUgcGFzc2VkXHJcbiAgICAgKiBidXQgd2l0aCBhIGRpZmZlcmVudCBvcmRlciB0byBjaGFuZ2UgdGhlIHRyYW5zbGF0aW9uIHByaW9yaXR5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsb2NhbGVzIEEgbGlzdCB3aXRoIHRoZSBuZXcgbG9jYWxlcyB0cmFuc2xhdGlvbiBwcmlvcml0eVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHZvaWRcclxuICAgICAqL1xyXG4gICAgc2V0TG9jYWxlc09yZGVyKGxvY2FsZXM6c3RyaW5nW10pe1xyXG5cclxuICAgICAgICBpZihsb2NhbGVzLmxlbmd0aCAhPT0gdGhpcy5fbG9jYWxlcy5sZW5ndGgpe1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2NhbGVzIG11c3QgY29udGFpbiBhbGwgdGhlIGN1cnJlbnRseSBsb2FkZWQgbG9jYWxlcycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbml0aWFsaXplZCgpO1xyXG5cclxuICAgICAgICBmb3IobGV0IGxvY2FsZSBvZiBsb2NhbGVzKXtcclxuICAgICAgICBcclxuICAgICAgICAgICAgaWYoIXRoaXMuaXNMb2NhbGVMb2FkZWQobG9jYWxlKSl7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGxvY2FsZSArICcgbm90IGxvYWRlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9sb2NhbGVzID0gbG9jYWxlcztcclxuICAgICAgICB0aGlzLl9sYW5ndWFnZXMgPSB0aGlzLl9sb2NhbGVzLm1hcCgobDogc3RyaW5nKSA9PiBsLnN1YnN0cmluZygwLCAyKSk7XHJcbiAgICAgICAgdGhpcy5fY2FjaGVIYXNoQmFzZVN0cmluZyA9IHRoaXMuX3dpbGRDYXJkc0Zvcm1hdCArIHRoaXMuX21pc3NpbmdLZXlGb3JtYXQgKyB0aGlzLl9sb2NhbGVzWzBdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBhbiBhdXggbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgVHVyYm9Db21tb25zIFN0cmluZ1V0aWxzIHJlcGxhY2UgbWV0aG9kLlxyXG4gICAgICogSXQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgb25lIG9uIHRoZSBsaWJyYXJ5LCBidXQgd2UgaW1wbGVtZW50IGl0IGhlcmUgdG8gYXZvaWQgaGF2aW5nIGEgZGVwZW5kZW5jeSB3aXRoIFR1cmJvQ29tbW9uc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9yZXBsYWNlKHN0cmluZzogc3RyaW5nLCBzZWFyY2g6c3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZXNjYXBlZFNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xyXG4gICAgICAgICAgIFxyXG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShuZXcgUmVnRXhwKGVzY2FwZWRTZWFyY2gsICdnJyksIHJlcGxhY2VtZW50KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgYW4gYXV4IG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIFR1cmJvQ29tbW9ucyBTdHJpbmdVdGlscyBpc0VtcHR5IG1ldGhvZC5cclxuICAgICAqIEl0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIG9uZSBvbiB0aGUgbGlicmFyeSwgYnV0IHdlIGltcGxlbWVudCBpdCBoZXJlIHRvIGF2b2lkIGhhdmluZyBhIGRlcGVuZGVuY3kgd2l0aCBUdXJib0NvbW1vbnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaXNFbXB0eShzdHJpbmc6c3RyaW5nKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGlzU3RyaW5nID0gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnIHx8IChzdHJpbmcgYXMgYW55KSBpbnN0YW5jZW9mIFN0cmluZyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gaWYgbm9uIHN0cmluZyB2YWx1ZSB3YXMgcmVjZWl2ZWRcclxuICAgICAgICBpZighaXNTdHJpbmcpe1xyXG5cclxuICAgICAgICAgICAgLy8gRW1wdHkgb3IgbnVsbCB2YWx1ZSBpcyBjb25zaWRlcmVkIGVtcHR5XHJcbiAgICAgICAgICAgIGlmKHN0cmluZyA9PSBudWxsIHx8IHN0cmluZyA9PSAnJyl7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2YWx1ZSBpcyBub3QgYSBzdHJpbmdcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1sgXFxuXFxyXFx0XS9nLCAnJykgPT09ICcnO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBhbiBhdXggbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgVHVyYm9Db21tb25zIFN0cmluZ1V0aWxzIGZvcmNlTm9uRW1wdHlTdHJpbmcgbWV0aG9kLlxyXG4gICAgICogSXQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgb25lIG9uIHRoZSBsaWJyYXJ5LCBidXQgd2UgaW1wbGVtZW50IGl0IGhlcmUgdG8gYXZvaWQgaGF2aW5nIGEgZGVwZW5kZW5jeSB3aXRoIFR1cmJvQ29tbW9uc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9mb3JjZU5vbkVtcHR5U3RyaW5nKHZhbHVlOmFueSwgdmFsdWVOYW1lID0gJycsIGVycm9yTWVzc2FnZSA9ICdtdXN0IGJlIGEgbm9uIGVtcHR5IHN0cmluZycpe1xyXG5cclxuICAgICAgICBsZXQgaXNTdHJpbmcgPSAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYoIWlzU3RyaW5nIHx8IHRoaXMuX2lzRW1wdHkodmFsdWUpKXtcclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih2YWx1ZU5hbWUgKyAnICcgKyBlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=