@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
130 lines • 17.7 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Directive, HostListener, Injector } from '@angular/core';
import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators';
import { KeyCode } from '@microsoft/windows-admin-center-sdk/core/data/accessibility-manager';
import { LogLevel } from '@microsoft/windows-admin-center-sdk/core/diagnostics/log-level';
import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom';
import { CoreBaseComponent } from '../common/base.component';
import { TooltipHostInstance } from './tooltip-host-instance';
import * as i0 from "@angular/core";
export class TooltipZoneDirective extends CoreBaseComponent {
constructor(injector) {
super(injector);
this.isViewLoaded = false;
this.isObserving = false;
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'TooltipZoneDirective';
}
onShortcut(event) {
if (event.keyCode === KeyCode.F1 && event.altKey) {
if (this.tooltipDirective) {
if (!this.tooltipDirective.shown) {
this.tooltipDirective.show(true);
event.stopImmediatePropagation();
}
else {
this.tooltipDirective.hide();
}
}
}
}
onFocusChange() {
// The tooltip is using a template, handle the focusout event properly if template has tab index
if (this.tooltipDirective) {
event.stopImmediatePropagation();
if (!TooltipHostInstance.activeHost.isFocused) {
this.tooltipDirective.hide();
}
}
}
ngOnInit() {
this.mutationObserver = new MutationObserver(mutations => {
mutations.forEach(() => {
/* Observe when a node is added or removed. If this occurs then reset which element
will have the aria-keyshortcuts attribute so the first focusable element will only
have it.*/
this.unsetAriaShortcutAttribute();
this.setAriaShortcutAttribute();
});
});
}
ngAfterViewInit() {
this.isViewLoaded = true;
this.startObserving();
}
ngOnDestroy() {
this.stopObserving();
this.unsetAriaShortcutAttribute();
}
registerTooltipDirective(tooltipDirective) {
this.tooltipDirective = tooltipDirective;
this.setAriaShortcutAttribute();
this.startObserving();
}
unregisterTooltipDirective() {
this.tooltipDirective = null;
this.unsetAriaShortcutAttribute();
this.stopObserving();
}
startObserving() {
// Only start observing if there is a tooltip associated with this zone
// and the view has had the initial load.
if (this.tooltipDirective && this.isViewLoaded && !this.isObserving && this.mutationObserver) {
this.isObserving = true;
this.mutationObserver.observe(this.hostElement.nativeElement, {
childList: true,
subtree: true
});
}
}
stopObserving() {
if (this.mutationObserver && this.isObserving) {
this.mutationObserver.disconnect();
this.isObserving = false;
}
}
// Add debounce to allow the content of the tooltip zone to load before finding a focusable element
setAriaShortcutAttribute() {
this.focusableZoneElement = Dom.getFirstElement(this.hostElement.nativeElement, element => Dom.isFocusPossible(element), element => !!element.getAttribute('smeTooltipZone'));
if (this.focusableZoneElement) {
this.focusableZoneElement.setAttribute('aria-keyshortcuts', this.strings.MsftSmeShell.Angular.TooltipZone.Aria.keyShortcuts);
}
else {
this.log('A tooltip zone must have a child element that is focusable for keyboard accessibility', LogLevel.Error, { TooltipZone: this.hostElement.nativeElement });
}
}
unsetAriaShortcutAttribute() {
if (this.focusableZoneElement) {
this.focusableZoneElement.removeAttribute('aria-keyshortcuts');
this.focusableZoneElement = null;
}
}
}
/** @nocollapse */ TooltipZoneDirective.ɵfac = function TooltipZoneDirective_Factory(t) { return new (t || TooltipZoneDirective)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ TooltipZoneDirective.ɵdir = /** @pureOrBreakMyCode */ i0.ɵɵdefineDirective({ type: TooltipZoneDirective, selectors: [["", "smeTooltipZone", ""]], hostBindings: function TooltipZoneDirective_HostBindings(rf, ctx) { if (rf & 1) {
i0.ɵɵlistener("keydown", function TooltipZoneDirective_keydown_HostBindingHandler($event) { return ctx.onShortcut($event); })("focusout", function TooltipZoneDirective_focusout_HostBindingHandler() { return ctx.onFocusChange(); });
} }, exportAs: ["smeTooltipZone"], features: [i0.ɵɵInheritDefinitionFeature] });
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], TooltipZoneDirective.prototype, "setAriaShortcutAttribute", null);
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TooltipZoneDirective, [{
type: Directive,
args: [{
selector: '[smeTooltipZone]',
exportAs: 'smeTooltipZone'
}]
}], function () { return [{ type: i0.Injector }]; }, { onShortcut: [{
type: HostListener,
args: ['keydown', ['$event']]
}], onFocusChange: [{
type: HostListener,
args: ['focusout']
}], setAriaShortcutAttribute: [] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC16b25lLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3Rvb2x0aXAvdG9vbHRpcC16b25lLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osUUFBUSxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDOUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFNOUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGlCQUFpQjtJQXdDdkQsWUFBWSxRQUFrQjtRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUE3QlosaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUE2QjVCLENBQUM7SUF4Q0Q7O09BRUc7SUFDSCxJQUFjLGFBQWE7UUFDdkIsT0FBTyxzQkFBc0IsQ0FBQztJQUNsQyxDQUFDO0lBU00sVUFBVSxDQUFDLEtBQW9CO1FBQ2xDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDOUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO29CQUM5QixJQUFJ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LFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNoSTthQUFNO1lBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FDSix1RkFBdUYsRUFDdkYsUUFBUSxDQUFDLEtBQUssRUFDZCxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUNsRCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRU8sMEJBQTBCO1FBQzlCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQ3BDO0lBQ0wsQ0FBQzs7MkdBMUhRLG9CQUFvQjtzR0FBcEIsb0JBQW9COzJHQUFwQixzQkFBa0Isc0ZBQWxCLG1CQUFlOztBQWtHeEI7SUFBQyxRQUFRLEVBQUU7Ozs7b0VBaUJWO3VGQW5IUSxvQkFBb0I7Y0FKaEMsU0FBUztlQUFDO2dCQUNQLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFFBQVEsRUFBRSxnQkFBZ0I7YUFDN0I7MkRBaUJVLFVBQVU7a0JBRGhCLFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBZTVCLGFBQWE7a0JBRG5CLFlBQVk7bUJBQUMsVUFBVTtZQXNFaEIsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBJbmplY3RvcixcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBLZXlDb2RlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2ctbGV2ZWwnO1xyXG5pbXBvcnQgeyBEb20gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RvbS9kb20nO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRvb2x0aXBIb3N0SW5zdGFuY2UgfSBmcm9tICcuL3Rvb2x0aXAtaG9zdC1pbnN0YW5jZSc7XHJcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICcuL3Rvb2x0aXAuZGlyZWN0aXZlJztcclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tzbWVUb29sdGlwWm9uZV0nLFxyXG4gICAgZXhwb3J0QXM6ICdzbWVUb29sdGlwWm9uZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRvb2x0aXBab25lRGlyZWN0aXZlIGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1Rvb2x0aXBab25lRGlyZWN0aXZlJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvb2x0aXBEaXJlY3RpdmU6IFRvb2x0aXBEaXJlY3RpdmU7XHJcbiAgICBwcml2YXRlIGZvY3VzYWJsZVpvbmVFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcclxuICAgIHByaXZhdGUgaXNWaWV3TG9hZGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzT2JzZXJ2aW5nID0gZmFsc2U7XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMgb25TaG9ydGN1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkYxICYmIGV2ZW50LmFsdEtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50b29sdGlwRGlyZWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudG9vbHRpcERpcmVjdGl2ZS5zaG93bikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcERpcmVjdGl2ZS5zaG93KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBEaXJlY3RpdmUuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JylcclxuICAgIHB1YmxpYyBvbkZvY3VzQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFRoZSB0b29sdGlwIGlzIHVzaW5nIGEgdGVtcGxhdGUsIGhhbmRsZSB0aGUgZm9jdXNvdXQgZXZlbnQgcHJvcGVybHkgaWYgdGVtcGxhdGUgaGFzIHRhYiBpbmRleFxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBEaXJlY3RpdmUpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmICghVG9vbHRpcEhvc3RJbnN0YW5jZS5hY3RpdmVIb3N0LmlzRm9jdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwRGlyZWN0aXZlLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qICBPYnNlcnZlIHdoZW4gYSBub2RlIGlzIGFkZGVkIG9yIHJlbW92ZWQuIElmIHRoaXMgb2NjdXJzIHRoZW4gcmVzZXQgd2hpY2ggZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIHdpbGwgaGF2ZSB0aGUgYXJpYS1rZXlzaG9ydGN1dHMgYXR0cmlidXRlIHNvIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCB3aWxsIG9ubHlcclxuICAgICAgICAgICAgICAgICAgICBoYXZlIGl0LiovXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2V0QXJpYVNob3J0Y3V0QXR0cmlidXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyaWFTaG9ydGN1dEF0dHJpYnV0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuaXNWaWV3TG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnN0YXJ0T2JzZXJ2aW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc3RvcE9ic2VydmluZygpO1xyXG4gICAgICAgIHRoaXMudW5zZXRBcmlhU2hvcnRjdXRBdHRyaWJ1dGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJUb29sdGlwRGlyZWN0aXZlKHRvb2x0aXBEaXJlY3RpdmU6IFRvb2x0aXBEaXJlY3RpdmUpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBEaXJlY3RpdmUgPSB0b29sdGlwRGlyZWN0aXZlO1xyXG4gICAgICAgIHRoaXMuc2V0QXJpYVNob3J0Y3V0QXR0cmlidXRlKCk7XHJcbiAgICAgICAgdGhpcy5zdGFydE9ic2VydmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnJlZ2lzdGVyVG9vbHRpcERpcmVjdGl2ZSgpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBEaXJlY3RpdmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudW5zZXRBcmlhU2hvcnRjdXRBdHRyaWJ1dGUoKTtcclxuICAgICAgICB0aGlzLnN0b3BPYnNlcnZpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0T2JzZXJ2aW5nKCkge1xyXG4gICAgICAgIC8vIE9ubHkgc3RhcnQgb2JzZXJ2aW5nIGlmIHRoZXJlIGlzIGEgdG9vbHRpcCBhc3NvY2lhdGVkIHdpdGggdGhpcyB6b25lXHJcbiAgICAgICAgLy8gYW5kIHRoZSB2aWV3IGhhcyBoYWQgdGhlIGluaXRpYWwgbG9hZC5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwRGlyZWN0aXZlICYmIHRoaXMuaXNWaWV3TG9hZGVkICYmICF0aGlzLmlzT2JzZXJ2aW5nICYmIHRoaXMubXV0YXRpb25PYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLmlzT2JzZXJ2aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0b3BPYnNlcnZpbmcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubXV0YXRpb25PYnNlcnZlciAmJiB0aGlzLmlzT2JzZXJ2aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNPYnNlcnZpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGRlYm91bmNlIHRvIGFsbG93IHRoZSBjb250ZW50IG9mIHRoZSB0b29sdGlwIHpvbmUgdG8gbG9hZCBiZWZvcmUgZmluZGluZyBhIGZvY3VzYWJsZSBlbGVtZW50XHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHJpdmF0ZSBzZXRBcmlhU2hvcnRjdXRBdHRyaWJ1dGUoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2FibGVab25lRWxlbWVudCA9IERvbS5nZXRGaXJzdEVsZW1lbnQoXHJcbiAgICAgICAgICAgIDxIVE1MRWxlbWVudD50aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgIGVsZW1lbnQgPT4gRG9tLmlzRm9jdXNQb3NzaWJsZShlbGVtZW50KSxcclxuICAgICAgICAgICAgZWxlbWVudCA9PiAhIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzbWVUb29sdGlwWm9uZScpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNhYmxlWm9uZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2FibGVab25lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEta2V5c2hvcnRjdXRzJywgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLlRvb2x0aXBab25lLkFyaWEua2V5U2hvcnRjdXRzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyhcclxuICAgICAgICAgICAgICAgICdBIHRvb2x0aXAgem9uZSBtdXN0IGhhdmUgYSBjaGlsZCBlbGVtZW50IHRoYXQgaXMgZm9jdXNhYmxlIGZvciBrZXlib2FyZCBhY2Nlc3NpYmlsaXR5JyxcclxuICAgICAgICAgICAgICAgIExvZ0xldmVsLkVycm9yLFxyXG4gICAgICAgICAgICAgICAgeyBUb29sdGlwWm9uZTogdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50IH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1bnNldEFyaWFTaG9ydGN1dEF0dHJpYnV0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5mb2N1c2FibGVab25lRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzYWJsZVpvbmVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1rZXlzaG9ydGN1dHMnKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2FibGVab25lRWxlbWVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==