@taiga-ui/kit
Version:
Taiga UI Angular main components kit
266 lines • 32 kB
JavaScript
import { __decorate, __extends, __param } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, HostListener, Inject, Input, Optional, Self, ViewChild, } from '@angular/core';
import { NgControl } from '@angular/forms';
import { AbstractTuiNullableControl, TUI_FOCUSABLE_ITEM_ACCESSOR, tuiDefaultProp, } from '@taiga-ui/cdk';
import { formatNumber, maskedMoneyValueIsEmpty, maskedNumberStringToNumber, tuiCreateAutoCorrectedNumberPipe, tuiCreateNumberMask, TuiPrimitiveTextfieldComponent, } from '@taiga-ui/core';
var DEFAULT_MAX_LENGTH = 18;
// @dynamic
var TuiInputNumberComponent = /** @class */ (function (_super) {
__extends(TuiInputNumberComponent, _super);
function TuiInputNumberComponent(control, changeDetectorRef) {
var _this = _super.call(this, control, changeDetectorRef) || this;
_this.min = -Infinity;
_this.max = Infinity;
_this.decimal = "not-zero" /* NotZero */;
_this.precision = 2;
_this.postfix = '';
_this.mask = function (allowNegative, decimal, precision, nativeFocusableElement) { return ({
mask: tuiCreateNumberMask({
allowNegative: allowNegative,
allowDecimal: decimal !== 'never',
decimalLimit: precision,
requireDecimal: decimal === 'always',
}),
pipe: tuiCreateAutoCorrectedNumberPipe(decimal === 'always' ? precision : 0, ',', nativeFocusableElement || undefined),
guide: false,
}); };
return _this;
}
TuiInputNumberComponent_1 = TuiInputNumberComponent;
Object.defineProperty(TuiInputNumberComponent.prototype, "nativeFocusableElement", {
get: function () {
return !this.primitiveTextfield || this.computedDisabled
? null
: this.primitiveTextfield.nativeFocusableElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiInputNumberComponent.prototype, "focused", {
get: function () {
return !!this.primitiveTextfield && this.primitiveTextfield.focused;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiInputNumberComponent.prototype, "isNegativeAllowed", {
get: function () {
return this.min < 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiInputNumberComponent.prototype, "inputMode", {
get: function () {
return this.decimal === 'never' ? "numeric" /* Numeric */ : "decimal" /* Decimal */;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiInputNumberComponent.prototype, "calculatedMaxLength", {
get: function () {
return (DEFAULT_MAX_LENGTH +
(this.decimal !== "never" /* Never */ && this.nativeValue.includes(',')
? this.precision + 1
: 0));
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiInputNumberComponent.prototype, "formattedValue", {
get: function () {
var value = this.value || 0;
var absValue = Math.abs(value);
var hasFraction = absValue % 1 > 0;
var limit = this.decimal === 'always' || hasFraction ? this.precision : 0;
var fraction = hasFraction
? value.toString().split('.')[1].substr(0, this.precision)
: '';
if (this.focused && this.decimal !== 'always') {
limit = fraction.length;
}
return formatNumber(value, limit);
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiInputNumberComponent.prototype, "computedValue", {
get: function () {
if (this.focused || !this.isNativeValueInLimit) {
return this.nativeValue;
}
if (this.value === null) {
return maskedMoneyValueIsEmpty(this.nativeValue) ? this.nativeValue : '';
}
return this.formattedValue;
},
enumerable: true,
configurable: true
});
TuiInputNumberComponent.prototype.onValue = function (value) {
if (maskedMoneyValueIsEmpty(value)) {
this.updateValue(null);
return;
}
if (this.isNativeValueNotFinished) {
return;
}
var capped = this.absoluteCapInputValue(value);
if (capped === null || isNaN(capped)) {
return;
}
this.updateValue(capped);
if (capped !== maskedNumberStringToNumber(value)) {
this.nativeValue = this.formattedValue;
}
};
TuiInputNumberComponent.prototype.onKeyDown = function (event) {
if (event.key !== ',' && event.key !== '.') {
return;
}
if (this.decimal === 'never') {
event.preventDefault();
return;
}
if (this.nativeValue.includes(',')) {
event.preventDefault();
this.setCaretAfterComma();
}
};
TuiInputNumberComponent.prototype.onFocused = function (focused) {
this.updateFocused(focused);
if (focused) {
return;
}
var nativeNumberValue = maskedNumberStringToNumber(this.nativeValue);
if (isNaN(nativeNumberValue)) {
this.clear();
return;
}
var clamped = Math.min(this.max, Math.max(this.min, nativeNumberValue));
this.updateValue(clamped);
this.nativeValue = this.formattedValue;
};
TuiInputNumberComponent.prototype.onHovered = function (hovered) {
this.updateHovered(hovered);
};
TuiInputNumberComponent.prototype.onPressed = function (pressed) {
this.updatePressed(pressed);
};
TuiInputNumberComponent.prototype.onZero = function (event) {
var decimal = this.nativeValue.split(',')[1] || '';
var nativeFocusableElement = this.nativeFocusableElement;
if (decimal.length < this.precision ||
!nativeFocusableElement ||
!nativeFocusableElement.selectionStart ||
this.nativeValue[nativeFocusableElement.selectionStart] !== '0') {
return;
}
event.preventDefault();
nativeFocusableElement.selectionStart++;
};
Object.defineProperty(TuiInputNumberComponent.prototype, "isNativeValueInLimit", {
get: function () {
if (this.nativeValue === '') {
return true;
}
var nativeNumberValue = maskedNumberStringToNumber(this.nativeValue);
return nativeNumberValue >= this.min && nativeNumberValue <= this.max;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiInputNumberComponent.prototype, "isNativeValueNotFinished", {
get: function () {
var nativeNumberValue = maskedNumberStringToNumber(this.nativeValue);
return nativeNumberValue < 0
? nativeNumberValue > this.max
: nativeNumberValue < this.min;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiInputNumberComponent.prototype, "nativeValue", {
get: function () {
return this.nativeFocusableElement ? this.nativeFocusableElement.value : '';
},
set: function (value) {
if (!this.primitiveTextfield || !this.nativeFocusableElement) {
return;
}
this.primitiveTextfield.value = value;
this.nativeFocusableElement.value = value;
},
enumerable: true,
configurable: true
});
TuiInputNumberComponent.prototype.clear = function () {
this.nativeValue = '';
this.updateValue(null);
};
TuiInputNumberComponent.prototype.absoluteCapInputValue = function (inputValue) {
var value = maskedNumberStringToNumber(inputValue);
var capped = value < 0 ? Math.max(this.min, value) : Math.min(value, this.max);
var ineligibleValue = isNaN(capped) || capped < this.min || capped > this.max;
return ineligibleValue ? null : capped;
};
TuiInputNumberComponent.prototype.setCaretAfterComma = function () {
if (!this.nativeFocusableElement) {
return;
}
var afterCommaPosition = this.nativeValue.length - this.precision;
this.nativeFocusableElement.setSelectionRange(afterCommaPosition, afterCommaPosition);
};
var TuiInputNumberComponent_1;
TuiInputNumberComponent.ctorParameters = function () { return [
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgControl,] }] },
{ type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] }
]; };
__decorate([
Input(),
tuiDefaultProp()
], TuiInputNumberComponent.prototype, "min", void 0);
__decorate([
Input(),
tuiDefaultProp()
], TuiInputNumberComponent.prototype, "max", void 0);
__decorate([
Input(),
tuiDefaultProp()
], TuiInputNumberComponent.prototype, "decimal", void 0);
__decorate([
Input(),
tuiDefaultProp()
], TuiInputNumberComponent.prototype, "precision", void 0);
__decorate([
Input(),
tuiDefaultProp()
], TuiInputNumberComponent.prototype, "postfix", void 0);
__decorate([
ViewChild(TuiPrimitiveTextfieldComponent)
], TuiInputNumberComponent.prototype, "primitiveTextfield", void 0);
__decorate([
HostListener('keydown.0', ['$event'])
], TuiInputNumberComponent.prototype, "onZero", null);
TuiInputNumberComponent = TuiInputNumberComponent_1 = __decorate([
Component({
selector: 'tui-input-number',
template: "<tui-primitive-textfield\n class=\"textfield\"\n tuiValueAccessor\n tuiTextfieldInputMode=\"decimal\"\n [pseudoHovered]=\"pseudoHovered\"\n [pseudoFocused]=\"computedFocused\"\n [invalid]=\"computedInvalid\"\n [tuiTextfieldMaxLength]=\"calculatedMaxLength\"\n [readOnly]=\"readOnly\"\n [disabled]=\"computedDisabled\"\n [textMask]=\"isNegativeAllowed | tuiMapper: mask:decimal:precision:nativeFocusableElement\"\n [value]=\"computedValue\"\n [postfix]=\"postfix\"\n [focusable]=\"focusable\"\n (valueChange)=\"onValue($event)\"\n (hoveredChange)=\"onHovered($event)\"\n (focusedChange)=\"onFocused($event)\"\n (pressedChange)=\"onPressed($event)\"\n (keydown)=\"onKeyDown($event)\"\n>\n <ng-content></ng-content>\n</tui-primitive-textfield>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [
{
provide: TUI_FOCUSABLE_ITEM_ACCESSOR,
useExisting: forwardRef(function () { return TuiInputNumberComponent_1; }),
},
],
styles: [":host{display:block;border-radius:var(--tui-radius-m)}.textfield{border-radius:inherit}"]
}),
__param(0, Optional()),
__param(0, Self()),
__param(0, Inject(NgControl)),
__param(1, Inject(ChangeDetectorRef))
], TuiInputNumberComponent);
return TuiInputNumberComponent;
}(AbstractTuiNullableControl));
export { TuiInputNumberComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9pbnB1dC1udW1iZXIvIiwic291cmNlcyI6WyJpbnB1dC1udW1iZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQ0gsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQixjQUFjLEdBSWpCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLDBCQUEwQixFQUMxQixnQ0FBZ0MsRUFDaEMsbUJBQW1CLEVBRW5CLDhCQUE4QixHQUVqQyxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLElBQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCLFdBQVc7QUFhWDtJQUNZLDJDQUFrQztJQTZDMUMsaUNBSUksT0FBeUIsRUFDRSxpQkFBb0M7UUFMbkUsWUFPSSxrQkFBTSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsU0FDcEM7UUFqREQsU0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBSWhCLFNBQUcsR0FBRyxRQUFRLENBQUM7UUFJZixhQUFPLDRCQUFrQztRQUl6QyxlQUFTLEdBQUcsQ0FBQyxDQUFDO1FBSWQsYUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLFVBQUksR0FBMkMsVUFDM0MsYUFBc0IsRUFDdEIsT0FBbUIsRUFDbkIsU0FBaUIsRUFDakIsc0JBQStDLElBQzlDLE9BQUEsQ0FBQztZQUNGLElBQUksRUFBRSxtQkFBbUIsQ0FBQztnQkFD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QjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTt3REFDRDtJQUloQjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTt3REFDRjtJQUlmO1FBRkMsS0FBSyxFQUFFO1FBQ1AsY0FBYyxFQUFFOzREQUN3QjtJQUl6QztRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTs4REFDSDtJQUlkO1FBRkMsS0FBSyxFQUFFO1FBQ1AsY0FBYyxFQUFFOzREQUNKO0lBdUJiO1FBREMsU0FBUyxDQUFDLDhCQUE4QixDQUFDO3VFQUMyQjtJQTJJckU7UUFEQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7eURBZ0JyQztJQXRNUSx1QkFBdUI7UUFabkMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QiwyeUJBQTJDO1lBRTNDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO1lBQy9DLFNBQVMsRUFBRTtnQkFDUDtvQkFDSSxPQUFPLEVBQUUsMkJBQTJCO29CQUNwQyxXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSx5QkFBdUIsRUFBdkIsQ0FBdUIsQ0FBQztpQkFDekQ7YUFDSjs7U0FDSixDQUFDO1FBZ0RPLFdBQUEsUUFBUSxFQUFFLENBQUE7UUFDVixXQUFBLElBQUksRUFBRSxDQUFBO1FBQ04sV0FBQSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFakIsV0FBQSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtPQW5EckIsdUJBQXVCLENBZ1FuQztJQUFELDhCQUFDO0NBQUEsQUFoUUQsQ0FDWSwwQkFBMEIsR0ErUHJDO1NBaFFZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPcHRpb25hbCxcbiAgICBTZWxmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFR1aU51bGxhYmxlQ29udHJvbCxcbiAgICBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgdHVpRGVmYXVsdFByb3AsXG4gICAgVHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yLFxuICAgIFR1aUlucHV0TW9kZSxcbiAgICBUdWlNYXBwZXIsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHtcbiAgICBmb3JtYXROdW1iZXIsXG4gICAgbWFza2VkTW9uZXlWYWx1ZUlzRW1wdHksXG4gICAgbWFza2VkTnVtYmVyU3RyaW5nVG9OdW1iZXIsXG4gICAgdHVpQ3JlYXRlQXV0b0NvcnJlY3RlZE51bWJlclBpcGUsXG4gICAgdHVpQ3JlYXRlTnVtYmVyTWFzayxcbiAgICBUdWlEZWNpbWFsLFxuICAgIFR1aVByaW1pdGl2ZVRleHRmaWVsZENvbXBvbmVudCxcbiAgICBUdWlUZXh0TWFza09wdGlvbnMsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcblxuY29uc3QgREVGQVVMVF9NQVhfTEVOR1RIID0gMTg7XG5cbi8vIEBkeW5hbWljXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3R1aS1pbnB1dC1udW1iZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1udW1iZXIudGVtcGxhdGUuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtbnVtYmVyLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVFVJX0ZPQ1VTQUJMRV9JVEVNX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVHVpSW5wdXROdW1iZXJDb21wb25lbnQpLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUlucHV0TnVtYmVyQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBBYnN0cmFjdFR1aU51bGxhYmxlQ29udHJvbDxudW1iZXI+XG4gICAgaW1wbGVtZW50cyBUdWlGb2N1c2FibGVFbGVtZW50QWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBtaW4gPSAtSW5maW5pdHk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgbWF4ID0gSW5maW5pdHk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgZGVjaW1hbDogVHVpRGVjaW1hbCA9IFR1aURlY2ltYWwuTm90WmVybztcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBwcmVjaXNpb24gPSAyO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHBvc3RmaXggPSAnJztcblxuICAgIG1hc2s6IFR1aU1hcHBlcjxib29sZWFuLCBUdWlUZXh0TWFza09wdGlvbnM+ID0gKFxuICAgICAgICBhbGxvd05lZ2F0aXZlOiBib29sZWFuLFxuICAgICAgICBkZWNpbWFsOiBUdWlEZWNpbWFsLFxuICAgICAgICBwcmVjaXNpb246IG51bWJlcixcbiAgICAgICAgbmF0aXZlRm9jdXNhYmxlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCB8IG51bGwsXG4gICAgKSA9PiAoe1xuICAgICAgICBtYXNrOiB0dWlDcmVhdGVOdW1iZXJNYXNrKHtcbiAgICAgICAgICAgIGFsbG93TmVnYXRpdmU6IGFsbG93TmVnYXRpdmUsXG4gICAgICAgICAgICBhbGxvd0RlY2ltYWw6IGRlY2ltYWwgIT09ICduZXZlcicsXG4gICAgICAgICAgICBkZWNpbWFsTGltaXQ6IHByZWNpc2lvbixcbiAgICAgICAgICAgIHJlcXVpcmVEZWNpbWFsOiBkZWNpbWFsID09PSAnYWx3YXlzJyxcbiAgICAgICAgfSksXG4gICAgICAgIHBpcGU6IHR1aUNyZWF0ZUF1dG9Db3JyZWN0ZWROdW1iZXJQaXBlKFxuICAgICAgICAgICAgZGVjaW1hbCA9PT0gJ2Fsd2F5cycgPyBwcmVjaXNpb24gOiAwLFxuICAgICAgICAgICAgJywnLFxuICAgICAgICAgICAgbmF0aXZlRm9jdXNhYmxlRWxlbWVudCB8fCB1bmRlZmluZWQsXG4gICAgICAgICksXG4gICAgICAgIGd1aWRlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIEBWaWV3Q2hpbGQoVHVpUHJpbWl0aXZlVGV4dGZpZWxkQ29tcG9uZW50KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbWl0aXZlVGV4dGZpZWxkPzogVHVpUHJpbWl0aXZlVGV4dGZpZWxkQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTZWxmKClcbiAgICAgICAgQEluamVjdChOZ0NvbnRyb2wpXG4gICAgICAgIGNvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoY29udHJvbCwgY2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVGb2N1c2FibGVFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByaW1pdGl2ZVRleHRmaWVsZCB8fCB0aGlzLmNvbXB1dGVkRGlzYWJsZWRcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiB0aGlzLnByaW1pdGl2ZVRleHRmaWVsZC5uYXRpdmVGb2N1c2FibGVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnByaW1pdGl2ZVRleHRmaWVsZCAmJiB0aGlzLnByaW1pdGl2ZVRleHRmaWVsZC5mb2N1c2VkO1xuICAgIH1cblxuICAgIGdldCBpc05lZ2F0aXZlQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluIDwgMDtcbiAgICB9XG5cbiAgICBnZXQgaW5wdXRNb2RlKCk6IFR1aUlucHV0TW9kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY2ltYWwgPT09ICduZXZlcicgPyBUdWlJbnB1dE1vZGUuTnVtZXJpYyA6IFR1aUlucHV0TW9kZS5EZWNpbWFsO1xuICAgIH1cblxuICAgIGdldCBjYWxjdWxhdGVkTWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBERUZBVUxUX01BWF9MRU5HVEggK1xuICAgICAgICAgICAgKHRoaXMuZGVjaW1hbCAhPT0gVHVpRGVjaW1hbC5OZXZlciAmJiB0aGlzLm5hdGl2ZVZhbHVlLmluY2x1ZGVzKCcsJylcbiAgICAgICAgICAgICAgICA/IHRoaXMucHJlY2lzaW9uICsgMVxuICAgICAgICAgICAgICAgIDogMClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlIHx8IDA7XG4gICAgICAgIGNvbnN0IGFic1ZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuICAgICAgICBjb25zdCBoYXNGcmFjdGlvbiA9IGFic1ZhbHVlICUgMSA+IDA7XG4gICAgICAgIGxldCBsaW1pdCA9IHRoaXMuZGVjaW1hbCA9PT0gJ2Fsd2F5cycgfHwgaGFzRnJhY3Rpb24gPyB0aGlzLnByZWNpc2lvbiA6IDA7XG5cbiAgICAgICAgY29uc3QgZnJhY3Rpb24gPSBoYXNGcmFjdGlvblxuICAgICAgICAgICAgPyB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCcuJylbMV0uc3Vic3RyKDAsIHRoaXMucHJlY2lzaW9uKVxuICAgICAgICAgICAgOiAnJztcblxuICAgICAgICBpZiAodGhpcy5mb2N1c2VkICYmIHRoaXMuZGVjaW1hbCAhPT0gJ2Fsd2F5cycpIHtcbiAgICAgICAgICAgIGxpbWl0ID0gZnJhY3Rpb24ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcih2YWx1ZSwgbGltaXQpO1xuICAgIH1cblxuICAgIGdldCBjb21wdXRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWQgfHwgIXRoaXMuaXNOYXRpdmVWYWx1ZUluTGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXNrZWRNb25leVZhbHVlSXNFbXB0eSh0aGlzLm5hdGl2ZVZhbHVlKSA/IHRoaXMubmF0aXZlVmFsdWUgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHRlZFZhbHVlO1xuICAgIH1cblxuICAgIG9uVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAobWFza2VkTW9uZXlWYWx1ZUlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKG51bGwpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc05hdGl2ZVZhbHVlTm90RmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcHBlZCA9IHRoaXMuYWJzb2x1dGVDYXBJbnB1dFZhbHVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY2FwcGVkID09PSBudWxsIHx8IGlzTmFOKGNhcHBlZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoY2FwcGVkKTtcblxuICAgICAgICBpZiAoY2FwcGVkICE9PSBtYXNrZWROdW1iZXJTdHJpbmdUb051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB0aGlzLmZvcm1hdHRlZFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgIT09ICcsJyAmJiBldmVudC5rZXkgIT09ICcuJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVjaW1hbCA9PT0gJ25ldmVyJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmF0aXZlVmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FyZXRBZnRlckNvbW1hKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkZvY3VzZWQoZm9jdXNlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzZWQoZm9jdXNlZCk7XG5cbiAgICAgICAgaWYgKGZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hdGl2ZU51bWJlclZhbHVlID0gbWFza2VkTnVtYmVyU3RyaW5nVG9OdW1iZXIodGhpcy5uYXRpdmVWYWx1ZSk7XG5cbiAgICAgICAgaWYgKGlzTmFOKG5hdGl2ZU51bWJlclZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4odGhpcy5tYXgsIE1hdGgubWF4KHRoaXMubWluLCBuYXRpdmVOdW1iZXJWYWx1ZSkpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoY2xhbXBlZCk7XG4gICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB0aGlzLmZvcm1hdHRlZFZhbHVlO1xuICAgIH1cblxuICAgIG9uSG92ZXJlZChob3ZlcmVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSG92ZXJlZChob3ZlcmVkKTtcbiAgICB9XG5cbiAgICBvblByZXNzZWQocHJlc3NlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZVByZXNzZWQocHJlc3NlZCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi4wJywgWyckZXZlbnQnXSlcbiAgICBvblplcm8oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZGVjaW1hbCA9IHRoaXMubmF0aXZlVmFsdWUuc3BsaXQoJywnKVsxXSB8fCAnJztcbiAgICAgICAgY29uc3Qge25hdGl2ZUZvY3VzYWJsZUVsZW1lbnR9ID0gdGhpcztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWNpbWFsLmxlbmd0aCA8IHRoaXMucHJlY2lzaW9uIHx8XG4gICAgICAgICAgICAhbmF0aXZlRm9jdXNhYmxlRWxlbWVudCB8fFxuICAgICAgICAgICAgIW5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgfHxcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWVbbmF0aXZlRm9jdXNhYmxlRWxlbWVudC5zZWxlY3Rpb25TdGFydF0gIT09ICcwJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQrKztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpc05hdGl2ZVZhbHVlSW5MaW1pdCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlVmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hdGl2ZU51bWJlclZhbHVlID0gbWFza2VkTnVtYmVyU3RyaW5nVG9OdW1iZXIodGhpcy5uYXRpdmVWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5hdGl2ZU51bWJlclZhbHVlID49IHRoaXMubWluICYmIG5hdGl2ZU51bWJlclZhbHVlIDw9IHRoaXMubWF4O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzTmF0aXZlVmFsdWVOb3RGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbmF0aXZlTnVtYmVyVmFsdWUgPSBtYXNrZWROdW1iZXJTdHJpbmdUb051bWJlcih0aGlzLm5hdGl2ZVZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmF0aXZlTnVtYmVyVmFsdWUgPCAwXG4gICAgICAgICAgICA/IG5hdGl2ZU51bWJlclZhbHVlID4gdGhpcy5tYXhcbiAgICAgICAgICAgIDogbmF0aXZlTnVtYmVyVmFsdWUgPCB0aGlzLm1pbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBuYXRpdmVWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50ID8gdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50LnZhbHVlIDogJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXQgbmF0aXZlVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMucHJpbWl0aXZlVGV4dGZpZWxkIHx8ICF0aGlzLm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJpbWl0aXZlVGV4dGZpZWxkLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFic29sdXRlQ2FwSW5wdXRWYWx1ZShpbnB1dFZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtYXNrZWROdW1iZXJTdHJpbmdUb051bWJlcihpbnB1dFZhbHVlKTtcbiAgICAgICAgY29uc3QgY2FwcGVkID0gdmFsdWUgPCAwID8gTWF0aC5tYXgodGhpcy5taW4sIHZhbHVlKSA6IE1hdGgubWluKHZhbHVlLCB0aGlzLm1heCk7XG4gICAgICAgIGNvbnN0IGluZWxpZ2libGVWYWx1ZSA9IGlzTmFOKGNhcHBlZCkgfHwgY2FwcGVkIDwgdGhpcy5taW4gfHwgY2FwcGVkID4gdGhpcy5tYXg7XG5cbiAgICAgICAgcmV0dXJuIGluZWxpZ2libGVWYWx1ZSA/IG51bGwgOiBjYXBwZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDYXJldEFmdGVyQ29tbWEoKSB7XG4gICAgICAgIGlmICghdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZnRlckNvbW1hUG9zaXRpb24gPSB0aGlzLm5hdGl2ZVZhbHVlLmxlbmd0aCAtIHRoaXMucHJlY2lzaW9uO1xuXG4gICAgICAgIHRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgIGFmdGVyQ29tbWFQb3NpdGlvbixcbiAgICAgICAgICAgIGFmdGVyQ29tbWFQb3NpdGlvbixcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=