UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

818 lines 60.9 kB
/** * @fileoverview added by tsickle * Generated from: base.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __read, __spread } from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { CdkConnectedOverlay } from '@angular/cdk/overlay'; import { EventEmitter, Input, Output, TemplateRef, ViewChild } from '@angular/core'; import { warnDeprecation } from 'ng-zorro-antd/core/logger'; import { DEFAULT_TOOLTIP_POSITIONS, getPlacementName, POSITION_MAP } from 'ng-zorro-antd/core/overlay'; import { isNotNil, toBoolean } from 'ng-zorro-antd/core/util'; import { Subject } from 'rxjs'; import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; /** * @abstract */ var NzTooltipBaseDirective = /** @class */ (function () { function NzTooltipBaseDirective(elementRef, hostView, resolver, renderer, noAnimation) { this.elementRef = elementRef; this.hostView = hostView; this.resolver = resolver; this.renderer = renderer; this.noAnimation = noAnimation; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. * Please use a more specific API. Like `nzTooltipTrigger`. */ this.nzTrigger = 'hover'; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. * Please use a more specific API. Like `nzTooltipPlacement`. */ this.nzPlacement = 'top'; this.nzMouseEnterDelay = 0.15; this.nzMouseLeaveDelay = 0.1; this.needProxyProperties = [ 'nzOverlayClassName', 'nzOverlayStyle', 'nzMouseEnterDelay', 'nzMouseLeaveDelay', 'nzVisible', 'noAnimation' ]; this.nzVisibleChange = new EventEmitter(); this.visible = false; this.destroy$ = new Subject(); this.triggerDisposables = []; } Object.defineProperty(NzTooltipBaseDirective.prototype, "title", { /** * This true title that would be used in other parts on this component. */ get: /** * This true title that would be used in other parts on this component. * @protected * @return {?} */ function () { return this.specificTitle || this.directiveNameTitle || this.nzTitle || null; }, enumerable: true, configurable: true }); Object.defineProperty(NzTooltipBaseDirective.prototype, "content", { get: /** * @protected * @return {?} */ function () { return this.specificContent || this.directiveNameContent || this.nzContent || null; }, enumerable: true, configurable: true }); Object.defineProperty(NzTooltipBaseDirective.prototype, "placement", { get: /** * @protected * @return {?} */ function () { return this.specificPlacement || this.nzPlacement; }, enumerable: true, configurable: true }); Object.defineProperty(NzTooltipBaseDirective.prototype, "trigger", { get: /** * @protected * @return {?} */ function () { // NzTooltipTrigger can be null. return typeof this.specificTrigger !== 'undefined' ? this.specificTrigger : this.nzTrigger; }, enumerable: true, configurable: true }); /** * @param {?} changes * @return {?} */ NzTooltipBaseDirective.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var nzTrigger = changes.nzTrigger, specificTrigger = changes.specificTrigger; /** @type {?} */ var trigger = specificTrigger || nzTrigger; if (trigger && !trigger.isFirstChange()) { this.registerTriggers(); } if (this.component) { this.updateChangedProperties(changes); } // warn deprecated things when specific property is not given if (changes.nzTitle && !this.specificTitle && !this.directiveNameTitle) { warnDeprecation("'nzTitle' of 'nz-tooltip' is deprecated and will be removed in 10.0.0.\nPlease use 'nzTooltipTitle' instead. The same with 'nz-popover' and 'nz-popconfirm'."); } if (changes.nzContent && !this.specificContent) { warnDeprecation("'nzContent' of 'nz-popover' is deprecated and will be removed in 10.0.0.\nPlease use 'nzPopoverContent' instead."); } if (changes.nzPlacement && !this.specificPlacement) { warnDeprecation("'nzPlacement' of 'nz-tooltip' is deprecated and will be removed in 10.0.0.\nPlease use 'nzTooltipContent' instead. The same with 'nz-popover' and 'nz-popconfirm'."); } if (changes.nzTrigger && !this.specificTrigger) { warnDeprecation("'nzTrigger' of 'nz-tooltip' is deprecated and will be removed in 10.0.0.\nPlease use 'nzTooltipTrigger' instead. The same with 'nz-popover' and 'nz-popconfirm'."); } }; /** * @return {?} */ NzTooltipBaseDirective.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.createComponent(); this.registerTriggers(); }; /** * @return {?} */ NzTooltipBaseDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroy$.next(); this.destroy$.complete(); // Clear toggling timer. Issue #3875 #4317 #4386 this.clearTogglingTimer(); this.removeTriggerListeners(); }; /** * @return {?} */ NzTooltipBaseDirective.prototype.show = /** * @return {?} */ function () { this.component.show(); }; /** * @return {?} */ NzTooltipBaseDirective.prototype.hide = /** * @return {?} */ function () { this.component.hide(); }; /** * Force the component to update its position. */ /** * Force the component to update its position. * @return {?} */ NzTooltipBaseDirective.prototype.updatePosition = /** * Force the component to update its position. * @return {?} */ function () { if (this.component) { this.component.updatePosition(); } }; /** * Create a dynamic tooltip component. This method can be override. */ /** * Create a dynamic tooltip component. This method can be override. * @protected * @return {?} */ NzTooltipBaseDirective.prototype.createComponent = /** * Create a dynamic tooltip component. This method can be override. * @protected * @return {?} */ function () { var _this = this; /** @type {?} */ var componentRef = this.hostView.createComponent(this.componentFactory); this.component = componentRef.instance; // Remove the component's DOM because it should be in the overlay container. this.renderer.removeChild(this.renderer.parentNode(this.elementRef.nativeElement), componentRef.location.nativeElement); this.component.setOverlayOrigin({ elementRef: this.specificOrigin || this.elementRef }); this.updateChangedProperties(this.needProxyProperties); this.component.nzVisibleChange.pipe(distinctUntilChanged(), takeUntil(this.destroy$)).subscribe((/** * @param {?} visible * @return {?} */ function (visible) { _this.visible = visible; _this.nzVisibleChange.emit(visible); })); }; /** * @protected * @return {?} */ NzTooltipBaseDirective.prototype.registerTriggers = /** * @protected * @return {?} */ function () { var _this = this; // When the method gets invoked, all properties has been synced to the dynamic component. // After removing the old API, we can just check the directive's own `nzTrigger`. /** @type {?} */ var el = this.elementRef.nativeElement; /** @type {?} */ var trigger = this.trigger; this.removeTriggerListeners(); if (trigger === 'hover') { /** @type {?} */ var overlayElement_1; this.triggerDisposables.push(this.renderer.listen(el, 'mouseenter', (/** * @return {?} */ function () { _this.delayEnterLeave(true, true, _this.nzMouseEnterDelay); }))); this.triggerDisposables.push(this.renderer.listen(el, 'mouseleave', (/** * @return {?} */ function () { _this.delayEnterLeave(true, false, _this.nzMouseLeaveDelay); if (_this.component.overlay.overlayRef && !overlayElement_1) { overlayElement_1 = _this.component.overlay.overlayRef.overlayElement; _this.triggerDisposables.push(_this.renderer.listen(overlayElement_1, 'mouseenter', (/** * @return {?} */ function () { _this.delayEnterLeave(false, true); }))); _this.triggerDisposables.push(_this.renderer.listen(overlayElement_1, 'mouseleave', (/** * @return {?} */ function () { _this.delayEnterLeave(false, false); }))); } }))); } else if (trigger === 'focus') { this.triggerDisposables.push(this.renderer.listen(el, 'focus', (/** * @return {?} */ function () { return _this.show(); }))); this.triggerDisposables.push(this.renderer.listen(el, 'blur', (/** * @return {?} */ function () { return _this.hide(); }))); } else if (trigger === 'click') { this.triggerDisposables.push(this.renderer.listen(el, 'click', (/** * @param {?} e * @return {?} */ function (e) { e.preventDefault(); _this.show(); }))); } // Else do nothing because user wants to control the visibility programmatically. }; /** * Sync changed properties to the component and trigger change detection in that component. */ /** * Sync changed properties to the component and trigger change detection in that component. * @protected * @param {?} propertiesOrChanges * @return {?} */ NzTooltipBaseDirective.prototype.updateChangedProperties = /** * Sync changed properties to the component and trigger change detection in that component. * @protected * @param {?} propertiesOrChanges * @return {?} */ function (propertiesOrChanges) { var _this = this; /** @type {?} */ var isArray = Array.isArray(propertiesOrChanges); /** @type {?} */ var keys = isArray ? ((/** @type {?} */ (propertiesOrChanges))) : Object.keys(propertiesOrChanges); keys.forEach((/** * @param {?} property * @return {?} */ function (property) { if (_this.needProxyProperties.indexOf(property) !== -1) { // @ts-ignore _this.updateComponentValue(property, _this[property]); } })); if (isArray) { this.updateComponentValue('nzTitle', this.title); this.updateComponentValue('nzContent', this.content); this.updateComponentValue('nzPlacement', this.placement); this.updateComponentValue('nzTrigger', this.trigger); } else { /** @type {?} */ var c = (/** @type {?} */ (propertiesOrChanges)); if (c.specificTitle || c.directiveNameTitle || c.nzTitle) { this.updateComponentValue('nzTitle', this.title); } if (c.specificContent || c.directiveNameContent || c.nzContent) { this.updateComponentValue('nzContent', this.content); } if (c.specificTrigger || c.nzTrigger) { this.updateComponentValue('nzTrigger', this.trigger); } if (c.specificPlacement || c.nzPlacement) { this.updateComponentValue('nzPlacement', this.placement); } } this.component.updateByDirective(); }; /** * @private * @param {?} key * @param {?} value * @return {?} */ NzTooltipBaseDirective.prototype.updateComponentValue = /** * @private * @param {?} key * @param {?} value * @return {?} */ function (key, value) { if (typeof value !== 'undefined') { // @ts-ignore this.component[key] = value; } }; /** * @private * @param {?} isOrigin * @param {?} isEnter * @param {?=} delay * @return {?} */ NzTooltipBaseDirective.prototype.delayEnterLeave = /** * @private * @param {?} isOrigin * @param {?} isEnter * @param {?=} delay * @return {?} */ function (isOrigin, isEnter, delay) { var _this = this; if (delay === void 0) { delay = -1; } if (this.delayTimer) { this.clearTogglingTimer(); } else if (delay > 0) { this.delayTimer = setTimeout((/** * @return {?} */ function () { _this.delayTimer = undefined; isEnter ? _this.show() : _this.hide(); }), delay * 1000); } else { // `isOrigin` is used due to the tooltip will not hide immediately // (may caused by the fade-out animation). isEnter && isOrigin ? this.show() : this.hide(); } }; /** * @private * @return {?} */ NzTooltipBaseDirective.prototype.removeTriggerListeners = /** * @private * @return {?} */ function () { this.triggerDisposables.forEach((/** * @param {?} dispose * @return {?} */ function (dispose) { return dispose(); })); this.triggerDisposables.length = 0; }; /** * @private * @return {?} */ NzTooltipBaseDirective.prototype.clearTogglingTimer = /** * @private * @return {?} */ function () { if (this.delayTimer) { clearTimeout(this.delayTimer); this.delayTimer = undefined; } }; NzTooltipBaseDirective.propDecorators = { nzTitle: [{ type: Input }], nzContent: [{ type: Input }], nzTrigger: [{ type: Input }], nzPlacement: [{ type: Input }], nzMouseEnterDelay: [{ type: Input }], nzMouseLeaveDelay: [{ type: Input }], nzOverlayClassName: [{ type: Input }], nzOverlayStyle: [{ type: Input }], nzVisible: [{ type: Input }], nzVisibleChange: [{ type: Output }] }; return NzTooltipBaseDirective; }()); export { NzTooltipBaseDirective }; if (false) { /** @type {?} */ NzTooltipBaseDirective.prototype.directiveNameTitle; /** @type {?} */ NzTooltipBaseDirective.prototype.specificTitle; /** @type {?} */ NzTooltipBaseDirective.prototype.directiveNameContent; /** @type {?} */ NzTooltipBaseDirective.prototype.specificContent; /** @type {?} */ NzTooltipBaseDirective.prototype.specificTrigger; /** @type {?} */ NzTooltipBaseDirective.prototype.specificPlacement; /** @type {?} */ NzTooltipBaseDirective.prototype.specificOrigin; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. * Please use a more specific API. Like `nzTooltipTitle`. * @type {?} */ NzTooltipBaseDirective.prototype.nzTitle; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. * Please use a more specific API. Like `nzPopoverContent`. * @type {?} */ NzTooltipBaseDirective.prototype.nzContent; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. * Please use a more specific API. Like `nzTooltipTrigger`. * @type {?} */ NzTooltipBaseDirective.prototype.nzTrigger; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. * Please use a more specific API. Like `nzTooltipPlacement`. * @type {?} */ NzTooltipBaseDirective.prototype.nzPlacement; /** @type {?} */ NzTooltipBaseDirective.prototype.nzMouseEnterDelay; /** @type {?} */ NzTooltipBaseDirective.prototype.nzMouseLeaveDelay; /** @type {?} */ NzTooltipBaseDirective.prototype.nzOverlayClassName; /** @type {?} */ NzTooltipBaseDirective.prototype.nzOverlayStyle; /** @type {?} */ NzTooltipBaseDirective.prototype.nzVisible; /** * For create tooltip dynamically. This should be override for each different component. * @type {?} * @protected */ NzTooltipBaseDirective.prototype.componentFactory; /** * @type {?} * @protected */ NzTooltipBaseDirective.prototype.needProxyProperties; /** @type {?} */ NzTooltipBaseDirective.prototype.nzVisibleChange; /** @type {?} */ NzTooltipBaseDirective.prototype.visible; /** @type {?} */ NzTooltipBaseDirective.prototype.component; /** * @type {?} * @protected */ NzTooltipBaseDirective.prototype.destroy$; /** * @type {?} * @protected */ NzTooltipBaseDirective.prototype.triggerDisposables; /** * @type {?} * @private */ NzTooltipBaseDirective.prototype.delayTimer; /** @type {?} */ NzTooltipBaseDirective.prototype.elementRef; /** * @type {?} * @protected */ NzTooltipBaseDirective.prototype.hostView; /** * @type {?} * @protected */ NzTooltipBaseDirective.prototype.resolver; /** * @type {?} * @protected */ NzTooltipBaseDirective.prototype.renderer; /** * @type {?} * @protected */ NzTooltipBaseDirective.prototype.noAnimation; } /** * @abstract */ var NzTooltipBaseComponent = /** @class */ (function () { function NzTooltipBaseComponent(cdr, noAnimation) { this.cdr = cdr; this.noAnimation = noAnimation; this.nzVisibleChange = new Subject(); this.nzOverlayStyle = {}; this._visible = false; this._trigger = 'hover'; this.preferredPlacement = 'top'; this._classMap = {}; this._hasBackdrop = false; this._prefix = 'ant-tooltip-placement'; this._positions = __spread(DEFAULT_TOOLTIP_POSITIONS); } Object.defineProperty(NzTooltipBaseComponent.prototype, "nzVisible", { get: /** * @return {?} */ function () { return this._visible; }, set: /** * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var visible = toBoolean(value); if (this._visible !== visible) { this._visible = visible; this.nzVisibleChange.next(visible); } }, enumerable: true, configurable: true }); Object.defineProperty(NzTooltipBaseComponent.prototype, "nzTrigger", { get: /** * @return {?} */ function () { return this._trigger; }, set: /** * @param {?} value * @return {?} */ function (value) { this._trigger = value; this._hasBackdrop = this._trigger === 'click'; }, enumerable: true, configurable: true }); Object.defineProperty(NzTooltipBaseComponent.prototype, "nzPlacement", { get: /** * @return {?} */ function () { return this.preferredPlacement; }, set: /** * @param {?} value * @return {?} */ function (value) { if (value !== this.preferredPlacement) { this.preferredPlacement = value; this._positions = __spread([POSITION_MAP[this.nzPlacement]], this._positions); } }, enumerable: true, configurable: true }); /** * @return {?} */ NzTooltipBaseComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.nzVisibleChange.complete(); }; /** * @return {?} */ NzTooltipBaseComponent.prototype.show = /** * @return {?} */ function () { if (this.nzVisible) { return; } if (!this.isEmpty()) { this.nzVisible = true; this.nzVisibleChange.next(true); this.cdr.detectChanges(); } }; /** * @return {?} */ NzTooltipBaseComponent.prototype.hide = /** * @return {?} */ function () { if (!this.nzVisible) { return; } this.nzVisible = false; this.nzVisibleChange.next(false); this.cdr.detectChanges(); }; /** * @return {?} */ NzTooltipBaseComponent.prototype.updateByDirective = /** * @return {?} */ function () { var _this = this; this.setClassMap(); this.cdr.detectChanges(); Promise.resolve().then((/** * @return {?} */ function () { _this.updatePosition(); _this.updateVisibilityByTitle(); })); }; /** * Force the component to update its position. */ /** * Force the component to update its position. * @return {?} */ NzTooltipBaseComponent.prototype.updatePosition = /** * Force the component to update its position. * @return {?} */ function () { if (this.origin && this.overlay && this.overlay.overlayRef) { this.overlay.overlayRef.updatePosition(); } }; /** * @param {?} position * @return {?} */ NzTooltipBaseComponent.prototype.onPositionChange = /** * @param {?} position * @return {?} */ function (position) { this.preferredPlacement = (/** @type {?} */ (getPlacementName(position))); this.setClassMap(); this.cdr.detectChanges(); }; /** * @return {?} */ NzTooltipBaseComponent.prototype.setClassMap = /** * @return {?} */ function () { var _a; this._classMap = (_a = {}, _a[this.nzOverlayClassName] = true, _a[this._prefix + "-" + this.preferredPlacement] = true, _a); }; /** * @param {?} origin * @return {?} */ NzTooltipBaseComponent.prototype.setOverlayOrigin = /** * @param {?} origin * @return {?} */ function (origin) { this.origin = origin; this.cdr.markForCheck(); }; /** * Hide the component while the content is empty. */ /** * Hide the component while the content is empty. * @private * @return {?} */ NzTooltipBaseComponent.prototype.updateVisibilityByTitle = /** * Hide the component while the content is empty. * @private * @return {?} */ function () { if (this.isEmpty()) { this.hide(); } }; NzTooltipBaseComponent.propDecorators = { overlay: [{ type: ViewChild, args: ['overlay', { static: false },] }] }; return NzTooltipBaseComponent; }()); export { NzTooltipBaseComponent }; if (false) { /** @type {?} */ NzTooltipBaseComponent.prototype.overlay; /** @type {?} */ NzTooltipBaseComponent.prototype.nzVisibleChange; /** @type {?} */ NzTooltipBaseComponent.prototype.nzTitle; /** @type {?} */ NzTooltipBaseComponent.prototype.nzContent; /** @type {?} */ NzTooltipBaseComponent.prototype.nzOverlayClassName; /** @type {?} */ NzTooltipBaseComponent.prototype.nzOverlayStyle; /** @type {?} */ NzTooltipBaseComponent.prototype.nzMouseEnterDelay; /** @type {?} */ NzTooltipBaseComponent.prototype.nzMouseLeaveDelay; /** @type {?} */ NzTooltipBaseComponent.prototype._visible; /** * @type {?} * @protected */ NzTooltipBaseComponent.prototype._trigger; /** @type {?} */ NzTooltipBaseComponent.prototype.origin; /** @type {?} */ NzTooltipBaseComponent.prototype.preferredPlacement; /** @type {?} */ NzTooltipBaseComponent.prototype._classMap; /** @type {?} */ NzTooltipBaseComponent.prototype._hasBackdrop; /** @type {?} */ NzTooltipBaseComponent.prototype._prefix; /** @type {?} */ NzTooltipBaseComponent.prototype._positions; /** @type {?} */ NzTooltipBaseComponent.prototype.cdr; /** @type {?} */ NzTooltipBaseComponent.prototype.noAnimation; /** * Empty component cannot be opened. * @abstract * @protected * @return {?} */ NzTooltipBaseComponent.prototype.isEmpty = function () { }; } /** * @param {?} value * @return {?} */ export function isTooltipEmpty(value) { return value instanceof TemplateRef ? false : value === '' || !isNotNil(value); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvdG9vbHRpcC8iLCJzb3VyY2VzIjpbImJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQVFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBNEUsTUFBTSxzQkFBc0IsQ0FBQztBQUNySSxPQUFPLEVBTUwsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sV0FBVyxFQUNYLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFNUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXZHLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFJakU7SUFtRkUsZ0NBQ1MsVUFBc0IsRUFDbkIsUUFBMEIsRUFDMUIsUUFBa0MsRUFDbEMsUUFBbUIsRUFDbkIsV0FBb0M7UUFKdkMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNuQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUMxQixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUF5Qjs7Ozs7UUEvRHZDLGNBQVMsR0FBcUIsT0FBTyxDQUFDOzs7OztRQU10QyxnQkFBVyxHQUFXLEtBQUssQ0FBQztRQUU1QixzQkFBaUIsR0FBVyxJQUFJLENBQUM7UUFDakMsc0JBQWlCLEdBQVcsR0FBRyxDQUFDO1FBOEIvQix3QkFBbUIsR0FBRztZQUM5QixvQkFBb0I7WUFDcEIsZ0JBQWdCO1lBQ2hCLG1CQUFt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QUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7OzBCQTlIQSxTQUFTLFNBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7SUFvSXpDLDZCQUFDO0NBQUEsQUFySUQsSUFxSUM7U0FySXFCLHNCQUFzQjs7O0lBQzFDLHlDQUFzRTs7SUFFdEUsaURBQXlDOztJQUN6Qyx5Q0FBeUI7O0lBQ3pCLDJDQUEyQjs7SUFDM0Isb0RBQTJCOztJQUMzQixnREFBc0M7O0lBQ3RDLG1EQUEwQjs7SUFDMUIsbURBQTBCOztJQWMxQiwwQ0FBaUI7Ozs7O0lBV2pCLDBDQUErQzs7SUFhL0Msd0NBQXlCOztJQUN6QixvREFBMkI7O0lBRTNCLDJDQUFpQzs7SUFDakMsOENBQXFCOztJQUNyQix5Q0FBa0M7O0lBQ2xDLDRDQUFzRTs7SUFFMUQscUNBQTZCOztJQUFFLDZDQUEyQzs7Ozs7OztJQTZFdEYsMkRBQXNDOzs7Ozs7QUFHeEMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUF3QztJQUNyRSxPQUFPLEtBQUssWUFBWSxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IENka0Nvbm5lY3RlZE92ZXJsYXksIENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSwgQ29ubmVjdGlvblBvc2l0aW9uUGFpciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHdhcm5EZXByZWNhdGlvbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9sb2dnZXInO1xuaW1wb3J0IHsgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24nO1xuaW1wb3J0IHsgREVGQVVMVF9UT09MVElQX1BPU0lUSU9OUywgZ2V0UGxhY2VtZW50TmFtZSwgUE9TSVRJT05fTUFQIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL292ZXJsYXknO1xuaW1wb3J0IHsgTmdDbGFzc0ludGVyZmFjZSwgTmdTdHlsZUludGVyZmFjZSwgTnpTYWZlQW55LCBOelRTVHlwZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBpc05vdE5pbCwgdG9Cb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IHR5cGUgTnpUb29sdGlwVHJpZ2dlciA9ICdjbGljaycgfCAnZm9jdXMnIHwgJ2hvdmVyJyB8IG51bGw7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOelRvb2x0aXBCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBkaXJlY3RpdmVOYW1lVGl0bGU/OiBOelRTVHlwZSB8IG51bGw7XG4gIHNwZWNpZmljVGl0bGU/OiBOelRTVHlwZSB8IG51bGw7XG4gIGRpcmVjdGl2ZU5hbWVDb250ZW50PzogTnpUU1R5cGUgfCBudWxsO1xuICBzcGVjaWZpY0NvbnRlbnQ/OiBOelRTVHlwZSB8IG51bGw7XG4gIHNwZWNpZmljVHJpZ2dlcj86IE56VG9vbHRpcFRyaWdnZXI7XG4gIHNwZWNpZmljUGxhY2VtZW50Pzogc3RyaW5nO1xuICBzcGVjaWZpY09yaWdpbj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAxMC4wLjAuIFRoaXMgaXMgZGVwcmVjYXRlZCBhbmQgZ29pbmcgdG8gYmUgcmVtb3ZlZCBpbiAxMC4wLjAuXG4gICAqIFBsZWFzZSB1c2UgYSBtb3JlIHNwZWNpZmljIEFQSS4gTGlrZSBgbnpUb29sdGlwVGl0bGVgLlxuICAgKi9cbiAgQElucHV0KCkgbnpUaXRsZTogTnpUU1R5cGUgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAxMC4wLjAuIFRoaXMgaXMgZGVwcmVjYXRlZCBhbmQgZ29pbmcgdG8gYmUgcmVtb3ZlZCBpbiAxMC4wLjAuXG4gICAqIFBsZWFzZSB1c2UgYSBtb3JlIHNwZWNpZmljIEFQSS4gTGlrZSBgbnpQb3BvdmVyQ29udGVudGAuXG4gICAqL1xuICBASW5wdXQoKSBuekNvbnRlbnQ6IE56VFNUeXBlIHwgbnVsbDtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgMTAuMC4wLiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuICAgKiBQbGVhc2UgdXNlIGEgbW9yZSBzcGVjaWZpYyBBUEkuIExpa2UgYG56VG9vbHRpcFRyaWdnZXJgLlxuICAgKi9cbiAgQElucHV0KCkgbnpUcmlnZ2VyOiBOelRvb2x0aXBUcmlnZ2VyID0gJ2hvdmVyJztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgMTAuMC4wLiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuICAgKiBQbGVhc2UgdXNlIGEgbW9yZSBzcGVjaWZpYyBBUEkuIExpa2UgYG56VG9vbHRpcFBsYWNlbWVudGAuXG4gICAqL1xuICBASW5wdXQoKSBuelBsYWNlbWVudDogc3RyaW5nID0gJ3RvcCc7XG5cbiAgQElucHV0KCkgbnpNb3VzZUVudGVyRGVsYXk6IG51bWJlciA9IDAuMTU7XG4gIEBJbnB1dCgpIG56TW91c2VMZWF2ZURlbGF5OiBudW1iZXIgPSAwLjE7XG4gIEBJbnB1dCgpIG56T3ZlcmxheUNsYXNzTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBuek92ZXJsYXlTdHlsZTogTmdTdHlsZUludGVyZmFjZTtcbiAgQElucHV0KCkgbnpWaXNpYmxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGb3IgY3JlYXRlIHRvb2x0aXAgZHluYW1pY2FsbHkuIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRlIGZvciBlYWNoIGRpZmZlcmVudCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29tcG9uZW50RmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxOelRvb2x0aXBCYXNlQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogVGhpcyB0cnVlIHRpdGxlIHRoYXQgd291bGQgYmUgdXNlZCBpbiBvdGhlciBwYXJ0cyBvbiB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdGl0bGUoKTogTnpUU1R5cGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zcGVjaWZpY1RpdGxlIHx8IHRoaXMuZGlyZWN0aXZlTmFtZVRpdGxlIHx8IHRoaXMubnpUaXRsZSB8fCBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBjb250ZW50KCk6IE56VFNUeXBlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3BlY2lmaWNDb250ZW50IHx8IHRoaXMuZGlyZWN0aXZlTmFtZUNvbnRlbnQgfHwgdGhpcy5uekNvbnRlbnQgfHwgbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcGxhY2VtZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3BlY2lmaWNQbGFjZW1lbnQgfHwgdGhpcy5uelBsYWNlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJpZ2dlcigpOiBOelRvb2x0aXBUcmlnZ2VyIHtcbiAgICAvLyBOelRvb2x0aXBUcmlnZ2VyIGNhbiBiZSBudWxsLlxuICAgIHJldHVybiB0eXBlb2YgdGhpcy5zcGVjaWZpY1RyaWdnZXIgIT09ICd1bmRlZmluZWQnID8gdGhpcy5zcGVjaWZpY1RyaWdnZXIgOiB0aGlzLm56VHJpZ2dlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZWVkUHJveHlQcm9wZXJ0aWVzID0gW1xuICAgICduek92ZXJsYXlDbGFzc05hbWUnLFxuICAgICduek92ZXJsYXlTdHlsZScsXG4gICAgJ256TW91c2VFbnRlckRlbGF5JyxcbiAgICAnbnpNb3VzZUxlYXZlRGVsYXknLFxuICAgICduelZpc2libGUnLFxuICAgICdub0FuaW1hdGlvbidcbiAgXTtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpWaXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHZpc2libGUgPSBmYWxzZTtcbiAgY29tcG9uZW50OiBOelRvb2x0aXBCYXNlQ29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmlnZ2VyRGlzcG9zYWJsZXM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgcHJpdmF0ZSBkZWxheVRpbWVyPzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBob3N0VmlldzogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcm90ZWN0ZWQgbm9BbmltYXRpb24/OiBOek5vQW5pbWF0aW9uRGlyZWN0aXZlXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBuelRyaWdnZXIsIHNwZWNpZmljVHJpZ2dlciB9ID0gY2hhbmdlcztcbiAgICBjb25zdCB0cmlnZ2VyID0gc3BlY2lmaWNUcmlnZ2VyIHx8IG56VHJpZ2dlcjtcblxuICAgIGlmICh0cmlnZ2VyICYmICF0cmlnZ2VyLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgdGhpcy5yZWdpc3RlclRyaWdnZXJzKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICB0aGlzLnVwZGF0ZUNoYW5nZWRQcm9wZXJ0aWVzKGNoYW5nZXMpO1xuICAgIH1cblxuICAgIC8vIHdhcm4gZGVwcmVjYXRlZCB0aGluZ3Mgd2hlbiBzcGVjaWZpYyBwcm9wZXJ0eSBpcyBub3QgZ2l2ZW5cbiAgICBpZiAoY2hhbmdlcy5uelRpdGxlICYmICF0aGlzLnNwZWNpZmljVGl0bGUgJiYgIXRoaXMuZGlyZWN0aXZlTmFtZVRpdGxlKSB7XG4gICAgICB3YXJuRGVwcmVjYXRpb24oXG4gICAgICAgIGAnbnpUaXRsZScgb2YgJ256LXRvb2x0aXAnIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAxMC4wLjAuXG5QbGVhc2UgdXNlICduelRvb2x0aXBUaXRsZScgaW5zdGVhZC4gVGhlIHNhbWUgd2l0aCAnbnotcG9wb3ZlcicgYW5kICduei1wb3Bjb25maXJtJy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm56Q29udGVudCAmJiAhdGhpcy5zcGVjaWZpY0NvbnRlbnQpIHtcbiAgICAgIHdhcm5EZXByZWNhdGlvbihcbiAgICAgICAgYCduekNvbnRlbnQnIG9mICduei1wb3BvdmVyJyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuUGxlYXNlIHVzZSAnbnpQb3BvdmVyQ29udGVudCcgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm56UGxhY2VtZW50ICYmICF0aGlzLnNwZWNpZmljUGxhY2VtZW50KSB7XG4gICAgICB3YXJuRGVwcmVjYXRpb24oXG4gICAgICAgIGAnbnpQbGFjZW1lbnQnIG9mICduei10b29sdGlwJyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuUGxlYXNlIHVzZSAnbnpUb29sdGlwQ29udGVudCcgaW5zdGVhZC4gVGhlIHNhbWUgd2l0aCAnbnotcG9wb3ZlcicgYW5kICduei1wb3Bjb25maXJtJy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm56VHJpZ2dlciAmJiAhdGhpcy5zcGVjaWZpY1RyaWdnZXIpIHtcbiAgICAgIHdhcm5EZXByZWNhdGlvbihcbiAgICAgICAgYCduelRyaWdnZXInIG9mICduei10b29sdGlwJyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuUGxlYXNlIHVzZSAnbnpUb29sdGlwVHJpZ2dlcicgaW5zdGVhZC4gVGhlIHNhbWUgd2l0aCAnbnotcG9wb3ZlcicgYW5kICduei1wb3Bjb25maXJtJy5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudCgpO1xuICAgIHRoaXMucmVnaXN0ZXJUcmlnZ2VycygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgLy8gQ2xlYXIgdG9nZ2xpbmcgdGltZXIuIElzc3VlICMzODc1ICM0MzE3ICM0Mzg2XG4gICAgdGhpcy5jbGVhclRvZ2dsaW5nVGltZXIoKTtcbiAgICB0aGlzLnJlbW92ZVRyaWdnZXJMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnQuc2hvdygpO1xuICB9XG5cbiAgaGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudC5oaWRlKCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgdGhlIGNvbXBvbmVudCB0byB1cGRhdGUgaXRzIHBvc2l0aW9uLlxuICAgKi9cbiAgdXBkYXRlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVQb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBkeW5hbWljIHRvb2x0aXAgY29tcG9uZW50LiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuaG9zdFZpZXcuY3JlYXRlQ29tcG9uZW50KHRoaXMuY29tcG9uZW50RmFjdG9yeSk7XG5cbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgIC8vIFJlbW92ZSB0aGUgY29tcG9uZW50J3MgRE9NIGJlY2F1c2UgaXQgc2hvdWxkIGJlIGluIHRoZSBvdmVybGF5IGNvbnRhaW5lci5cbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMucmVuZGVyZXIucGFyZW50Tm9kZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCksIGNvbXBvbmVu