fundamental-ngx
Version:
SAP Fiori Fundamentals, implemented in Angular
210 lines • 20.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ComponentFactoryResolver, Injectable, ApplicationRef, Injector } from '@angular/core';
import { ModalComponent } from '../modal.component';
import { ModalBackdrop } from '../modal-utils/modal-backdrop';
import { ModalContainer } from '../modal-utils/modal-container';
import { ModalConfig } from '../modal-utils/modal-config';
import { ModalRef } from '../modal-utils/modal-ref';
import { ModalInjector } from '../modal-utils/modal-injector';
var ModalService = /** @class */ (function () {
function ModalService(componentFactoryResolver, appRef, injector) {
this.componentFactoryResolver = componentFactoryResolver;
this.appRef = appRef;
this.injector = injector;
this.modals = [];
}
/**
* @return {?}
*/
ModalService.prototype.hasOpenModals = /**
* @return {?}
*/
function () {
return this.modals && this.modals.length > 0;
};
/**
* @return {?}
*/
ModalService.prototype.dismissAll = /**
* @return {?}
*/
function () {
var _this = this;
this.modals.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) {
_this.destroyModalComponent(item.modalRef);
}));
};
/**
* @param {?} contentType
* @param {?=} modalConfig
* @return {?}
*/
ModalService.prototype.open = /**
* @param {?} contentType
* @param {?=} modalConfig
* @return {?}
*/
function (contentType, modalConfig) {
var _this = this;
if (modalConfig === void 0) { modalConfig = new ModalConfig(); }
// Get default values from model
modalConfig = Object.assign(new ModalConfig(), modalConfig);
// Setup injectable data
/** @type {?} */
var configMap = new WeakMap();
/** @type {?} */
var modalRef = new ModalRef();
modalRef.data = (modalConfig ? modalConfig.data : undefined);
configMap.set(ModalRef, modalRef);
// Prepare container
/** @type {?} */
var containerFactory = this.componentFactoryResolver.resolveComponentFactory(ModalContainer);
/** @type {?} */
var containerRef = containerFactory.create(this.injector);
this.appRef.attachView(containerRef.hostView);
// Prepare modal
/** @type {?} */
var componentFactory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent);
/** @type {?} */
var componentRef = componentFactory.create(new ModalInjector(this.injector, configMap));
this.appRef.attachView(componentRef.hostView);
// Prepare backdrop
/** @type {?} */
var backdropRef;
if (modalConfig.hasBackdrop) {
/** @type {?} */
var backdropFactory = this.componentFactoryResolver.resolveComponentFactory(ModalBackdrop);
backdropRef = backdropFactory.create(new ModalInjector(this.injector, configMap));
this.appRef.attachView(backdropRef.hostView);
}
// Subscribe to close of modalRef
/** @type {?} */
var refSub = modalRef.afterClosed.subscribe((/**
* @return {?}
*/
function () {
_this.destroyModalComponent(componentRef);
refSub.unsubscribe();
}), (/**
* @return {?}
*/
function () {
_this.destroyModalComponent(componentRef);
refSub.unsubscribe();
}));
// Assign component attributes
/** @type {?} */
var configObj = Object.assign({}, modalConfig);
Object.keys(configObj).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
if (key !== 'data') {
componentRef.instance[key] = configObj[key];
if (modalConfig.hasBackdrop) {
backdropRef.instance[key] = configObj[key];
}
}
}));
componentRef.instance.childComponentType = contentType;
// Sizing
componentRef.location.nativeElement.style.minWidth = configObj.minWidth;
componentRef.location.nativeElement.style.minHeight = configObj.minHeight;
componentRef.location.nativeElement.style.maxWidth = configObj.maxWidth;
componentRef.location.nativeElement.style.maxHeight = configObj.maxHeight;
componentRef.location.nativeElement.style.width = configObj.width;
componentRef.location.nativeElement.style.height = configObj.height;
// Render container
/** @type {?} */
var containerEl = (/** @type {?} */ (((/** @type {?} */ (containerRef.hostView))).rootNodes[0]));
document.body.appendChild(containerEl);
// Render backdrop
if (modalConfig.hasBackdrop) {
/** @type {?} */
var domBackdrop = (/** @type {?} */ (((/** @type {?} */ (backdropRef.hostView))).rootNodes[0]));
containerRef.location.nativeElement.appendChild(domBackdrop);
}
// Render modal
/** @type {?} */
var domElement = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0]));
containerRef.location.nativeElement.appendChild(domElement);
this.modals.push({ modalRef: componentRef, backdropRef: backdropRef, containerRef: containerRef });
return modalRef;
};
/**
* @private
* @param {?} modal
* @return {?}
*/
ModalService.prototype.destroyModalComponent = /**
* @private
* @param {?} modal
* @return {?}
*/
function (modal) {
/** @type {?} */
var arrayRef = this.modals.find((/**
* @param {?} item
* @return {?}
*/
function (item) { return item.modalRef === modal; }));
/** @type {?} */
var indexOf = this.modals.indexOf(arrayRef);
this.appRef.detachView(arrayRef.modalRef.hostView);
this.appRef.detachView(arrayRef.containerRef.hostView);
arrayRef.containerRef.destroy();
arrayRef.modalRef.destroy();
if (arrayRef.backdropRef) {
this.appRef.detachView(arrayRef.backdropRef.hostView);
arrayRef.backdropRef.destroy();
}
this.modals[indexOf] = null;
this.modals = this.modals.filter((/**
* @param {?} item
* @return {?}
*/
function (item) { return item !== null && item !== undefined; }));
};
ModalService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ModalService.ctorParameters = function () { return [
{ type: ComponentFactoryResolver },
{ type: ApplicationRef },
{ type: Injector }
]; };
return ModalService;
}());
export { ModalService };
if (false) {
/**
* @type {?}
* @private
*/
ModalService.prototype.modals;
/**
* @type {?}
* @private
*/
ModalService.prototype.componentFactoryResolver;
/**
* @type {?}
* @private
*/
ModalService.prototype.appRef;
/**
* @type {?}
* @private
*/
ModalService.prototype.injector;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Z1bmRhbWVudGFsLW5neC8iLCJzb3VyY2VzIjpbImxpYi9tb2RhbC9tb2RhbC1zZXJ2aWNlL21vZGFsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCx3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEVBS1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQ7SUFRSSxzQkFBb0Isd0JBQWtELEVBQ2xELE1BQXNCLEVBQ3RCLFFBQWtCO1FBRmxCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQVI5QixXQUFNLEdBSVIsRUFBRSxDQUFDO0lBSWdDLENBQUM7Ozs7SUFFbkMsb0NBQWE7OztJQUFwQjtRQUNJLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQzs7OztJQUVNLGlDQUFVOzs7SUFBakI7UUFBQSxpQkFJQztRQUhHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTzs7OztRQUFDLFVBQUEsSUFBSTtZQUNwQixLQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FB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QVU7Ozs7Z0JBaEJQLHdCQUF3QjtnQkFFeEIsY0FBYztnQkFDZCxRQUFROztJQWlJWixtQkFBQztDQUFBLEFBcEhELElBb0hDO1NBbkhZLFlBQVk7Ozs7OztJQUNyQiw4QkFJUzs7Ozs7SUFFRyxnREFBMEQ7Ozs7O0lBQzFELDhCQUE4Qjs7Ozs7SUFDOUIsZ0NBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgSW5qZWN0YWJsZSxcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBJbmplY3RvcixcbiAgICBFbWJlZGRlZFZpZXdSZWYsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIFR5cGUsXG4gICAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb2RhbEJhY2tkcm9wIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtYmFja2Ryb3AnO1xuaW1wb3J0IHsgTW9kYWxDb250YWluZXIgfSBmcm9tICcuLi9tb2RhbC11dGlscy9tb2RhbC1jb250YWluZXInO1xuaW1wb3J0IHsgTW9kYWxDb25maWcgfSBmcm9tICcuLi9tb2RhbC11dGlscy9tb2RhbC1jb25maWcnO1xuaW1wb3J0IHsgTW9kYWxSZWYgfSBmcm9tICcuLi9tb2RhbC11dGlscy9tb2RhbC1yZWYnO1xuaW1wb3J0IHsgTW9kYWxJbmplY3RvciB9IGZyb20gJy4uL21vZGFsLXV0aWxzL21vZGFsLWluamVjdG9yJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vZGFsU2VydmljZSB7XG4gICAgcHJpdmF0ZSBtb2RhbHM6IHtcbiAgICAgICAgbW9kYWxSZWY6IENvbXBvbmVudFJlZjxNb2RhbENvbXBvbmVudD4sXG4gICAgICAgIGJhY2tkcm9wUmVmPzogQ29tcG9uZW50UmVmPE1vZGFsQmFja2Ryb3A+LFxuICAgICAgICBjb250YWluZXJSZWY/OiBDb21wb25lbnRSZWY8TW9kYWxDb250YWluZXI+XG4gICAgfVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge31cblxuICAgIHB1YmxpYyBoYXNPcGVuTW9kYWxzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RhbHMgJiYgdGhpcy5tb2RhbHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzbWlzc0FsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2RhbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vZGFsQ29tcG9uZW50KGl0ZW0ubW9kYWxSZWYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3Blbihjb250ZW50VHlwZTogVHlwZTxhbnk+IHwgVGVtcGxhdGVSZWY8YW55PiwgbW9kYWxDb25maWc6IE1vZGFsQ29uZmlnID0gbmV3IE1vZGFsQ29uZmlnKCkpOiBNb2RhbFJlZiB7XG5cbiAgICAgICAgLy8gR2V0IGRlZmF1bHQgdmFsdWVzIGZyb20gbW9kZWxcbiAgICAgICAgbW9kYWxDb25maWcgPSBPYmplY3QuYXNzaWduKG5ldyBNb2RhbENvbmZpZygpLCBtb2RhbENvbmZpZyk7XG5cbiAgICAgICAgLy8gU2V0dXAgaW5qZWN0YWJsZSBkYXRhXG4gICAgICAgIGNvbnN0IGNvbmZpZ01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIGNvbnN0IG1vZGFsUmVmID0gbmV3IE1vZGFsUmVmKCk7XG4gICAgICAgIG1vZGFsUmVmLmRhdGEgPSAobW9kYWxDb25maWcgPyBtb2RhbENvbmZpZy5kYXRhIDogdW5kZWZpbmVkKTtcbiAgICAgICAgY29uZmlnTWFwLnNldChNb2RhbFJlZiwgbW9kYWxSZWYpO1xuXG4gICAgICAgIC8vIFByZXBhcmUgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShNb2RhbENvbnRhaW5lcik7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IGNvbnRhaW5lckZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbnRhaW5lclJlZi5ob3N0Vmlldyk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBtb2RhbFxuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTW9kYWxDb21wb25lbnQpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShuZXcgTW9kYWxJbmplY3Rvcih0aGlzLmluamVjdG9yLCBjb25maWdNYXApKTtcbiAgICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXG4gICAgICAgIC8vIFByZXBhcmUgYmFja2Ryb3BcbiAgICAgICAgbGV0IGJhY2tkcm9wUmVmO1xuICAgICAgICBpZiAobW9kYWxDb25maWcuaGFzQmFja2Ryb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tkcm9wRmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KE1vZGFsQmFja2Ryb3ApO1xuICAgICAgICAgICAgYmFja2Ryb3BSZWYgPSBiYWNrZHJvcEZhY3RvcnkuY3JlYXRlKG5ldyBNb2RhbEluamVjdG9yKHRoaXMuaW5qZWN0b3IsIGNvbmZpZ01hcCkpO1xuICAgICAgICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyhiYWNrZHJvcFJlZi5ob3N0Vmlldyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY2xvc2Ugb2YgbW9kYWxSZWZcbiAgICAgICAgY29uc3QgcmVmU3ViID0gbW9kYWxSZWYuYWZ0ZXJDbG9zZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vZGFsQ29tcG9uZW50KGNvbXBvbmVudFJlZik7XG4gICAgICAgICAgICByZWZTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95TW9kYWxDb21wb25lbnQoY29tcG9uZW50UmVmKTtcbiAgICAgICAgICAgIHJlZlN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBc3NpZ24gY29tcG9uZW50IGF0dHJpYnV0ZXNcbiAgICAgICAgY29uc3QgY29uZmlnT2JqID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kYWxDb25maWcpO1xuICAgICAgICBPYmplY3Qua2V5cyhjb25maWdPYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdkYXRhJykge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZVtrZXldID0gY29uZmlnT2JqW2tleV07XG5cbiAgICAgICAgICAgICAgICBpZiAobW9kYWxDb25maWcuaGFzQmFja2Ryb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3BSZWYuaW5zdGFuY2Vba2V5XSA9IGNvbmZpZ09ialtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jaGlsZENvbXBvbmVudFR5cGUgPSBjb250ZW50VHlwZTtcblxuICAgICAgICAvLyBTaXppbmdcbiAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWluV2lkdGggPSBjb25maWdPYmoubWluV2lkdGg7XG4gICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLm1pbkhlaWdodCA9IGNvbmZpZ09iai5taW5IZWlnaHQ7XG4gICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLm1heFdpZHRoID0gY29uZmlnT2JqLm1heFdpZHRoO1xuICAgICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS5tYXhIZWlnaHQgPSBjb25maWdPYmoubWF4SGVpZ2h0O1xuICAgICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGNvbmZpZ09iai53aWR0aDtcbiAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gY29uZmlnT2JqLmhlaWdodDtcblxuICAgICAgICAvLyBSZW5kZXIgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gKGNvbnRhaW5lclJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lckVsKTtcblxuICAgICAgICAvLyBSZW5kZXIgYmFja2Ryb3BcbiAgICAgICAgaWYgKG1vZGFsQ29uZmlnLmhhc0JhY2tkcm9wKSB7XG4gICAgICAgICAgICBjb25zdCBkb21CYWNrZHJvcCA9IChiYWNrZHJvcFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9tQmFja2Ryb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVuZGVyIG1vZGFsXG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSAoY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnRhaW5lclJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGRvbUVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMubW9kYWxzLnB1c2goe21vZGFsUmVmOiBjb21wb25lbnRSZWYsIGJhY2tkcm9wUmVmOiBiYWNrZHJvcFJlZiwgY29udGFpbmVyUmVmOiBjb250YWluZXJSZWZ9KTtcbiAgICAgICAgcmV0dXJuIG1vZGFsUmVmO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveU1vZGFsQ29tcG9uZW50KG1vZGFsOiBDb21wb25lbnRSZWY8TW9kYWxDb21wb25lbnQ+KSB7XG4gICAgICAgIGNvbnN0IGFycmF5UmVmID0gdGhpcy5tb2RhbHMuZmluZCgoaXRlbSkgPT4gaXRlbS5tb2RhbFJlZiA9PT0gbW9kYWwpO1xuICAgICAgICBjb25zdCBpbmRleE9mID0gdGhpcy5tb2RhbHMuaW5kZXhPZihhcnJheVJlZik7XG4gICAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcoYXJyYXlSZWYubW9kYWxSZWYuaG9zdFZpZXcpO1xuICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KGFycmF5UmVmLmNvbnRhaW5lclJlZi5ob3N0Vmlldyk7XG4gICAgICAgIGFycmF5UmVmLmNvbnRhaW5lclJlZi5kZXN0cm95KCk7XG4gICAgICAgIGFycmF5UmVmLm1vZGFsUmVmLmRlc3Ryb3koKTtcblxuICAgICAgICBpZiAoYXJyYXlSZWYuYmFja2Ryb3BSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcoYXJyYXlSZWYuYmFja2Ryb3BSZWYuaG9zdFZpZXcpO1xuICAgICAgICAgICAgYXJyYXlSZWYuYmFja2Ryb3BSZWYuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RhbHNbaW5kZXhPZl0gPSBudWxsO1xuICAgICAgICB0aGlzLm1vZGFscyA9IHRoaXMubW9kYWxzLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICB9XG5cbn1cbiJdfQ==