@ngneat/transloco
Version:
The internationalization (i18n) library for Angular
310 lines • 25.4 kB
JavaScript
/**
* @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=