UNPKG

@ngneat/transloco

Version:

The internationalization (i18n) library for Angular

310 lines 25.4 kB
/** * @fileoverview added by tsickle * Generated from: lib/transloco.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectorRef, Directive, ElementRef, Inject, Input, Optional, TemplateRef, ViewContainerRef } from '@angular/core'; import { forkJoin } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { TemplateHandler } from './template-handler'; import { TRANSLOCO_LANG } from './transloco-lang'; import { TRANSLOCO_LOADING_TEMPLATE } from './transloco-loading-template'; import { TRANSLOCO_SCOPE } from './transloco-scope'; import { TranslocoService } from './transloco.service'; import { listenOrNotOperator, resolveInlineLoader, shouldListenToLangChanges } from './shared'; import { LangResolver } from './lang-resolver'; import { ScopeResolver } from './scope-resolver'; export class TranslocoDirective { /** * @param {?} translocoService * @param {?} tpl * @param {?} providerScope * @param {?} providerLang * @param {?} providedLoadingTpl * @param {?} vcr * @param {?} cdr * @param {?} host */ constructor(translocoService, tpl, providerScope, providerLang, providedLoadingTpl, vcr, cdr, host) { this.translocoService = translocoService; this.tpl = tpl; this.providerScope = providerScope; this.providerLang = providerLang; this.providedLoadingTpl = providedLoadingTpl; this.vcr = vcr; this.cdr = cdr; this.host = host; this.translationMemo = {}; this.params = {}; this.loaderTplHandler = null; // Whether we already rendered the view once this.initialized = false; this.langResolver = new LangResolver(); this.scopeResolver = new ScopeResolver(this.translocoService); } /** * @return {?} */ ngOnInit() { /** @type {?} */ const listenToLangChange = shouldListenToLangChanges(this.translocoService, this.providerLang || this.inlineLang); this.subscription = this.translocoService.langChanges$ .pipe(switchMap((/** * @param {?} activeLang * @return {?} */ activeLang => { /** @type {?} */ const lang = this.langResolver.resolve({ inline: this.inlineLang, provider: this.providerLang, active: activeLang }); return Array.isArray(this.providerScope) ? forkJoin(((/** @type {?} */ (this.providerScope))).map((/** * @param {?} providerScope * @return {?} */ providerScope => this.resolveScope(lang, providerScope)))) : this.resolveScope(lang, this.providerScope); })), listenOrNotOperator(listenToLangChange)) .subscribe((/** * @return {?} */ () => { this.currentLang = this.langResolver.resolveLangBasedOnScope(this.path); this.tpl === null ? this.simpleStrategy() : this.structuralStrategy(this.currentLang, this.inlineRead); this.cdr.markForCheck(); this.initialized = true; })); /** @type {?} */ const loadingTpl = this.getLoadingTpl(); if (!this.initialized && loadingTpl) { this.loaderTplHandler = new TemplateHandler(loadingTpl, this.vcr); this.loaderTplHandler.attachView(); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { // We need to support dynamic keys/params, so if this is not the first change CD cycle // we need to run the function again in order to update the value /** @type {?} */ const notInit = Object.keys(changes).some((/** * @param {?} v * @return {?} */ v => changes[v].firstChange === false)); notInit && this.simpleStrategy(); } /** * @private * @return {?} */ simpleStrategy() { this.detachLoader(); this.host.nativeElement.innerText = this.translocoService.translate(this.key, this.params, this.currentLang); } /** * @private * @param {?} lang * @param {?} read * @return {?} */ structuralStrategy(lang, read) { this.translationMemo = {}; if (this.view) { // when the lang changes we need to change the reference so Angular will update the view this.view.context['$implicit'] = this.getTranslateFn(lang, read); this.view.context['currentLang'] = this.currentLang; } else { this.detachLoader(); this.view = this.vcr.createEmbeddedView(this.tpl, { $implicit: this.getTranslateFn(lang, read), currentLang: this.currentLang }); } } /** * @protected * @param {?} lang * @param {?} read * @return {?} */ getTranslateFn(lang, read) { return (/** * @param {?} key * @param {?} params * @return {?} */ (key, params) => { /** @type {?} */ const withRead = read ? `${read}.${key}` : key; /** @type {?} */ const withParams = params ? `${withRead}${JSON.stringify(params)}` : withRead; if (this.translationMemo.hasOwnProperty(withParams)) { return this.translationMemo[withParams].value; } this.translationMemo[withParams] = { params, value: this.translocoService.translate(withRead, params, lang) }; return this.translationMemo[withParams].value; }); } /** * @private * @return {?} */ getLoadingTpl() { return this.inlineTpl || this.providedLoadingTpl; } /** * @return {?} */ ngOnDestroy() { this.subscription && this.subscription.unsubscribe(); } /** * @private * @return {?} */ detachLoader() { this.loaderTplHandler && this.loaderTplHandler.detachView(); } /** * @private * @param {?} lang * @param {?} providerScope * @return {?} */ resolveScope(lang, providerScope) { /** @type {?} */ let resolvedScope = this.scopeResolver.resolve({ inline: this.inlineScope, provider: providerScope }); this.path = this.langResolver.resolveLangPath(lang, resolvedScope); /** @type {?} */ const inlineLoader = resolveInlineLoader(providerScope, resolvedScope); return this.translocoService._loadDependencies(this.path, inlineLoader); } } TranslocoDirective.decorators = [ { type: Directive, args: [{ selector: '[transloco]' },] } ]; /** @nocollapse */ TranslocoDirective.ctorParameters = () => [ { type: TranslocoService }, { type: TemplateRef, decorators: [{ type: Optional }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [TRANSLOCO_SCOPE,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [TRANSLOCO_LANG,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [TRANSLOCO_LOADING_TEMPLATE,] }] }, { type: ViewContainerRef }, { type: ChangeDetectorRef }, { type: ElementRef } ]; TranslocoDirective.propDecorators = { key: [{ type: Input, args: ['transloco',] }], params: [{ type: Input, args: ['translocoParams',] }], inlineScope: [{ type: Input, args: ['translocoScope',] }], inlineRead: [{ type: Input, args: ['translocoRead',] }], inlineLang: [{ type: Input, args: ['translocoLang',] }], inlineTpl: [{ type: Input, args: ['translocoLoadingTpl',] }] }; if (false) { /** @type {?} */ TranslocoDirective.prototype.subscription; /** @type {?} */ TranslocoDirective.prototype.view; /** * @type {?} * @private */ TranslocoDirective.prototype.translationMemo; /** @type {?} */ TranslocoDirective.prototype.key; /** @type {?} */ TranslocoDirective.prototype.params; /** @type {?} */ TranslocoDirective.prototype.inlineScope; /** @type {?} */ TranslocoDirective.prototype.inlineRead; /** @type {?} */ TranslocoDirective.prototype.inlineLang; /** @type {?} */ TranslocoDirective.prototype.inlineTpl; /** * @type {?} * @private */ TranslocoDirective.prototype.currentLang; /** * @type {?} * @private */ TranslocoDirective.prototype.loaderTplHandler; /** * @type {?} * @private */ TranslocoDirective.prototype.initialized; /** * @type {?} * @private */ TranslocoDirective.prototype.path; /** * @type {?} * @private */ TranslocoDirective.prototype.langResolver; /** * @type {?} * @private */ TranslocoDirective.prototype.scopeResolver; /** * @type {?} * @private */ TranslocoDirective.prototype.translocoService; /** * @type {?} * @private */ TranslocoDirective.prototype.tpl; /** * @type {?} * @private */ TranslocoDirective.prototype.providerScope; /** * @type {?} * @private */ TranslocoDirective.prototype.providerLang; /** * @type {?} * @private */ TranslocoDirective.prototype.providedLoadingTpl; /** * @type {?} * @private */ TranslocoDirective.prototype.vcr; /** * @type {?} * @private */ TranslocoDirective.prototype.cdr; /** * @type {?} * @private */ TranslocoDirective.prototype.host; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZ25lYXQvdHJhbnNsb2NvLyIsInNvdXJjZXMiOlsibGliL3RyYW5zbG9jby5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBRVYsTUFBTSxFQUNOLEtBQUssRUFJTCxRQUFRLEVBQ1IsV0FBVyxFQUVYLGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFLakQsTUFBTSxPQUFPLGtCQUFrQjs7Ozs7Ozs7Ozs7SUFvQjdCLFlBQ1UsZ0JBQWtDLEVBQ3RCLEdBQTRGLEVBQ25FLGFBQXlDLEVBQzFDLFlBQTJCLEVBQ2Ysa0JBQXNDLEVBQ3RGLEdBQXFCLEVBQ3JCLEdBQXNCLEVBQ3RCLElBQWdCO1FBUGhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDdEIs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Q0FBNkI7Ozs7O0lBQzdCLGlDQUE4Qjs7Ozs7SUFDOUIsa0NBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRW1iZWRkZWRWaWV3UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUZW1wbGF0ZUhhbmRsZXIsIFZpZXcgfSBmcm9tICcuL3RlbXBsYXRlLWhhbmRsZXInO1xuaW1wb3J0IHsgVFJBTlNMT0NPX0xBTkcgfSBmcm9tICcuL3RyYW5zbG9jby1sYW5nJztcbmltcG9ydCB7IFRSQU5TTE9DT19MT0FESU5HX1RFTVBMQVRFIH0gZnJvbSAnLi90cmFuc2xvY28tbG9hZGluZy10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBUUkFOU0xPQ09fU0NPUEUgfSBmcm9tICcuL3RyYW5zbG9jby1zY29wZSc7XG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xvY28uc2VydmljZSc7XG5pbXBvcnQgeyBIYXNoTWFwLCBNYXliZUFycmF5LCBUcmFuc2xhdGlvbiwgVHJhbnNsb2NvU2NvcGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGxpc3Rlbk9yTm90T3BlcmF0b3IsIHJlc29sdmVJbmxpbmVMb2FkZXIsIHNob3VsZExpc3RlblRvTGFuZ0NoYW5nZXMgfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQgeyBMYW5nUmVzb2x2ZXIgfSBmcm9tICcuL2xhbmctcmVzb2x2ZXInO1xuaW1wb3J0IHsgU2NvcGVSZXNvbHZlciB9IGZyb20gJy4vc2NvcGUtcmVzb2x2ZXInO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdHJhbnNsb2NvXSdcbn0pXG5leHBvcnQgY2xhc3MgVHJhbnNsb2NvRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbDtcbiAgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG4gIHByaXZhdGUgdHJhbnNsYXRpb25NZW1vOiB7IFtrZXk6IHN0cmluZ106IHsgdmFsdWU6IGFueTsgcGFyYW1zOiBIYXNoTWFwIH0gfSA9IHt9O1xuXG4gIEBJbnB1dCgndHJhbnNsb2NvJykga2V5OiBzdHJpbmc7XG4gIEBJbnB1dCgndHJhbnNsb2NvUGFyYW1zJykgcGFyYW1zOiBIYXNoTWFwID0ge307XG4gIEBJbnB1dCgndHJhbnNsb2NvU2NvcGUnKSBpbmxpbmVTY29wZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoJ3RyYW5zbG9jb1JlYWQnKSBpbmxpbmVSZWFkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgndHJhbnNsb2NvTGFuZycpIGlubGluZUxhbmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCd0cmFuc2xvY29Mb2FkaW5nVHBsJykgaW5saW5lVHBsOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY3VycmVudExhbmc6IHN0cmluZztcbiAgcHJpdmF0ZSBsb2FkZXJUcGxIYW5kbGVyOiBUZW1wbGF0ZUhhbmRsZXIgPSBudWxsO1xuICAvLyBXaGV0aGVyIHdlIGFscmVhZHkgcmVuZGVyZWQgdGhlIHZpZXcgb25jZVxuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgcGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGxhbmdSZXNvbHZlciA9IG5ldyBMYW5nUmVzb2x2ZXIoKTtcbiAgcHJpdmF0ZSBzY29wZVJlc29sdmVyID0gbmV3IFNjb3BlUmVzb2x2ZXIodGhpcy50cmFuc2xvY29TZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRyYW5zbG9jb1NlcnZpY2U6IFRyYW5zbG9jb1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB0cGw6IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiAoa2V5OiBzdHJpbmcsIHBhcmFtcz86IEhhc2hNYXApID0+IGFueTsgY3VycmVudExhbmc6IHN0cmluZyB9PixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRSQU5TTE9DT19TQ09QRSkgcHJpdmF0ZSBwcm92aWRlclNjb3BlOiBNYXliZUFycmF5PFRyYW5zbG9jb1Njb3BlPixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRSQU5TTE9DT19MQU5HKSBwcml2YXRlIHByb3ZpZGVyTGFuZzogc3RyaW5nIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRSQU5TTE9DT19MT0FESU5HX1RFTVBMQVRFKSBwcml2YXRlIHByb3ZpZGVkTG9hZGluZ1RwbDogVHlwZTxhbnk+IHwgc3RyaW5nLFxuICAgIHByaXZhdGUgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGxpc3RlblRvTGFuZ0NoYW5nZSA9IHNob3VsZExpc3RlblRvTGFuZ0NoYW5nZXModGhpcy50cmFuc2xvY29TZXJ2aWNlLCB0aGlzLnByb3ZpZGVyTGFuZyB8fCB0aGlzLmlubGluZUxhbmcpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnRyYW5zbG9jb1NlcnZpY2UubGFuZ0NoYW5nZXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKGFjdGl2ZUxhbmcgPT4ge1xuICAgICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmdSZXNvbHZlci5yZXNvbHZlKHtcbiAgICAgICAgICAgIGlubGluZTogdGhpcy5pbmxpbmVMYW5nLFxuICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXMucHJvdmlkZXJMYW5nLFxuICAgICAgICAgICAgYWN0aXZlOiBhY3RpdmVMYW5nXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLnByb3ZpZGVyU2NvcGUpXG4gICAgICAgICAgICA/IGZvcmtKb2luKFxuICAgICAgICAgICAgICAgICg8VHJhbnNsb2NvU2NvcGVbXT50aGlzLnByb3ZpZGVyU2NvcGUpLm1hcChwcm92aWRlclNjb3BlID0+IHRoaXMucmVzb2x2ZVNjb3BlKGxhbmcsIHByb3ZpZGVyU2NvcGUpKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHRoaXMucmVzb2x2ZVNjb3BlKGxhbmcsIHRoaXMucHJvdmlkZXJTY29wZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBsaXN0ZW5Pck5vdE9wZXJhdG9yKGxpc3RlblRvTGFuZ0NoYW5nZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRMYW5nID0gdGhpcy5sYW5nUmVzb2x2ZXIucmVzb2x2ZUxhbmdCYXNlZE9uU2NvcGUodGhpcy5wYXRoKTtcbiAgICAgICAgdGhpcy50cGwgPT09IG51bGwgPyB0aGlzLnNpbXBsZVN0cmF0ZWd5KCkgOiB0aGlzLnN0cnVjdHVyYWxTdHJhdGVneSh0aGlzLmN1cnJlbnRMYW5nLCB0aGlzLmlubGluZVJlYWQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IGxvYWRpbmdUcGwgPSB0aGlzLmdldExvYWRpbmdUcGwoKTtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgJiYgbG9hZGluZ1RwbCkge1xuICAgICAgdGhpcy5sb2FkZXJUcGxIYW5kbGVyID0gbmV3IFRlbXBsYXRlSGFuZGxlcihsb2FkaW5nVHBsLCB0aGlzLnZjcik7XG4gICAgICB0aGlzLmxvYWRlclRwbEhhbmRsZXIuYXR0YWNoVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAvLyBXZSBuZWVkIHRvIHN1cHBvcnQgZHluYW1pYyBrZXlzL3BhcmFtcywgc28gaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGNoYW5nZSBDRCBjeWNsZVxuICAgIC8vIHdlIG5lZWQgdG8gcnVuIHRoZSBmdW5jdGlvbiBhZ2FpbiBpbiBvcmRlciB0byB1cGRhdGUgdGhlIHZhbHVlXG4gICAgY29uc3Qgbm90SW5pdCA9IE9iamVjdC5rZXlzKGNoYW5nZXMpLnNvbWUodiA9PiBjaGFuZ2VzW3ZdLmZpcnN0Q2hhbmdlID09PSBmYWxzZSk7XG4gICAgbm90SW5pdCAmJiB0aGlzLnNpbXBsZVN0cmF0ZWd5KCk7XG4gIH1cblxuICBwcml2YXRlIHNpbXBsZVN0cmF0ZWd5KCkge1xuICAgIHRoaXMuZGV0YWNoTG9hZGVyKCk7XG4gICAgdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQuaW5uZXJUZXh0ID0gdGhpcy50cmFuc2xvY29TZXJ2aWNlLnRyYW5zbGF0ZSh0aGlzLmtleSwgdGhpcy5wYXJhbXMsIHRoaXMuY3VycmVudExhbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHJ1Y3R1cmFsU3RyYXRlZ3kobGFuZzogc3RyaW5nLCByZWFkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnRyYW5zbGF0aW9uTWVtbyA9IHt9O1xuXG4gICAgaWYgKHRoaXMudmlldykge1xuICAgICAgLy8gd2hlbiB0aGUgbGFuZyBjaGFuZ2VzIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSByZWZlcmVuY2Ugc28gQW5ndWxhciB3aWxsIHVwZGF0ZSB0aGUgdmlld1xuICAgICAgdGhpcy52aWV3LmNvbnRleHRbJyRpbXBsaWNpdCddID0gdGhpcy5nZXRUcmFuc2xhdGVGbihsYW5nLCByZWFkKTtcbiAgICAgIHRoaXMudmlldy5jb250ZXh0WydjdXJyZW50TGFuZyddID0gdGhpcy5jdXJyZW50TGFuZztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZXRhY2hMb2FkZXIoKTtcbiAgICAgIHRoaXMudmlldyA9IHRoaXMudmNyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRwbCwge1xuICAgICAgICAkaW1wbGljaXQ6IHRoaXMuZ2V0VHJhbnNsYXRlRm4obGFuZywgcmVhZCksXG4gICAgICAgIGN1cnJlbnRMYW5nOiB0aGlzLmN1cnJlbnRMYW5nXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNsYXRlRm4obGFuZzogc3RyaW5nLCByZWFkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiAoa2V5OiBzdHJpbmcsIHBhcmFtcz86IEhhc2hNYXApID0+IGFueSB7XG4gICAgcmV0dXJuIChrZXk6IHN0cmluZywgcGFyYW1zOiBIYXNoTWFwKSA9PiB7XG4gICAgICBjb25zdCB3aXRoUmVhZCA9IHJlYWQgPyBgJHtyZWFkfS4ke2tleX1gIDoga2V5O1xuICAgICAgY29uc3Qgd2l0aFBhcmFtcyA9IHBhcmFtcyA/IGAke3dpdGhSZWFkfSR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX1gIDogd2l0aFJlYWQ7XG4gICAgICBpZiAodGhpcy50cmFuc2xhdGlvbk1lbW8uaGFzT3duUHJvcGVydHkod2l0aFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25NZW1vW3dpdGhQYXJhbXNdLnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2xhdGlvbk1lbW9bd2l0aFBhcmFtc10gPSB7XG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgdmFsdWU6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUod2l0aFJlYWQsIHBhcmFtcywgbGFuZylcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uTWVtb1t3aXRoUGFyYW1zXS52YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2FkaW5nVHBsKCk6IFZpZXcge1xuICAgIHJldHVybiB0aGlzLmlubGluZVRwbCB8fCB0aGlzLnByb3ZpZGVkTG9hZGluZ1RwbDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uICYmIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGRldGFjaExvYWRlcigpIHtcbiAgICB0aGlzLmxvYWRlclRwbEhhbmRsZXIgJiYgdGhpcy5sb2FkZXJUcGxIYW5kbGVyLmRldGFjaFZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVNjb3BlKGxhbmc6IHN0cmluZywgcHJvdmlkZXJTY29wZTogVHJhbnNsb2NvU2NvcGUpOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9uIHwgVHJhbnNsYXRpb25bXT4ge1xuICAgIGxldCByZXNvbHZlZFNjb3BlID0gdGhpcy5zY29wZVJlc29sdmVyLnJlc29sdmUoeyBpbmxpbmU6IHRoaXMuaW5saW5lU2NvcGUsIHByb3ZpZGVyOiBwcm92aWRlclNjb3BlIH0pO1xuICAgIHRoaXMucGF0aCA9IHRoaXMubGFuZ1Jlc29sdmVyLnJlc29sdmVMYW5nUGF0aChsYW5nLCByZXNvbHZlZFNjb3BlKTtcbiAgICBjb25zdCBpbmxpbmVMb2FkZXIgPSByZXNvbHZlSW5saW5lTG9hZGVyKHByb3ZpZGVyU2NvcGUsIHJlc29sdmVkU2NvcGUpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UuX2xvYWREZXBlbmRlbmNpZXModGhpcy5wYXRoLCBpbmxpbmVMb2FkZXIpO1xuICB9XG59XG4iXX0=