angular-bootstrap-datetimepicker
Version:
Native Angular (8+) datetime picker component styled by Twitter Bootstrap 4.
193 lines • 21.9 kB
JavaScript
import * as tslib_1 from "tslib";
import { Directive, ElementRef, EventEmitter, forwardRef, HostListener, Inject, Input, Output, Renderer2 } from '@angular/core';
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators, } from '@angular/forms';
import * as _moment from 'moment';
import { DL_DATE_TIME_DISPLAY_FORMAT, DL_DATE_TIME_INPUT_FORMATS, DlDateAdapter } from '../core/public-api';
import { DlDateTimeInputChange } from './dl-date-time-input-change';
/**
* @internal
*/
var moment = _moment;
/**
* This directive allows the user to enter dates, using the keyboard, into an input box and
* angular will then store a date value in the model.
*
* The input format(s), display format, and model format are independent and fully customizable.
*/
var DlDateTimeInputDirective = /** @class */ (function () {
/**
* Constructs a new instance of this directive.
* @param _renderer
* reference to the renderer.
* @param _elementRef
* reference to this element.
* @param _dateAdapter
* date adapter for the date type in the model.
* @param _displayFormat
* from `DL_DATE_TIME_DISPLAY_FORMAT`, which defines the format to use for a valid date/time value.
* @param _inputFormats
* from `DL_DATE_TIME_INPUT_FORMATS`, which defines the input formats that allowed as valid date/time values.
* NB: moment is always in strict parse mode for this directive.
*/
function DlDateTimeInputDirective(_renderer, _elementRef, _dateAdapter, _displayFormat, _inputFormats) {
var _this = this;
this._renderer = _renderer;
this._elementRef = _elementRef;
this._dateAdapter = _dateAdapter;
this._displayFormat = _displayFormat;
this._inputFormats = _inputFormats;
/* tslint:disable:member-ordering */
this._filterValidator = function (control) {
// @ts-ignore
return (_this._inputFilter || (function (value) { return true; }))(_this._value) ?
null : { 'dlDateTimeInputFilter': { 'value': control.value } };
};
this._inputFilter = function () { return true; };
this._isValid = true;
this._parseValidator = function () {
return _this._isValid ?
null : { 'dlDateTimeInputParse': { 'text': _this._elementRef.nativeElement.value } };
};
this._changed = [];
this._touched = [];
this._validator = Validators.compose([this._parseValidator, this._filterValidator]);
this._validatorOnChange = function () { };
this._value = undefined;
/**
* Emits when a `change` event when date/time is selected or
* the value of the date/time picker changes.
**/
this.dateChange = new EventEmitter();
}
DlDateTimeInputDirective_1 = DlDateTimeInputDirective;
Object.defineProperty(DlDateTimeInputDirective.prototype, "dlDateTimeInputFilter", {
/**
* Set a function used to determine whether or not the `value` entered by the user is allowed.
* @param inputFilterFunction
* a function that returns `true` if the `value` entered by the user is allowed, otherwise `false`.
*/
set: function (inputFilterFunction) {
this._inputFilter = inputFilterFunction;
this._validatorOnChange();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DlDateTimeInputDirective.prototype, "value", {
/* tslint:enable:member-ordering */
/**
* Returns `D` value of the date/time input or `undefined` | `null` if no value is set.
**/
get: function () {
return this._value;
},
enumerable: true,
configurable: true
});
/**
* Emit a `change` event when the value of the input changes.
*/
DlDateTimeInputDirective.prototype._onChange = function () {
this.dateChange.emit(new DlDateTimeInputChange(this._value));
};
/**
* Format the input text using {@link DL_DATE_TIME_DISPLAY_FORMAT} and mark the control as touched.
*/
DlDateTimeInputDirective.prototype._onBlur = function () {
if (this._value) {
this.writeValue(this._value);
}
this._touched.forEach(function (onTouched) { return onTouched(); });
};
/**
* Parse the user input into a possibly valid date.
* The model value is not set if the input is NOT one of the {@link DL_DATE_TIME_INPUT_FORMATS}.
* @param value
* Value of the input control.
*/
DlDateTimeInputDirective.prototype._onInput = function (value) {
var _this = this;
var testDate = value === null || value === undefined || value === ''
? undefined
: moment(value, this._inputFormats, true);
this._isValid = testDate && testDate.isValid();
this._value = this._isValid ? this._dateAdapter.fromMilliseconds(testDate.valueOf()) : undefined;
this._changed.forEach(function (onChanged) { return onChanged(_this._value); });
};
/**
* @internal
*/
DlDateTimeInputDirective.prototype.registerOnChange = function (onChange) {
this._changed.push(onChange);
};
/**
* @internal
*/
DlDateTimeInputDirective.prototype.registerOnTouched = function (onTouched) {
this._touched.push(onTouched);
};
/**
* @internal
*/
DlDateTimeInputDirective.prototype.registerOnValidatorChange = function (validatorOnChange) {
this._validatorOnChange = validatorOnChange;
};
/**
* @internal
*/
DlDateTimeInputDirective.prototype.setDisabledState = function (isDisabled) {
this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);
};
/**
* @internal
*/
DlDateTimeInputDirective.prototype.validate = function (control) {
return this._validator(control);
};
/**
* @internal
*/
DlDateTimeInputDirective.prototype.writeValue = function (value) {
var normalizedValue = value === null || value === undefined
? ''
: moment(value).format(this._displayFormat);
this._renderer.setProperty(this._elementRef.nativeElement, 'value', normalizedValue);
};
var DlDateTimeInputDirective_1;
DlDateTimeInputDirective.ctorParameters = function () { return [
{ type: Renderer2 },
{ type: ElementRef },
{ type: DlDateAdapter },
{ type: String, decorators: [{ type: Inject, args: [DL_DATE_TIME_DISPLAY_FORMAT,] }] },
{ type: Array, decorators: [{ type: Inject, args: [DL_DATE_TIME_INPUT_FORMATS,] }] }
]; };
tslib_1.__decorate([
Output()
], DlDateTimeInputDirective.prototype, "dateChange", void 0);
tslib_1.__decorate([
Input()
], DlDateTimeInputDirective.prototype, "dlDateTimeInputFilter", null);
tslib_1.__decorate([
HostListener('change')
], DlDateTimeInputDirective.prototype, "_onChange", null);
tslib_1.__decorate([
HostListener('blur')
], DlDateTimeInputDirective.prototype, "_onBlur", null);
tslib_1.__decorate([
HostListener('input', ['$event.target.value'])
], DlDateTimeInputDirective.prototype, "_onInput", null);
DlDateTimeInputDirective = DlDateTimeInputDirective_1 = tslib_1.__decorate([
Directive({
selector: 'input[dlDateTimeInput]',
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return DlDateTimeInputDirective_1; }), multi: true },
{ provide: NG_VALIDATORS, useExisting: forwardRef(function () { return DlDateTimeInputDirective_1; }), multi: true }
]
}),
tslib_1.__param(3, Inject(DL_DATE_TIME_DISPLAY_FORMAT)),
tslib_1.__param(4, Inject(DL_DATE_TIME_INPUT_FORMATS))
], DlDateTimeInputDirective);
return DlDateTimeInputDirective;
}());
export { DlDateTimeInputDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGwtZGF0ZS10aW1lLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyIsInNvdXJjZXMiOlsiZGwtZGF0ZS10aW1lLWlucHV0L2RsLWRhdGUtdGltZS1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixFQUlqQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUMsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUcsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFbEU7O0dBRUc7QUFDSCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFFdkI7Ozs7O0dBS0c7QUFRSDtJQTJCRTs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsa0NBQ1UsU0FBb0IsRUFDcEIsV0FBdUIsRUFDdkIsWUFBOEIsRUFDZ0IsY0FBc0IsRUFDdkIsYUFBdUI7UUFMOUUsaUJBTUk7UUFMTSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUNnQixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBVTtRQTVDOUUsb0NBQW9DO1FBQzVCLHFCQUFnQixHQUFnQixVQUFDLE9BQXdCO1lBQy9ELGFBQWE7WUFDYixPQUFPLENBQUMsS0FB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Z0JBQ1QsYUFBYTs2Q0FDbEMsTUFBTSxTQUFDLDJCQUEyQjs0Q0FDbEMsTUFBTSxTQUFDLDBCQUEwQjs7SUFyQnBDO1FBREMsTUFBTSxFQUFFO2dFQUMwRDtJQThCbkU7UUFEQyxLQUFLLEVBQUU7eUVBSVA7SUFjdUI7UUFBdkIsWUFBWSxDQUFDLFFBQVEsQ0FBQzs2REFFdEI7SUFLcUI7UUFBckIsWUFBWSxDQUFDLE1BQU0sQ0FBQzsyREFLcEI7SUFRK0M7UUFBL0MsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7NERBUTlDO0lBcEdVLHdCQUF3QjtRQVBwQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsd0JBQXdCO1lBQ2xDLFNBQVMsRUFBRTtnQkFDVCxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSwwQkFBd0IsRUFBeEIsQ0FBd0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7Z0JBQ2xHLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSwwQkFBd0IsRUFBeEIsQ0FBd0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7YUFDL0Y7U0FDRixDQUFDO1FBOENHLG1CQUFBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1FBQ25DLG1CQUFBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO09BOUMxQix3QkFBd0IsQ0FrSnBDO0lBQUQsK0JBQUM7Q0FBQSxBQWxKRCxJQWtKQztTQWxKWSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE91dHB1dCwgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgKiBhcyBfbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0RMX0RBVEVfVElNRV9ESVNQTEFZX0ZPUk1BVCwgRExfREFURV9USU1FX0lOUFVUX0ZPUk1BVFMsIERsRGF0ZUFkYXB0ZXJ9IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQge0RsRGF0ZVRpbWVJbnB1dENoYW5nZX0gZnJvbSAnLi9kbC1kYXRlLXRpbWUtaW5wdXQtY2hhbmdlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgbW9tZW50ID0gX21vbWVudDtcblxuLyoqXG4gKiAgVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGRhdGVzLCB1c2luZyB0aGUga2V5Ym9hcmQsIGludG8gYW4gaW5wdXQgYm94IGFuZFxuICogIGFuZ3VsYXIgd2lsbCB0aGVuIHN0b3JlIGEgZGF0ZSB2YWx1ZSBpbiB0aGUgbW9kZWwuXG4gKlxuICogIFRoZSBpbnB1dCBmb3JtYXQocyksIGRpc3BsYXkgZm9ybWF0LCBhbmQgbW9kZWwgZm9ybWF0IGFyZSBpbmRlcGVuZGVudCBhbmQgZnVsbHkgY3VzdG9taXphYmxlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdpbnB1dFtkbERhdGVUaW1lSW5wdXRdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEbERhdGVUaW1lSW5wdXREaXJlY3RpdmUpLCBtdWx0aTogdHJ1ZX0sXG4gICAge3Byb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZSksIG11bHRpOiB0cnVlfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZTxEPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuXG4gIC8qIHRzbGludDpkaXNhYmxlOm1lbWJlci1vcmRlcmluZyAqL1xuICBwcml2YXRlIF9maWx0ZXJWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuICh0aGlzLl9pbnB1dEZpbHRlciB8fCAoKHZhbHVlOiBhbnkpID0+IHRydWUpKSh0aGlzLl92YWx1ZSkgP1xuICAgICAgbnVsbCA6IHsnZGxEYXRlVGltZUlucHV0RmlsdGVyJzogeyd2YWx1ZSc6IGNvbnRyb2wudmFsdWV9fTtcbiAgfVxuICBwcml2YXRlIF9pbnB1dEZpbHRlcjogKHZhbHVlOiAoRCB8IG51bGwpKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZTtcbiAgcHJpdmF0ZSBfaXNWYWxpZCA9IHRydWU7XG4gIHByaXZhdGUgX3BhcnNlVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9ICgpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVmFsaWQgP1xuICAgICAgbnVsbCA6IHsnZGxEYXRlVGltZUlucHV0UGFyc2UnOiB7J3RleHQnOiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWV9fTtcbiAgfVxuICBwcml2YXRlIF9jaGFuZ2VkOiAoKHZhbHVlOiBEKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgX3RvdWNoZWQ6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbdGhpcy5fcGFyc2VWYWxpZGF0b3IsIHRoaXMuX2ZpbHRlclZhbGlkYXRvcl0pO1xuICBwcml2YXRlIF92YWxpZGF0b3JPbkNoYW5nZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIF92YWx1ZTogRCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIGBjaGFuZ2VgIGV2ZW50IHdoZW4gZGF0ZS90aW1lIGlzIHNlbGVjdGVkIG9yXG4gICAqIHRoZSB2YWx1ZSBvZiB0aGUgZGF0ZS90aW1lIHBpY2tlciBjaGFuZ2VzLlxuICAgKiovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEbERhdGVUaW1lSW5wdXRDaGFuZ2U8RD4+KCk7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBkaXJlY3RpdmUuXG4gICAqIEBwYXJhbSBfcmVuZGVyZXJcbiAgICogIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyZXIuXG4gICAqIEBwYXJhbSBfZWxlbWVudFJlZlxuICAgKiAgcmVmZXJlbmNlIHRvIHRoaXMgZWxlbWVudC5cbiAgICogQHBhcmFtIF9kYXRlQWRhcHRlclxuICAgKiAgZGF0ZSBhZGFwdGVyIGZvciB0aGUgZGF0ZSB0eXBlIGluIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIF9kaXNwbGF5Rm9ybWF0XG4gICAqICBmcm9tIGBETF9EQVRFX1RJTUVfRElTUExBWV9GT1JNQVRgLCB3aGljaCBkZWZpbmVzIHRoZSBmb3JtYXQgdG8gdXNlIGZvciBhIHZhbGlkIGRhdGUvdGltZSB2YWx1ZS5cbiAgICogQHBhcmFtIF9pbnB1dEZvcm1hdHNcbiAgICogIGZyb20gYERMX0RBVEVfVElNRV9JTlBVVF9GT1JNQVRTYCwgd2hpY2ggZGVmaW5lcyB0aGUgaW5wdXQgZm9ybWF0cyB0aGF0IGFsbG93ZWQgYXMgdmFsaWQgZGF0ZS90aW1lIHZhbHVlcy5cbiAgICogIE5COiBtb21lbnQgaXMgYWx3YXlzIGluIHN0cmljdCBwYXJzZSBtb2RlIGZvciB0aGlzIGRpcmVjdGl2ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9kYXRlQWRhcHRlcjogRGxEYXRlQWRhcHRlcjxEPixcbiAgICBASW5qZWN0KERMX0RBVEVfVElNRV9ESVNQTEFZX0ZPUk1BVCkgcHJpdmF0ZSByZWFkb25seSBfZGlzcGxheUZvcm1hdDogc3RyaW5nLFxuICAgIEBJbmplY3QoRExfREFURV9USU1FX0lOUFVUX0ZPUk1BVFMpIHByaXZhdGUgcmVhZG9ubHkgX2lucHV0Rm9ybWF0czogc3RyaW5nW11cbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBTZXQgYSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgYHZhbHVlYCBlbnRlcmVkIGJ5IHRoZSB1c2VyIGlzIGFsbG93ZWQuXG4gICAqIEBwYXJhbSBpbnB1dEZpbHRlckZ1bmN0aW9uXG4gICAqICAgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGVudGVyZWQgYnkgdGhlIHVzZXIgaXMgYWxsb3dlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgZGxEYXRlVGltZUlucHV0RmlsdGVyKGlucHV0RmlsdGVyRnVuY3Rpb246ICh2YWx1ZTogRCB8IG51bGwpID0+IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pbnB1dEZpbHRlciA9IGlucHV0RmlsdGVyRnVuY3Rpb247XG4gICAgdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qIHRzbGludDplbmFibGU6bWVtYmVyLW9yZGVyaW5nICovXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYERgIHZhbHVlIG9mIHRoZSBkYXRlL3RpbWUgaW5wdXQgb3IgYHVuZGVmaW5lZGAgfCBgbnVsbGAgaWYgbm8gdmFsdWUgaXMgc2V0LlxuICAgKiovXG4gIGdldCB2YWx1ZSgpOiBEIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhIGBjaGFuZ2VgIGV2ZW50IHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBjaGFuZ2VzLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJykgX29uQ2hhbmdlKCkge1xuICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KG5ldyBEbERhdGVUaW1lSW5wdXRDaGFuZ2UodGhpcy5fdmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIGlucHV0IHRleHQgdXNpbmcge0BsaW5rIERMX0RBVEVfVElNRV9ESVNQTEFZX0ZPUk1BVH0gYW5kIG1hcmsgdGhlIGNvbnRyb2wgYXMgdG91Y2hlZC5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKSBfb25CbHVyKCkge1xuICAgIGlmICh0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fdG91Y2hlZC5mb3JFYWNoKG9uVG91Y2hlZCA9PiBvblRvdWNoZWQoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdGhlIHVzZXIgaW5wdXQgaW50byBhIHBvc3NpYmx5IHZhbGlkIGRhdGUuXG4gICAqIFRoZSBtb2RlbCB2YWx1ZSBpcyBub3Qgc2V0IGlmIHRoZSBpbnB1dCBpcyBOT1Qgb25lIG9mIHRoZSB7QGxpbmsgRExfREFURV9USU1FX0lOUFVUX0ZPUk1BVFN9LlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogICBWYWx1ZSBvZiB0aGUgaW5wdXQgY29udHJvbC5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQudGFyZ2V0LnZhbHVlJ10pIF9vbklucHV0KHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgdGVzdERhdGUgPSB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJ1xuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogbW9tZW50KHZhbHVlLCB0aGlzLl9pbnB1dEZvcm1hdHMsIHRydWUpO1xuXG4gICAgdGhpcy5faXNWYWxpZCA9IHRlc3REYXRlICYmIHRlc3REYXRlLmlzVmFsaWQoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2lzVmFsaWQgPyB0aGlzLl9kYXRlQWRhcHRlci5mcm9tTWlsbGlzZWNvbmRzKHRlc3REYXRlLnZhbHVlT2YoKSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2hhbmdlZC5mb3JFYWNoKG9uQ2hhbmdlZCA9PiBvbkNoYW5nZWQodGhpcy5fdmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhbmdlZC5wdXNoKG9uQ2hhbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3RvdWNoZWQucHVzaChvblRvdWNoZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSh2YWxpZGF0b3JPbkNoYW5nZTogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbGlkYXRvck9uQ2hhbmdlID0gdmFsaWRhdG9yT25DaGFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IoY29udHJvbCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBEKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAnJ1xuICAgICAgOiBtb21lbnQodmFsdWUpLmZvcm1hdCh0aGlzLl9kaXNwbGF5Rm9ybWF0KTtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gIH1cbn1cbiJdfQ==