UNPKG

carbon-components-angular

Version:
116 lines 14.4 kB
import { Injectable } from "@angular/core"; import { CloseReasons } from "./dialog-config.interface"; import { tabbableSelector } from "carbon-components-angular/common"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/placeholder"; /** * `Dialog` object to be injected into other components. */ export class DialogService { /** * Creates an instance of `DialogService`. */ constructor(injector, placeholderService) { this.injector = injector; this.placeholderService = placeholderService; } /** * Closes all known `Dialog`s. Does not focus any previous elements, since we can't know which would be correct */ static closeAll() { DialogService.dialogRefs.forEach(ref => ref.instance.doClose({ reason: CloseReasons.programmatic })); DialogService.dialogRefs.clear(); } /** * If `dialogRef` is defined, the Dialog is already open. If * `dialogRef` is undefined, we create the `Dialog` component and reference to it. * A subscription is created to track if the `Dialog` should close. * * @param viewContainer a `ViewContainerRef` to instantiate the component against. * May be `null` if an `cds-placeholder` exists and `dialogConfig.appendInline` is false * @param dialogConfig the `DialogConfig` for the component */ open(viewContainer, dialogConfig, component) { if (!component) { return; } let dialogRef; if (dialogConfig.appendInline) { // add our component to the view dialogRef = viewContainer.createComponent(component, { index: 0, injector: this.injector }); } else if (!this.placeholderService.hasPlaceholderRef()) { dialogRef = viewContainer.createComponent(component, { index: 0, injector: this.injector }); if (dialogRef) { setTimeout(() => { window.document.querySelector("body").appendChild(dialogRef.location.nativeElement); }); } } else { dialogRef = this.placeholderService.createComponent(component, this.injector); } // keep track of all initialized dialogs DialogService.dialogRefs.add(dialogRef); // initialize some extra options dialogConfig["previouslyFocusedElement"] = document.activeElement; dialogRef.instance.dialogConfig = dialogConfig; dialogRef.instance.elementRef.nativeElement.focus(); return dialogRef; } /** * On close of `Dialog` item, sets focus back to previous item, unsets * the current `dialogRef` item. Unsubscribes to the event of `Dialog` close. * * @param dialogRef the dialogRef to close */ close(dialogRef) { // to handle the case where we have a null `this.dialogRef` if (!dialogRef) { return; } const elementToFocus = dialogRef.instance.dialogConfig["previouslyFocusedElement"]; dialogRef.destroy(); // update the globally tracked dialogRefs if (DialogService.dialogRefs.has(dialogRef)) { DialogService.dialogRefs.delete(dialogRef); } // Keeps the focus on the dialog trigger if there are no focusable elements. Change focus to previously focused element // if there are focusable elements in the dialog. if (!dialogRef.location.nativeElement.querySelectorAll(tabbableSelector)) { elementToFocus.focus(); } } /** * Fix for safari hijacking clicks. * * Runs on `ngOnInit` of every dialog. Ensures we don't have multiple listeners * because having many of them could degrade performance in certain cases (and is * not necessary for our use case) * * This is an internally used function, can change at any point (even get removed) * and changes to it won't be considered a breaking change. Use at your own risk. */ singletonClickListen() { if (!DialogService.listeningForBodyClicks) { document.body.firstElementChild.addEventListener("click", () => null, true); DialogService.listeningForBodyClicks = true; } } } /** * Used in `singletonClickListen`, don't count on its existence and values. */ DialogService.listeningForBodyClicks = false; /** * A set of all known dialog components */ DialogService.dialogRefs = new Set(); DialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DialogService, deps: [{ token: i0.Injector }, { token: i1.PlaceholderService }], target: i0.ɵɵFactoryTarget.Injectable }); DialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DialogService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DialogService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.PlaceholderService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGlhbG9nL2RpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTixVQUFVLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBZ0IsTUFBTSwyQkFBMkIsQ0FBQztBQUd2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBRXBFOztHQUVHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUFxQnpCOztPQUVHO0lBQ0gsWUFBc0IsUUFBa0IsRUFBWSxrQkFBc0M7UUFBcEUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFZLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7SUFBRyxDQUFDO0lBYjlGOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFFBQVE7UUFDckIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUM1RCxNQUFNLEVBQUUsWUFBWSxDQUFDLFlBQVk7U0FDakMsQ0FBQyxDQUFDLENBQUM7UUFDSixhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFPRDs7Ozs7Ozs7T0FRRztJQUNILElBQUksQ0FBQyxhQUErQixFQUFFLFlBQTBCLEVBQUUsU0FBYztRQUMvRSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2YsT0FBTztTQUNQO1FBRUQsSUFBSSxTQUFTLENBQUM7UUFDZCxJQUFJLFlBQVksQ0FBQyxZQUFZLEVBQUU7WUFDOUIsZ0NBQWdDO1lBQ2hDLFNBQVMsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVGO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO1lBQ3hELFNBQVMsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzVGLElBQUksU0FBUyxFQUFFO2dCQUNkLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JGLENBQUMsQ0FBQyxDQUFDO2FBQ0g7U0FDRDthQUFNO1lBQ04sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM5RTtRQUVELHdDQUF3QztRQUN4QyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4QyxnQ0FBZ0M7UUFDaEMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNsRSxTQUFTLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFL0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXBELE9BQU8sU0FBaUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsU0FBK0I7UUFDcEMsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFM0IsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUVuRixTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFcEIseUNBQXlDO1FBQ3pDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDNUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0M7UUFFRCx1SEFBdUg7UUFDdkgsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3pFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN2QjtJQUNGLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxvQkFBb0I7UUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRTtZQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUUsYUFBYSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztTQUM1QztJQUNGLENBQUM7O0FBM0dEOztHQUVHO0FBQ2Msb0NBQXNCLEdBQUcsS0FBTSxDQUFBO0FBRWhEOztHQUVHO0FBQ2Msd0JBQVUsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQTswR0FUbEQsYUFBYTs4R0FBYixhQUFhOzJGQUFiLGFBQWE7a0JBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRJbmplY3Rvcixcblx0Q29tcG9uZW50UmVmLFxuXHRJbmplY3RhYmxlLFxuXHRWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDbG9zZVJlYXNvbnMsIERpYWxvZ0NvbmZpZyB9IGZyb20gXCIuL2RpYWxvZy1jb25maWcuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBQbGFjZWhvbGRlclNlcnZpY2UgfSBmcm9tIFwiY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhci9wbGFjZWhvbGRlclwiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vZGlhbG9nLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgdGFiYmFibGVTZWxlY3RvciB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2NvbW1vblwiO1xuXG4vKipcbiAqIGBEaWFsb2dgIG9iamVjdCB0byBiZSBpbmplY3RlZCBpbnRvIG90aGVyIGNvbXBvbmVudHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEaWFsb2dTZXJ2aWNlIHtcblx0LyoqXG5cdCAqIFVzZWQgaW4gYHNpbmdsZXRvbkNsaWNrTGlzdGVuYCwgZG9uJ3QgY291bnQgb24gaXRzIGV4aXN0ZW5jZSBhbmQgdmFsdWVzLlxuXHQgKi9cblx0cHJvdGVjdGVkIHN0YXRpYyBsaXN0ZW5pbmdGb3JCb2R5Q2xpY2tzID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIEEgc2V0IG9mIGFsbCBrbm93biBkaWFsb2cgY29tcG9uZW50c1xuXHQgKi9cblx0cHJvdGVjdGVkIHN0YXRpYyBkaWFsb2dSZWZzID0gbmV3IFNldDxDb21wb25lbnRSZWY8RGlhbG9nPj4oKTtcblxuXHQvKipcblx0ICogQ2xvc2VzIGFsbCBrbm93biBgRGlhbG9nYHMuIERvZXMgbm90IGZvY3VzIGFueSBwcmV2aW91cyBlbGVtZW50cywgc2luY2Ugd2UgY2FuJ3Qga25vdyB3aGljaCB3b3VsZCBiZSBjb3JyZWN0XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGNsb3NlQWxsKCkge1xuXHRcdERpYWxvZ1NlcnZpY2UuZGlhbG9nUmVmcy5mb3JFYWNoKHJlZiA9PiByZWYuaW5zdGFuY2UuZG9DbG9zZSh7XG5cdFx0XHRyZWFzb246IENsb3NlUmVhc29ucy5wcm9ncmFtbWF0aWNcblx0XHR9KSk7XG5cdFx0RGlhbG9nU2VydmljZS5kaWFsb2dSZWZzLmNsZWFyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBgRGlhbG9nU2VydmljZWAuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLCBwcm90ZWN0ZWQgcGxhY2Vob2xkZXJTZXJ2aWNlOiBQbGFjZWhvbGRlclNlcnZpY2UpIHt9XG5cblx0LyoqXG5cdCAqIElmIGBkaWFsb2dSZWZgIGlzIGRlZmluZWQsIHRoZSBEaWFsb2cgaXMgYWxyZWFkeSBvcGVuLiBJZlxuXHQgKiBgZGlhbG9nUmVmYCBpcyB1bmRlZmluZWQsIHdlIGNyZWF0ZSB0aGUgYERpYWxvZ2AgY29tcG9uZW50IGFuZCByZWZlcmVuY2UgdG8gaXQuXG5cdCAqIEEgc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQgdG8gdHJhY2sgaWYgdGhlIGBEaWFsb2dgIHNob3VsZCBjbG9zZS5cblx0ICpcblx0ICogQHBhcmFtIHZpZXdDb250YWluZXIgYSBgVmlld0NvbnRhaW5lclJlZmAgdG8gaW5zdGFudGlhdGUgdGhlIGNvbXBvbmVudCBhZ2FpbnN0LlxuXHQgKiBNYXkgYmUgYG51bGxgIGlmIGFuIGBjZHMtcGxhY2Vob2xkZXJgIGV4aXN0cyBhbmQgYGRpYWxvZ0NvbmZpZy5hcHBlbmRJbmxpbmVgIGlzIGZhbHNlXG5cdCAqIEBwYXJhbSBkaWFsb2dDb25maWcgdGhlIGBEaWFsb2dDb25maWdgIGZvciB0aGUgY29tcG9uZW50XG5cdCAqL1xuXHRvcGVuKHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsIGRpYWxvZ0NvbmZpZzogRGlhbG9nQ29uZmlnLCBjb21wb25lbnQ6IGFueSkge1xuXHRcdGlmICghY29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IGRpYWxvZ1JlZjtcblx0XHRpZiAoZGlhbG9nQ29uZmlnLmFwcGVuZElubGluZSkge1xuXHRcdFx0Ly8gYWRkIG91ciBjb21wb25lbnQgdG8gdGhlIHZpZXdcblx0XHRcdGRpYWxvZ1JlZiA9IHZpZXdDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwgeyBpbmRleDogMCwgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSk7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5wbGFjZWhvbGRlclNlcnZpY2UuaGFzUGxhY2Vob2xkZXJSZWYoKSkge1xuXHRcdFx0ZGlhbG9nUmVmID0gdmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCB7IGluZGV4OiAwLCBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9KTtcblx0XHRcdGlmIChkaWFsb2dSZWYpIHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0d2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJib2R5XCIpLmFwcGVuZENoaWxkKGRpYWxvZ1JlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpYWxvZ1JlZiA9IHRoaXMucGxhY2Vob2xkZXJTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHRoaXMuaW5qZWN0b3IpO1xuXHRcdH1cblxuXHRcdC8vIGtlZXAgdHJhY2sgb2YgYWxsIGluaXRpYWxpemVkIGRpYWxvZ3Ncblx0XHREaWFsb2dTZXJ2aWNlLmRpYWxvZ1JlZnMuYWRkKGRpYWxvZ1JlZik7XG5cblx0XHQvLyBpbml0aWFsaXplIHNvbWUgZXh0cmEgb3B0aW9uc1xuXHRcdGRpYWxvZ0NvbmZpZ1tcInByZXZpb3VzbHlGb2N1c2VkRWxlbWVudFwiXSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdFx0ZGlhbG9nUmVmLmluc3RhbmNlLmRpYWxvZ0NvbmZpZyA9IGRpYWxvZ0NvbmZpZztcblxuXHRcdGRpYWxvZ1JlZi5pbnN0YW5jZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcblxuXHRcdHJldHVybiBkaWFsb2dSZWYgYXMgQ29tcG9uZW50UmVmPERpYWxvZz47XG5cdH1cblxuXHQvKipcblx0ICogT24gY2xvc2Ugb2YgYERpYWxvZ2AgaXRlbSwgc2V0cyBmb2N1cyBiYWNrIHRvIHByZXZpb3VzIGl0ZW0sIHVuc2V0c1xuXHQgKiB0aGUgY3VycmVudCBgZGlhbG9nUmVmYCBpdGVtLiBVbnN1YnNjcmliZXMgdG8gdGhlIGV2ZW50IG9mIGBEaWFsb2dgIGNsb3NlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZGlhbG9nUmVmIHRoZSBkaWFsb2dSZWYgdG8gY2xvc2Vcblx0ICovXG5cdGNsb3NlKGRpYWxvZ1JlZjogQ29tcG9uZW50UmVmPERpYWxvZz4pIHtcblx0XHQvLyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIG51bGwgYHRoaXMuZGlhbG9nUmVmYFxuXHRcdGlmICghZGlhbG9nUmVmKSB7IHJldHVybjsgfVxuXG5cdFx0Y29uc3QgZWxlbWVudFRvRm9jdXMgPSBkaWFsb2dSZWYuaW5zdGFuY2UuZGlhbG9nQ29uZmlnW1wicHJldmlvdXNseUZvY3VzZWRFbGVtZW50XCJdO1xuXG5cdFx0ZGlhbG9nUmVmLmRlc3Ryb3koKTtcblxuXHRcdC8vIHVwZGF0ZSB0aGUgZ2xvYmFsbHkgdHJhY2tlZCBkaWFsb2dSZWZzXG5cdFx0aWYgKERpYWxvZ1NlcnZpY2UuZGlhbG9nUmVmcy5oYXMoZGlhbG9nUmVmKSkge1xuXHRcdFx0RGlhbG9nU2VydmljZS5kaWFsb2dSZWZzLmRlbGV0ZShkaWFsb2dSZWYpO1xuXHRcdH1cblxuXHRcdC8vIEtlZXBzIHRoZSBmb2N1cyBvbiB0aGUgZGlhbG9nIHRyaWdnZXIgaWYgdGhlcmUgYXJlIG5vIGZvY3VzYWJsZSBlbGVtZW50cy4gQ2hhbmdlIGZvY3VzIHRvIHByZXZpb3VzbHkgZm9jdXNlZCBlbGVtZW50XG5cdFx0Ly8gaWYgdGhlcmUgYXJlIGZvY3VzYWJsZSBlbGVtZW50cyBpbiB0aGUgZGlhbG9nLlxuXHRcdGlmICghZGlhbG9nUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCh0YWJiYWJsZVNlbGVjdG9yKSkge1xuXHRcdFx0ZWxlbWVudFRvRm9jdXMuZm9jdXMoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRml4IGZvciBzYWZhcmkgaGlqYWNraW5nIGNsaWNrcy5cblx0ICpcblx0ICogUnVucyBvbiBgbmdPbkluaXRgIG9mIGV2ZXJ5IGRpYWxvZy4gRW5zdXJlcyB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGxpc3RlbmVyc1xuXHQgKiBiZWNhdXNlIGhhdmluZyBtYW55IG9mIHRoZW0gY291bGQgZGVncmFkZSBwZXJmb3JtYW5jZSBpbiBjZXJ0YWluIGNhc2VzIChhbmQgaXNcblx0ICogbm90IG5lY2Vzc2FyeSBmb3Igb3VyIHVzZSBjYXNlKVxuXHQgKlxuXHQgKiBUaGlzIGlzIGFuIGludGVybmFsbHkgdXNlZCBmdW5jdGlvbiwgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgKGV2ZW4gZ2V0IHJlbW92ZWQpXG5cdCAqIGFuZCBjaGFuZ2VzIHRvIGl0IHdvbid0IGJlIGNvbnNpZGVyZWQgYSBicmVha2luZyBjaGFuZ2UuIFVzZSBhdCB5b3VyIG93biByaXNrLlxuXHQgKi9cblx0c2luZ2xldG9uQ2xpY2tMaXN0ZW4oKSB7XG5cdFx0aWYgKCFEaWFsb2dTZXJ2aWNlLmxpc3RlbmluZ0ZvckJvZHlDbGlja3MpIHtcblx0XHRcdGRvY3VtZW50LmJvZHkuZmlyc3RFbGVtZW50Q2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IG51bGwsIHRydWUpO1xuXHRcdFx0RGlhbG9nU2VydmljZS5saXN0ZW5pbmdGb3JCb2R5Q2xpY2tzID0gdHJ1ZTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==