igniteui-angular 15.1.1 → 15.1.2

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.
@@ -2,7 +2,7 @@ import { Component, EventEmitter, ElementRef, HostBinding, HostListener, Input,
2
2
  import { DisplayDensityToken, DisplayDensityBase } from '../core/displayDensity';
3
3
  import { IgxDragDirective } from '../directives/drag-drop/drag-drop.directive';
4
4
  import { CurrentResourceStrings } from '../core/i18n/resources';
5
- import { fromEvent } from 'rxjs';
5
+ import { fromEvent, Subject } from 'rxjs';
6
6
  import { take, filter } from 'rxjs/operators';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "@angular/common";
@@ -356,6 +356,11 @@ export class IgxChipComponent extends DisplayDensityBase {
356
356
  * @internal
357
357
  */
358
358
  this.hideBaseElement = false;
359
+ /**
360
+ * @hidden
361
+ * @internal
362
+ */
363
+ this.destroy$ = new Subject();
359
364
  this._tabIndex = null;
360
365
  this._selected = false;
361
366
  this._selectedItemClass = 'igx-chip__item--selected';
@@ -629,6 +634,10 @@ export class IgxChipComponent extends DisplayDensityBase {
629
634
  }
630
635
  }
631
636
  }
637
+ ngOnDestroy() {
638
+ this.destroy$.next();
639
+ this.destroy$.complete();
640
+ }
632
641
  }
633
642
  IgxChipComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: IgxChipComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DisplayDensityToken, optional: true }], target: i0.ɵɵFactoryTarget.Component });
634
643
  IgxChipComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: IgxChipComponent, selector: "igx-chip", inputs: { id: "id", tabIndex: "tabIndex", data: "data", draggable: "draggable", animateOnRelease: "animateOnRelease", hideBaseOnDrag: "hideBaseOnDrag", removable: "removable", removeIcon: "removeIcon", selectable: "selectable", selectIcon: "selectIcon", disabled: "disabled", selected: "selected", color: "color", resourceStrings: "resourceStrings" }, outputs: { selectedChange: "selectedChange", moveStart: "moveStart", moveEnd: "moveEnd", remove: "remove", chipClick: "chipClick", selectedChanging: "selectedChanging", selectedChanged: "selectedChanged", keyDown: "keyDown", dragEnter: "dragEnter", dragLeave: "dragLeave", dragOver: "dragOver", dragDrop: "dragDrop" }, host: { listeners: { "keydown": "keyEvent($event)" }, properties: { "attr.id": "this.id", "attr.role": "this.role", "attr.tabIndex": "this.tabIndex", "attr.aria-selected": "this.selected", "class": "this.hostClass" } }, viewQueries: [{ propertyName: "dragDirective", first: true, predicate: ["chipArea"], descendants: true, read: IgxDragDirective, static: true }, { propertyName: "chipArea", first: true, predicate: ["chipArea"], descendants: true, read: ElementRef, static: true }, { propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true, read: ElementRef, static: true }, { propertyName: "defaultRemoveIcon", first: true, predicate: ["defaultRemoveIcon"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultSelectIcon", first: true, predicate: ["defaultSelectIcon"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0, template: "<div #chipArea class=\"igx-chip__item\"\n [igxDrag]=\"{chip: this}\"\n [style.visibility]='hideBaseElement ? \"hidden\" : \"visible\"'\n [ghostClass]=\"ghostClass\"\n (dragStart)=\"onChipDragStart($event)\"\n (ghostCreate)=\"onChipGhostCreate()\"\n (ghostDestroy)=\"onChipGhostDestroy()\"\n (dragEnd)=\"onChipDragEnd()\"\n (transitioned)=\"onChipMoveEnd($event)\"\n (dragClick)=\"onChipDragClicked($event)\"\n igxDrop\n (enter)=\"onChipDragEnterHandler($event)\"\n (leave)= \"onChipDragLeaveHandler($event)\"\n (over)=\"onChipOverHandler($event)\"\n (dropped)=\"onChipDrop($event)\">\n\n <div #selectContainer [ngClass]=\"selectClass(selected)\">\n <ng-container *ngTemplateOutlet=\"selectIconTemplate\"></ng-container>\n </div>\n\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n\n <div class=\"igx-chip__content\">\n <ng-content></ng-content>\n </div>\n\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n\n <div class=\"igx-chip__remove\" *ngIf=\"removable\"\n [attr.tabIndex]=\"tabIndex\"\n (keydown)=\"onRemoveBtnKeyDown($event)\"\n (pointerdown)=\"onRemoveMouseDown($event)\"\n (mousedown)=\"onRemoveMouseDown($event)\"\n (click)=\"onRemoveClick($event)\"\n (touchmove)=\"onRemoveTouchMove()\"\n (touchend)=\"onRemoveTouchEnd($event)\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate\"></ng-container>\n </div>\n</div>\n\n<ng-template #defaultSelectIcon>\n <igx-icon [attr.aria-label]=\"resourceStrings.igx_chip_select\">done</igx-icon>\n</ng-template>\n\n<ng-template #defaultRemoveIcon>\n <igx-icon [attr.aria-label]=\"resourceStrings.igx_chip_remove\">cancel</igx-icon>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i3.IgxDragDirective, selector: "[igxDrag]", inputs: ["igxDrag", "dragTolerance", "dragDirection", "dragChannel", "ghost", "ghostClass", "ghostTemplate", "ghostHost", "scrollContainer", "ghostOffsetX", "ghostOffsetY"], outputs: ["dragStart", "dragMove", "dragEnd", "dragClick", "ghostCreate", "ghostDestroy", "transitioned"], exportAs: ["drag"] }, { kind: "directive", type: i3.IgxDropDirective, selector: "[igxDrop]", inputs: ["igxDrop", "dropChannel", "dropStrategy"], outputs: ["enter", "over", "leave", "dropped"], exportAs: ["drop"] }] });
@@ -726,4 +735,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImpor
726
735
  type: HostListener,
727
736
  args: ['keydown', ['$event']]
728
737
  }] } });
