UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

121 lines 16.1 kB
import { TranslateDirective, TranslateService } from '@ngx-translate/core'; import { ChangeDetectorRef, Directive, ElementRef, EventEmitter } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; export class C8yTranslateDirective extends TranslateDirective { /** * Used to get private element property from TranslateDirective, so it doesn't throw tsErrors */ get _elementRef() { return this.element; } /** * Used to get private translateService property from TranslateDirective, so it doesn't throw tsErrors */ get _translateService() { return this.translateService; } constructor(translateService, element, _ref) { super(translateService, element, _ref); /** * Used to trigger events when html is replaced by directive. */ this.htmlUpdateEvent = new EventEmitter(); this.destroy$ = new Subject(); this.elementTranslated = false; translateService.onLangChange.pipe(takeUntil(this.destroy$)).subscribe(() => { if (!this.htmlMode) { element.nativeElement.innerHTML = this.initialValue; this.setTranslatedStatus(false); _ref.detectChanges(); } }); } /** * Overridden method from original directive. * For simple text nodes, it just invokes the base method. * For complex nodes, it builds translation key from whole inner HTML * and replaces it with its translation. * This prevents splitting HTML into pieces and attempting to translate each one separately * which doesn't work, because we extract strings in whole. */ checkNodes(forceUpdate = false, translations) { if (!this.htmlMode && (this.isElementSimpleTextType() || this.isElementInnerHtmlEmpty())) { /** * If element does not contain complex html, then fallBack to default logic. */ if (!this.elementTranslated) { super.checkNodes(forceUpdate, translations); this.setTranslatedStatus(true); } } else { this.htmlMode = true; if (this.isLookupKeyMissing()) { this._elementRef.nativeElement.lookupKey = this.getLookupKey(); } if (this.lookupKeyExist()) { const newTranslation = this.getNewTranslation(); if (!this.lastTranslation || this.lastTranslation !== newTranslation) { this.lastTranslation = newTranslation; this.updateHtmlContent(); this.htmlUpdateEvent.emit(); } } } } ngOnChanges(changes) { if (changes && changes.translateParams) { this.setTranslatedStatus(false); } } ngOnDestroy() { this.htmlUpdateEvent.complete(); this.destroy$.next(); this.destroy$.complete(); super.ngOnDestroy(); } ngAfterViewInit() { this.initialValue = this._elementRef.nativeElement.innerHTML; } setTranslatedStatus(status) { this.elementTranslated = status; } /** * Builds lookup key from innerHTML, removes comments (that might be added by Angular) and trims it. */ getLookupKey() { return this._elementRef.nativeElement.innerHTML.replace(/<!--.*?-->/gs, '').trim(); } isElementSimpleTextType() { return (this._elementRef.nativeElement.childNodes.length === 1 && this._elementRef.nativeElement.childNodes[0].nodeType === 3); } isElementInnerHtmlEmpty() { return !this._elementRef.nativeElement.innerHTML; } isLookupKeyMissing() { return !this._elementRef.nativeElement.lookupKey; } lookupKeyExist() { return this._elementRef.nativeElement.lookupKey; } getNewTranslation() { return this._translateService.instant(this._elementRef.nativeElement.lookupKey, this.currentParams || {}); } updateHtmlContent() { this._elementRef.nativeElement.innerHTML = this.lastTranslation; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C8yTranslateDirective, deps: [{ token: i1.TranslateService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: C8yTranslateDirective, isStandalone: true, selector: "[translate],[ngx-translate]", usesInheritance: true, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C8yTranslateDirective, decorators: [{ type: Directive, args: [{ selector: '[translate],[ngx-translate]', standalone: true }] }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYzh5LXRyYW5zbGF0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2kxOG4vYzh5LXRyYW5zbGF0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0UsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFJYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBTTNDLE1BQU0sT0FBTyxxQkFDWCxTQUFRLGtCQUFrQjtJQUcxQjs7T0FFRztJQUNILElBQVksV0FBVztRQUNyQixPQUFRLElBQVksQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBWSxpQkFBaUI7UUFDM0IsT0FBUSxJQUFZLENBQUMsZ0JBQWdCLENBQUM7SUFDeEMsQ0FBQztJQXVCRCxZQUFZLGdCQUFrQyxFQUFFLE9BQW1CLEVBQUUsSUFBdUI7UUFDMUYsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQXRCekM7O1dBRUc7UUFDSCxvQkFBZSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBZS9ELGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUt4QixnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsVUFBVSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsWUFBa0I7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekY7O2VBRUc7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVCLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pFLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxjQUFjLEVBQUUsQ0FBQztvQkFDckUsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDL0QsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQWU7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckYsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixPQUFPLENBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO0lBQ25ELENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNuRCxDQUFDO0lBRU8sY0FBYztRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNsRCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUN4QyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDbEUsQ0FBQzsrR0E1SVUscUJBQXFCO21HQUFyQixxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBSmpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNsYXRlRGlyZWN0aXZlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdHJhbnNsYXRlXSxbbmd4LXRyYW5zbGF0ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEM4eVRyYW5zbGF0ZURpcmVjdGl2ZVxuICBleHRlbmRzIFRyYW5zbGF0ZURpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gIC8qKlxuICAgKiBVc2VkIHRvIGdldCBwcml2YXRlIGVsZW1lbnQgcHJvcGVydHkgZnJvbSBUcmFuc2xhdGVEaXJlY3RpdmUsIHNvIGl0IGRvZXNuJ3QgdGhyb3cgdHNFcnJvcnNcbiAgICovXG4gIHByaXZhdGUgZ2V0IF9lbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYge1xuICAgIHJldHVybiAodGhpcyBhcyBhbnkpLmVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBnZXQgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlIHByb3BlcnR5IGZyb20gVHJhbnNsYXRlRGlyZWN0aXZlLCBzbyBpdCBkb2Vzbid0IHRocm93IHRzRXJyb3JzXG4gICAqL1xuICBwcml2YXRlIGdldCBfdHJhbnNsYXRlU2VydmljZSgpOiBUcmFuc2xhdGVTZXJ2aWNlIHtcbiAgICByZXR1cm4gKHRoaXMgYXMgYW55KS50cmFuc2xhdGVTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gdHJpZ2dlciBldmVudHMgd2hlbiBodG1sIGlzIHJlcGxhY2VkIGJ5IGRpcmVjdGl2ZS5cbiAgICovXG4gIGh0bWxVcGRhdGVFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgZGlyZWN0aXZlIHN1Y2Nlc3NmdWxseSB0cmFuc2xhdGVzIG5vZGUsIGl0IHN0b3JlcyBpdHMgdmFsdWUgaW4gdGhpcyBwcm9wZXJ0eS5cbiAgICogQW5vdGhlciB0cmFuc2xhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBvbmx5IGlmIG5ldyB0cmFuc2xhdGlvbiB2YWx1ZSBkaWZmZXJzIGZyb20gc3RvcmVkIG9uZS5cbiAgICovXG4gIGxhc3RUcmFuc2xhdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgZGlyZWN0aXZlIGVuY291bnRlcnMgZWxlbWVudCB0aGF0IGlzIEhUTUwsIGl0IHNob3VsZCBzd2l0Y2ggdG8gSHRtbCBtb2RlIGV2ZW4gaWZcbiAgICogbmV3IHRyYW5zbGF0ZWQgZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGFueSBIVE1MLlxuICAgKi9cbiAgaHRtbE1vZGU6IGJvb2xlYW47XG5cbiAgaW5pdGlhbFZhbHVlOiBzdHJpbmc7XG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgZWxlbWVudFRyYW5zbGF0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLCBlbGVtZW50OiBFbGVtZW50UmVmLCBfcmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKHRyYW5zbGF0ZVNlcnZpY2UsIGVsZW1lbnQsIF9yZWYpO1xuXG4gICAgdHJhbnNsYXRlU2VydmljZS5vbkxhbmdDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaHRtbE1vZGUpIHtcbiAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuaW5pdGlhbFZhbHVlO1xuICAgICAgICB0aGlzLnNldFRyYW5zbGF0ZWRTdGF0dXMoZmFsc2UpO1xuICAgICAgICBfcmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZGVuIG1ldGhvZCBmcm9tIG9yaWdpbmFsIGRpcmVjdGl2ZS5cbiAgICogRm9yIHNpbXBsZSB0ZXh0IG5vZGVzLCBpdCBqdXN0IGludm9rZXMgdGhlIGJhc2UgbWV0aG9kLlxuICAgKiBGb3IgY29tcGxleCBub2RlcywgaXQgYnVpbGRzIHRyYW5zbGF0aW9uIGtleSBmcm9tIHdob2xlIGlubmVyIEhUTUxcbiAgICogYW5kIHJlcGxhY2VzIGl0IHdpdGggaXRzIHRyYW5zbGF0aW9uLlxuICAgKiBUaGlzIHByZXZlbnRzIHNwbGl0dGluZyBIVE1MIGludG8gcGllY2VzIGFuZCBhdHRlbXB0aW5nIHRvIHRyYW5zbGF0ZSBlYWNoIG9uZSBzZXBhcmF0ZWx5XG4gICAqIHdoaWNoIGRvZXNuJ3Qgd29yaywgYmVjYXVzZSB3ZSBleHRyYWN0IHN0cmluZ3MgaW4gd2hvbGUuXG4gICAqL1xuICBjaGVja05vZGVzKGZvcmNlVXBkYXRlID0gZmFsc2UsIHRyYW5zbGF0aW9ucz86IGFueSkge1xuICAgIGlmICghdGhpcy5odG1sTW9kZSAmJiAodGhpcy5pc0VsZW1lbnRTaW1wbGVUZXh0VHlwZSgpIHx8IHRoaXMuaXNFbGVtZW50SW5uZXJIdG1sRW1wdHkoKSkpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGNvbXBsZXggaHRtbCwgdGhlbiBmYWxsQmFjayB0byBkZWZhdWx0IGxvZ2ljLlxuICAgICAgICovXG4gICAgICBpZiAoIXRoaXMuZWxlbWVudFRyYW5zbGF0ZWQpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tOb2Rlcyhmb3JjZVVwZGF0ZSwgdHJhbnNsYXRpb25zKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2xhdGVkU3RhdHVzKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmh0bWxNb2RlID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmlzTG9va3VwS2V5TWlzc2luZygpKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5sb29rdXBLZXkgPSB0aGlzLmdldExvb2t1cEtleSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubG9va3VwS2V5RXhpc3QoKSkge1xuICAgICAgICBjb25zdCBuZXdUcmFuc2xhdGlvbiA9IHRoaXMuZ2V0TmV3VHJhbnNsYXRpb24oKTtcbiAgICAgICAgaWYgKCF0aGlzLmxhc3RUcmFuc2xhdGlvbiB8fCB0aGlzLmxhc3RUcmFuc2xhdGlvbiAhPT0gbmV3VHJhbnNsYXRpb24pIHtcbiAgICAgICAgICB0aGlzLmxhc3RUcmFuc2xhdGlvbiA9IG5ld1RyYW5zbGF0aW9uO1xuICAgICAgICAgIHRoaXMudXBkYXRlSHRtbENvbnRlbnQoKTtcbiAgICAgICAgICB0aGlzLmh0bWxVcGRhdGVFdmVudC5lbWl0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy50cmFuc2xhdGVQYXJhbXMpIHtcbiAgICAgIHRoaXMuc2V0VHJhbnNsYXRlZFN0YXR1cyhmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5odG1sVXBkYXRlRXZlbnQuY29tcGxldGUoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gIH1cblxuICBzZXRUcmFuc2xhdGVkU3RhdHVzKHN0YXR1czogYm9vbGVhbikge1xuICAgIHRoaXMuZWxlbWVudFRyYW5zbGF0ZWQgPSBzdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGxvb2t1cCBrZXkgZnJvbSBpbm5lckhUTUwsIHJlbW92ZXMgY29tbWVudHMgKHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgQW5ndWxhcikgYW5kIHRyaW1zIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb29rdXBLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbm5lckhUTUwucmVwbGFjZSgvPCEtLS4qPy0tPi9ncywgJycpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNFbGVtZW50U2ltcGxlVGV4dFR5cGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgPT09IDNcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0VsZW1lbnRJbm5lckh0bWxFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gIH1cblxuICBwcml2YXRlIGlzTG9va3VwS2V5TWlzc2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5sb29rdXBLZXk7XG4gIH1cblxuICBwcml2YXRlIGxvb2t1cEtleUV4aXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQubG9va3VwS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROZXdUcmFuc2xhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQubG9va3VwS2V5LFxuICAgICAgdGhpcy5jdXJyZW50UGFyYW1zIHx8IHt9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSHRtbENvbnRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMubGFzdFRyYW5zbGF0aW9uO1xuICB9XG59XG4iXX0=