UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

296 lines 27.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { fromEvent as observableFromEvent, merge as observableMerge } from 'rxjs'; import { debounceTime, delay, filter, repeat, share, switchMap, takeUntil, takeWhile, map } from 'rxjs/operators'; /** @enum {string} */ const NbTrigger = { CLICK: 'click', HOVER: 'hover', HINT: 'hint', FOCUS: 'focus', }; export { NbTrigger }; /* * Provides entity with two event stream: show and hide. * Each stream provides different events depends on implementation. * We have three main trigger strategies: click, hint and hover. * */ /* * TODO maybe we have to use renderer.listen instead of observableFromEvent? * Renderer provides capability use it in service worker, ssr and so on. * */ /** * @abstract */ export class NbTriggerStrategy { /** * @param {?} document * @param {?} host * @param {?} container */ constructor(document, host, container) { this.document = document; this.host = host; this.container = container; } /** * @protected * @param {?} event * @return {?} */ isNotOnHostOrContainer(event) { return !this.isOnHost(event) && !this.isOnContainer(event); } /** * @protected * @param {?} event * @return {?} */ isOnHostOrContainer(event) { return this.isOnHost(event) || this.isOnContainer(event); } /** * @protected * @param {?} __0 * @return {?} */ isOnHost({ target }) { return this.host.contains((/** @type {?} */ (target))); } /** * @protected * @param {?} __0 * @return {?} */ isOnContainer({ target }) { return this.container() && this.container().location.nativeElement.contains(target); } } if (false) { /** @type {?} */ NbTriggerStrategy.prototype.show$; /** @type {?} */ NbTriggerStrategy.prototype.hide$; /** * @type {?} * @protected */ NbTriggerStrategy.prototype.document; /** * @type {?} * @protected */ NbTriggerStrategy.prototype.host; /** * @type {?} * @protected */ NbTriggerStrategy.prototype.container; } /* * Creates show and hide event streams. * Fires toggle event when the click was performed on the host element. * Fires close event when the click was performed on the document but * not on the host or container. * */ export class NbClickTriggerStrategy extends NbTriggerStrategy { constructor() { super(...arguments); // since we should track click for both SHOW and HIDE event we firstly need to track the click and the state // of the container and then later on decide should we hide it or show // if we track the click & state separately this will case a behavior when the container is getting shown // and then hidden right away this.click$ = observableFromEvent(this.document, 'click') .pipe(map((event) => (/** @type {?} */ ([!this.container() && this.isOnHost(event), event]))), share()); this.show$ = this.click$ .pipe(filter(([shouldShow]) => shouldShow), map(([, event]) => event)); this.hide$ = this.click$ .pipe(filter(([shouldShow, event]) => !shouldShow && !this.isOnContainer(event)), map(([, event]) => event)); } } if (false) { /** * @type {?} * @protected */ NbClickTriggerStrategy.prototype.click$; /** @type {?} */ NbClickTriggerStrategy.prototype.show$; /** @type {?} */ NbClickTriggerStrategy.prototype.hide$; } /* * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element and stops out of the host and popover container. * */ export class NbHoverTriggerStrategy extends NbTriggerStrategy { constructor() { super(...arguments); this.show$ = observableFromEvent(this.host, 'mouseenter') .pipe(filter(() => !this.container()), delay(100), takeUntil(observableFromEvent(this.host, 'mouseleave')), repeat()); this.hide$ = observableFromEvent(this.host, 'mouseleave') .pipe(switchMap(() => observableFromEvent(this.document, 'mousemove') .pipe(debounceTime(100), takeWhile(() => !!this.container()), filter(event => this.isNotOnHostOrContainer(event))))); } } if (false) { /** @type {?} */ NbHoverTriggerStrategy.prototype.show$; /** @type {?} */ NbHoverTriggerStrategy.prototype.hide$; } /* * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element. * */ export class NbHintTriggerStrategy extends NbTriggerStrategy { constructor() { super(...arguments); this.show$ = observableFromEvent(this.host, 'mouseenter') .pipe(delay(100), takeUntil(observableFromEvent(this.host, 'mouseleave')), // this `delay & takeUntil & repeat` operators combination is a synonym for `conditional debounce` // meaning that if one event occurs in some time after the initial one we won't react to it repeat()); this.hide$ = observableFromEvent(this.host, 'mouseleave'); } } if (false) { /** @type {?} */ NbHintTriggerStrategy.prototype.show$; /** @type {?} */ NbHintTriggerStrategy.prototype.hide$; } /* * Creates show and hide event streams. * Fires open event when a focus is on the host element and stay over at least 100 milliseconds. * Fires close event when the focus leaves the host element. * */ export class NbFocusTriggerStrategy extends NbTriggerStrategy { constructor() { super(...arguments); this.focusOut$ = observableFromEvent(this.host, 'focusout') .pipe(switchMap(() => observableFromEvent(this.document, 'focusin') .pipe(takeWhile(() => !!this.container()), filter(event => this.isNotOnHostOrContainer(event))))); this.clickIn$ = observableFromEvent(this.host, 'click') .pipe(filter(() => !this.container())); this.clickOut$ = observableFromEvent(this.document, 'click') .pipe(filter(() => !!this.container()), filter(event => this.isNotOnHostOrContainer(event))); this.tabKeyPress$ = observableFromEvent(this.document, 'keydown') .pipe(filter((event) => event.keyCode === 9), filter(() => !!this.container())); this.show$ = observableMerge(observableFromEvent(this.host, 'focusin'), this.clickIn$) .pipe(filter(() => !this.container()), debounceTime(100), takeUntil(observableFromEvent(this.host, 'focusout')), repeat()); this.hide$ = observableMerge(this.focusOut$, this.tabKeyPress$, this.clickOut$); } } if (false) { /** * @type {?} * @protected */ NbFocusTriggerStrategy.prototype.focusOut$; /** * @type {?} * @protected */ NbFocusTriggerStrategy.prototype.clickIn$; /** * @type {?} * @protected */ NbFocusTriggerStrategy.prototype.clickOut$; /** * @type {?} * @protected */ NbFocusTriggerStrategy.prototype.tabKeyPress$; /** @type {?} */ NbFocusTriggerStrategy.prototype.show$; /** @type {?} */ NbFocusTriggerStrategy.prototype.hide$; } export class NbTriggerStrategyBuilder { /** * @template THIS * @this {THIS} * @param {?} document * @return {THIS} */ document(document) { (/** @type {?} */ (this))._document = document; return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} trigger * @return {THIS} */ trigger(trigger) { (/** @type {?} */ (this))._trigger = trigger; return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} host * @return {THIS} */ host(host) { (/** @type {?} */ (this))._host = host; return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} container * @return {THIS} */ container(container) { (/** @type {?} */ (this))._container = container; return (/** @type {?} */ (this)); } /** * @return {?} */ build() { switch (this._trigger) { case NbTrigger.CLICK: return new NbClickTriggerStrategy(this._document, this._host, this._container); case NbTrigger.HINT: return new NbHintTriggerStrategy(this._document, this._host, this._container); case NbTrigger.HOVER: return new NbHoverTriggerStrategy(this._document, this._host, this._container); case NbTrigger.FOCUS: return new NbFocusTriggerStrategy(this._document, this._host, this._container); default: throw new Error('Trigger have to be provided'); } } } if (false) { /** * @type {?} * @protected */ NbTriggerStrategyBuilder.prototype._host; /** * @type {?} * @protected */ NbTriggerStrategyBuilder.prototype._container; /** * @type {?} * @protected */ NbTriggerStrategyBuilder.prototype._trigger; /** * @type {?} * @protected */ NbTriggerStrategyBuilder.prototype._document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS10cmlnZ2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdGhlbWUtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvY2RrL292ZXJsYXkvb3ZlcmxheS10cmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsU0FBUyxJQUFJLG1CQUFtQixFQUFFLEtBQUssSUFBSSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztJQUloSCxPQUFRLE9BQU87SUFDZixPQUFRLE9BQU87SUFDZixNQUFPLE1BQU07SUFDYixPQUFRLE9BQU87Ozs7Ozs7Ozs7Ozs7OztBQVlqQixNQUFNLE9BQWdCLGlCQUFpQjs7Ozs7O0lBcUJyQyxZQUFzQixRQUFrQixFQUFZLElBQWlCLEVBQVksU0FBa0M7UUFBN0YsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFZLFNBQUksR0FBSixJQUFJLENBQWE7UUFBWSxjQUFTLEdBQVQsU0FBUyxDQUF5QjtJQUNuSCxDQUFDOzs7Ozs7SUFwQlMsc0JBQXNCLENBQUMsS0FBWTtRQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsQ0FBQzs7Ozs7O0lBRVMsbUJBQW1CLENBQUMsS0FBWTtRQUN4QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDOzs7Ozs7SUFFUyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQVM7UUFDbEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBQSxNQUFNLEVBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7OztJQUVTLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBUztRQUN2QyxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEYsQ0FBQztDQU9GOzs7SUFMQyxrQ0FBa0M7O0lBQ2xDLGtDQUFrQzs7Ozs7SUFFdEIscUNBQTRCOzs7OztJQUFFLGlDQUEyQjs7Ozs7SUFBRSxzQ0FBNEM7Ozs7Ozs7O0FBVXJILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxpQkFBaUI7SUFBN0Q7Ozs7OztRQU1ZLFdBQU0sR0FBaUMsbUJBQW1CLENBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUM7YUFDaEcsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsbUJBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFvQixDQUFDLEVBQzdGLEtBQUssRUFBRSxDQUNSLENBQUM7UUFFSyxVQUFLLEdBQXNCLElBQUksQ0FBQyxNQUFNO2FBQzVDLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FDMUIsQ0FBQztRQUVLLFVBQUssR0FBc0IsSUFBSSxDQUFDLE1BQU07YUFDNUMsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDMUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7Q0FBQTs7Ozs7O0lBakJDLHdDQUlJOztJQUVKLHVDQUlJOztJQUVKLHVDQUlJOzs7Ozs7O0FBUU4sTUFBTSxPQUFPLHNCQUF1QixTQUFRLGlCQUFpQjtJQUE3RDs7UUFFRSxVQUFLLEdBQXNCLG1CQUFtQixDQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDO2FBQzNFLElBQUksQ0FDSCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUNWLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQ3ZELE1BQU0sRUFBRSxDQUNULENBQUM7UUFFSixVQUFLLEdBQXNCLG1CQUFtQixDQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDO2FBQzNFLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUM7YUFDbkUsSUFBSSxDQUNILFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUNqRCxDQUNGLENBQ0YsQ0FDRixDQUFDO0lBQ04sQ0FBQztDQUFBOzs7SUFuQkMsdUNBTUk7O0lBRUosdUNBVUk7Ozs7Ozs7QUFRTixNQUFNLE9BQU8scUJBQXNCLFNBQVEsaUJBQWlCO0lBQTVEOztRQUNFLFVBQUssR0FBc0IsbUJBQW1CLENBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUM7YUFDM0UsSUFBSSxDQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsRUFDVixTQUFTLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN2RCxrR0FBa0c7UUFDbEcsMkZBQTJGO1FBQzNGLE1BQU0sRUFBRSxDQUNULENBQUM7UUFFSixVQUFLLEdBQXNCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDMUUsQ0FBQztDQUFBOzs7SUFWQyxzQ0FPSTs7SUFFSixzQ0FBd0U7Ozs7Ozs7QUFTMUUsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGlCQUFpQjtJQUE3RDs7UUFFWSxjQUFTLEdBQXNCLG1CQUFtQixDQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDO2FBQ3ZGLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7YUFDakUsSUFBSSxDQUNILFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNwRCxDQUNGLENBQ0YsQ0FBQztRQUVNLGFBQVEsR0FBc0IsbUJBQW1CLENBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7YUFDbkYsSUFBSSxDQUNILE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUNoQyxDQUFDO1FBRU0sY0FBUyxHQUFzQixtQkFBbUIsQ0FBUSxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQzthQUN4RixJQUFJLENBQ0gsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3BELENBQUM7UUFFTSxpQkFBWSxHQUFzQixtQkFBbUIsQ0FBUSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQzthQUM3RixJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFDckQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FDakMsQ0FBQztRQUVKLFVBQUssR0FBc0IsZUFBZSxDQUFDLG1CQUFtQixDQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN4RyxJQUFJLENBQ0gsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQy9CLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFDckQsTUFBTSxFQUFFLENBQ1QsQ0FBQztRQUVKLFVBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3RSxDQUFDO0NBQUE7Ozs7OztJQXBDQywyQ0FRSTs7Ozs7SUFFSiwwQ0FHSTs7Ozs7SUFFSiwyQ0FJSTs7Ozs7SUFFSiw4Q0FJSTs7SUFFSix1Q0FNSTs7SUFFSix1Q0FBMkU7O0FBRzdFLE1BQU0sT0FBTyx3QkFBd0I7Ozs7Ozs7SUFNbkMsUUFBUSxDQUFDLFFBQWtCO1FBQ3pCLG1CQUFBLElBQUksRUFBQSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQztJQUNkLENBQUM7Ozs7Ozs7SUFFRCxPQUFPLENBQUMsT0FBa0I7UUFDeEIsbUJBQUEsSUFBSSxFQUFBLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7OztJQUVELElBQUksQ0FBQyxJQUFpQjtRQUNwQixtQkFBQSxJQUFJLEVBQUEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE9BQU8sbUJBQUEsSUFBSSxFQUFBLENBQUM7SUFDZCxDQUFDOzs7Ozs7O0lBRUQsU0FBUyxDQUFDLFNBQWtDO1FBQzFDLG1CQUFBLElBQUksRUFBQSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQztJQUNkLENBQUM7Ozs7SUFFRCxLQUFLO1FBQ0gsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JCLEtBQUssU0FBUyxDQUFDLEtBQUs7Z0JBQ2xCLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pGLEtBQUssU0FBUyxDQUFDLElBQUk7Z0JBQ2pCLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hGLEtBQUssU0FBUyxDQUFDLEtBQUs7Z0JBQ2xCLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pGLEtBQUssU0FBUyxDQUFDLEtBQUs7Z0JBQ2xCLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pGO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7Q0FDRjs7Ozs7O0lBdkNDLHlDQUE2Qjs7Ozs7SUFDN0IsOENBQThDOzs7OztJQUM5Qyw0Q0FBOEI7Ozs7O0lBQzlCLDZDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgYXMgb2JzZXJ2YWJsZUZyb21FdmVudCwgbWVyZ2UgYXMgb2JzZXJ2YWJsZU1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGVsYXksIGZpbHRlciwgcmVwZWF0LCBzaGFyZSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRha2VXaGlsZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIE5iVHJpZ2dlciB7XHJcbiAgQ0xJQ0sgPSAnY2xpY2snLFxyXG4gIEhPVkVSID0gJ2hvdmVyJyxcclxuICBISU5UID0gJ2hpbnQnLFxyXG4gIEZPQ1VTID0gJ2ZvY3VzJyxcclxufVxyXG5cclxuLypcclxuICogUHJvdmlkZXMgZW50aXR5IHdpdGggdHdvIGV2ZW50IHN0cmVhbTogc2hvdyBhbmQgaGlkZS5cclxuICogRWFjaCBzdHJlYW0gcHJvdmlkZXMgZGlmZmVyZW50IGV2ZW50cyBkZXBlbmRzIG9uIGltcGxlbWVudGF0aW9uLlxyXG4gKiBXZSBoYXZlIHRocmVlIG1haW4gdHJpZ2dlciBzdHJhdGVnaWVzOiBjbGljaywgaGludCBhbmQgaG92ZXIuXHJcbiAqICovXHJcbi8qXHJcbiAqIFRPRE8gbWF5YmUgd2UgaGF2ZSB0byB1c2UgcmVuZGVyZXIubGlzdGVuIGluc3RlYWQgb2Ygb2JzZXJ2YWJsZUZyb21FdmVudD9cclxuICogUmVuZGVyZXIgcHJvdmlkZXMgY2FwYWJpbGl0eSB1c2UgaXQgaW4gc2VydmljZSB3b3JrZXIsIHNzciBhbmQgc28gb24uXHJcbiAqICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOYlRyaWdnZXJTdHJhdGVneSB7XHJcblxyXG4gIHByb3RlY3RlZCBpc05vdE9uSG9zdE9yQ29udGFpbmVyKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmlzT25Ib3N0KGV2ZW50KSAmJiAhdGhpcy5pc09uQ29udGFpbmVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc09uSG9zdE9yQ29udGFpbmVyKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNPbkhvc3QoZXZlbnQpIHx8IHRoaXMuaXNPbkNvbnRhaW5lcihldmVudCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaXNPbkhvc3QoeyB0YXJnZXQgfTogRXZlbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhvc3QuY29udGFpbnModGFyZ2V0IGFzIE5vZGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzT25Db250YWluZXIoeyB0YXJnZXQgfTogRXZlbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcigpICYmIHRoaXMuY29udGFpbmVyKCkubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xyXG4gIH1cclxuXHJcbiAgYWJzdHJhY3Qgc2hvdyQ6IE9ic2VydmFibGU8RXZlbnQ+O1xyXG4gIGFic3RyYWN0IGhpZGUkOiBPYnNlcnZhYmxlPEV2ZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGRvY3VtZW50OiBEb2N1bWVudCwgcHJvdGVjdGVkIGhvc3Q6IEhUTUxFbGVtZW50LCBwcm90ZWN0ZWQgY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55Pikge1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIHRvZ2dsZSBldmVudCB3aGVuIHRoZSBjbGljayB3YXMgcGVyZm9ybWVkIG9uIHRoZSBob3N0IGVsZW1lbnQuXHJcbiAqIEZpcmVzIGNsb3NlIGV2ZW50IHdoZW4gdGhlIGNsaWNrIHdhcyBwZXJmb3JtZWQgb24gdGhlIGRvY3VtZW50IGJ1dFxyXG4gKiBub3Qgb24gdGhlIGhvc3Qgb3IgY29udGFpbmVyLlxyXG4gKiAqL1xyXG5leHBvcnQgY2xhc3MgTmJDbGlja1RyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuXHJcbiAgLy8gc2luY2Ugd2Ugc2hvdWxkIHRyYWNrIGNsaWNrIGZvciBib3RoIFNIT1cgYW5kIEhJREUgZXZlbnQgd2UgZmlyc3RseSBuZWVkIHRvIHRyYWNrIHRoZSBjbGljayBhbmQgdGhlIHN0YXRlXHJcbiAgLy8gb2YgdGhlIGNvbnRhaW5lciBhbmQgdGhlbiBsYXRlciBvbiBkZWNpZGUgc2hvdWxkIHdlIGhpZGUgaXQgb3Igc2hvd1xyXG4gIC8vIGlmIHdlIHRyYWNrIHRoZSBjbGljayAmIHN0YXRlIHNlcGFyYXRlbHkgdGhpcyB3aWxsIGNhc2UgYSBiZWhhdmlvciB3aGVuIHRoZSBjb250YWluZXIgaXMgZ2V0dGluZyBzaG93blxyXG4gIC8vIGFuZCB0aGVuIGhpZGRlbiByaWdodCBhd2F5XHJcbiAgcHJvdGVjdGVkIGNsaWNrJDogT2JzZXJ2YWJsZTxbYm9vbGVhbiwgRXZlbnRdPiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdjbGljaycpXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChldmVudDogRXZlbnQpID0+IFshdGhpcy5jb250YWluZXIoKSAmJiB0aGlzLmlzT25Ib3N0KGV2ZW50KSwgZXZlbnRdIGFzIFtib29sZWFuLCBFdmVudF0pLFxyXG4gICAgICBzaGFyZSgpLFxyXG4gICAgKTtcclxuXHJcbiAgcmVhZG9ubHkgc2hvdyQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gdGhpcy5jbGljayRcclxuICAgIC5waXBlKFxyXG4gICAgICBmaWx0ZXIoKFtzaG91bGRTaG93XSkgPT4gc2hvdWxkU2hvdyksXHJcbiAgICAgIG1hcCgoWywgZXZlbnRdKSA9PiBldmVudCksXHJcbiAgICApO1xyXG5cclxuICByZWFkb25seSBoaWRlJDogT2JzZXJ2YWJsZTxFdmVudD4gPSB0aGlzLmNsaWNrJFxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoW3Nob3VsZFNob3csIGV2ZW50XSkgPT4gIXNob3VsZFNob3cgJiYgIXRoaXMuaXNPbkNvbnRhaW5lcihldmVudCkpLFxyXG4gICAgICBtYXAoKFssIGV2ZW50XSkgPT4gZXZlbnQpLFxyXG4gICAgKTtcclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIG9wZW4gZXZlbnQgd2hlbiBhIG1vdXNlIGhvdmVycyBvdmVyIHRoZSBob3N0IGVsZW1lbnQgYW5kIHN0YXkgb3ZlciBhdCBsZWFzdCAxMDAgbWlsbGlzZWNvbmRzLlxyXG4gKiBGaXJlcyBjbG9zZSBldmVudCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGhvc3QgZWxlbWVudCBhbmQgc3RvcHMgb3V0IG9mIHRoZSBob3N0IGFuZCBwb3BvdmVyIGNvbnRhaW5lci5cclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iSG92ZXJUcmlnZ2VyU3RyYXRlZ3kgZXh0ZW5kcyBOYlRyaWdnZXJTdHJhdGVneSB7XHJcblxyXG4gIHNob3ckOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuaG9zdCwgJ21vdXNlZW50ZXInKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICAgIGRlbGF5KDEwMCksXHJcbiAgICAgIHRha2VVbnRpbChvYnNlcnZhYmxlRnJvbUV2ZW50KHRoaXMuaG9zdCwgJ21vdXNlbGVhdmUnKSksXHJcbiAgICAgIHJlcGVhdCgpLFxyXG4gICAgKTtcclxuXHJcbiAgaGlkZSQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5ob3N0LCAnbW91c2VsZWF2ZScpXHJcbiAgICAucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdtb3VzZW1vdmUnKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgICAgICB0YWtlV2hpbGUoKCkgPT4gISF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICAgICAgIGZpbHRlcihldmVudCA9PiB0aGlzLmlzTm90T25Ib3N0T3JDb250YWluZXIoZXZlbnQpLFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICApLFxyXG4gICAgICApLFxyXG4gICAgKTtcclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIG9wZW4gZXZlbnQgd2hlbiBhIG1vdXNlIGhvdmVycyBvdmVyIHRoZSBob3N0IGVsZW1lbnQgYW5kIHN0YXkgb3ZlciBhdCBsZWFzdCAxMDAgbWlsbGlzZWNvbmRzLlxyXG4gKiBGaXJlcyBjbG9zZSBldmVudCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGhvc3QgZWxlbWVudC5cclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iSGludFRyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuICBzaG93JDogT2JzZXJ2YWJsZTxFdmVudD4gPSBvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdtb3VzZWVudGVyJylcclxuICAgIC5waXBlKFxyXG4gICAgICBkZWxheSgxMDApLFxyXG4gICAgICB0YWtlVW50aWwob2JzZXJ2YWJsZUZyb21FdmVudCh0aGlzLmhvc3QsICdtb3VzZWxlYXZlJykpLFxyXG4gICAgICAvLyB0aGlzIGBkZWxheSAmIHRha2VVbnRpbCAmIHJlcGVhdGAgb3BlcmF0b3JzIGNvbWJpbmF0aW9uIGlzIGEgc3lub255bSBmb3IgYGNvbmRpdGlvbmFsIGRlYm91bmNlYFxyXG4gICAgICAvLyBtZWFuaW5nIHRoYXQgaWYgb25lIGV2ZW50IG9jY3VycyBpbiBzb21lIHRpbWUgYWZ0ZXIgdGhlIGluaXRpYWwgb25lIHdlIHdvbid0IHJlYWN0IHRvIGl0XHJcbiAgICAgIHJlcGVhdCgpLFxyXG4gICAgKTtcclxuXHJcbiAgaGlkZSQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudCh0aGlzLmhvc3QsICdtb3VzZWxlYXZlJyk7XHJcbn1cclxuXHJcblxyXG4vKlxyXG4gKiBDcmVhdGVzIHNob3cgYW5kIGhpZGUgZXZlbnQgc3RyZWFtcy5cclxuICogRmlyZXMgb3BlbiBldmVudCB3aGVuIGEgZm9jdXMgaXMgb24gdGhlIGhvc3QgZWxlbWVudCBhbmQgc3RheSBvdmVyIGF0IGxlYXN0IDEwMCBtaWxsaXNlY29uZHMuXHJcbiAqIEZpcmVzIGNsb3NlIGV2ZW50IHdoZW4gdGhlIGZvY3VzIGxlYXZlcyB0aGUgaG9zdCBlbGVtZW50LlxyXG4gKiAqL1xyXG5leHBvcnQgY2xhc3MgTmJGb2N1c1RyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzT3V0JDogT2JzZXJ2YWJsZTxFdmVudD4gPSBvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdmb2N1c291dCcpXHJcbiAgICAucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdmb2N1c2luJylcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2VXaGlsZSgoKSA9PiAhIXRoaXMuY29udGFpbmVyKCkpLFxyXG4gICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IHRoaXMuaXNOb3RPbkhvc3RPckNvbnRhaW5lcihldmVudCkpLFxyXG4gICAgICAgICksXHJcbiAgICAgICksXHJcbiAgICApO1xyXG5cclxuICBwcm90ZWN0ZWQgY2xpY2tJbiQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5ob3N0LCAnY2xpY2snKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICApO1xyXG5cclxuICBwcm90ZWN0ZWQgY2xpY2tPdXQkOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdjbGljaycpXHJcbiAgICAucGlwZShcclxuICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICAgIGZpbHRlcihldmVudCA9PiB0aGlzLmlzTm90T25Ib3N0T3JDb250YWluZXIoZXZlbnQpKSxcclxuICAgICk7XHJcblxyXG4gIHByb3RlY3RlZCB0YWJLZXlQcmVzcyQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5kb2N1bWVudCwgJ2tleWRvd24nKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGV2ZW50LmtleUNvZGUgPT09IDkpLFxyXG4gICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICk7XHJcblxyXG4gIHNob3ckOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVNZXJnZShvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdmb2N1c2luJyksIHRoaXMuY2xpY2tJbiQpXHJcbiAgICAucGlwZShcclxuICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgIHRha2VVbnRpbChvYnNlcnZhYmxlRnJvbUV2ZW50KHRoaXMuaG9zdCwgJ2ZvY3Vzb3V0JykpLFxyXG4gICAgICByZXBlYXQoKSxcclxuICAgICk7XHJcblxyXG4gIGhpZGUkID0gb2JzZXJ2YWJsZU1lcmdlKHRoaXMuZm9jdXNPdXQkLCB0aGlzLnRhYktleVByZXNzJCwgdGhpcy5jbGlja091dCQpO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyIHtcclxuICBwcm90ZWN0ZWQgX2hvc3Q6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBfY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55PjtcclxuICBwcm90ZWN0ZWQgX3RyaWdnZXI6IE5iVHJpZ2dlcjtcclxuICBwcm90ZWN0ZWQgX2RvY3VtZW50OiBEb2N1bWVudDtcclxuXHJcbiAgZG9jdW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogdGhpcyB7XHJcbiAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB0cmlnZ2VyKHRyaWdnZXI6IE5iVHJpZ2dlcik6IHRoaXMge1xyXG4gICAgdGhpcy5fdHJpZ2dlciA9IHRyaWdnZXI7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGhvc3QoaG9zdDogSFRNTEVsZW1lbnQpOiB0aGlzIHtcclxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBjb250YWluZXIoY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55Pik6IHRoaXMge1xyXG4gICAgdGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBidWlsZCgpOiBOYlRyaWdnZXJTdHJhdGVneSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3RyaWdnZXIpIHtcclxuICAgICAgY2FzZSBOYlRyaWdnZXIuQ0xJQ0s6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOYkNsaWNrVHJpZ2dlclN0cmF0ZWd5KHRoaXMuX2RvY3VtZW50LCB0aGlzLl9ob3N0LCB0aGlzLl9jb250YWluZXIpO1xyXG4gICAgICBjYXNlIE5iVHJpZ2dlci5ISU5UOlxyXG4gICAgICAgIHJldHVybiBuZXcgTmJIaW50VHJpZ2dlclN0cmF0ZWd5KHRoaXMuX2RvY3VtZW50LCB0aGlzLl9ob3N0LCB0aGlzLl9jb250YWluZXIpO1xyXG4gICAgICBjYXNlIE5iVHJpZ2dlci5IT1ZFUjpcclxuICAgICAgICByZXR1cm4gbmV3IE5iSG92ZXJUcmlnZ2VyU3RyYXRlZ3kodGhpcy5fZG9jdW1lbnQsIHRoaXMuX2hvc3QsIHRoaXMuX2NvbnRhaW5lcik7XHJcbiAgICAgIGNhc2UgTmJUcmlnZ2VyLkZPQ1VTOlxyXG4gICAgICAgIHJldHVybiBuZXcgTmJGb2N1c1RyaWdnZXJTdHJhdGVneSh0aGlzLl9kb2N1bWVudCwgdGhpcy5faG9zdCwgdGhpcy5fY29udGFpbmVyKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWdnZXIgaGF2ZSB0byBiZSBwcm92aWRlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=