UNPKG

@miracledevs/paradigm-web-angular

Version:

An angular wrapper with base functionality and helper services.

195 lines 16.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /*! * Paradigm Framework - Angular Wrapper * Copyright (c) 2017 Miracle Devs, Inc * Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Shared/blob/master/LICENSE) */ import { Injectable, ComponentFactoryResolver, Injector } from '@angular/core'; import { ArrayList, ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared'; import { ServiceBase } from './base.service'; import * as i0 from "@angular/core"; /** * Represents a modal dialog instance. * This class lifespan depends on the modal dialog lifespan. * @template TParameters, TResult */ export class ModalInstance { /** * Creates an instance of \@see ModalInstance * @param {?} type the modal component type. */ constructor(type) { this.type = type; } /** * Gets the component ref associated to the modal dialog. * @return {?} */ get componentRef() { return this.innerComponentRef; } /** * Sets the component ref reference. * @param {?} componentRef the component ref object. * @return {?} */ setComponentRef(componentRef) { this.innerComponentRef = componentRef; } } if (false) { /** * A reference to the component ref object. * @type {?} * @private */ ModalInstance.prototype.innerComponentRef; /** * The type of the modal component. * @type {?} */ ModalInstance.prototype.type; /** * Resolves and finish successfully the modal dialog. * @type {?} */ ModalInstance.prototype.resolve; /** * Rejects and finish unsuccessfully the modal dialog. * @type {?} */ ModalInstance.prototype.reject; } export class ModalService extends ServiceBase { /** * Creates a new instance of \@see ModalService * @param {?} resolver a reference to the component factory resolver, * @param {?} injector a reference to the DI injector container */ constructor(resolver, injector) { super(); this.resolver = resolver; this.injector = injector; this.modalInstances = new ArrayList(); } /** * Sets the view container ref that will hold and contain * the modal components. * @param {?} container the view container ref. * @return {?} */ setViewContainer(container) { if (ObjectExtensions.isNull(container)) { throw new Error('The container can not be null or undefined.'); } this.viewContainer = container; } /** * Gets the stack of modal instances. * @return {?} */ getModalInstances() { return this.modalInstances; } /** * Opens a modal dialog component. * @template TParameters, TResult * @param {?} type The modal component type. * @param {?=} parameters the creation parameters to pass to the modal component. * @return {?} */ open(type, parameters) { // create modal instance. /** @type {?} */ const modalInstance = new ModalInstance(type); this.modalInstances.add(modalInstance); // setup the modal promise. /** @type {?} */ const promise = new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => { modalInstance.resolve = (/** * @param {?=} result * @return {?} */ (result) => { resolve(result); this.remove(modalInstance); }); modalInstance.reject = (/** * @param {?=} reason * @return {?} */ (reason) => { reject(reason); this.remove(modalInstance); }); })); // create the component. /** @type {?} */ const factory = this.resolver.resolveComponentFactory(type); /** @type {?} */ const componentRef = factory.create(this.injector); // initialize the modal and component. modalInstance.setComponentRef(componentRef); componentRef.instance.setModalService(this); componentRef.instance.setModalInstance(modalInstance); componentRef.instance.setParameters(parameters); // insert view on screen. this.viewContainer.insert(componentRef.hostView); // return the promise. return promise; } /** * Removes the modal from the stack of modal instances. * @private * @template TParameters, TResult * @param {?} modalInstance the modal that will be removed. * @return {?} */ remove(modalInstance) { this.modalInstances.remove(modalInstance); this.viewContainer.remove(this.viewContainer.indexOf(modalInstance.componentRef.hostView)); } } ModalService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ ModalService.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: Injector } ]; /** @nocollapse */ ModalService.ngInjectableDef = i0.defineInjectable({ factory: function ModalService_Factory() { return new ModalService(i0.inject(i0.ComponentFactoryResolver), i0.inject(i0.INJECTOR)); }, token: ModalService, providedIn: "root" }); if (false) { /** * A stack of modal instances. * @type {?} * @private */ ModalService.prototype.modalInstances; /** * A reference to the view container ref that will hold * and contain the modal components. * @type {?} * @private */ ModalService.prototype.viewContainer; /** * @type {?} * @private */ ModalService.prototype.resolver; /** * @type {?} * @private */ ModalService.prototype.injector; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUF3QyxNQUFNLGVBQWUsQ0FBQztBQUVySCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBVTdDLE1BQU0sT0FBTyxhQUFhOzs7OztJQStCdEIsWUFBWSxJQUFvRDtRQUU1RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDOzs7OztJQVRELElBQUksWUFBWSxLQUE2RCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Ozs7OztJQWU3RyxlQUFlLENBQUMsWUFBb0U7UUFFaEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztJQUMxQyxDQUFDO0NBQ0o7Ozs7Ozs7SUF2Q0csMENBQWtGOzs7OztJQUtsRiw2QkFBOEQ7Ozs7O0lBSzlELGdDQUErQjs7Ozs7SUFLL0IsK0JBQW9COztBQTZCeEIsTUFBTSxPQUFPLFlBQWEsU0FBUSxXQUFXOzs7Ozs7SUFrQnpDLFlBQ1ksUUFBa0MsRUFDbEMsUUFBa0I7UUFFMUIsS0FBSyxFQUFFLENBQUM7UUFIQSxhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUMxQyxDQUFDOzs7Ozs7O0lBT0QsZ0JBQWdCLENBQUMsU0FBMkI7UUFFeEMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQ3RDO1lBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDbkMsQ0FBQzs7Ozs7SUFLRCxpQkFBaUI7UUFFYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQzs7Ozs7Ozs7SUFPRCxJQUFJLENBQXVCLElBQW9ELEVBQUUsVUFBd0I7OztjQUcvRixhQUFhLEdBQUcsSUFBSSxhQUFhLENBQXVCLElBQUksQ0FBQztRQUNuRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7O2NBR2pDLE9BQU8sR0FBRyxJQUFJLE9BQU87Ozs7O1FBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFFckQsYUFBYSxDQUFDLE9BQU87Ozs7WUFBRyxDQUFDLE1BQWdCLEVBQUUsRUFBRTtnQkFFekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQSxDQUFDO1lBQ0YsYUFBYSxDQUFDLE1BQU07Ozs7WUFBRyxDQUFDLE1BQWUsRUFBRSxFQUFFO2dCQUV2QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUEsQ0FBQztRQUNOLENBQUMsRUFBQzs7O2NBR0ksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDOztjQUNyRCxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRWxELHNDQUFzQztRQUN0QyxhQUFhLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVqRCxzQkFBc0I7UUFDdEIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQzs7Ozs7Ozs7SUFNTyxNQUFNLENBQXVCLGFBQWtEO1FBRW5GLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDOzs7WUF2R0osVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7O1lBN0RvQix3QkFBd0I7WUFBRSxRQUFROzs7Ozs7Ozs7SUFtRW5ELHNDQUEyRDs7Ozs7OztJQU0zRCxxQ0FBd0M7Ozs7O0lBUXBDLGdDQUEwQzs7Ozs7SUFDMUMsZ0NBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLlNoYXJlZC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgSW5qZWN0b3IsIFR5cGUsIENvbXBvbmVudFJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9tb2RhbC1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcnJheUxpc3QsIE9iamVjdEV4dGVuc2lvbnMgfSBmcm9tICdAbWlyYWNsZWRldnMvcGFyYWRpZ20tdWktd2ViLXNoYXJlZCc7XG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcblxuZXhwb3J0IHR5cGUgTW9kYWxSZXNvbHZlPFRSZXN1bHQ+ID0gKHJlc3VsdDogVFJlc3VsdCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgTW9kYWxSZWplY3QgPSAocmVhc29uOiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1vZGFsIGRpYWxvZyBpbnN0YW5jZS5cbiAqIFRoaXMgY2xhc3MgbGlmZXNwYW4gZGVwZW5kcyBvbiB0aGUgbW9kYWwgZGlhbG9nIGxpZmVzcGFuLlxuICovXG5leHBvcnQgY2xhc3MgTW9kYWxJbnN0YW5jZTxUUGFyYW1ldGVycywgVFJlc3VsdD5cbntcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHJlZiBvYmplY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbm5lckNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50QmFzZTxUUGFyYW1ldGVycywgVFJlc3VsdD4+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIG1vZGFsIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlOiBUeXBlPE1vZGFsQ29tcG9uZW50QmFzZTxUUGFyYW1ldGVycywgVFJlc3VsdD4+O1xuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYW5kIGZpbmlzaCBzdWNjZXNzZnVsbHkgdGhlIG1vZGFsIGRpYWxvZy5cbiAgICAgKi9cbiAgICByZXNvbHZlOiBNb2RhbFJlc29sdmU8VFJlc3VsdD47XG5cbiAgICAvKipcbiAgICAgKiBSZWplY3RzIGFuZCBmaW5pc2ggdW5zdWNjZXNzZnVsbHkgdGhlIG1vZGFsIGRpYWxvZy5cbiAgICAgKi9cbiAgICByZWplY3Q6IE1vZGFsUmVqZWN0O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29tcG9uZW50IHJlZiBhc3NvY2lhdGVkIHRvIHRoZSBtb2RhbCBkaWFsb2cuXG4gICAgICovXG4gICAgZ2V0IGNvbXBvbmVudFJlZigpOiBDb21wb25lbnRSZWY8TW9kYWxDb21wb25lbnRCYXNlPFRQYXJhbWV0ZXJzLCBUUmVzdWx0Pj4geyByZXR1cm4gdGhpcy5pbm5lckNvbXBvbmVudFJlZjsgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBAc2VlIE1vZGFsSW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbW9kYWwgY29tcG9uZW50IHR5cGUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZTxNb2RhbENvbXBvbmVudEJhc2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+PilcbiAgICB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29tcG9uZW50IHJlZiByZWZlcmVuY2UuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFJlZiB0aGUgY29tcG9uZW50IHJlZiBvYmplY3QuXG4gICAgICovXG4gICAgc2V0Q29tcG9uZW50UmVmKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50QmFzZTxUUGFyYW1ldGVycywgVFJlc3VsdD4+KTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5pbm5lckNvbXBvbmVudFJlZiA9IGNvbXBvbmVudFJlZjtcbiAgICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxTZXJ2aWNlIGV4dGVuZHMgU2VydmljZUJhc2VcbntcbiAgICAvKipcbiAgICAgKiBBIHN0YWNrIG9mIG1vZGFsIGluc3RhbmNlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1vZGFsSW5zdGFuY2VzOiBBcnJheUxpc3Q8TW9kYWxJbnN0YW5jZTxhbnksIGFueT4+O1xuXG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHZpZXcgY29udGFpbmVyIHJlZiB0aGF0IHdpbGwgaG9sZFxuICAgICAqIGFuZCBjb250YWluIHRoZSBtb2RhbCBjb21wb25lbnRzLlxuICAgICAqL1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBNb2RhbFNlcnZpY2VcbiAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBmYWN0b3J5IHJlc29sdmVyLFxuICAgICAqIEBwYXJhbSBpbmplY3RvciBhIHJlZmVyZW5jZSB0byB0aGUgREkgaW5qZWN0b3IgY29udGFpbmVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm1vZGFsSW5zdGFuY2VzID0gbmV3IEFycmF5TGlzdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZpZXcgY29udGFpbmVyIHJlZiB0aGF0IHdpbGwgaG9sZCBhbmQgY29udGFpblxuICAgICAqIHRoZSBtb2RhbCBjb21wb25lbnRzLlxuICAgICAqIEBwYXJhbSBjb250YWluZXIgdGhlIHZpZXcgY29udGFpbmVyIHJlZi5cbiAgICAgKi9cbiAgICBzZXRWaWV3Q29udGFpbmVyKGNvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZik6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChjb250YWluZXIpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjb250YWluZXIgY2FuIG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGFjayBvZiBtb2RhbCBpbnN0YW5jZXMuXG4gICAgICovXG4gICAgZ2V0TW9kYWxJbnN0YW5jZXMoKTogQXJyYXlMaXN0PE1vZGFsSW5zdGFuY2U8YW55LCBhbnk+PlxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kYWxJbnN0YW5jZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBtb2RhbCBkaWFsb2cgY29tcG9uZW50LlxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSBtb2RhbCBjb21wb25lbnQgdHlwZS5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgY3JlYXRpb24gcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtb2RhbCBjb21wb25lbnQuXG4gICAgICovXG4gICAgb3BlbjxUUGFyYW1ldGVycywgVFJlc3VsdD4odHlwZTogVHlwZTxNb2RhbENvbXBvbmVudEJhc2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+PiwgcGFyYW1ldGVycz86IFRQYXJhbWV0ZXJzKTogUHJvbWlzZTxUUmVzdWx0PlxuICAgIHtcbiAgICAgICAgLy8gY3JlYXRlIG1vZGFsIGluc3RhbmNlLlxuICAgICAgICBjb25zdCBtb2RhbEluc3RhbmNlID0gbmV3IE1vZGFsSW5zdGFuY2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+KHR5cGUpO1xuICAgICAgICB0aGlzLm1vZGFsSW5zdGFuY2VzLmFkZChtb2RhbEluc3RhbmNlKTtcblxuICAgICAgICAvLyBzZXR1cCB0aGUgbW9kYWwgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFRSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIG1vZGFsSW5zdGFuY2UucmVzb2x2ZSA9IChyZXN1bHQ/OiBUUmVzdWx0KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShtb2RhbEluc3RhbmNlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtb2RhbEluc3RhbmNlLnJlamVjdCA9IChyZWFzb24/OiBzdHJpbmcpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUobW9kYWxJbnN0YW5jZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjcmVhdGUgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodHlwZSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIG1vZGFsIGFuZCBjb21wb25lbnQuXG4gICAgICAgIG1vZGFsSW5zdGFuY2Uuc2V0Q29tcG9uZW50UmVmKGNvbXBvbmVudFJlZik7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXRNb2RhbFNlcnZpY2UodGhpcyk7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXRNb2RhbEluc3RhbmNlKG1vZGFsSW5zdGFuY2UpO1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcblxuICAgICAgICAvLyBpbnNlcnQgdmlldyBvbiBzY3JlZW4uXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5pbnNlcnQoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAvLyByZXR1cm4gdGhlIHByb21pc2UuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIG1vZGFsIGZyb20gdGhlIHN0YWNrIG9mIG1vZGFsIGluc3RhbmNlcy5cbiAgICAgKiBAcGFyYW0gbW9kYWxJbnN0YW5jZSB0aGUgbW9kYWwgdGhhdCB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmU8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+KG1vZGFsSW5zdGFuY2U6IE1vZGFsSW5zdGFuY2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+KTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5tb2RhbEluc3RhbmNlcy5yZW1vdmUobW9kYWxJbnN0YW5jZSk7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5yZW1vdmUodGhpcy52aWV3Q29udGFpbmVyLmluZGV4T2YobW9kYWxJbnN0YW5jZS5jb21wb25lbnRSZWYuaG9zdFZpZXcpKTtcbiAgICB9XG59XG4iXX0=