729
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvY2hpcHMvY2hpcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvY2hpcHMvY2hpcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsTUFBTSxFQUNOLFFBQVEsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTBCLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekcsT0FBTyxFQUNILGdCQUFnQixFQUtuQixNQUFNLDZDQUE2QyxDQUFDO0FBR3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUF5QjlDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQUVoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUtILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxrQkFBa0I7SUF3QnBEOzs7Ozs7O09BT0c7SUFDSCxJQUVXLFFBQVEsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLFNBQVMs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QUFNO2dCQWNBLE9BQU87c0JBRGIsTUFBTTtnQkFjQSxTQUFTO3NCQURmLE1BQU07Z0JBY0EsU0FBUztzQkFEZixNQUFNO2dCQWNDLFFBQVE7c0JBRGQsTUFBTTtnQkFjRCxRQUFRO3NCQURkLE1BQU07Z0JBaUJBLGFBQWE7c0JBRG5CLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBUXhELFFBQVE7c0JBRGQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBUWxELGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBUXpELGlCQUFpQjtzQkFEdkIsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFRNUQsaUJBQWlCO3NCQUR2QixTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWtEdkQsU0FBUztzQkFEcEIsV0FBVzt1QkFBQyxPQUFPO2dCQW1CYixRQUFRO3NCQURkLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIEluamVjdCxcbiAgICBPcHRpb25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4sIERpc3BsYXlEZW5zaXR5QmFzZSB9IGZyb20gJy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHtcbiAgICBJZ3hEcmFnRGlyZWN0aXZlLFxuICAgIElEcmFnQmFzZUV2ZW50QXJncyxcbiAgICBJRHJhZ1N0YXJ0RXZlbnRBcmdzLFxuICAgIElEcm9wQmFzZUV2ZW50QXJncyxcbiAgICBJRHJvcERyb3BwZWRFdmVudEFyZ3Ncbn0gZnJvbSAnLi4vZGlyZWN0aXZlcy9kcmFnLWRyb3AvZHJhZy1kcm9wLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSUNoaXBSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vY2hpcC1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ3VycmVudFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJhc2VDaGlwRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIG9yaWdpbmFsRXZlbnQ6IElEcmFnQmFzZUV2ZW50QXJncyB8IElEcm9wQmFzZUV2ZW50QXJncyB8IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudDtcbiAgICBvd25lcjogSWd4Q2hpcENvbXBvbmVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hpcENsaWNrRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDaGlwRXZlbnRBcmdzIHtcbiAgICBjYW5jZWw6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNoaXBLZXlEb3duRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDaGlwRXZlbnRBcmdzIHtcbiAgICBvcmlnaW5hbEV2ZW50OiBLZXlib2FyZEV2ZW50O1xuICAgIGNhbmNlbDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUNoaXBFdmVudEFyZ3Mge1xuICAgIGRyYWdDaGlwOiBJZ3hDaGlwQ29tcG9uZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDaGlwU2VsZWN0RXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDaGlwRXZlbnRBcmdzIHtcbiAgICBjYW5jZWw6IGJvb2xlYW47XG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbmxldCBDSElQX0lEID0gMDtcblxuLyoqXG4gKiBDaGlwIGlzIGNvbXBhY3QgdmlzdWFsIGNvbXBvbmVudCB0aGF0IGRpc3BsYXlzIGluZm9ybWF0aW9uIGluIGFuIG9icm91bmQuXG4gKlxuICogQGlneE1vZHVsZSBJZ3hDaGlwc01vZHVsZVxuICpcbiAqIEBpZ3hUaGVtZSBpZ3gtY2hpcC10aGVtZVxuICpcbiAqIEBpZ3hLZXl3b3JkcyBjaGlwXG4gKlxuICogQGlneEdyb3VwIGRpc3BsYXlcbiAqXG4gKiBAcmVtYXJrc1xuICogVGhlIElnbml0ZSBVSSBDaGlwIGNhbiBiZSB0ZW1wbGF0ZWQsIGRlbGV0ZWQsIGFuZCBzZWxlY3RlZC5cbiAqIE11bHRpcGxlIGNoaXBzIGNhbiBiZSByZW9yZGVyZWQgYW5kIHZpc3VhbGx5IGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLlxuICogQ2hpcHMgcmVzaWRlIGluIGEgY29udGFpbmVyIGNhbGxlZCBjaGlwcyBhcmVhIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIGNoaXBzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LWNoaXAgY2xhc3M9XCJjaGlwU3R5bGVcIiBbaWRdPVwiOTAxXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJjaGlwUmVtb3ZlZCgkZXZlbnQpXCI+XG4gKiAgICA8aWd4LWF2YXRhciBjbGFzcz1cImNoaXAtYXZhdGFyLXJlc2l6ZWRcIiBpZ3hQcmVmaXg+PC9pZ3gtYXZhdGFyPlxuICogPC9pZ3gtY2hpcD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1jaGlwJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NoaXAuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneENoaXBDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZhbHVlIG9mIGBpZGAgYXR0cmlidXRlLiBJZiBub3QgcHJvdmlkZWQgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCI+PC9pZ3gtY2hpcD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkID0gYGlneC1jaGlwLSR7Q0hJUF9JRCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBjaGlwLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNoaXBSb2xlID0gdGhpcy5jaGlwLnJvbGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ29wdGlvbic7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiBgdGFiaW5kZXhgIGF0dHJpYnV0ZS4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgdXNlIHRoZSBlbGVtZW50J3MgdGFiaW5kZXggaWYgc2V0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCInaWd4LWNoaXAtMSdcIiBbdGFiSW5kZXhdPVwiMVwiPjwvaWd4LWNoaXA+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYkluZGV4JylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdGFiSW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl90YWJJbmRleCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFiSW5kZXgoKSB7XG4gICAgICAgIGlmICh0aGlzLl90YWJJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhYkluZGV4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCA/IDAgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHN0b3JlcyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGNoaXAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgW2RhdGFdPVwieyB2YWx1ZTogJ0NvdW50cnknIH1cIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRhdGE6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGRlZmluZXMgaWYgdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBjYW4gYmUgZHJhZ2dlZCBpbiBvcmRlciB0byBjaGFuZ2UgaXQncyBwb3NpdGlvbi5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCI+PC9pZ3gtY2hpcD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkcmFnZ2FibGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgdGhlIGRyYWdnYWJsZSBlbGVtZW50IGFuaW1hdGlvbiB3aGVuIHRoZSBlbGVtZW50IGlzIHJlbGVhc2VkLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgW2FuaW1hdGVPblJlbGVhc2VdPVwiZmFsc2VcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFuaW1hdGVPblJlbGVhc2UgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZW5hYmxlcy9kaXNhYmxlcyB0aGUgaGlkaW5nIG9mIHRoZSBiYXNlIGVsZW1lbnQgdGhhdCBoYXMgYmVlbiBkcmFnZ2VkLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgW2hpZGVCYXNlT25EcmFnXT1cImZhbHNlXCI+PC9pZ3gtY2hpcD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoaWRlQmFzZU9uRHJhZyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBkZWZpbmVzIGlmIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgc2hvdWxkIHJlbmRlciByZW1vdmUgYnV0dG9uIGFuZCB0aHJvdyByZW1vdmUgZXZlbnRzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCInaWd4LWNoaXAtMSdcIiBbZHJhZ2dhYmxlXT1cInRydWVcIiBbcmVtb3ZhYmxlXT1cInRydWVcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlbW92YWJsZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGljb24gdGhhdCB0aGUgY2hpcCBhcHBsaWVzIHRvIHRoZSByZW1vdmUgYnV0dG9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCJjaGlwLmlkXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgW3JlbW92ZUljb25dPVwiaWNvblRlbXBsYXRlXCI+PC9pZ3gtY2hpcD5cbiAgICAgKiA8bmctdGVtcGxhdGUgI2ljb25UZW1wbGF0ZT48aWd4LWljb24+ZGVsZXRlPC9pZ3gtaWNvbj48L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlbW92ZUljb246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBkZWZpbmVzIGlmIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgY2FuIGJlIHNlbGVjdGVkIG9uIGNsaWNrIG9yIHRocm91Z2ggbmF2aWdhdGlvbixcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiY2hpcC5pZFwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIFtyZW1vdmFibGVdPVwidHJ1ZVwiIFtzZWxlY3RhYmxlXT1cInRydWVcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlbGVjdGFibGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpY29uIHRoYXQgdGhlIGNoaXAgYXBwbGllcyB3aGVuIGl0IGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCJjaGlwLmlkXCIgW3NlbGVjdGFibGVdPVwidHJ1ZVwiIFtzZWxlY3RJY29uXT1cImljb25UZW1wbGF0ZVwiPjwvaWd4LWNoaXA+XG4gICAgICogPG5nLXRlbXBsYXRlICNpY29uVGVtcGxhdGU+PGlneC1pY29uPmRvbmVfb3V0bGluZTwvaWd4LWljb24+PC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RJY29uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZGVmaW5lcyBpZiB0aGUgYElneENoaXBDb21wb25lbnRgIGlzIGRpc2FibGVkLiBXaGVuIGRpc2FibGVkIGl0IHJlc3RyaWN0cyB1c2VyIGludGVyYWN0aW9uc1xuICAgICAqIGxpa2UgZm9jdXNpbmcgb24gY2xpY2sgb3IgdGFiLCBzZWxlY3Rpb24gb24gY2xpY2sgb3IgU3BhY2UsIGRyYWdnaW5nLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCJjaGlwLmlkXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgc2VsZWN0ZWQgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW3NlbGVjdGFibGVdPVwidHJ1ZVwiIFtzZWxlY3RlZF09XCJ0cnVlXCI+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUd28td2F5IGRhdGEgYmluZGluZzpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtzZWxlY3RhYmxlXT1cInRydWVcIiBbKHNlbGVjdGVkKV09XCJtb2RlbC5pc1NlbGVjdGVkXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtc2VsZWN0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzZWxlY3RlZChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbihuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneENoaXBDb21wb25lbnRgIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgnbXlDaGlwJylcbiAgICAgKiBwdWJsaWMgY2hpcDogSWd4Q2hpcENvbXBvbmVudDtcbiAgICAgKiBzZWxlY3RlZENoaXAoKXtcbiAgICAgKiAgICAgbGV0IHNlbGVjdGVkQ2hpcCA9IHRoaXMuY2hpcC5zZWxlY3RlZDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgKiBUaGUgYGNvbG9yYCBwcm9wZXJ0eSBzdXBwb3J0cyBzdHJpbmcsIHJnYiwgaGV4LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtjb2xvcl09XCInI2ZmMDAwMCdcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBjb2xvcihuZXdDb2xvcikge1xuICAgICAgICB0aGlzLmNoaXBBcmVhLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gbmV3Q29sb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgYElneENoaXBDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgnbXlDaGlwJylcbiAgICAgKiBwdWJsaWMgY2hpcDogSWd4Q2hpcENvbXBvbmVudDtcbiAgICAgKiBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICAgbGV0IGNoaXBDb2xvciA9IHRoaXMuY2hpcC5jb2xvcjtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2xvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpcEFyZWEubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCBzZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSUNoaXBSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCByZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElDaGlwUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgbW92aW5nIHN0YXJ0cy5cbiAgICAgKiBSZXR1cm5zIHRoZSBtb3ZpbmcgYElneENoaXBDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChtb3ZlU3RhcnQpPVwibW92ZVN0YXJ0ZWQoJGV2ZW50KVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBtb3ZlU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElCYXNlQ2hpcEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBtb3ZpbmcgZW5kcy5cbiAgICAgKiBSZXR1cm5zIHRoZSBtb3ZlZCBgSWd4Q2hpcENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgKG1vdmVFbmQpPVwibW92ZUVuZGVkKCRldmVudClcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbW92ZUVuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDaGlwRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgYElneENoaXBDb21wb25lbnRgIGlzIHJlbW92ZWQuXG4gICAgICogUmV0dXJucyB0aGUgcmVtb3ZlZCBgSWd4Q2hpcENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJyZW1vdmUoJGV2ZW50KVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPElCYXNlQ2hpcEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBpcyBjbGlja2VkLlxuICAgICAqIFJldHVybnMgdGhlIGNsaWNrZWQgYElneENoaXBDb21wb25lbnRgLCB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgKGNsaWNrKT1cImNoaXBDbGljaygkZXZlbnQpXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNoaXBDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBDbGlja0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBpcyBzZWxlY3RlZC9kZXNlbGVjdGVkLlxuICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIGNoaXAgcmVmZXJlbmNlLCB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgY2FuY2VsZWQsIHdoYXQgaXMgdGhlIG5leHQgc2VsZWN0aW9uIHN0YXRlIGFuZFxuICAgICAqIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBpbnRlcmFjdGlvbiBgb3JpZ2luYWxFdmVudGAgaXMgcHJvdmlkZWQsIG90aGVyd2lzZSBgb3JpZ2luYWxFdmVudGAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtzZWxlY3RhYmxlXT1cInRydWVcIiAoc2VsZWN0ZWRDaGFuZ2luZyk9XCJjaGlwU2VsZWN0KCRldmVudClcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0ZWRDaGFuZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBTZWxlY3RFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBldmVudCB3aGVuIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgaXMgc2VsZWN0ZWQvZGVzZWxlY3RlZCBhbmQgYW55IHJlbGF0ZWQgYW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMgYWxzbyBlbmQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW3NlbGVjdGFibGVdPVwidHJ1ZVwiIChzZWxlY3RlZENoYW5nZWQpPVwiY2hpcFNlbGVjdEVuZCgkZXZlbnQpXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDaGlwRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgYElneENoaXBDb21wb25lbnRgIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgYmVpbmcgdXNlZC5cbiAgICAgKiBSZXR1cm5zIHRoZSBmb2N1c2VkL3NlbGVjdGVkIGBJZ3hDaGlwQ29tcG9uZW50YCwgd2hldGhlciB0aGUgZXZlbnQgc2hvdWxkIGJlIGNhbmNlbGVkLFxuICAgICAqIGlmIHRoZSBgYWx0YCwgYHNoaWZ0YCBvciBgY29udHJvbGAga2V5IGlzIHByZXNzZWQgYW5kIHRoZSBwcmVzc2VkIGtleSBuYW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChrZXlEb3duKT1cImNoaXBLZXlEb3duKCRldmVudClcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMga2V5RG93biA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBLZXlEb3duRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgYElneENoaXBDb21wb25lbnRgIGhhcyBlbnRlcmVkIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YC5cbiAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYElneENoaXBDb21wb25lbnRgLCB0aGUgZHJhZyBgSWd4Q2hpcENvbXBvbmVudGAsIGFzICB3ZWxsIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIGRyb3AgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChkcmFnRW50ZXIpPVwiY2hpcEVudGVyKCRldmVudClcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZHJhZ0VudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgaGFzIGxlZnQgdGhlIGBJZ3hDaGlwc0FyZWFDb21wb25lbnRgLlxuICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBgSWd4Q2hpcENvbXBvbmVudGAsIHRoZSBkcmFnIGBJZ3hDaGlwQ29tcG9uZW50YCwgYXMgIHdlbGwgYXNcbiAgICAgKiB0aGUgb3JpZ2luYWwgZHJvcCBldmVudCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgKGRyYWdMZWF2ZSk9XCJjaGlwTGVhdmUoJGV2ZW50KVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkcmFnTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPElDaGlwRW50ZXJEcmFnQXJlYUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBpcyBvdmVyIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YC5cbiAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYElneENoaXBDb21wb25lbnRgLCB0aGUgZHJhZyBgSWd4Q2hpcENvbXBvbmVudGAsIGFzICB3ZWxsIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIGRyb3AgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChkcmFnT3Zlcik9XCJjaGlwT3ZlcigkZXZlbnQpXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgIEBPdXRwdXQoKVxuICAgICBwdWJsaWMgZHJhZ092ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElDaGlwRW50ZXJEcmFnQXJlYUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBoYXMgYmVlbiBkcm9wcGVkIGluIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YC5cbiAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYElneENoaXBDb21wb25lbnRgLCB0aGUgZHJhZyBgSWd4Q2hpcENvbXBvbmVudGAsIGFzICB3ZWxsIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIGRyb3AgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChkcmFnRHJvcCk9XCJjaGlwTGVhdmUoJGV2ZW50KVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkcmFnRHJvcCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBFbnRlckRyYWdBcmVhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYElneERyYWdEaXJlY3RpdmVgIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgdXNlcyBmb3IgZHJhZ2dpbmcgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgW2lkXT1cImNoaXAuaWRcIiBbZHJhZ2dhYmxlXT1cInRydWVcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBvbk1vdmVTdGFydChldmVudDogSUJhc2VDaGlwRXZlbnRBcmdzKXtcbiAgICAgKiAgICAgbGV0IGRyYWdEaXJlY3RpdmUgPSBldmVudC5vd25lci5kcmFnRGlyZWN0aXZlO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdjaGlwQXJlYScsIHsgcmVhZDogSWd4RHJhZ0RpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGRyYWdEaXJlY3RpdmU6IElneERyYWdEaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY2hpcEFyZWEnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBjaGlwQXJlYTogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzZWxlY3RDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBzZWxlY3RDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFJlbW92ZUljb24nLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZGVmYXVsdFJlbW92ZUljb246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFNlbGVjdEljb24nLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZGVmYXVsdFNlbGVjdEljb246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByZW1vdmVCdXR0b25UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlSWNvbiB8fCB0aGlzLmRlZmF1bHRSZW1vdmVJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdEljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0SWNvbiB8fCB0aGlzLmRlZmF1bHRTZWxlY3RJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKCdpZ3gtY2hpcF9fZ2hvc3QnKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZUJhc2VFbGVtZW50ID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX3RhYkluZGV4ID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgX3NlbGVjdGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9zZWxlY3RlZEl0ZW1DbGFzcyA9ICdpZ3gtY2hpcF9faXRlbS0tc2VsZWN0ZWQnO1xuICAgIHByb3RlY3RlZCBfbW92ZWRXaGlsZVJlbW92aW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcmVzb3VyY2VTdHJpbmdzID0gQ3VycmVudFJlc291cmNlU3RyaW5ncy5DaGlwUmVzU3RyaW5ncztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcm90ZWN0ZWQgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucykge1xuICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBwcml2YXRlIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFt0aGlzLmdldENvbXBvbmVudERlbnNpdHlDbGFzcygnaWd4LWNoaXAnKV07XG5cbiAgICAgICAgLy8gQWRkIHRoZSBiYXNlIGNsYXNzIGZpcnN0IGZvciBlYWNoIGRlbnNpdHlcbiAgICAgICAgaWYgKCFjbGFzc2VzLmluY2x1ZGVzKCdpZ3gtY2hpcCcpKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnVuc2hpZnQoJ2lneC1jaGlwJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5kaXNhYmxlZCA/ICdpZ3gtY2hpcC0tZGlzYWJsZWQnIDogJycpO1xuXG4gICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGtleUV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHRoaXMub25DaGlwS2V5RG93bihldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RDbGFzcyhjb25kaXRpb246IGJvb2xlYW4pOiBhbnkge1xuICAgICAgICBjb25zdCBTRUxFQ1RfQ0xBU1MgPSAnaWd4LWNoaXBfX3NlbGVjdCc7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFtTRUxFQ1RfQ0xBU1NdOiBjb25kaXRpb24sXG4gICAgICAgICAgICBbYCR7U0VMRUNUX0NMQVNTfS0taGlkZGVuYF06ICFjb25kaXRpb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3RUcmFuc2l0aW9uRG9uZShldmVudCkge1xuICAgICAgICBpZiAoISFldmVudC50YXJnZXQudGFnTmFtZSkge1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBvblNlbGVjdGlvbkRvbmUgb24gd2hlbiBgd2lkdGhgIHByb3BlcnR5IGlzIGNoYW5nZWQgYW5kIHRoZSB0YXJnZXQgaXMgdmFsaWQgZWxlbWVudChub3QgY29tbWVudCkuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgY29uc3Qga2V5RG93bkFyZ3M6IElDaGlwS2V5RG93bkV2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5rZXlEb3duLmVtaXQoa2V5RG93bkFyZ3MpO1xuICAgICAgICBpZiAoa2V5RG93bkFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScgfHwgZXZlbnQua2V5ID09PSAnRGVsJykgJiYgdGhpcy5yZW1vdmFibGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlLmVtaXQoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIG93bmVyOiB0aGlzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoZXZlbnQua2V5ID09PSAnICcgfHwgZXZlbnQua2V5ID09PSAnU3BhY2ViYXInKSAmJiB0aGlzLnNlbGVjdGFibGUgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VsZWN0aW9uKCF0aGlzLnNlbGVjdGVkLCBldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQua2V5ICE9PSAnVGFiJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW1vdmVCdG5LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJyB8fCBldmVudC5rZXkgPT09ICdTcGFjZWJhcicgfHwgZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudCxcbiAgICAgICAgICAgICAgICBvd25lcjogdGhpc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblJlbW92ZU1vdXNlRG93bihldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uUmVtb3ZlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICAgICAgICBvd25lcjogdGhpc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uUmVtb3ZlVG91Y2hNb3ZlKCkge1xuICAgICAgICAvLyBXZSBkb24ndCByZW1vdmUgY2hpcCBpZiB1c2VyIHN0YXJ0aW5nIHRvdWNoIGludGVyYWN0aW5nIG9uIHRoZSByZW1vdmUgYnV0dG9uIG1vdmVzIHRoZSBjaGlwXG4gICAgICAgIHRoaXMuX21vdmVkV2hpbGVSZW1vdmluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbW92ZVRvdWNoRW5kKGV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5fbW92ZWRXaGlsZVJlbW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVtb3ZlQ2xpY2soZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21vdmVkV2hpbGVSZW1vdmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0YXJ0IGNoaXAgaWd4RHJhZyBiZWhhdmlvclxuICAgIHB1YmxpYyBvbkNoaXBEcmFnU3RhcnQoZXZlbnQ6IElEcmFnU3RhcnRFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5tb3ZlU3RhcnQuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIG93bmVyOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgICBldmVudC5jYW5jZWwgPSAhdGhpcy5kcmFnZ2FibGUgfHwgdGhpcy5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcERyYWdFbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGVPblJlbGVhc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0RpcmVjdGl2ZS50cmFuc2l0aW9uVG9PcmlnaW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwTW92ZUVuZChldmVudDogSURyYWdCYXNlRXZlbnRBcmdzKSB7XG4gICAgICAgIC8vIG1vdmVFbmQgaXMgdHJpZ2dlcmVkIGFmdGVyIHJldHVybiBhbmltYXRpb24gaGFzIGZpbmlzaGVkLiBUaGlzIGhhcHBlbiB3aGVuIHdlIGRyYWcgYW5kIHJlbGVhc2UgdGhlIGNoaXAuXG4gICAgICAgIHRoaXMubW92ZUVuZC5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgb3duZXI6IHRoaXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpcEFyZWEubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBHaG9zdENyZWF0ZSgpIHtcbiAgICAgICAgdGhpcy5oaWRlQmFzZUVsZW1lbnQgPSB0aGlzLmhpZGVCYXNlT25EcmFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwR2hvc3REZXN0cm95KCkge1xuICAgICAgICB0aGlzLmhpZGVCYXNlRWxlbWVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwRHJhZ0NsaWNrZWQoZXZlbnQ6IElEcmFnQmFzZUV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBjbGlja0V2ZW50QXJnczogSUNoaXBDbGlja0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2hpcENsaWNrLmVtaXQoY2xpY2tFdmVudEFyZ3MpO1xuXG4gICAgICAgIGlmICghY2xpY2tFdmVudEFyZ3MuY2FuY2VsICYmIHRoaXMuc2VsZWN0YWJsZSAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb24oIXRoaXMuc2VsZWN0ZWQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBFbmQgY2hpcCBpZ3hEcmFnIGJlaGF2aW9yXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdGFydCBjaGlwIGlneERyb3AgYmVoYXZpb3JcbiAgICBwdWJsaWMgb25DaGlwRHJhZ0VudGVySGFuZGxlcihldmVudDogSURyb3BCYXNlRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdEaXJlY3RpdmUgPT09IGV2ZW50LmRyYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUNoaXBFbnRlckRyYWdBcmVhRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBkcmFnQ2hpcDogZXZlbnQuZHJhZy5kYXRhPy5jaGlwLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kcmFnRW50ZXIuZW1pdChldmVudEFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwRHJhZ0xlYXZlSGFuZGxlcihldmVudDogSURyb3BCYXNlRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdEaXJlY3RpdmUgPT09IGV2ZW50LmRyYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUNoaXBFbnRlckRyYWdBcmVhRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBkcmFnQ2hpcDogZXZlbnQuZHJhZy5kYXRhPy5jaGlwLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kcmFnTGVhdmUuZW1pdChldmVudEFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwRHJvcChldmVudDogSURyb3BEcm9wcGVkRXZlbnRBcmdzKSB7XG4gICAgICAgIC8vIENhbmNlbCB0aGUgZGVmYXVsdCBkcm9wIGxvZ2ljXG4gICAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmRyYWdEaXJlY3RpdmUgPT09IGV2ZW50LmRyYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUNoaXBFbnRlckRyYWdBcmVhRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBkcmFnQ2hpcDogZXZlbnQuZHJhZy5kYXRhPy5jaGlwLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kcmFnRHJvcC5lbWl0KGV2ZW50QXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBPdmVySGFuZGxlcihldmVudDogSURyb3BCYXNlRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdEaXJlY3RpdmUgPT09IGV2ZW50LmRyYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUNoaXBFbnRlckRyYWdBcmVhRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBkcmFnQ2hpcDogZXZlbnQuZHJhZy5kYXRhPy5jaGlwLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kcmFnT3Zlci5lbWl0KGV2ZW50QXJncyk7XG4gICAgfVxuICAgIC8vIEVuZCBjaGlwIGlneERyb3AgYmVoYXZpb3JcblxuICAgIHByb3RlY3RlZCBjaGFuZ2VTZWxlY3Rpb24obmV3VmFsdWU6IGJvb2xlYW4sIHNyY0V2ZW50ID0gbnVsbCkge1xuICAgICAgICBjb25zdCBvblNlbGVjdEFyZ3M6IElDaGlwU2VsZWN0RXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogc3JjRXZlbnQsXG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICBmcm9tRXZlbnQodGhpcy5zZWxlY3RDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnKVxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyPFRyYW5zaXRpb25FdmVudD4oZXZlbnQgPT4gZXZlbnQucHJvcGVydHlOYW1lID09PSAnd2lkdGgnKSwgdGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5vblNlbGVjdFRyYW5zaXRpb25Eb25lKGV2ZW50KSk7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlICYmICF0aGlzLl9zZWxlY3RlZCkge1xuICAgICAgICAgICAgb25TZWxlY3RBcmdzLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2luZy5lbWl0KG9uU2VsZWN0QXJncyk7XG5cbiAgICAgICAgICAgIGlmICghb25TZWxlY3RBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5jaGlwQXJlYS5uYXRpdmVFbGVtZW50LCB0aGlzLl9zZWxlY3RlZEl0ZW1DbGFzcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5fc2VsZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFuZXdWYWx1ZSAmJiB0aGlzLl9zZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5naW5nLmVtaXQob25TZWxlY3RBcmdzKTtcblxuICAgICAgICAgICAgaWYgKCFvblNlbGVjdEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmNoaXBBcmVhLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX3NlbGVjdGVkSXRlbUNsYXNzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2ICNjaGlwQXJlYSBjbGFzcz1cImlneC1jaGlwX19pdGVtXCJcbiAgICBbaWd4RHJhZ109XCJ7Y2hpcDogdGhpc31cIlxuICAgIFtzdHlsZS52aXNpYmlsaXR5XT0naGlkZUJhc2VFbGVtZW50ID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiJ1xuICAgIFtnaG9zdENsYXNzXT1cImdob3N0Q2xhc3NcIlxuICAgIChkcmFnU3RhcnQpPVwib25DaGlwRHJhZ1N0YXJ0KCRldmVudClcIlxuICAgIChnaG9zdENyZWF0ZSk9XCJvbkNoaXBHaG9zdENyZWF0ZSgpXCJcbiAgICAoZ2hvc3REZXN0cm95KT1cIm9uQ2hpcEdob3N0RGVzdHJveSgpXCJcbiAgICAoZHJhZ0VuZCk9XCJvbkNoaXBEcmFnRW5kKClcIlxuICAgICh0cmFuc2l0aW9uZWQpPVwib25DaGlwTW92ZUVuZCgkZXZlbnQpXCJcbiAgICAoZHJhZ0NsaWNrKT1cIm9uQ2hpcERyYWdDbGlja2VkKCRldmVudClcIlxuICAgIGlneERyb3BcbiAgICAoZW50ZXIpPVwib25DaGlwRHJhZ0VudGVySGFuZGxlcigkZXZlbnQpXCJcbiAgICAobGVhdmUpPSBcIm9uQ2hpcERyYWdMZWF2ZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgKG92ZXIpPVwib25DaGlwT3ZlckhhbmRsZXIoJGV2ZW50KVwiXG4gICAgKGRyb3BwZWQpPVwib25DaGlwRHJvcCgkZXZlbnQpXCI+XG5cbiAgICA8ZGl2ICNzZWxlY3RDb250YWluZXIgW25nQ2xhc3NdPVwic2VsZWN0Q2xhc3Moc2VsZWN0ZWQpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RJY29uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1wcmVmaXgsW2lneFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWNoaXBfX2NvbnRlbnRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXN1ZmZpeCxbaWd4U3VmZml4XVwiPjwvbmctY29udGVudD5cblxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtY2hpcF9fcmVtb3ZlXCIgKm5nSWY9XCJyZW1vdmFibGVcIlxuICAgICAgICBbYXR0ci50YWJJbmRleF09XCJ0YWJJbmRleFwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uUmVtb3ZlQnRuS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUmVtb3ZlTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAobW91c2Vkb3duKT1cIm9uUmVtb3ZlTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAoY2xpY2spPVwib25SZW1vdmVDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKHRvdWNobW92ZSk9XCJvblJlbW92ZVRvdWNoTW92ZSgpXCJcbiAgICAgICAgKHRvdWNoZW5kKT1cIm9uUmVtb3ZlVG91Y2hFbmQoJGV2ZW50KVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVtb3ZlQnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRTZWxlY3RJY29uPlxuICAgIDxpZ3gtaWNvbiBbYXR0ci5hcmlhLWxhYmVsXT1cInJlc291cmNlU3RyaW5ncy5pZ3hfY2hpcF9zZWxlY3RcIj5kb25lPC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJlbW92ZUljb24+XG4gICAgPGlneC1pY29uIFthdHRyLmFyaWEtbGFiZWxdPVwicmVzb3VyY2VTdHJpbmdzLmlneF9jaGlwX3JlbW92ZVwiPmNhbmNlbDwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuIl19
738
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvY2hpcHMvY2hpcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvY2hpcHMvY2hpcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsTUFBTSxFQUNOLFFBQVEsRUFFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTBCLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekcsT0FBTyxFQUNILGdCQUFnQixFQUtuQixNQUFNLDZDQUE2QyxDQUFDO0FBR3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBeUI5QyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFLSCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsa0JBQWtCO0lBd0JwRDs7Ozs7OztPQU9HO0lBQ0gsSUFFVyxRQUFRLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2YsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtZQUN6QixPQUFPLElBQUks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QUFLO2dCQTBCSyxlQUFlO3NCQUR6QixLQUFLO2dCQXNCQyxTQUFTO3NCQURmLE1BQU07Z0JBYUEsT0FBTztzQkFEYixNQUFNO2dCQWFBLE1BQU07c0JBRFosTUFBTTtnQkFhQSxTQUFTO3NCQURmLE1BQU07Z0JBY0EsZ0JBQWdCO3NCQUR0QixNQUFNO2dCQVlBLGVBQWU7c0JBRHJCLE1BQU07Z0JBY0EsT0FBTztzQkFEYixNQUFNO2dCQWNBLFNBQVM7c0JBRGYsTUFBTTtnQkFjQSxTQUFTO3NCQURmLE1BQU07Z0JBY0MsUUFBUTtzQkFEZCxNQUFNO2dCQWNELFFBQVE7c0JBRGQsTUFBTTtnQkFpQkEsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFReEQsUUFBUTtzQkFEZCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFRbEQsZUFBZTtzQkFEckIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFRekQsaUJBQWlCO3NCQUR2QixTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVE1RCxpQkFBaUI7c0JBRHZCLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBd0R2RCxTQUFTO3NCQURwQixXQUFXO3VCQUFDLE9BQU87Z0JBbUJiLFFBQVE7c0JBRGQsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgSW5qZWN0LFxuICAgIE9wdGlvbmFsLFxuICAgIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4sIERpc3BsYXlEZW5zaXR5QmFzZSB9IGZyb20gJy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHtcbiAgICBJZ3hEcmFnRGlyZWN0aXZlLFxuICAgIElEcmFnQmFzZUV2ZW50QXJncyxcbiAgICBJRHJhZ1N0YXJ0RXZlbnRBcmdzLFxuICAgIElEcm9wQmFzZUV2ZW50QXJncyxcbiAgICBJRHJvcERyb3BwZWRFdmVudEFyZ3Ncbn0gZnJvbSAnLi4vZGlyZWN0aXZlcy9kcmFnLWRyb3AvZHJhZy1kcm9wLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSUNoaXBSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vY2hpcC1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ3VycmVudFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJhc2VDaGlwRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIG9yaWdpbmFsRXZlbnQ6IElEcmFnQmFzZUV2ZW50QXJncyB8IElEcm9wQmFzZUV2ZW50QXJncyB8IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudDtcbiAgICBvd25lcjogSWd4Q2hpcENvbXBvbmVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hpcENsaWNrRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDaGlwRXZlbnRBcmdzIHtcbiAgICBjYW5jZWw6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNoaXBLZXlEb3duRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDaGlwRXZlbnRBcmdzIHtcbiAgICBvcmlnaW5hbEV2ZW50OiBLZXlib2FyZEV2ZW50O1xuICAgIGNhbmNlbDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUNoaXBFdmVudEFyZ3Mge1xuICAgIGRyYWdDaGlwOiBJZ3hDaGlwQ29tcG9uZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDaGlwU2VsZWN0RXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDaGlwRXZlbnRBcmdzIHtcbiAgICBjYW5jZWw6IGJvb2xlYW47XG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbmxldCBDSElQX0lEID0gMDtcblxuLyoqXG4gKiBDaGlwIGlzIGNvbXBhY3QgdmlzdWFsIGNvbXBvbmVudCB0aGF0IGRpc3BsYXlzIGluZm9ybWF0aW9uIGluIGFuIG9icm91bmQuXG4gKlxuICogQGlneE1vZHVsZSBJZ3hDaGlwc01vZHVsZVxuICpcbiAqIEBpZ3hUaGVtZSBpZ3gtY2hpcC10aGVtZVxuICpcbiAqIEBpZ3hLZXl3b3JkcyBjaGlwXG4gKlxuICogQGlneEdyb3VwIGRpc3BsYXlcbiAqXG4gKiBAcmVtYXJrc1xuICogVGhlIElnbml0ZSBVSSBDaGlwIGNhbiBiZSB0ZW1wbGF0ZWQsIGRlbGV0ZWQsIGFuZCBzZWxlY3RlZC5cbiAqIE11bHRpcGxlIGNoaXBzIGNhbiBiZSByZW9yZGVyZWQgYW5kIHZpc3VhbGx5IGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLlxuICogQ2hpcHMgcmVzaWRlIGluIGEgY29udGFpbmVyIGNhbGxlZCBjaGlwcyBhcmVhIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIGNoaXBzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LWNoaXAgY2xhc3M9XCJjaGlwU3R5bGVcIiBbaWRdPVwiOTAxXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJjaGlwUmVtb3ZlZCgkZXZlbnQpXCI+XG4gKiAgICA8aWd4LWF2YXRhciBjbGFzcz1cImNoaXAtYXZhdGFyLXJlc2l6ZWRcIiBpZ3hQcmVmaXg+PC9pZ3gtYXZhdGFyPlxuICogPC9pZ3gtY2hpcD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1jaGlwJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NoaXAuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneENoaXBDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZhbHVlIG9mIGBpZGAgYXR0cmlidXRlLiBJZiBub3QgcHJvdmlkZWQgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCI+PC9pZ3gtY2hpcD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkID0gYGlneC1jaGlwLSR7Q0hJUF9JRCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBjaGlwLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNoaXBSb2xlID0gdGhpcy5jaGlwLnJvbGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ29wdGlvbic7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiBgdGFiaW5kZXhgIGF0dHJpYnV0ZS4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgdXNlIHRoZSBlbGVtZW50J3MgdGFiaW5kZXggaWYgc2V0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCInaWd4LWNoaXAtMSdcIiBbdGFiSW5kZXhdPVwiMVwiPjwvaWd4LWNoaXA+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYkluZGV4JylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdGFiSW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl90YWJJbmRleCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFiSW5kZXgoKSB7XG4gICAgICAgIGlmICh0aGlzLl90YWJJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhYkluZGV4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCA/IDAgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHN0b3JlcyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGNoaXAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgW2RhdGFdPVwieyB2YWx1ZTogJ0NvdW50cnknIH1cIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRhdGE6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGRlZmluZXMgaWYgdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBjYW4gYmUgZHJhZ2dlZCBpbiBvcmRlciB0byBjaGFuZ2UgaXQncyBwb3NpdGlvbi5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCI+PC9pZ3gtY2hpcD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkcmFnZ2FibGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgdGhlIGRyYWdnYWJsZSBlbGVtZW50IGFuaW1hdGlvbiB3aGVuIHRoZSBlbGVtZW50IGlzIHJlbGVhc2VkLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgW2FuaW1hdGVPblJlbGVhc2VdPVwiZmFsc2VcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFuaW1hdGVPblJlbGVhc2UgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZW5hYmxlcy9kaXNhYmxlcyB0aGUgaGlkaW5nIG9mIHRoZSBiYXNlIGVsZW1lbnQgdGhhdCBoYXMgYmVlbiBkcmFnZ2VkLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgW2hpZGVCYXNlT25EcmFnXT1cImZhbHNlXCI+PC9pZ3gtY2hpcD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoaWRlQmFzZU9uRHJhZyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBkZWZpbmVzIGlmIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgc2hvdWxkIHJlbmRlciByZW1vdmUgYnV0dG9uIGFuZCB0aHJvdyByZW1vdmUgZXZlbnRzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCInaWd4LWNoaXAtMSdcIiBbZHJhZ2dhYmxlXT1cInRydWVcIiBbcmVtb3ZhYmxlXT1cInRydWVcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlbW92YWJsZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGljb24gdGhhdCB0aGUgY2hpcCBhcHBsaWVzIHRvIHRoZSByZW1vdmUgYnV0dG9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCJjaGlwLmlkXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgW3JlbW92ZUljb25dPVwiaWNvblRlbXBsYXRlXCI+PC9pZ3gtY2hpcD5cbiAgICAgKiA8bmctdGVtcGxhdGUgI2ljb25UZW1wbGF0ZT48aWd4LWljb24+ZGVsZXRlPC9pZ3gtaWNvbj48L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlbW92ZUljb246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBkZWZpbmVzIGlmIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgY2FuIGJlIHNlbGVjdGVkIG9uIGNsaWNrIG9yIHRocm91Z2ggbmF2aWdhdGlvbixcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcCBbaWRdPVwiY2hpcC5pZFwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIFtyZW1vdmFibGVdPVwidHJ1ZVwiIFtzZWxlY3RhYmxlXT1cInRydWVcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlbGVjdGFibGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpY29uIHRoYXQgdGhlIGNoaXAgYXBwbGllcyB3aGVuIGl0IGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCJjaGlwLmlkXCIgW3NlbGVjdGFibGVdPVwidHJ1ZVwiIFtzZWxlY3RJY29uXT1cImljb25UZW1wbGF0ZVwiPjwvaWd4LWNoaXA+XG4gICAgICogPG5nLXRlbXBsYXRlICNpY29uVGVtcGxhdGU+PGlneC1pY29uPmRvbmVfb3V0bGluZTwvaWd4LWljb24+PC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RJY29uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZGVmaW5lcyBpZiB0aGUgYElneENoaXBDb21wb25lbnRgIGlzIGRpc2FibGVkLiBXaGVuIGRpc2FibGVkIGl0IHJlc3RyaWN0cyB1c2VyIGludGVyYWN0aW9uc1xuICAgICAqIGxpa2UgZm9jdXNpbmcgb24gY2xpY2sgb3IgdGFiLCBzZWxlY3Rpb24gb24gY2xpY2sgb3IgU3BhY2UsIGRyYWdnaW5nLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwIFtpZF09XCJjaGlwLmlkXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgc2VsZWN0ZWQgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW3NlbGVjdGFibGVdPVwidHJ1ZVwiIFtzZWxlY3RlZF09XCJ0cnVlXCI+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUd28td2F5IGRhdGEgYmluZGluZzpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtzZWxlY3RhYmxlXT1cInRydWVcIiBbKHNlbGVjdGVkKV09XCJtb2RlbC5pc1NlbGVjdGVkXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtc2VsZWN0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzZWxlY3RlZChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbihuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneENoaXBDb21wb25lbnRgIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgnbXlDaGlwJylcbiAgICAgKiBwdWJsaWMgY2hpcDogSWd4Q2hpcENvbXBvbmVudDtcbiAgICAgKiBzZWxlY3RlZENoaXAoKXtcbiAgICAgKiAgICAgbGV0IHNlbGVjdGVkQ2hpcCA9IHRoaXMuY2hpcC5zZWxlY3RlZDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgKiBUaGUgYGNvbG9yYCBwcm9wZXJ0eSBzdXBwb3J0cyBzdHJpbmcsIHJnYiwgaGV4LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtjb2xvcl09XCInI2ZmMDAwMCdcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBjb2xvcihuZXdDb2xvcikge1xuICAgICAgICB0aGlzLmNoaXBBcmVhLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gbmV3Q29sb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgYElneENoaXBDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgnbXlDaGlwJylcbiAgICAgKiBwdWJsaWMgY2hpcDogSWd4Q2hpcENvbXBvbmVudDtcbiAgICAgKiBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICAgbGV0IGNoaXBDb2xvciA9IHRoaXMuY2hpcC5jb2xvcjtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2xvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpcEFyZWEubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCBzZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSUNoaXBSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCByZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElDaGlwUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgbW92aW5nIHN0YXJ0cy5cbiAgICAgKiBSZXR1cm5zIHRoZSBtb3ZpbmcgYElneENoaXBDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChtb3ZlU3RhcnQpPVwibW92ZVN0YXJ0ZWQoJGV2ZW50KVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBtb3ZlU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElCYXNlQ2hpcEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBtb3ZpbmcgZW5kcy5cbiAgICAgKiBSZXR1cm5zIHRoZSBtb3ZlZCBgSWd4Q2hpcENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgKG1vdmVFbmQpPVwibW92ZUVuZGVkKCRldmVudClcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbW92ZUVuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDaGlwRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgYElneENoaXBDb21wb25lbnRgIGlzIHJlbW92ZWQuXG4gICAgICogUmV0dXJucyB0aGUgcmVtb3ZlZCBgSWd4Q2hpcENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJyZW1vdmUoJGV2ZW50KVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPElCYXNlQ2hpcEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBpcyBjbGlja2VkLlxuICAgICAqIFJldHVybnMgdGhlIGNsaWNrZWQgYElneENoaXBDb21wb25lbnRgLCB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgKGNsaWNrKT1cImNoaXBDbGljaygkZXZlbnQpXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNoaXBDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBDbGlja0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBpcyBzZWxlY3RlZC9kZXNlbGVjdGVkLlxuICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIGNoaXAgcmVmZXJlbmNlLCB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgY2FuY2VsZWQsIHdoYXQgaXMgdGhlIG5leHQgc2VsZWN0aW9uIHN0YXRlIGFuZFxuICAgICAqIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBpbnRlcmFjdGlvbiBgb3JpZ2luYWxFdmVudGAgaXMgcHJvdmlkZWQsIG90aGVyd2lzZSBgb3JpZ2luYWxFdmVudGAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtzZWxlY3RhYmxlXT1cInRydWVcIiAoc2VsZWN0ZWRDaGFuZ2luZyk9XCJjaGlwU2VsZWN0KCRldmVudClcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0ZWRDaGFuZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBTZWxlY3RFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBldmVudCB3aGVuIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgaXMgc2VsZWN0ZWQvZGVzZWxlY3RlZCBhbmQgYW55IHJlbGF0ZWQgYW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMgYWxzbyBlbmQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW3NlbGVjdGFibGVdPVwidHJ1ZVwiIChzZWxlY3RlZENoYW5nZWQpPVwiY2hpcFNlbGVjdEVuZCgkZXZlbnQpXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDaGlwRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgYElneENoaXBDb21wb25lbnRgIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgYmVpbmcgdXNlZC5cbiAgICAgKiBSZXR1cm5zIHRoZSBmb2N1c2VkL3NlbGVjdGVkIGBJZ3hDaGlwQ29tcG9uZW50YCwgd2hldGhlciB0aGUgZXZlbnQgc2hvdWxkIGJlIGNhbmNlbGVkLFxuICAgICAqIGlmIHRoZSBgYWx0YCwgYHNoaWZ0YCBvciBgY29udHJvbGAga2V5IGlzIHByZXNzZWQgYW5kIHRoZSBwcmVzc2VkIGtleSBuYW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChrZXlEb3duKT1cImNoaXBLZXlEb3duKCRldmVudClcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMga2V5RG93biA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBLZXlEb3duRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgYElneENoaXBDb21wb25lbnRgIGhhcyBlbnRlcmVkIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YC5cbiAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYElneENoaXBDb21wb25lbnRgLCB0aGUgZHJhZyBgSWd4Q2hpcENvbXBvbmVudGAsIGFzICB3ZWxsIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIGRyb3AgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChkcmFnRW50ZXIpPVwiY2hpcEVudGVyKCRldmVudClcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZHJhZ0VudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgaGFzIGxlZnQgdGhlIGBJZ3hDaGlwc0FyZWFDb21wb25lbnRgLlxuICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBgSWd4Q2hpcENvbXBvbmVudGAsIHRoZSBkcmFnIGBJZ3hDaGlwQ29tcG9uZW50YCwgYXMgIHdlbGwgYXNcbiAgICAgKiB0aGUgb3JpZ2luYWwgZHJvcCBldmVudCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgI215Q2hpcCBbaWRdPVwiJ2lneC1jaGlwLTEnXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCIgKGRyYWdMZWF2ZSk9XCJjaGlwTGVhdmUoJGV2ZW50KVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkcmFnTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPElDaGlwRW50ZXJEcmFnQXJlYUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBpcyBvdmVyIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YC5cbiAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYElneENoaXBDb21wb25lbnRgLCB0aGUgZHJhZyBgSWd4Q2hpcENvbXBvbmVudGAsIGFzICB3ZWxsIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIGRyb3AgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChkcmFnT3Zlcik9XCJjaGlwT3ZlcigkZXZlbnQpXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgIEBPdXRwdXQoKVxuICAgICBwdWJsaWMgZHJhZ092ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElDaGlwRW50ZXJEcmFnQXJlYUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBoYXMgYmVlbiBkcm9wcGVkIGluIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YC5cbiAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYElneENoaXBDb21wb25lbnRgLCB0aGUgZHJhZyBgSWd4Q2hpcENvbXBvbmVudGAsIGFzICB3ZWxsIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIGRyb3AgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwICNteUNoaXAgW2lkXT1cIidpZ3gtY2hpcC0xJ1wiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIChkcmFnRHJvcCk9XCJjaGlwTGVhdmUoJGV2ZW50KVwiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkcmFnRHJvcCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBFbnRlckRyYWdBcmVhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYElneERyYWdEaXJlY3RpdmVgIHRoZSBgSWd4Q2hpcENvbXBvbmVudGAgdXNlcyBmb3IgZHJhZ2dpbmcgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXAgW2lkXT1cImNoaXAuaWRcIiBbZHJhZ2dhYmxlXT1cInRydWVcIj48L2lneC1jaGlwPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBvbk1vdmVTdGFydChldmVudDogSUJhc2VDaGlwRXZlbnRBcmdzKXtcbiAgICAgKiAgICAgbGV0IGRyYWdEaXJlY3RpdmUgPSBldmVudC5vd25lci5kcmFnRGlyZWN0aXZlO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdjaGlwQXJlYScsIHsgcmVhZDogSWd4RHJhZ0RpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGRyYWdEaXJlY3RpdmU6IElneERyYWdEaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY2hpcEFyZWEnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBjaGlwQXJlYTogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzZWxlY3RDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBzZWxlY3RDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFJlbW92ZUljb24nLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZGVmYXVsdFJlbW92ZUljb246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFNlbGVjdEljb24nLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZGVmYXVsdFNlbGVjdEljb246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByZW1vdmVCdXR0b25UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlSWNvbiB8fCB0aGlzLmRlZmF1bHRSZW1vdmVJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdEljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0SWNvbiB8fCB0aGlzLmRlZmF1bHRTZWxlY3RJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKCdpZ3gtY2hpcF9fZ2hvc3QnKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZUJhc2VFbGVtZW50ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHByb3RlY3RlZCBfdGFiSW5kZXggPSBudWxsO1xuICAgIHByb3RlY3RlZCBfc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX3NlbGVjdGVkSXRlbUNsYXNzID0gJ2lneC1jaGlwX19pdGVtLS1zZWxlY3RlZCc7XG4gICAgcHJvdGVjdGVkIF9tb3ZlZFdoaWxlUmVtb3ZpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBDdXJyZW50UmVzb3VyY2VTdHJpbmdzLkNoaXBSZXNTdHJpbmdzO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgcmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByb3RlY3RlZCBfZGlzcGxheURlbnNpdHlPcHRpb25zOiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICAgIHByaXZhdGUgZ2V0IGhvc3RDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gW3RoaXMuZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKCdpZ3gtY2hpcCcpXTtcblxuICAgICAgICAvLyBBZGQgdGhlIGJhc2UgY2xhc3MgZmlyc3QgZm9yIGVhY2ggZGVuc2l0eVxuICAgICAgICBpZiAoIWNsYXNzZXMuaW5jbHVkZXMoJ2lneC1jaGlwJykpIHtcbiAgICAgICAgICAgIGNsYXNzZXMudW5zaGlmdCgnaWd4LWNoaXAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmRpc2FibGVkID8gJ2lneC1jaGlwLS1kaXNhYmxlZCcgOiAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMga2V5RXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkNoaXBLZXlEb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdENsYXNzKGNvbmRpdGlvbjogYm9vbGVhbik6IGFueSB7XG4gICAgICAgIGNvbnN0IFNFTEVDVF9DTEFTUyA9ICdpZ3gtY2hpcF9fc2VsZWN0JztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgW1NFTEVDVF9DTEFTU106IGNvbmRpdGlvbixcbiAgICAgICAgICAgIFtgJHtTRUxFQ1RfQ0xBU1N9LS1oaWRkZW5gXTogIWNvbmRpdGlvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBvblNlbGVjdFRyYW5zaXRpb25Eb25lKGV2ZW50KSB7XG4gICAgICAgIGlmICghIWV2ZW50LnRhcmdldC50YWdOYW1lKSB7XG4gICAgICAgICAgICAvLyBUcmlnZ2VyIG9uU2VsZWN0aW9uRG9uZSBvbiB3aGVuIGB3aWR0aGAgcHJvcGVydHkgaXMgY2hhbmdlZCBhbmQgdGhlIHRhcmdldCBpcyB2YWxpZCBlbGVtZW50KG5vdCBjb21tZW50KS5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2VkLmVtaXQoe1xuICAgICAgICAgICAgICAgIG93bmVyOiB0aGlzLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCBrZXlEb3duQXJnczogSUNoaXBLZXlEb3duRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmtleURvd24uZW1pdChrZXlEb3duQXJncyk7XG4gICAgICAgIGlmIChrZXlEb3duQXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoZXZlbnQua2V5ID09PSAnRGVsZXRlJyB8fCBldmVudC5rZXkgPT09ICdEZWwnKSAmJiB0aGlzLnJlbW92YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUuZW1pdCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICAgICAgICAgICAgb3duZXI6IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChldmVudC5rZXkgPT09ICcgJyB8fCBldmVudC5rZXkgPT09ICdTcGFjZWJhcicpICYmIHRoaXMuc2VsZWN0YWJsZSAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb24oIXRoaXMuc2VsZWN0ZWQsIGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5rZXkgIT09ICdUYWInKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbW92ZUJ0bktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyAnIHx8IGV2ZW50LmtleSA9PT0gJ1NwYWNlYmFyJyB8fCBldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlLmVtaXQoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIG93bmVyOiB0aGlzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVtb3ZlTW91c2VEb3duKGV2ZW50OiBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW1vdmVDbGljayhldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIG93bmVyOiB0aGlzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW1vdmVUb3VjaE1vdmUoKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHJlbW92ZSBjaGlwIGlmIHVzZXIgc3RhcnRpbmcgdG91Y2ggaW50ZXJhY3Rpbmcgb24gdGhlIHJlbW92ZSBidXR0b24gbW92ZXMgdGhlIGNoaXBcbiAgICAgICAgdGhpcy5fbW92ZWRXaGlsZVJlbW92aW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uUmVtb3ZlVG91Y2hFbmQoZXZlbnQ6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tb3ZlZFdoaWxlUmVtb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMub25SZW1vdmVDbGljayhldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbW92ZWRXaGlsZVJlbW92aW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU3RhcnQgY2hpcCBpZ3hEcmFnIGJlaGF2aW9yXG4gICAgcHVibGljIG9uQ2hpcERyYWdTdGFydChldmVudDogSURyYWdTdGFydEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLm1vdmVTdGFydC5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgb3duZXI6IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50LmNhbmNlbCA9ICF0aGlzLmRyYWdnYWJsZSB8fCB0aGlzLmRpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwRHJhZ0VuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZU9uUmVsZWFzZSkge1xuICAgICAgICAgICAgdGhpcy5kcmFnRGlyZWN0aXZlLnRyYW5zaXRpb25Ub09yaWdpbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBNb3ZlRW5kKGV2ZW50OiBJRHJhZ0Jhc2VFdmVudEFyZ3MpIHtcbiAgICAgICAgLy8gbW92ZUVuZCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgcmV0dXJuIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQuIFRoaXMgaGFwcGVuIHdoZW4gd2UgZHJhZyBhbmQgcmVsZWFzZSB0aGUgY2hpcC5cbiAgICAgICAgdGhpcy5tb3ZlRW5kLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICAgICAgICBvd25lcjogdGhpc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcEdob3N0Q3JlYXRlKCkge1xuICAgICAgICB0aGlzLmhpZGVCYXNlRWxlbWVudCA9IHRoaXMuaGlkZUJhc2VPbkRyYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBHaG9zdERlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuaGlkZUJhc2VFbGVtZW50ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBEcmFnQ2xpY2tlZChldmVudDogSURyYWdCYXNlRXZlbnRBcmdzKSB7XG4gICAgICAgIGNvbnN0IGNsaWNrRXZlbnRBcmdzOiBJQ2hpcENsaWNrRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jaGlwQ2xpY2suZW1pdChjbGlja0V2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKCFjbGlja0V2ZW50QXJncy5jYW5jZWwgJiYgdGhpcy5zZWxlY3RhYmxlICYmICF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbighdGhpcy5zZWxlY3RlZCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEVuZCBjaGlwIGlneERyYWcgYmVoYXZpb3JcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0YXJ0IGNoaXAgaWd4RHJvcCBiZWhhdmlvclxuICAgIHB1YmxpYyBvbkNoaXBEcmFnRW50ZXJIYW5kbGVyKGV2ZW50OiBJRHJvcEJhc2VFdmVudEFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ0RpcmVjdGl2ZSA9PT0gZXZlbnQuZHJhZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIGRyYWdDaGlwOiBldmVudC5kcmFnLmRhdGE/LmNoaXAsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYWdFbnRlci5lbWl0KGV2ZW50QXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBEcmFnTGVhdmVIYW5kbGVyKGV2ZW50OiBJRHJvcEJhc2VFdmVudEFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ0RpcmVjdGl2ZSA9PT0gZXZlbnQuZHJhZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIGRyYWdDaGlwOiBldmVudC5kcmFnLmRhdGE/LmNoaXAsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYWdMZWF2ZS5lbWl0KGV2ZW50QXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBEcm9wKGV2ZW50OiBJRHJvcERyb3BwZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgLy8gQ2FuY2VsIHRoZSBkZWZhdWx0IGRyb3AgbG9naWNcbiAgICAgICAgZXZlbnQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ0RpcmVjdGl2ZSA9PT0gZXZlbnQuZHJhZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIGRyYWdDaGlwOiBldmVudC5kcmFnLmRhdGE/LmNoaXAsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYWdEcm9wLmVtaXQoZXZlbnRBcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcE92ZXJIYW5kbGVyKGV2ZW50OiBJRHJvcEJhc2VFdmVudEFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ0RpcmVjdGl2ZSA9PT0gZXZlbnQuZHJhZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIGRyYWdDaGlwOiBldmVudC5kcmFnLmRhdGE/LmNoaXAsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYWdPdmVyLmVtaXQoZXZlbnRBcmdzKTtcbiAgICB9XG4gICAgLy8gRW5kIGNoaXAgaWd4RHJvcCBiZWhhdmlvclxuXG4gICAgcHJvdGVjdGVkIGNoYW5nZVNlbGVjdGlvbihuZXdWYWx1ZTogYm9vbGVhbiwgc3JjRXZlbnQgPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9uU2VsZWN0QXJnczogSUNoaXBTZWxlY3RFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBzcmNFdmVudCxcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLnNlbGVjdENvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbmVuZCcpXG4gICAgICAgICAgICAucGlwZShmaWx0ZXI8VHJhbnNpdGlvbkV2ZW50PihldmVudCA9PiBldmVudC5wcm9wZXJ0eU5hbWUgPT09ICd3aWR0aCcpLCB0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShldmVudCA9PiB0aGlzLm9uU2VsZWN0VHJhbnNpdGlvbkRvbmUoZXZlbnQpKTtcblxuICAgICAgICBpZiAobmV3VmFsdWUgJiYgIXRoaXMuX3NlbGVjdGVkKSB7XG4gICAgICAgICAgICBvblNlbGVjdEFyZ3Muc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5naW5nLmVtaXQob25TZWxlY3RBcmdzKTtcblxuICAgICAgICAgICAgaWYgKCFvblNlbGVjdEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmNoaXBBcmVhLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX3NlbGVjdGVkSXRlbUNsYXNzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIW5ld1ZhbHVlICYmIHRoaXMuX3NlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdpbmcuZW1pdChvblNlbGVjdEFyZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIW9uU2VsZWN0QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuY2hpcEFyZWEubmF0aXZlRWxlbWVudCwgdGhpcy5fc2VsZWN0ZWRJdGVtQ2xhc3MpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuX3NlbGVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8ZGl2ICNjaGlwQXJlYSBjbGFzcz1cImlneC1jaGlwX19pdGVtXCJcbiAgICBbaWd4RHJhZ109XCJ7Y2hpcDogdGhpc31cIlxuICAgIFtzdHlsZS52aXNpYmlsaXR5XT0naGlkZUJhc2VFbGVtZW50ID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiJ1xuICAgIFtnaG9zdENsYXNzXT1cImdob3N0Q2xhc3NcIlxuICAgIChkcmFnU3RhcnQpPVwib25DaGlwRHJhZ1N0YXJ0KCRldmVudClcIlxuICAgIChnaG9zdENyZWF0ZSk9XCJvbkNoaXBHaG9zdENyZWF0ZSgpXCJcbiAgICAoZ2hvc3REZXN0cm95KT1cIm9uQ2hpcEdob3N0RGVzdHJveSgpXCJcbiAgICAoZHJhZ0VuZCk9XCJvbkNoaXBEcmFnRW5kKClcIlxuICAgICh0cmFuc2l0aW9uZWQpPVwib25DaGlwTW92ZUVuZCgkZXZlbnQpXCJcbiAgICAoZHJhZ0NsaWNrKT1cIm9uQ2hpcERyYWdDbGlja2VkKCRldmVudClcIlxuICAgIGlneERyb3BcbiAgICAoZW50ZXIpPVwib25DaGlwRHJhZ0VudGVySGFuZGxlcigkZXZlbnQpXCJcbiAgICAobGVhdmUpPSBcIm9uQ2hpcERyYWdMZWF2ZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgKG92ZXIpPVwib25DaGlwT3ZlckhhbmRsZXIoJGV2ZW50KVwiXG4gICAgKGRyb3BwZWQpPVwib25DaGlwRHJvcCgkZXZlbnQpXCI+XG5cbiAgICA8ZGl2ICNzZWxlY3RDb250YWluZXIgW25nQ2xhc3NdPVwic2VsZWN0Q2xhc3Moc2VsZWN0ZWQpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RJY29uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1wcmVmaXgsW2lneFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWNoaXBfX2NvbnRlbnRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXN1ZmZpeCxbaWd4U3VmZml4XVwiPjwvbmctY29udGVudD5cblxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtY2hpcF9fcmVtb3ZlXCIgKm5nSWY9XCJyZW1vdmFibGVcIlxuICAgICAgICBbYXR0ci50YWJJbmRleF09XCJ0YWJJbmRleFwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uUmVtb3ZlQnRuS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUmVtb3ZlTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAobW91c2Vkb3duKT1cIm9uUmVtb3ZlTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAoY2xpY2spPVwib25SZW1vdmVDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKHRvdWNobW92ZSk9XCJvblJlbW92ZVRvdWNoTW92ZSgpXCJcbiAgICAgICAgKHRvdWNoZW5kKT1cIm9uUmVtb3ZlVG91Y2hFbmQoJGV2ZW50KVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVtb3ZlQnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRTZWxlY3RJY29uPlxuICAgIDxpZ3gtaWNvbiBbYXR0ci5hcmlhLWxhYmVsXT1cInJlc291cmNlU3RyaW5ncy5pZ3hfY2hpcF9zZWxlY3RcIj5kb25lPC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJlbW92ZUljb24+XG4gICAgPGlneC1pY29uIFthdHRyLmFyaWEtbGFiZWxdPVwicmVzb3VyY2VTdHJpbmdzLmlneF9jaGlwX3JlbW92ZVwiPmNhbmNlbDwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -127,20 +127,20 @@ export class IgxChipsAreaComponent {
127
127
  const changes = this._differ.diff(this.chipsList.toArray());
128
128
  if (changes) {
129
129
  changes.forEachAddedItem((addedChip) => {
130
- addedChip.item.moveStart.pipe(takeUntil(this.destroy$)).subscribe((args) => {
130
+ addedChip.item.moveStart.pipe(takeUntil(addedChip.item.destroy$)).subscribe((args) => {
131
131
  this.onChipMoveStart(args);
132
132
  });
133
- addedChip.item.moveEnd.pipe(takeUntil(this.destroy$)).subscribe((args) => {
133
+ addedChip.item.moveEnd.pipe(takeUntil(addedChip.item.destroy$)).subscribe((args) => {
134
134
  this.onChipMoveEnd(args);
135
135
  });
136
- addedChip.item.dragEnter.pipe(takeUntil(this.destroy$)).subscribe((args) => {
136
+ addedChip.item.dragEnter.pipe(takeUntil(addedChip.item.destroy$)).subscribe((args) => {
137
137
  this.onChipDragEnter(args);
138
138
  });
139
- addedChip.item.keyDown.pipe(takeUntil(this.destroy$)).subscribe((args) => {
139
+ addedChip.item.keyDown.pipe(takeUntil(addedChip.item.destroy$)).subscribe((args) => {
140
140
  this.onChipKeyDown(args);
141
141
  });
142
142
  if (addedChip.item.selectable) {
143
- addedChip.item.selectedChanging.pipe(takeUntil(this.destroy$)).subscribe((args) => {
143
+ addedChip.item.selectedChanging.pipe(takeUntil(addedChip.item.destroy$)).subscribe((args) => {
144
144
  this.onChipSelectionChange(args);
145
145
  });
146
146
  }
@@ -323,4 +323,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImpor
323
323
  type: HostBinding,
324
324
  args: ['class']
325
325
  }] } });
326
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMtYXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvY2hpcHMvY2hpcHMtYXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvY2hpcHMvY2hpcHMtYXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBTVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUtuQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBZXBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFvQzlCLHdCQUF3QjtJQUN4QixJQUNXLFdBQVc7UUFDbEIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFhRCx3QkFBd0I7SUFDeEIsSUFDVyxZQUFZO1FBQ25CLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBc0VELFlBQW1CLEdBQXNCLEVBQVMsT0FBbUIsRUFDekQsZ0JBQWlDO1FBRDFCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUN6RCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBOUg3Qzs7Ozs7OztXQU9HO1FBRUssU0FB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QkFBQyxpQkFBaUI7Z0JBWXhCLEtBQUs7c0JBRFgsS0FBSztnQkFLSyxXQUFXO3NCQURyQixXQUFXO3VCQUFDLGlCQUFpQjtnQkFjdkIsTUFBTTtzQkFEWixLQUFLO2dCQUtLLFlBQVk7c0JBRHRCLFdBQVc7dUJBQUMsa0JBQWtCO2dCQWV4QixPQUFPO3NCQURiLE1BQU07Z0JBY0EsZUFBZTtzQkFEckIsTUFBTTtnQkFZQSxTQUFTO3NCQURmLE1BQU07Z0JBWUEsT0FBTztzQkFEYixNQUFNO2dCQWNBLFNBQVM7c0JBRGYsZUFBZTt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBTWhELFNBQVM7c0JBRGhCLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVEaWZmZXIsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgRG9DaGVjayxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBJZ3hDaGlwQ29tcG9uZW50LFxuICAgIElDaGlwU2VsZWN0RXZlbnRBcmdzLFxuICAgIElDaGlwS2V5RG93bkV2ZW50QXJncyxcbiAgICBJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3MsXG4gICAgSUJhc2VDaGlwRXZlbnRBcmdzXG59IGZyb20gJy4vY2hpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSURyb3BCYXNlRXZlbnRBcmdzLCBJRHJhZ0Jhc2VFdmVudEFyZ3MgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2RyYWctZHJvcC9kcmFnLWRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHJlbSB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElCYXNlQ2hpcHNBcmVhRXZlbnRBcmdzIHtcbiAgICBvcmlnaW5hbEV2ZW50OiBJRHJhZ0Jhc2VFdmVudEFyZ3MgfCBJRHJvcEJhc2VFdmVudEFyZ3MgfCBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCB8IFRvdWNoRXZlbnQ7XG4gICAgb3duZXI6IElneENoaXBzQXJlYUNvbXBvbmVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hpcHNBcmVhUmVvcmRlckV2ZW50QXJncyBleHRlbmRzIElCYXNlQ2hpcHNBcmVhRXZlbnRBcmdzIHtcbiAgICBjaGlwc0FycmF5OiBJZ3hDaGlwQ29tcG9uZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNoaXBzQXJlYVNlbGVjdEV2ZW50QXJncyBleHRlbmRzIElCYXNlQ2hpcHNBcmVhRXZlbnRBcmdzIHtcbiAgICBuZXdTZWxlY3Rpb246IElneENoaXBDb21wb25lbnRbXTtcbn1cblxuLyoqXG4gKiBUaGUgY2hpcCBhcmVhIGFsbG93cyB5b3UgdG8gcGVyZm9ybSBtb3JlIGNvbXBsZXggc2NlbmFyaW9zIHdpdGggY2hpcHMgdGhhdCByZXF1aXJlIGludGVyYWN0aW9uLFxuICogbGlrZSBkcmFnZ2luZywgc2VsZWN0aW9uLCBuYXZpZ2F0aW9uLCBldGMuXG4gKlxuICogQGlneE1vZHVsZSBJZ3hDaGlwc01vZHVsZVxuICpcbiAqIEBpZ3hUaGVtZSBpZ3gtY2hpcC10aGVtZVxuICpcbiAqIEBpZ3hLZXl3b3JkcyBjaGlwIGFyZWEsIGNoaXBcbiAqXG4gKiBAaWd4R3JvdXAgZGlzcGxheVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LWNoaXBzLWFyZWE+XG4gKiAgICA8aWd4LWNoaXAgKm5nRm9yPVwibGV0IGNoaXAgb2YgY2hpcExpc3RcIiBbaWRdPVwiY2hpcC5pZFwiPlxuICogICAgICAgIDxzcGFuPnt7Y2hpcC50ZXh0fX08L3NwYW4+XG4gKiAgICA8L2lneC1jaGlwPlxuICogPC9pZ3gtY2hpcHMtYXJlYT5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1jaGlwcy1hcmVhJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NoaXBzLWFyZWEuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hDaGlwc0FyZWFDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2hpcHMgYXJlYS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjaGlwc0FyZWFSb2xlID0gdGhpcy5jaGlwc0FyZWEucm9sZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgICBwdWJsaWMgcm9sZSA9ICdsaXN0Ym94JztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUgb2YgdGhlIGNoaXBzIGFyZWEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXJpYUxhYmVsID0gdGhpcy5jaGlwc0FyZWEuYXJpYUxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICovXG4gICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxhYmVsJylcbiAgICAgcHVibGljIGFyaWFMYWJlbCA9ICdjaGlwIGFyZWEnO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgd2lkdGggb2YgdGhlIGBJZ3hDaGlwc0FyZWFDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwcy1hcmVhICNjaGlwc0FyZWEgW3dpZHRoXT1cIjMwMFwiIFtoZWlnaHRdPVwiMTBcIiAob25SZW9yZGVyKT1cImNoaXBzT3JkZXJDaGFuZ2VkKCRldmVudClcIj48L2lneC1jaGlwcy1hcmVhPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHdpZHRoOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoLnJlbScpXG4gICAgcHVibGljIGdldCBfd2lkdGhUb1JlbSgpIHtcbiAgICAgICAgcmV0dXJuIHJlbSh0aGlzLndpZHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGBJZ3hDaGlwc0FyZWFDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwcy1hcmVhICNjaGlwc0FyZWEgW3dpZHRoXT1cIjMwMFwiIFtoZWlnaHRdPVwiMTBcIiAob25SZW9yZGVyKT1cImNoaXBzT3JkZXJDaGFuZ2VkKCRldmVudClcIj48L2lneC1jaGlwcy1hcmVhPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQucmVtJylcbiAgICBwdWJsaWMgZ2V0IF9oZWlnaHRUb1JlbSgpIHtcbiAgICAgICAgcmV0dXJuIHJlbSh0aGlzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiBgSWd4Q2hpcENvbXBvbmVudGBzIGluIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YCBzaG91bGQgYmUgcmVvcmRlcmVkLlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYElneENoaXBDb21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcHMtYXJlYSAjY2hpcHNBcmVhIFt3aWR0aF09XCInMzAwJ1wiIFtoZWlnaHRdPVwiJzEwJ1wiIChvblJlb3JkZXIpPVwiY2hhbmdlZE9yZGVyKCRldmVudClcIj48L2lneC1jaGlwcy1hcmVhPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZW9yZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hpcHNBcmVhUmVvcmRlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYW4gYElneENoaXBDb21wb25lbnRgIGluIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YCBpcyBzZWxlY3RlZC9kZXNlbGVjdGVkLlxuICAgICAqIEZpcmVkIGFmdGVyIHRoZSBjaGlwcyBhcmVhIGlzIGluaXRpYWxpemVkIGlmIHRoZXJlIGFyZSBpbml0aWFsbHkgc2VsZWN0ZWQgY2hpcHMgYXMgd2VsbC5cbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNlbGVjdGVkIGBJZ3hDaGlwQ29tcG9uZW50YHMgYW5kIHRoZSBgSWd4Q2hpcEFyZWFDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwcy1hcmVhICNjaGlwc0FyZWEgW3dpZHRoXT1cIiczMDAnXCIgW2hlaWdodF09XCInMTAnXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb24oJGV2ZW50KVwiPjwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBzQXJlYVNlbGVjdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYW4gYElneENoaXBDb21wb25lbnRgIGluIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YCBpcyBtb3ZlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcHMtYXJlYSAjY2hpcHNBcmVhIFt3aWR0aF09XCInMzAwJ1wiIFtoZWlnaHRdPVwiJzEwJ1wiIChtb3ZlU3RhcnQpPVwibW92ZVN0YXJ0KCRldmVudClcIj48L2lneC1jaGlwcy1hcmVhPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBtb3ZlU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElCYXNlQ2hpcHNBcmVhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYWZ0ZXIgYW4gYElneENoaXBDb21wb25lbnRgIGluIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YCBpcyBtb3ZlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hpcHMtYXJlYSAjY2hpcHNBcmVhIFt3aWR0aF09XCInMzAwJ1wiIFtoZWlnaHRdPVwiJzEwJ1wiIChtb3ZlRW5kKT1cIm1vdmVFbmQoJGV2ZW50KVwiPjwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG1vdmVFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElCYXNlQ2hpcHNBcmVhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogSG9sZHMgdGhlIGBJZ3hDaGlwQ29tcG9uZW50YCBpbiB0aGUgYElneENoaXBzQXJlYUNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgY2hpcHMgPSB0aGlzLmNoaXBzQXJlYS5jaGlwc0xpc3Q7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Q2hpcENvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHB1YmxpYyBjaGlwc0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hDaGlwQ29tcG9uZW50PjtcblxuICAgIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBwcml2YXRlIGhvc3RDbGFzcyA9ICdpZ3gtY2hpcC1hcmVhJztcblxuICAgIHByaXZhdGUgbW9kaWZpZWRDaGlwc0FycmF5OiBJZ3hDaGlwQ29tcG9uZW50W107XG4gICAgcHJpdmF0ZSBfZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxJZ3hDaGlwQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIF9pdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xuICAgICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9pdGVyYWJsZURpZmZlcnMuZmluZChbXSkuY3JlYXRlKG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGluaXRpYWxseSBzZWxlY3RlZCBjaGlwcyB0aHJvdWdoIHRoZWlyIGlucHV0cywgd2UgbmVlZCB0byBnZXQgdGhlbSwgYmVjYXVzZSB3ZSBjYW5ub3QgbGlzdGVuIHRvIHRoZWlyIGV2ZW50cyB5ZXQuXG4gICAgICAgIGlmICh0aGlzLmNoaXBzTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2hpcHMgPSB0aGlzLmNoaXBzTGlzdC5maWx0ZXIoKGl0ZW06IElneENoaXBDb21wb25lbnQpID0+IGl0ZW0uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hpcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvbjogc2VsZWN0ZWRDaGlwcyxcbiAgICAgICAgICAgICAgICAgICAgb3duZXI6IHRoaXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jaGlwc0xpc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLmNoaXBzTGlzdC50b0FycmF5KCkpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKGFkZGVkQ2hpcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhZGRlZENoaXAuaXRlbS5tb3ZlU3RhcnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoaXBNb3ZlU3RhcnQoYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhZGRlZENoaXAuaXRlbS5tb3ZlRW5kLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGlwTW92ZUVuZChhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGFkZGVkQ2hpcC5pdGVtLmRyYWdFbnRlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hpcERyYWdFbnRlcihhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGFkZGVkQ2hpcC5pdGVtLmtleURvd24ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoaXBLZXlEb3duKGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGVkQ2hpcC5pdGVtLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkQ2hpcC5pdGVtLnNlbGVjdGVkQ2hhbmdpbmcucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGlwU2VsZWN0aW9uQ2hhbmdlKGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWVkQ2hpcHNBcnJheSA9IHRoaXMuY2hpcHNMaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25DaGlwS2V5RG93bihldmVudDogSUNoaXBLZXlEb3duRXZlbnRBcmdzKSB7XG4gICAgICAgIGxldCBvcmRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY2hpcHNBcnJheSA9IHRoaXMuY2hpcHNMaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgZHJhZ0NoaXBJbmRleCA9IGNoaXBzQXJyYXkuZmluZEluZGV4KChlbCkgPT4gZWwgPT09IGV2ZW50Lm93bmVyKTtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQuc2hpZnRLZXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQub3JpZ2luYWxFdmVudC5rZXkgPT09ICdMZWZ0Jykge1xuICAgICAgICAgICAgICAgIG9yZGVyQ2hhbmdlZCA9IHRoaXMucG9zaXRpb25DaGlwQXRJbmRleChkcmFnQ2hpcEluZGV4LCBkcmFnQ2hpcEluZGV4IC0gMSwgZmFsc2UsIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChvcmRlckNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaXBzTGlzdC5nZXQoZHJhZ0NoaXBJbmRleCAtIDEpLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5vcmlnaW5hbEV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGV2ZW50Lm9yaWdpbmFsRXZlbnQua2V5ID09PSAnUmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgb3JkZXJDaGFuZ2VkID0gdGhpcy5wb3NpdGlvbkNoaXBBdEluZGV4KGRyYWdDaGlwSW5kZXgsIGRyYWdDaGlwSW5kZXggKyAxLCB0cnVlLCBldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICgoZXZlbnQub3JpZ2luYWxFdmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50Lm9yaWdpbmFsRXZlbnQua2V5ID09PSAnTGVmdCcpICYmIGRyYWdDaGlwSW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgY2hpcHNBcnJheVtkcmFnQ2hpcEluZGV4IC0gMV0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQub3JpZ2luYWxFdmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldmVudC5vcmlnaW5hbEV2ZW50LmtleSA9PT0gJ1JpZ2h0JykgJiZcbiAgICAgICAgICAgICAgICBkcmFnQ2hpcEluZGV4IDwgY2hpcHNBcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY2hpcHNBcnJheVtkcmFnQ2hpcEluZGV4ICsgMV0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvbkNoaXBNb3ZlU3RhcnQoZXZlbnQ6IElCYXNlQ2hpcEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLm1vdmVTdGFydC5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgICBvd25lcjogdGhpc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uQ2hpcE1vdmVFbmQoZXZlbnQ6IElCYXNlQ2hpcEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLm1vdmVFbmQuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50LFxuICAgICAgICAgICAgb3duZXI6IHRoaXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvbkNoaXBEcmFnRW50ZXIoZXZlbnQ6IElDaGlwRW50ZXJEcmFnQXJlYUV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBkcm9wQ2hpcEluZGV4ID0gdGhpcy5jaGlwc0xpc3QudG9BcnJheSgpLmZpbmRJbmRleCgoZWwpID0+IGVsID09PSBldmVudC5vd25lcik7XG4gICAgICAgIGNvbnN0IGRyYWdDaGlwSW5kZXggPSB0aGlzLmNoaXBzTGlzdC50b0FycmF5KCkuZmluZEluZGV4KChlbCkgPT4gZWwgPT09IGV2ZW50LmRyYWdDaGlwKTtcbiAgICAgICAgaWYgKGRyYWdDaGlwSW5kZXggPCBkcm9wQ2hpcEluZGV4KSB7XG4gICAgICAgICAgICAvLyBmcm9tIHRoZSBsZWZ0IHRvIHJpZ2h0XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uQ2hpcEF0SW5kZXgoZHJhZ0NoaXBJbmRleCwgZHJvcENoaXBJbmRleCwgdHJ1ZSwgZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmcm9tIHRoZSByaWdodCB0byBsZWZ0XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uQ2hpcEF0SW5kZXgoZHJhZ0NoaXBJbmRleCwgZHJvcENoaXBJbmRleCwgZmFsc2UsIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwb3NpdGlvbkNoaXBBdEluZGV4KGNoaXBJbmRleCwgdGFyZ2V0SW5kZXgsIHNoaWZ0UmVzdExlZnQsIG9yaWdpbmFsRXZlbnQpIHtcbiAgICAgICAgaWYgKGNoaXBJbmRleCA8IDAgfHwgdGhpcy5jaGlwc0xpc3QubGVuZ3RoIDw9IGNoaXBJbmRleCB8fFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPCAwIHx8IHRoaXMuY2hpcHNMaXN0Lmxlbmd0aCA8PSB0YXJnZXRJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpcHNBcnJheSA9IHRoaXMuY2hpcHNMaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJZ3hDaGlwQ29tcG9uZW50W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlwc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc2hpZnRSZXN0TGVmdCkge1xuICAgICAgICAgICAgICAgIGlmIChjaGlwSW5kZXggPD0gaSAmJiBpIDwgdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpcHNBcnJheVtpICsgMV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpcHNBcnJheVtjaGlwSW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlwc0FycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IGkgJiYgaSA8PSBjaGlwSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpcHNBcnJheVtpIC0gMV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpcHNBcnJheVtjaGlwSW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlwc0FycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RpZmllZENoaXBzQXJyYXkgPSByZXN1bHQ7XG5cbiAgICAgICAgY29uc3QgZXZlbnREYXRhOiBJQ2hpcHNBcmVhUmVvcmRlckV2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIGNoaXBzQXJyYXk6IHRoaXMubW9kaWZpZWRDaGlwc0FycmF5LFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudCxcbiAgICAgICAgICAgIG93bmVyOiB0aGlzXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucmVvcmRlci5lbWl0KGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25DaGlwU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBJQ2hpcFNlbGVjdEV2ZW50QXJncykge1xuICAgICAgICBsZXQgc2VsZWN0ZWRDaGlwcyA9IHRoaXMuY2hpcHNMaXN0LmZpbHRlcigoY2hpcCkgPT4gY2hpcC5zZWxlY3RlZCk7XG4gICAgICAgIGlmIChldmVudC5zZWxlY3RlZCAmJiAhc2VsZWN0ZWRDaGlwcy5pbmNsdWRlcyhldmVudC5vd25lcikpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkQ2hpcHMucHVzaChldmVudC5vd25lcik7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV2ZW50LnNlbGVjdGVkICYmIHNlbGVjdGVkQ2hpcHMuaW5jbHVkZXMoZXZlbnQub3duZXIpKSB7XG4gICAgICAgICAgICBzZWxlY3RlZENoaXBzID0gc2VsZWN0ZWRDaGlwcy5maWx0ZXIoKGNoaXApID0+IGNoaXAuaWQgIT09IGV2ZW50Lm93bmVyLmlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgICBuZXdTZWxlY3Rpb246IHNlbGVjdGVkQ2hpcHMsXG4gICAgICAgICAgICBvd25lcjogdGhpc1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMtYXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvY2hpcHMvY2hpcHMtYXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvY2hpcHMvY2hpcHMtYXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBTVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUtuQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBZXBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFvQzlCLHdCQUF3QjtJQUN4QixJQUNXLFdBQVc7UUFDbEIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFhRCx3QkFBd0I7SUFDeEIsSUFDVyxZQUFZO1FBQ25CLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBc0VELFlBQW1CLEdBQXNCLEVBQVMsT0FBbUIsRUFDekQsZ0JBQWlDO1FBRDFCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUN6RCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBOUg3Qzs7Ozs7OztXQU9HO1FBRUssU0FB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QUFJO3NCQURWLFdBQVc7dUJBQUMsV0FBVztnQkFhakIsU0FBUztzQkFEZixXQUFXO3VCQUFDLGlCQUFpQjtnQkFZeEIsS0FBSztzQkFEWCxLQUFLO2dCQUtLLFdBQVc7c0JBRHJCLFdBQVc7dUJBQUMsaUJBQWlCO2dCQWN2QixNQUFNO3NCQURaLEtBQUs7Z0JBS0ssWUFBWTtzQkFEdEIsV0FBVzt1QkFBQyxrQkFBa0I7Z0JBZXhCLE9BQU87c0JBRGIsTUFBTTtnQkFjQSxlQUFlO3NCQURyQixNQUFNO2dCQVlBLFNBQVM7c0JBRGYsTUFBTTtnQkFZQSxPQUFPO3NCQURiLE1BQU07Z0JBY0EsU0FBUztzQkFEZixlQUFlO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFNaEQsU0FBUztzQkFEaEIsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBJdGVyYWJsZURpZmZlcixcbiAgICBJdGVyYWJsZURpZmZlcnMsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBEb0NoZWNrLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgT25EZXN0cm95LFxuICAgIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIElneENoaXBDb21wb25lbnQsXG4gICAgSUNoaXBTZWxlY3RFdmVudEFyZ3MsXG4gICAgSUNoaXBLZXlEb3duRXZlbnRBcmdzLFxuICAgIElDaGlwRW50ZXJEcmFnQXJlYUV2ZW50QXJncyxcbiAgICBJQmFzZUNoaXBFdmVudEFyZ3Ncbn0gZnJvbSAnLi9jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJRHJvcEJhc2VFdmVudEFyZ3MsIElEcmFnQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZHJhZy1kcm9wL2RyYWctZHJvcC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgcmVtIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJhc2VDaGlwc0FyZWFFdmVudEFyZ3Mge1xuICAgIG9yaWdpbmFsRXZlbnQ6IElEcmFnQmFzZUV2ZW50QXJncyB8IElEcm9wQmFzZUV2ZW50QXJncyB8IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudDtcbiAgICBvd25lcjogSWd4Q2hpcHNBcmVhQ29tcG9uZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDaGlwc0FyZWFSZW9yZGVyRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDaGlwc0FyZWFFdmVudEFyZ3Mge1xuICAgIGNoaXBzQXJyYXk6IElneENoaXBDb21wb25lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hpcHNBcmVhU2VsZWN0RXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDaGlwc0FyZWFFdmVudEFyZ3Mge1xuICAgIG5ld1NlbGVjdGlvbjogSWd4Q2hpcENvbXBvbmVudFtdO1xufVxuXG4vKipcbiAqIFRoZSBjaGlwIGFyZWEgYWxsb3dzIHlvdSB0byBwZXJmb3JtIG1vcmUgY29tcGxleCBzY2VuYXJpb3Mgd2l0aCBjaGlwcyB0aGF0IHJlcXVpcmUgaW50ZXJhY3Rpb24sXG4gKiBsaWtlIGRyYWdnaW5nLCBzZWxlY3Rpb24sIG5hdmlnYXRpb24sIGV0Yy5cbiAqXG4gKiBAaWd4TW9kdWxlIElneENoaXBzTW9kdWxlXG4gKlxuICogQGlneFRoZW1lIGlneC1jaGlwLXRoZW1lXG4gKlxuICogQGlneEtleXdvcmRzIGNoaXAgYXJlYSwgY2hpcFxuICpcbiAqIEBpZ3hHcm91cCBkaXNwbGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtY2hpcHMtYXJlYT5cbiAqICAgIDxpZ3gtY2hpcCAqbmdGb3I9XCJsZXQgY2hpcCBvZiBjaGlwTGlzdFwiIFtpZF09XCJjaGlwLmlkXCI+XG4gKiAgICAgICAgPHNwYW4+e3tjaGlwLnRleHR9fTwvc3Bhbj5cbiAqICAgIDwvaWd4LWNoaXA+XG4gKiA8L2lneC1jaGlwcy1hcmVhPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWNoaXBzLWFyZWEnLFxuICAgIHRlbXBsYXRlVXJsOiAnY2hpcHMtYXJlYS5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIElneENoaXBzQXJlYUNvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBjaGlwcyBhcmVhLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNoaXBzQXJlYVJvbGUgPSB0aGlzLmNoaXBzQXJlYS5yb2xlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgIHB1YmxpYyByb2xlID0gJ2xpc3Rib3gnO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSBvZiB0aGUgY2hpcHMgYXJlYS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBhcmlhTGFiZWwgPSB0aGlzLmNoaXBzQXJlYS5hcmlhTGFiZWw7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKi9cbiAgICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGFiZWwnKVxuICAgICBwdWJsaWMgYXJpYUxhYmVsID0gJ2NoaXAgYXJlYSc7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgYElneENoaXBzQXJlYUNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXBzLWFyZWEgI2NoaXBzQXJlYSBbd2lkdGhdPVwiMzAwXCIgW2hlaWdodF09XCIxMFwiIChvblJlb3JkZXIpPVwiY2hpcHNPcmRlckNoYW5nZWQoJGV2ZW50KVwiPjwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2lkdGg6IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgucmVtJylcbiAgICBwdWJsaWMgZ2V0IF93aWR0aFRvUmVtKCkge1xuICAgICAgICByZXR1cm4gcmVtKHRoaXMud2lkdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGhlaWdodCBvZiB0aGUgYElneENoaXBzQXJlYUNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXBzLWFyZWEgI2NoaXBzQXJlYSBbd2lkdGhdPVwiMzAwXCIgW2hlaWdodF09XCIxMFwiIChvblJlb3JkZXIpPVwiY2hpcHNPcmRlckNoYW5nZWQoJGV2ZW50KVwiPjwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmhlaWdodC5yZW0nKVxuICAgIHB1YmxpYyBnZXQgX2hlaWdodFRvUmVtKCkge1xuICAgICAgICByZXR1cm4gcmVtKHRoaXMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIGBJZ3hDaGlwQ29tcG9uZW50YHMgaW4gdGhlIGBJZ3hDaGlwc0FyZWFDb21wb25lbnRgIHNob3VsZCBiZSByZW9yZGVyZWQuXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBgSWd4Q2hpcENvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwcy1hcmVhICNjaGlwc0FyZWEgW3dpZHRoXT1cIiczMDAnXCIgW2hlaWdodF09XCInMTAnXCIgKG9uUmVvcmRlcik9XCJjaGFuZ2VkT3JkZXIoJGV2ZW50KVwiPjwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlb3JkZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElDaGlwc0FyZWFSZW9yZGVyRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiBhbiBgSWd4Q2hpcENvbXBvbmVudGAgaW4gdGhlIGBJZ3hDaGlwc0FyZWFDb21wb25lbnRgIGlzIHNlbGVjdGVkL2Rlc2VsZWN0ZWQuXG4gICAgICogRmlyZWQgYWZ0ZXIgdGhlIGNoaXBzIGFyZWEgaXMgaW5pdGlhbGl6ZWQgaWYgdGhlcmUgYXJlIGluaXRpYWxseSBzZWxlY3RlZCBjaGlwcyBhcyB3ZWxsLlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc2VsZWN0ZWQgYElneENoaXBDb21wb25lbnRgcyBhbmQgdGhlIGBJZ3hDaGlwQXJlYUNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoaXBzLWFyZWEgI2NoaXBzQXJlYSBbd2lkdGhdPVwiJzMwMCdcIiBbaGVpZ2h0XT1cIicxMCdcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdGlvbigkZXZlbnQpXCI+PC9pZ3gtY2hpcHMtYXJlYT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hpcHNBcmVhU2VsZWN0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiBhbiBgSWd4Q2hpcENvbXBvbmVudGAgaW4gdGhlIGBJZ3hDaGlwc0FyZWFDb21wb25lbnRgIGlzIG1vdmVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwcy1hcmVhICNjaGlwc0FyZWEgW3dpZHRoXT1cIiczMDAnXCIgW2hlaWdodF09XCInMTAnXCIgKG1vdmVTdGFydCk9XCJtb3ZlU3RhcnQoJGV2ZW50KVwiPjwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG1vdmVTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDaGlwc0FyZWFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCBhZnRlciBhbiBgSWd4Q2hpcENvbXBvbmVudGAgaW4gdGhlIGBJZ3hDaGlwc0FyZWFDb21wb25lbnRgIGlzIG1vdmVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGlwcy1hcmVhICNjaGlwc0FyZWEgW3dpZHRoXT1cIiczMDAnXCIgW2hlaWdodF09XCInMTAnXCIgKG1vdmVFbmQpPVwibW92ZUVuZCgkZXZlbnQpXCI+PC9pZ3gtY2hpcHMtYXJlYT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbW92ZUVuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDaGlwc0FyZWFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBIb2xkcyB0aGUgYElneENoaXBDb21wb25lbnRgIGluIHRoZSBgSWd4Q2hpcHNBcmVhQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBjaGlwcyA9IHRoaXMuY2hpcHNBcmVhLmNoaXBzTGlzdDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hDaGlwQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIGNoaXBzTGlzdDogUXVlcnlMaXN0PElneENoaXBDb21wb25lbnQ+O1xuXG4gICAgcHJvdGVjdGVkIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICAgIHByaXZhdGUgaG9zdENsYXNzID0gJ2lneC1jaGlwLWFyZWEnO1xuXG4gICAgcHJpdmF0ZSBtb2RpZmllZENoaXBzQXJyYXk6IElneENoaXBDb21wb25lbnRbXTtcbiAgICBwcml2YXRlIF9kaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPElneENoaXBDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgX2l0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzKSB7XG4gICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgaW5pdGlhbGx5IHNlbGVjdGVkIGNoaXBzIHRocm91Z2ggdGhlaXIgaW5wdXRzLCB3ZSBuZWVkIHRvIGdldCB0aGVtLCBiZWNhdXNlIHdlIGNhbm5vdCBsaXN0ZW4gdG8gdGhlaXIgZXZlbnRzIHlldC5cbiAgICAgICAgaWYgKHRoaXMuY2hpcHNMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDaGlwcyA9IHRoaXMuY2hpcHNMaXN0LmZpbHRlcigoaXRlbTogSWd4Q2hpcENvbXBvbmVudCkgPT4gaXRlbS5zZWxlY3RlZCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRDaGlwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uOiBzZWxlY3RlZENoaXBzLFxuICAgICAgICAgICAgICAgICAgICBvd25lcjogdGhpc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNoaXBzTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuY2hpcHNMaXN0LnRvQXJyYXkoKSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgoYWRkZWRDaGlwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFkZGVkQ2hpcC5pdGVtLm1vdmVTdGFydC5waXBlKHRha2VVbnRpbChhZGRlZENoaXAuaXRlbS5kZXN0cm95JCkpLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoaXBNb3ZlU3RhcnQoYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhZGRlZENoaXAuaXRlbS5tb3ZlRW5kLnBpcGUodGFrZVVudGlsKGFkZGVkQ2hpcC5pdGVtLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hpcE1vdmVFbmQoYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhZGRlZENoaXAuaXRlbS5kcmFnRW50ZXIucGlwZSh0YWtlVW50aWwoYWRkZWRDaGlwLml0ZW0uZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGlwRHJhZ0VudGVyKGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkZWRDaGlwLml0ZW0ua2V5RG93bi5waXBlKHRha2VVbnRpbChhZGRlZENoaXAuaXRlbS5kZXN0cm95JCkpLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoaXBLZXlEb3duKGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGVkQ2hpcC5pdGVtLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkQ2hpcC5pdGVtLnNlbGVjdGVkQ2hhbmdpbmcucGlwZSh0YWtlVW50aWwoYWRkZWRDaGlwLml0ZW0uZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hpcFNlbGVjdGlvbkNoYW5nZShhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZmllZENoaXBzQXJyYXkgPSB0aGlzLmNoaXBzTGlzdC50b0FycmF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uQ2hpcEtleURvd24oZXZlbnQ6IElDaGlwS2V5RG93bkV2ZW50QXJncykge1xuICAgICAgICBsZXQgb3JkZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNoaXBzQXJyYXkgPSB0aGlzLmNoaXBzTGlzdC50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IGRyYWdDaGlwSW5kZXggPSBjaGlwc0FycmF5LmZpbmRJbmRleCgoZWwpID0+IGVsID09PSBldmVudC5vd25lcik7XG4gICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQub3JpZ2luYWxFdmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50Lm9yaWdpbmFsRXZlbnQua2V5ID09PSAnTGVmdCcpIHtcbiAgICAgICAgICAgICAgICBvcmRlckNoYW5nZWQgPSB0aGlzLnBvc2l0aW9uQ2hpcEF0SW5kZXgoZHJhZ0NoaXBJbmRleCwgZHJhZ0NoaXBJbmRleCAtIDEsIGZhbHNlLCBldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgICAgICAgICBpZiAob3JkZXJDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlwc0xpc3QuZ2V0KGRyYWdDaGlwSW5kZXggLSAxKS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQub3JpZ2luYWxFdmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldmVudC5vcmlnaW5hbEV2ZW50LmtleSA9PT0gJ1JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIG9yZGVyQ2hhbmdlZCA9IHRoaXMucG9zaXRpb25DaGlwQXRJbmRleChkcmFnQ2hpcEluZGV4LCBkcmFnQ2hpcEluZGV4ICsgMSwgdHJ1ZSwgZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoKGV2ZW50Lm9yaWdpbmFsRXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBldmVudC5vcmlnaW5hbEV2ZW50LmtleSA9PT0gJ0xlZnQnKSAmJiBkcmFnQ2hpcEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIGNoaXBzQXJyYXlbZHJhZ0NoaXBJbmRleCAtIDFdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50Lm9yaWdpbmFsRXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQub3JpZ2luYWxFdmVudC5rZXkgPT09ICdSaWdodCcpICYmXG4gICAgICAgICAgICAgICAgZHJhZ0NoaXBJbmRleCA8IGNoaXBzQXJyYXkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGNoaXBzQXJyYXlbZHJhZ0NoaXBJbmRleCArIDFdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25DaGlwTW92ZVN0YXJ0KGV2ZW50OiBJQmFzZUNoaXBFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5tb3ZlU3RhcnQuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50LFxuICAgICAgICAgICAgb3duZXI6IHRoaXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvbkNoaXBNb3ZlRW5kKGV2ZW50OiBJQmFzZUNoaXBFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5tb3ZlRW5kLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudCxcbiAgICAgICAgICAgIG93bmVyOiB0aGlzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25DaGlwRHJhZ0VudGVyKGV2ZW50OiBJQ2hpcEVudGVyRHJhZ0FyZWFFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgZHJvcENoaXBJbmRleCA9IHRoaXMuY2hpcHNMaXN0LnRvQXJyYXkoKS5maW5kSW5kZXgoKGVsKSA9PiBlbCA9PT0gZXZlbnQub3duZXIpO1xuICAgICAgICBjb25zdCBkcmFnQ2hpcEluZGV4ID0gdGhpcy5jaGlwc0xpc3QudG9BcnJheSgpLmZpbmRJbmRleCgoZWwpID0+IGVsID09PSBldmVudC5kcmFnQ2hpcCk7XG4gICAgICAgIGlmIChkcmFnQ2hpcEluZGV4IDwgZHJvcENoaXBJbmRleCkge1xuICAgICAgICAgICAgLy8gZnJvbSB0aGUgbGVmdCB0byByaWdodFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkNoaXBBdEluZGV4KGRyYWdDaGlwSW5kZXgsIGRyb3BDaGlwSW5kZXgsIHRydWUsIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZnJvbSB0aGUgcmlnaHQgdG8gbGVmdFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkNoaXBBdEluZGV4KGRyYWdDaGlwSW5kZXgsIGRyb3BDaGlwSW5kZXgsIGZhbHNlLCBldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcG9zaXRpb25DaGlwQXRJbmRleChjaGlwSW5kZXgsIHRhcmdldEluZGV4LCBzaGlmdFJlc3RMZWZ0LCBvcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgIGlmIChjaGlwSW5kZXggPCAwIHx8IHRoaXMuY2hpcHNMaXN0Lmxlbmd0aCA8PSBjaGlwSW5kZXggfHxcbiAgICAgICAgICAgIHRhcmdldEluZGV4IDwgMCB8fCB0aGlzLmNoaXBzTGlzdC5sZW5ndGggPD0gdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaXBzQXJyYXkgPSB0aGlzLmNoaXBzTGlzdC50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogSWd4Q2hpcENvbXBvbmVudFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpcHNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNoaWZ0UmVzdExlZnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpcEluZGV4IDw9IGkgJiYgaSA8IHRhcmdldEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaXBzQXJyYXlbaSArIDFdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IHRhcmdldEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaXBzQXJyYXlbY2hpcEluZGV4XSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpcHNBcnJheVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCBpICYmIGkgPD0gY2hpcEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaXBzQXJyYXlbaSAtIDFdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IHRhcmdldEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaXBzQXJyYXlbY2hpcEluZGV4XSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpcHNBcnJheVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kaWZpZWRDaGlwc0FycmF5ID0gcmVzdWx0O1xuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YTogSUNoaXBzQXJlYVJlb3JkZXJFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBjaGlwc0FycmF5OiB0aGlzLm1vZGlmaWVkQ2hpcHNBcnJheSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgICBvd25lcjogdGhpc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJlb3JkZXIuZW1pdChldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uQ2hpcFNlbGVjdGlvbkNoYW5nZShldmVudDogSUNoaXBTZWxlY3RFdmVudEFyZ3MpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkQ2hpcHMgPSB0aGlzLmNoaXBzTGlzdC5maWx0ZXIoKGNoaXApID0+IGNoaXAuc2VsZWN0ZWQpO1xuICAgICAgICBpZiAoZXZlbnQuc2VsZWN0ZWQgJiYgIXNlbGVjdGVkQ2hpcHMuaW5jbHVkZXMoZXZlbnQub3duZXIpKSB7XG4gICAgICAgICAgICBzZWxlY3RlZENoaXBzLnB1c2goZXZlbnQub3duZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKCFldmVudC5zZWxlY3RlZCAmJiBzZWxlY3RlZENoaXBzLmluY2x1ZGVzKGV2ZW50Lm93bmVyKSkge1xuICAgICAgICAgICAgc2VsZWN0ZWRDaGlwcyA9IHNlbGVjdGVkQ2hpcHMuZmlsdGVyKChjaGlwKSA9PiBjaGlwLmlkICE9PSBldmVudC5vd25lci5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50LFxuICAgICAgICAgICAgbmV3U2VsZWN0aW9uOiBzZWxlY3RlZENoaXBzLFxuICAgICAgICAgICAgb3duZXI6IHRoaXNcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19