UNPKG

@dotcms/angular

Version:

Official Angular Components library to render a dotCMS page.

100 lines 14.1 kB
import { AsyncPipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, DestroyRef, Input, inject } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ActivatedRoute } from '@angular/router'; import { CLIENT_ACTIONS, DotCmsClient, initEditor, isInsideEditor, postMessageToEditor, updateNavigation } from '@dotcms/client'; import { PageContextService } from '../../services/dotcms-context/page-context.service'; import { RowComponent } from '../row/row.component'; import * as i0 from "@angular/core"; /** * `DotcmsLayoutComponent` is a class that represents the layout for a DotCMS page. * It includes a `pageAsset` property that represents the DotCMS page asset and a `components` property that represents the dynamic components for the page. * * @export * @class DotcmsLayoutComponent */ export class DotcmsLayoutComponent { constructor() { this.route = inject(ActivatedRoute); this.pageContextService = inject(PageContextService); this.destroyRef$ = inject(DestroyRef); this.pageAsset$ = this.pageContextService.currentPage$; } /** * Represents the DotCMS page asset. * * @type {DotCMSPageAsset} * @memberof DotcmsLayoutComponent */ set pageAsset(value) { this._pageAsset = value; if (!value.layout) { console.warn('Warning: pageAsset does not have a `layout` property. Might be using an advaced template or your dotCMS instance not have a enterprise license.'); } } /** * Returns the DotCMS page asset. * * @readonly * @type {DotCMSPageAsset} * @memberof DotcmsLayoutComponent */ get pageAsset() { return this._pageAsset; } ngOnInit() { this.pageContextService.setContext(this.pageAsset, this.components); if (!isInsideEditor()) { return; } this.client = DotCmsClient.instance; this.route.url.pipe(takeUntilDestroyed(this.destroyRef$)).subscribe((urlSegments) => { const pathname = '/' + urlSegments.join('/'); initEditor({ pathname }); updateNavigation(pathname || '/'); }); this.client.editor.on('changes', (data) => { if (this.onReload) { this.onReload(); return; } this.pageContextService.setPageAsset(data); }); postMessageToEditor({ action: CLIENT_ACTIONS.CLIENT_READY, payload: this.editor }); } ngOnDestroy() { if (!isInsideEditor()) { return; } this.client.editor.off('changes'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: DotcmsLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: DotcmsLayoutComponent, isStandalone: true, selector: "dotcms-layout", inputs: { pageAsset: "pageAsset", components: "components", onReload: "onReload", editor: "editor" }, ngImport: i0, template: ` @if (pageAsset$ | async; as page) { @for (row of page?.layout?.body?.rows; track $index) { <dotcms-row [row]="row" /> } } `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: RowComponent, selector: "dotcms-row", inputs: ["row"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: DotcmsLayoutComponent, decorators: [{ type: Component, args: [{ selector: 'dotcms-layout', standalone: true, imports: [RowComponent, AsyncPipe], template: ` @if (pageAsset$ | async; as page) { @for (row of page?.layout?.body?.rows; track $index) { <dotcms-row [row]="row" /> } } `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}\n"] }] }], propDecorators: { pageAsset: [{ type: Input, args: [{ required: true }] }], components: [{ type: Input, args: [{ required: true }] }], onReload: [{ type: Input }], editor: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90Y21zLWxheW91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9hbmd1bGFyL3NyYy9saWIvbGF5b3V0L2RvdGNtcy1sYXlvdXQvZG90Y21zLWxheW91dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBRUwsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQ0gsY0FBYyxFQUNkLFlBQVksRUFFWixVQUFVLEVBQ1YsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDbkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBRXBEOzs7Ozs7R0FNRztBQWVILE1BQU0sT0FBTyxxQkFBcUI7SUFkbEM7UUEwRXFCLFVBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0IsdUJBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEQsZ0JBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFL0IsZUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7S0FxQ3hFO0lBbEdHOzs7OztPQUtHO0lBQ0gsSUFDSSxTQUFTLENBQUMsS0FBc0I7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsSUFBSSxDQUNSLGlKQUFpSixDQUNwSixDQUFDO1FBQ04sQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLFNBQVM7UUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQXNDRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUNwQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDaEYsTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFN0MsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6QixnQkFBZ0IsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFaEIsT0FBTztZQUNYLENBQUM7WUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLElBQXVCLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztRQUVILG1CQUFtQixDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDcEIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQzs4R0FwR1EscUJBQXFCO2tHQUFyQixxQkFBcUIsK0tBVnBCOzs7Ozs7S0FNVCxnR0FQUyxZQUFZLG1FQUFFLFNBQVM7OzJGQVd4QixxQkFBcUI7a0JBZGpDLFNBQVM7K0JBQ0ksZUFBZSxjQUNiLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsWUFDeEI7Ozs7OztLQU1ULG1CQUVnQix1QkFBdUIsQ0FBQyxNQUFNOzhCQVkzQyxTQUFTO3NCQURaLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQTRCRSxVQUFVO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFRaEIsUUFBUTtzQkFBaEIsS0FBSztnQkFhRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRGVzdHJveVJlZixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1xuICAgIENMSUVOVF9BQ1RJT05TLFxuICAgIERvdENtc0NsaWVudCxcbiAgICBFZGl0b3JDb25maWcsXG4gICAgaW5pdEVkaXRvcixcbiAgICBpc0luc2lkZUVkaXRvcixcbiAgICBwb3N0TWVzc2FnZVRvRWRpdG9yLFxuICAgIHVwZGF0ZU5hdmlnYXRpb25cbn0gZnJvbSAnQGRvdGNtcy9jbGllbnQnO1xuXG5pbXBvcnQgeyBEb3RDTVNQYWdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IERvdENNU1BhZ2VBc3NldCB9IGZyb20gJy4uLy4uL21vZGVscy9kb3RjbXMubW9kZWwnO1xuaW1wb3J0IHsgUGFnZUNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZG90Y21zLWNvbnRleHQvcGFnZS1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUm93Q29tcG9uZW50IH0gZnJvbSAnLi4vcm93L3Jvdy5jb21wb25lbnQnO1xuXG4vKipcbiAqIGBEb3RjbXNMYXlvdXRDb21wb25lbnRgIGlzIGEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBsYXlvdXQgZm9yIGEgRG90Q01TIHBhZ2UuXG4gKiAgSXQgaW5jbHVkZXMgYSBgcGFnZUFzc2V0YCBwcm9wZXJ0eSB0aGF0IHJlcHJlc2VudHMgdGhlIERvdENNUyBwYWdlIGFzc2V0IGFuZCBhIGBjb21wb25lbnRzYCBwcm9wZXJ0eSB0aGF0IHJlcHJlc2VudHMgdGhlIGR5bmFtaWMgY29tcG9uZW50cyBmb3IgdGhlIHBhZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERvdGNtc0xheW91dENvbXBvbmVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2RvdGNtcy1sYXlvdXQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1Jvd0NvbXBvbmVudCwgQXN5bmNQaXBlXSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICBAaWYgKHBhZ2VBc3NldCQgfCBhc3luYzsgYXMgcGFnZSkge1xuICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2U/LmxheW91dD8uYm9keT8ucm93czsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRvdGNtcy1yb3cgW3Jvd109XCJyb3dcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgYCxcbiAgICBzdHlsZVVybDogJy4vZG90Y21zLWxheW91dC5jb21wb25lbnQuY3NzJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEb3RjbXNMYXlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHByaXZhdGUgX3BhZ2VBc3NldCE6IERvdENNU1BhZ2VBc3NldDtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgdGhlIERvdENNUyBwYWdlIGFzc2V0LlxuICAgICAqXG4gICAgICogQHR5cGUge0RvdENNU1BhZ2VBc3NldH1cbiAgICAgKiBAbWVtYmVyb2YgRG90Y21zTGF5b3V0Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICBzZXQgcGFnZUFzc2V0KHZhbHVlOiBEb3RDTVNQYWdlQXNzZXQpIHtcbiAgICAgICAgdGhpcy5fcGFnZUFzc2V0ID0gdmFsdWU7XG4gICAgICAgIGlmICghdmFsdWUubGF5b3V0KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ1dhcm5pbmc6IHBhZ2VBc3NldCBkb2VzIG5vdCBoYXZlIGEgYGxheW91dGAgcHJvcGVydHkuIE1pZ2h0IGJlIHVzaW5nIGFuIGFkdmFjZWQgdGVtcGxhdGUgb3IgeW91ciBkb3RDTVMgaW5zdGFuY2Ugbm90IGhhdmUgYSBlbnRlcnByaXNlIGxpY2Vuc2UuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIERvdENNUyBwYWdlIGFzc2V0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge0RvdENNU1BhZ2VBc3NldH1cbiAgICAgKiBAbWVtYmVyb2YgRG90Y21zTGF5b3V0Q29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IHBhZ2VBc3NldCgpOiBEb3RDTVNQYWdlQXNzZXQge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnZUFzc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgY29tcG9uZW50c2AgcHJvcGVydHkgaXMgYSByZWNvcmQgb2YgZHluYW1pYyBjb21wb25lbnRzIGZvciBlYWNoIENvbnRlbnRsZXQgb24gdGhlIHBhZ2UuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7RG90Q01TUGFnZUNvbXBvbmVudH1cbiAgICAgKiBAbWVtYmVyb2YgRG90Y21zTGF5b3V0Q29tcG9uZW50XG4gICAgICogQHJlcXVpcmVkXG4gICAgICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgY29tcG9uZW50cyE6IERvdENNU1BhZ2VDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYG9uUmVsb2FkYCBwcm9wZXJ0eSBpcyBhIGZ1bmN0aW9uIHRoYXQgcmVsb2FkcyB0aGUgcGFnZSBhZnRlciBjaGFuZ2VzIGFyZSBtYWRlLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIERvdGNtc0xheW91dENvbXBvbmVudFxuICAgICAqIEBkZXByZWNhdGVkIEluIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiB3ZSB3aWxsIGJlIGxpc3RlbmluZyBmb3IgdGhlIGNoYW5nZXMgZnJvbSB0aGUgZWRpdG9yIHRvIHVwZGF0ZSB0aGUgcGFnZSBzdGF0ZSBzbyByZWxvYWQgd2lsbCBub3QgYmUgbmVlZGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIG9uUmVsb2FkITogKCkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHR5cGUge0RvdENNU0ZldGNoQ29uZmlnfVxuICAgICAqIEBtZW1iZXJvZiBEb3RDTVNQYWdlRWRpdG9yQ29uZmlnXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSBjb25maWd1cmF0aW9uIGN1c3RvbSBwYXJhbXMgZm9yIGRhdGEgZmV0Y2hpbmcgb24gRWRpdCBNb2RlLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkV4YW1wbGUgd2l0aCBDdXN0b20gR3JhcGhRTCBxdWVyeTwvY2FwdGlvbj5cbiAgICAgKiA8ZG90Y21zLWxheW91dCBbZWRpdG9yXT1cInsgcXVlcnk6ICdxdWVyeSB7IC4uLiB9JyB9XCIvPlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+RXhhbXBsZSB1c2FnZSB3aXRoIEN1c3RvbSBQYWdlIEFQSSBwYXJhbWV0ZXJzPC9jYXB0aW9uPlxuICAgICAqIDxkb3RjbXMtbGF5b3V0IFtlZGl0b3JdPVwieyBwYXJhbXM6IHsgZGVwdGg6ICcyJyB9IH1cIi8+O1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGVkaXRvciE6IEVkaXRvckNvbmZpZztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZUNvbnRleHRTZXJ2aWNlID0gaW5qZWN0KFBhZ2VDb250ZXh0U2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmJCA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIGNsaWVudCE6IERvdENtc0NsaWVudDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFnZUFzc2V0JCA9IHRoaXMucGFnZUNvbnRleHRTZXJ2aWNlLmN1cnJlbnRQYWdlJDtcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnBhZ2VDb250ZXh0U2VydmljZS5zZXRDb250ZXh0KHRoaXMucGFnZUFzc2V0LCB0aGlzLmNvbXBvbmVudHMpO1xuXG4gICAgICAgIGlmICghaXNJbnNpZGVFZGl0b3IoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGllbnQgPSBEb3RDbXNDbGllbnQuaW5zdGFuY2U7XG4gICAgICAgIHRoaXMucm91dGUudXJsLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiQpKS5zdWJzY3JpYmUoKHVybFNlZ21lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9ICcvJyArIHVybFNlZ21lbnRzLmpvaW4oJy8nKTtcblxuICAgICAgICAgICAgaW5pdEVkaXRvcih7IHBhdGhuYW1lIH0pO1xuICAgICAgICAgICAgdXBkYXRlTmF2aWdhdGlvbihwYXRobmFtZSB8fCAnLycpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNsaWVudC5lZGl0b3Iub24oJ2NoYW5nZXMnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub25SZWxvYWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVsb2FkKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGFnZUNvbnRleHRTZXJ2aWNlLnNldFBhZ2VBc3NldChkYXRhIGFzIERvdENNU1BhZ2VBc3NldCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBvc3RNZXNzYWdlVG9FZGl0b3IoeyBhY3Rpb246IENMSUVOVF9BQ1RJT05TLkNMSUVOVF9SRUFEWSwgcGF5bG9hZDogdGhpcy5lZGl0b3IgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghaXNJbnNpZGVFZGl0b3IoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGllbnQuZWRpdG9yLm9mZignY2hhbmdlcycpO1xuICAgIH1cbn1cbiJdfQ==