UNPKG

@ngez/core

Version:

A collection of minimalistic, easy-to-use and fully customizable Angular components, directives and services

231 lines 21.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Directive, ElementRef, Inject, PLATFORM_ID, Optional, Input, Output, EventEmitter } from "@angular/core"; import { WINDOW } from "../window/window.service"; import { DOCUMENT, isPlatformBrowser } from "@angular/common"; import { defaultConfig, defaultOffsetConfig } from "./models"; import { fromEvent, merge, of } from "rxjs"; export class NgEzInViewportDirective { /** * @param {?} element * @param {?} platformId * @param {?} window * @param {?} document */ constructor(element, platformId, window, document) { this.element = element; this.platformId = platformId; this.window = window; this.document = document; this.inViewportChange = new EventEmitter(); this.latest = { top: false, bottom: false, left: false, right: false, all: false, any: false }; } /** * @param {?} config * @return {?} */ set config(config) { this._config = config; } /** * @return {?} */ ngOnInit() { if (!isPlatformBrowser(this.platformId)) return; this.container = this.getClosestScrollableParent(this.element.nativeElement); //Check on scroll, window resize and oninit this.subscription = merge(fromEvent(this.isDocumentTheScrollableContainer() ? this.document : this.container, 'scroll'), fromEvent(this.window, 'resize'), of(null)) .subscribe(() => this.check()); } /** * @return {?} */ ngOnDestroy() { if (this.subscription) this.subscription.unsubscribe(); } /** * @return {?} */ get config() { const _a = this._config || {}, { offset = {} } = _a, config = tslib_1.__rest(_a, ["offset"]); return Object.assign({}, defaultConfig, config, { offset: Object.assign({}, defaultOffsetConfig, offset) }); } /** * @return {?} */ check() { /** @type {?} */ const previous = this.latest; /** @type {?} */ const current = this.calculateVisibility(); /** @type {?} */ const hasChanged = previous.top != current.top || previous.bottom != current.bottom || previous.left != current.left || previous.right != current.right; if (hasChanged) this.inViewportChange.emit(current); this.latest = current; return current; } /** * @private * @return {?} */ calculateVisibility() { /** @type {?} */ const elementRect = this.element.nativeElement.getBoundingClientRect(); /** @type {?} */ const height = elementRect.height; /** @type {?} */ const width = elementRect.width; /** @type {?} */ const containerRect = this.container.getBoundingClientRect(); /** @type {?} */ const top = elementRect.top - (this.isDocumentTheScrollableContainer() ? 0 : containerRect.top); /** @type {?} */ const bottom = top + height; /** @type {?} */ const left = elementRect.left - (this.isDocumentTheScrollableContainer() ? 0 : containerRect.left); /** @type {?} */ const right = left + width; /** @type {?} */ const containerHeight = this.container.clientHeight || this.window.innerHeight; /** @type {?} */ const containerWidth = this.container.clientWidth || this.window.innerWidth; /** @type {?} */ const topInView = top + this.config.offset.top >= 0 && top <= (containerHeight + this.config.offset.top); /** @type {?} */ const bottomInView = bottom + this.config.offset.bottom >= 0 && bottom <= (containerHeight + this.config.offset.bottom); /** @type {?} */ const leftInView = left + this.config.offset.left >= 0 && left <= (containerWidth + this.config.offset.left); /** @type {?} */ const rightInView = right + this.config.offset.right >= 0 && right <= (containerWidth + this.config.offset.right); return { top: topInView, bottom: bottomInView, left: leftInView && (topInView || bottomInView), right: rightInView && (topInView || bottomInView), any: (topInView || bottomInView) && (leftInView || rightInView), all: topInView && bottomInView && leftInView && rightInView }; } /** * @private * @param {?} node * @return {?} */ getClosestScrollableParent(node) { return !node || node === this.document.body ? this.document.documentElement : this.isScrollable(node) ? node : this.getClosestScrollableParent(node.parentNode); } /** * @private * @param {?} node * @return {?} */ isScrollable(node) { /** @type {?} */ const regex = /(auto|scroll)/; return regex.test(this.getComputedStyle(node, 'overflow') + this.getComputedStyle(node, 'overflow-y') + this.getComputedStyle(node, 'overflow-x')); } /** * @private * @param {?} node * @param {?} style * @return {?} */ getComputedStyle(node, style) { return this.window.getComputedStyle(node).getPropertyValue(style); } /** * @private * @return {?} */ isDocumentTheScrollableContainer() { return this.document.documentElement === this.container; } } NgEzInViewportDirective.decorators = [ { type: Directive, args: [{ selector: '[ngezInViewport]', exportAs: 'ngezInViewport' },] } ]; /** @nocollapse */ NgEzInViewportDirective.ctorParameters = () => [ { type: ElementRef }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: undefined, decorators: [{ type: Inject, args: [WINDOW,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] } ]; NgEzInViewportDirective.propDecorators = { config: [{ type: Input }], inViewportChange: [{ type: Output }] }; if (false) { /** @type {?} */ NgEzInViewportDirective.prototype.inViewportChange; /** * @type {?} * @private */ NgEzInViewportDirective.prototype._config; /** * @type {?} * @private */ NgEzInViewportDirective.prototype.container; /** * @type {?} * @private */ NgEzInViewportDirective.prototype.subscription; /** * @type {?} * @private */ NgEzInViewportDirective.prototype.latest; /** * @type {?} * @private */ NgEzInViewportDirective.prototype.element; /** * @type {?} * @private */ NgEzInViewportDirective.prototype.platformId; /** * @type {?} * @private */ NgEzInViewportDirective.prototype.window; /** * @type {?} * @private */ NgEzInViewportDirective.prototype.document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tdmlld3BvcnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5nZXovY29yZS8iLCJzb3VyY2VzIjpbImluLXZpZXdwb3J0L2luLXZpZXdwb3J0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixXQUFXLEVBQ1gsUUFBUSxFQUVSLEtBQUssRUFHTCxNQUFNLEVBQ04sWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUF3QixhQUFhLEVBQUUsbUJBQW1CLEVBQXVCLE1BQU0sVUFBVSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQixFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFNMUQsTUFBTSxPQUFPLHVCQUF1Qjs7Ozs7OztJQXVCaEMsWUFDWSxPQUFtQixFQUNFLFVBQWtCLEVBQ3ZCLE1BQVcsRUFDRyxRQUFhO1FBSDNDLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDRSxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQUs7UUFDRyxhQUFRLEdBQVIsUUFBUSxDQUFLO1FBckI3QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQVE3RCxXQUFNLEdBQXdCO1lBQ2xDLEdBQUcsRUFBRSxLQUFLO1lBQ1YsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLEtBQUssRUFBRSxLQUFLO1lBQ1osR0FBRyxFQUFFLEtBQUs7WUFDVixHQUFHLEVBQUUsS0FBSztTQUNiLENBQUM7SUFNdUQsQ0FBQzs7Ozs7SUF6QjFELElBQWEsTUFBTSxDQUFDLE1BQTRCO1FBQzVD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QUV0Qyw0Q0FBMkI7Ozs7O0lBRTNCLCtDQUFtQzs7Ozs7SUFFbkMseUNBT0U7Ozs7O0lBR0UsMENBQTJCOzs7OztJQUMzQiw2Q0FBK0M7Ozs7O0lBQy9DLHlDQUFtQzs7Ozs7SUFDbkMsMkNBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXHJcbiAgICBEaXJlY3RpdmUsIFxyXG4gICAgRWxlbWVudFJlZiwgXHJcbiAgICBJbmplY3QsIFxyXG4gICAgUExBVEZPUk1fSUQsIFxyXG4gICAgT3B0aW9uYWwsIFxyXG4gICAgT25Jbml0LCBcclxuICAgIElucHV0LCBcclxuICAgIFRlbXBsYXRlUmVmLCBcclxuICAgIE9uRGVzdHJveSwgXHJcbiAgICBPdXRwdXQsXHJcbiAgICBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBXSU5ET1cgfSBmcm9tIFwiLi4vd2luZG93L3dpbmRvdy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgTmdFekluVmlld3BvcnRDb25maWcsIGRlZmF1bHRDb25maWcsIGRlZmF1bHRPZmZzZXRDb25maWcsIE5nRXpJblZpZXdwb3J0RXZlbnQgfSBmcm9tIFwiLi9tb2RlbHNcIjtcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgU3Vic2NyaXB0aW9uLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW25nZXpJblZpZXdwb3J0XScsXHJcbiAgICBleHBvcnRBczogJ25nZXpJblZpZXdwb3J0J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdFekluVmlld3BvcnREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveXtcclxuXHJcbiAgICBASW5wdXQoKSBzZXQgY29uZmlnKGNvbmZpZzogTmdFekluVmlld3BvcnRDb25maWcpe1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgaW5WaWV3cG9ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TmdFekluVmlld3BvcnRFdmVudD4oKTtcclxuXHJcbiAgICBwcml2YXRlIF9jb25maWc6IE5nRXpJblZpZXdwb3J0Q29uZmlnO1xyXG5cclxuICAgIHByaXZhdGUgY29udGFpbmVyOiBFbGVtZW50O1xyXG5cclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgcHJpdmF0ZSBsYXRlc3Q6IE5nRXpJblZpZXdwb3J0RXZlbnQgPSB7XHJcbiAgICAgICAgdG9wOiBmYWxzZSxcclxuICAgICAgICBib3R0b206IGZhbHNlLFxyXG4gICAgICAgIGxlZnQ6IGZhbHNlLFxyXG4gICAgICAgIHJpZ2h0OiBmYWxzZSxcclxuICAgICAgICBhbGw6IGZhbHNlLFxyXG4gICAgICAgIGFueTogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgICAgIEBJbmplY3QoV0lORE9XKSBwcml2YXRlIHdpbmRvdzogYW55LFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSl7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDbG9zZXN0U2Nyb2xsYWJsZVBhcmVudCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy9DaGVjayBvbiBzY3JvbGwsIHdpbmRvdyByZXNpemUgYW5kIG9uaW5pdFxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbWVyZ2UoXHJcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLmlzRG9jdW1lbnRUaGVTY3JvbGxhYmxlQ29udGFpbmVyKCkgPyB0aGlzLmRvY3VtZW50IDogdGhpcy5jb250YWluZXIsICdzY3JvbGwnKSwgXHJcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLndpbmRvdywgJ3Jlc2l6ZScpLFxyXG4gICAgICAgICAgICBvZihudWxsKSlcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVjaygpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBpZih0aGlzLnN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0IGNvbmZpZygpOiBOZ0V6SW5WaWV3cG9ydENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgeyBvZmZzZXQgPSB7fSwgLi4uY29uZmlnIH0gPSB0aGlzLl9jb25maWcgfHwge307XHJcblxyXG4gICAgICAgIHJldHVybiB7IFxyXG4gICAgICAgICAgICAuLi5kZWZhdWx0Q29uZmlnLCBcclxuICAgICAgICAgICAgLi4uY29uZmlnLCBcclxuICAgICAgICAgICAgb2Zmc2V0OiB7XHJcbiAgICAgICAgICAgICAgICAuLi5kZWZhdWx0T2Zmc2V0Q29uZmlnLFxyXG4gICAgICAgICAgICAgICAgLi4ub2Zmc2V0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrKCk6IE5nRXpJblZpZXdwb3J0RXZlbnR7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmxhdGVzdDtcclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWxjdWxhdGVWaXNpYmlsaXR5KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBwcmV2aW91cy50b3AgIT0gY3VycmVudC50b3BcclxuICAgICAgICAgICAgfHwgcHJldmlvdXMuYm90dG9tICE9IGN1cnJlbnQuYm90dG9tXHJcbiAgICAgICAgICAgIHx8IHByZXZpb3VzLmxlZnQgIT0gY3VycmVudC5sZWZ0XHJcbiAgICAgICAgICAgIHx8IHByZXZpb3VzLnJpZ2h0ICE9IGN1cnJlbnQucmlnaHQ7XHJcblxyXG4gICAgICAgIGlmKGhhc0NoYW5nZWQpXHJcbiAgICAgICAgICAgIHRoaXMuaW5WaWV3cG9ydENoYW5nZS5lbWl0KGN1cnJlbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmxhdGVzdCA9IGN1cnJlbnQ7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVWaXNpYmlsaXR5KCk6IE5nRXpJblZpZXdwb3J0RXZlbnR7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSAgZWxlbWVudFJlY3Qud2lkdGg7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgY29uc3QgdG9wID0gZWxlbWVudFJlY3QudG9wIC0gKHRoaXMuaXNEb2N1bWVudFRoZVNjcm9sbGFibGVDb250YWluZXIoKVxyXG4gICAgICAgICAgICA/IDBcclxuICAgICAgICAgICAgOiBjb250YWluZXJSZWN0LnRvcCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHRvcCArIGhlaWdodDtcclxuXHJcbiAgICAgICAgY29uc3QgbGVmdCA9IGVsZW1lbnRSZWN0LmxlZnQgLSAodGhpcy5pc0RvY3VtZW50VGhlU2Nyb2xsYWJsZUNvbnRhaW5lcigpXHJcbiAgICAgICAgICAgID8gMFxyXG4gICAgICAgICAgICA6IGNvbnRhaW5lclJlY3QubGVmdCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gbGVmdCArIHdpZHRoO1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCB8fCB0aGlzLndpbmRvdy5pbm5lcldpZHRoO1xyXG5cclxuICAgICAgICBjb25zdCB0b3BJblZpZXcgPSB0b3AgKyB0aGlzLmNvbmZpZy5vZmZzZXQudG9wID49IDAgJiYgdG9wIDw9IChjb250YWluZXJIZWlnaHQgKyB0aGlzLmNvbmZpZy5vZmZzZXQudG9wKTtcclxuICAgICAgICBjb25zdCBib3R0b21JblZpZXcgPSBib3R0b20gKyB0aGlzLmNvbmZpZy5vZmZzZXQuYm90dG9tID49IDAgJiYgYm90dG9tIDw9IChjb250YWluZXJIZWlnaHQgKyB0aGlzLmNvbmZpZy5vZmZzZXQuYm90dG9tKTtcclxuICAgICAgICBjb25zdCBsZWZ0SW5WaWV3ID0gbGVmdCArIHRoaXMuY29uZmlnLm9mZnNldC5sZWZ0ID49IDAgJiYgbGVmdCA8PSAoY29udGFpbmVyV2lkdGggKyB0aGlzLmNvbmZpZy5vZmZzZXQubGVmdCk7XHJcbiAgICAgICAgY29uc3QgcmlnaHRJblZpZXcgPSByaWdodCArIHRoaXMuY29uZmlnLm9mZnNldC5yaWdodCA+PSAwICYmIHJpZ2h0IDw9IChjb250YWluZXJXaWR0aCArIHRoaXMuY29uZmlnLm9mZnNldC5yaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRvcDogdG9wSW5WaWV3LFxyXG4gICAgICAgICAgICBib3R0b206IGJvdHRvbUluVmlldyxcclxuICAgICAgICAgICAgbGVmdDogbGVmdEluVmlldyAmJiAodG9wSW5WaWV3IHx8IGJvdHRvbUluVmlldyksXHJcbiAgICAgICAgICAgIHJpZ2h0OiByaWdodEluVmlldyAmJiAodG9wSW5WaWV3IHx8IGJvdHRvbUluVmlldyksXHJcbiAgICAgICAgICAgIGFueTogKHRvcEluVmlldyB8fCBib3R0b21JblZpZXcpICYmIChsZWZ0SW5WaWV3IHx8IHJpZ2h0SW5WaWV3KSxcclxuICAgICAgICAgICAgYWxsOiB0b3BJblZpZXcgJiYgYm90dG9tSW5WaWV3ICYmIGxlZnRJblZpZXcgJiYgcmlnaHRJblZpZXdcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q2xvc2VzdFNjcm9sbGFibGVQYXJlbnQobm9kZTogTm9kZSkge1xyXG4gICAgICAgIHJldHVybiAhbm9kZSB8fCBub2RlID09PSB0aGlzLmRvY3VtZW50LmJvZHlcclxuICAgICAgICAgICAgPyB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxyXG4gICAgICAgICAgICA6IHRoaXMuaXNTY3JvbGxhYmxlKG5vZGUpXHJcbiAgICAgICAgICAgICAgICA/IG5vZGUgXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0Q2xvc2VzdFNjcm9sbGFibGVQYXJlbnQobm9kZS5wYXJlbnROb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzU2Nyb2xsYWJsZShub2RlOiBOb2RlKXtcclxuICAgICAgICBjb25zdCByZWdleCA9IC8oYXV0b3xzY3JvbGwpLztcclxuICAgICAgICByZXR1cm4gcmVnZXgudGVzdChcclxuICAgICAgICAgICAgdGhpcy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdvdmVyZmxvdycpICtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdvdmVyZmxvdy15JykgK1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbXB1dGVkU3R5bGUobm9kZSwgJ292ZXJmbG93LXgnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb21wdXRlZFN0eWxlKG5vZGU6IE5vZGUsIHN0eWxlOiBzdHJpbmcpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNEb2N1bWVudFRoZVNjcm9sbGFibGVDb250YWluZXIoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPT09IHRoaXMuY29udGFpbmVyO1xyXG4gICAgfVxyXG59Il19