angular-bootstrap-datetimepicker
Version:
Native Angular (8+) datetime picker component styled by Twitter Bootstrap 4.
181 lines • 20.5 kB
JavaScript
var DlDateTimeInputDirective_1;
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
*/
const 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.
*/
let DlDateTimeInputDirective = DlDateTimeInputDirective_1 = class DlDateTimeInputDirective {
/**
* 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.
*/
constructor(_renderer, _elementRef, _dateAdapter, _displayFormat, _inputFormats) {
this._renderer = _renderer;
this._elementRef = _elementRef;
this._dateAdapter = _dateAdapter;
this._displayFormat = _displayFormat;
this._inputFormats = _inputFormats;
/* tslint:disable:member-ordering */
this._filterValidator = (control) => {
// @ts-ignore
return (this._inputFilter || ((value) => true))(this._value) ?
null : { 'dlDateTimeInputFilter': { 'value': control.value } };
};
this._inputFilter = () => true;
this._isValid = true;
this._parseValidator = () => {
return this._isValid ?
null : { 'dlDateTimeInputParse': { 'text': this._elementRef.nativeElement.value } };
};
this._changed = [];
this._touched = [];
this._validator = Validators.compose([this._parseValidator, this._filterValidator]);
this._validatorOnChange = () => { };
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();
}
/**
* 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 dlDateTimeInputFilter(inputFilterFunction) {
this._inputFilter = inputFilterFunction;
this._validatorOnChange();
}
/* tslint:enable:member-ordering */
/**
* Returns `D` value of the date/time input or `undefined` | `null` if no value is set.
**/
get value() {
return this._value;
}
/**
* Emit a `change` event when the value of the input changes.
*/
_onChange() {
this.dateChange.emit(new DlDateTimeInputChange(this._value));
}
/**
* Format the input text using {@link DL_DATE_TIME_DISPLAY_FORMAT} and mark the control as touched.
*/
_onBlur() {
if (this._value) {
this.writeValue(this._value);
}
this._touched.forEach(onTouched => 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.
*/
_onInput(value) {
const 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(onChanged => onChanged(this._value));
}
/**
* @internal
*/
registerOnChange(onChange) {
this._changed.push(onChange);
}
/**
* @internal
*/
registerOnTouched(onTouched) {
this._touched.push(onTouched);
}
/**
* @internal
*/
registerOnValidatorChange(validatorOnChange) {
this._validatorOnChange = validatorOnChange;
}
/**
* @internal
*/
setDisabledState(isDisabled) {
this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);
}
/**
* @internal
*/
validate(control) {
return this._validator(control);
}
/**
* @internal
*/
writeValue(value) {
const normalizedValue = value === null || value === undefined
? ''
: moment(value).format(this._displayFormat);
this._renderer.setProperty(this._elementRef.nativeElement, 'value', normalizedValue);
}
};
DlDateTimeInputDirective.ctorParameters = () => [
{ 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(() => DlDateTimeInputDirective_1), multi: true },
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => 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);
export { DlDateTimeInputDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGwtZGF0ZS10aW1lLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyIsInNvdXJjZXMiOlsiZGwtZGF0ZS10aW1lLWlucHV0L2RsLWRhdGUtdGltZS1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUgsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsRUFJakIsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFDLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLGFBQWEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRWxFOztHQUVHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBRXZCOzs7OztHQUtHO0FBUUgsSUFBYSx3QkFBd0IsZ0NBQXJDLE1BQWEsd0JBQXdCO0lBMkJuQzs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsWUFDVSxTQUFvQixFQUNwQixXQUF1QixFQUN2QixZQUE4QixFQUNnQixjQUFzQixFQUN2QixhQUF1QjtRQUpwRSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUNnQixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBVTtRQTVDOUUsb0NBQW9DO1FBQzVCLHFCQUFnQixHQUFnQixDQUFDLE9BQXdCLEVBQTJCLEVB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RDtBQThCbkU7SUFEQyxLQUFLLEVBQUU7cUVBSVA7QUFjdUI7SUFBdkIsWUFBWSxDQUFDLFFBQVEsQ0FBQzt5REFFdEI7QUFLcUI7SUFBckIsWUFBWSxDQUFDLE1BQU0sQ0FBQzt1REFLcEI7QUFRK0M7SUFBL0MsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7d0RBUTlDO0FBcEdVLHdCQUF3QjtJQVBwQyxTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLFNBQVMsRUFBRTtZQUNULEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQXdCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO1lBQ2xHLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDBCQUF3QixDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztTQUMvRjtLQUNGLENBQUM7SUE4Q0csbUJBQUEsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDbkMsbUJBQUEsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUE7R0E5QzFCLHdCQUF3QixDQWtKcEM7U0FsSlksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPdXRwdXQsIFJlbmRlcmVyMn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0ICogYXMgX21vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtETF9EQVRFX1RJTUVfRElTUExBWV9GT1JNQVQsIERMX0RBVEVfVElNRV9JTlBVVF9GT1JNQVRTLCBEbERhdGVBZGFwdGVyfSBmcm9tICcuLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtEbERhdGVUaW1lSW5wdXRDaGFuZ2V9IGZyb20gJy4vZGwtZGF0ZS10aW1lLWlucHV0LWNoYW5nZSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IG1vbWVudCA9IF9tb21lbnQ7XG5cbi8qKlxuICogIFRoaXMgZGlyZWN0aXZlIGFsbG93cyB0aGUgdXNlciB0byBlbnRlciBkYXRlcywgdXNpbmcgdGhlIGtleWJvYXJkLCBpbnRvIGFuIGlucHV0IGJveCBhbmRcbiAqICBhbmd1bGFyIHdpbGwgdGhlbiBzdG9yZSBhIGRhdGUgdmFsdWUgaW4gdGhlIG1vZGVsLlxuICpcbiAqICBUaGUgaW5wdXQgZm9ybWF0KHMpLCBkaXNwbGF5IGZvcm1hdCwgYW5kIG1vZGVsIGZvcm1hdCBhcmUgaW5kZXBlbmRlbnQgYW5kIGZ1bGx5IGN1c3RvbWl6YWJsZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbZGxEYXRlVGltZUlucHV0XScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGxEYXRlVGltZUlucHV0RGlyZWN0aXZlKSwgbXVsdGk6IHRydWV9LFxuICAgIHtwcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEbERhdGVUaW1lSW5wdXREaXJlY3RpdmUpLCBtdWx0aTogdHJ1ZX1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEbERhdGVUaW1lSW5wdXREaXJlY3RpdmU8RD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcblxuICAvKiB0c2xpbnQ6ZGlzYWJsZTptZW1iZXItb3JkZXJpbmcgKi9cbiAgcHJpdmF0ZSBfZmlsdGVyVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAodGhpcy5faW5wdXRGaWx0ZXIgfHwgKCh2YWx1ZTogYW55KSA9PiB0cnVlKSkodGhpcy5fdmFsdWUpID9cbiAgICAgIG51bGwgOiB7J2RsRGF0ZVRpbWVJbnB1dEZpbHRlcic6IHsndmFsdWUnOiBjb250cm9sLnZhbHVlfX07XG4gIH1cbiAgcHJpdmF0ZSBfaW5wdXRGaWx0ZXI6ICh2YWx1ZTogKEQgfCBudWxsKSkgPT4gYm9vbGVhbiA9ICgpID0+IHRydWU7XG4gIHByaXZhdGUgX2lzVmFsaWQgPSB0cnVlO1xuICBwcml2YXRlIF9wYXJzZVZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkID9cbiAgICAgIG51bGwgOiB7J2RsRGF0ZVRpbWVJbnB1dFBhcnNlJzogeyd0ZXh0JzogdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlfX07XG4gIH1cbiAgcHJpdmF0ZSBfY2hhbmdlZDogKCh2YWx1ZTogRCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIF90b3VjaGVkOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIF92YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW3RoaXMuX3BhcnNlVmFsaWRhdG9yLCB0aGlzLl9maWx0ZXJWYWxpZGF0b3JdKTtcbiAgcHJpdmF0ZSBfdmFsaWRhdG9yT25DaGFuZ2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBfdmFsdWU6IEQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYSBgY2hhbmdlYCBldmVudCB3aGVuIGRhdGUvdGltZSBpcyBzZWxlY3RlZCBvclxuICAgKiB0aGUgdmFsdWUgb2YgdGhlIGRhdGUvdGltZSBwaWNrZXIgY2hhbmdlcy5cbiAgICoqL1xuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGxEYXRlVGltZUlucHV0Q2hhbmdlPEQ+PigpO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgZGlyZWN0aXZlLlxuICAgKiBAcGFyYW0gX3JlbmRlcmVyXG4gICAqICByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmVyLlxuICAgKiBAcGFyYW0gX2VsZW1lbnRSZWZcbiAgICogIHJlZmVyZW5jZSB0byB0aGlzIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBfZGF0ZUFkYXB0ZXJcbiAgICogIGRhdGUgYWRhcHRlciBmb3IgdGhlIGRhdGUgdHlwZSBpbiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSBfZGlzcGxheUZvcm1hdFxuICAgKiAgZnJvbSBgRExfREFURV9USU1FX0RJU1BMQVlfRk9STUFUYCwgd2hpY2ggZGVmaW5lcyB0aGUgZm9ybWF0IHRvIHVzZSBmb3IgYSB2YWxpZCBkYXRlL3RpbWUgdmFsdWUuXG4gICAqIEBwYXJhbSBfaW5wdXRGb3JtYXRzXG4gICAqICBmcm9tIGBETF9EQVRFX1RJTUVfSU5QVVRfRk9STUFUU2AsIHdoaWNoIGRlZmluZXMgdGhlIGlucHV0IGZvcm1hdHMgdGhhdCBhbGxvd2VkIGFzIHZhbGlkIGRhdGUvdGltZSB2YWx1ZXMuXG4gICAqICBOQjogbW9tZW50IGlzIGFsd2F5cyBpbiBzdHJpY3QgcGFyc2UgbW9kZSBmb3IgdGhpcyBkaXJlY3RpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfZGF0ZUFkYXB0ZXI6IERsRGF0ZUFkYXB0ZXI8RD4sXG4gICAgQEluamVjdChETF9EQVRFX1RJTUVfRElTUExBWV9GT1JNQVQpIHByaXZhdGUgcmVhZG9ubHkgX2Rpc3BsYXlGb3JtYXQ6IHN0cmluZyxcbiAgICBASW5qZWN0KERMX0RBVEVfVElNRV9JTlBVVF9GT1JNQVRTKSBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dEZvcm1hdHM6IHN0cmluZ1tdXG4gICkge31cblxuICAvKipcbiAgICogU2V0IGEgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGB2YWx1ZWAgZW50ZXJlZCBieSB0aGUgdXNlciBpcyBhbGxvd2VkLlxuICAgKiBAcGFyYW0gaW5wdXRGaWx0ZXJGdW5jdGlvblxuICAgKiAgIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBlbnRlcmVkIGJ5IHRoZSB1c2VyIGlzIGFsbG93ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGRsRGF0ZVRpbWVJbnB1dEZpbHRlcihpbnB1dEZpbHRlckZ1bmN0aW9uOiAodmFsdWU6IEQgfCBudWxsKSA9PiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5wdXRGaWx0ZXIgPSBpbnB1dEZpbHRlckZ1bmN0aW9uO1xuICAgIHRoaXMuX3ZhbGlkYXRvck9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZW5hYmxlOm1lbWJlci1vcmRlcmluZyAqL1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGBEYCB2YWx1ZSBvZiB0aGUgZGF0ZS90aW1lIGlucHV0IG9yIGB1bmRlZmluZWRgIHwgYG51bGxgIGlmIG5vIHZhbHVlIGlzIHNldC5cbiAgICoqL1xuICBnZXQgdmFsdWUoKTogRCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYSBgY2hhbmdlYCBldmVudCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgY2hhbmdlcy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScpIF9vbkNoYW5nZSgpIHtcbiAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdChuZXcgRGxEYXRlVGltZUlucHV0Q2hhbmdlKHRoaXMuX3ZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHRoZSBpbnB1dCB0ZXh0IHVzaW5nIHtAbGluayBETF9EQVRFX1RJTUVfRElTUExBWV9GT1JNQVR9IGFuZCBtYXJrIHRoZSBjb250cm9sIGFzIHRvdWNoZWQuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdibHVyJykgX29uQmx1cigpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuX3RvdWNoZWQuZm9yRWFjaChvblRvdWNoZWQgPT4gb25Ub3VjaGVkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSB1c2VyIGlucHV0IGludG8gYSBwb3NzaWJseSB2YWxpZCBkYXRlLlxuICAgKiBUaGUgbW9kZWwgdmFsdWUgaXMgbm90IHNldCBpZiB0aGUgaW5wdXQgaXMgTk9UIG9uZSBvZiB0aGUge0BsaW5rIERMX0RBVEVfVElNRV9JTlBVVF9GT1JNQVRTfS5cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqICAgVmFsdWUgb2YgdGhlIGlucHV0IGNvbnRyb2wuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50LnRhcmdldC52YWx1ZSddKSBfb25JbnB1dCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IHRlc3REYXRlID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJydcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IG1vbWVudCh2YWx1ZSwgdGhpcy5faW5wdXRGb3JtYXRzLCB0cnVlKTtcblxuICAgIHRoaXMuX2lzVmFsaWQgPSB0ZXN0RGF0ZSAmJiB0ZXN0RGF0ZS5pc1ZhbGlkKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9pc1ZhbGlkID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZnJvbU1pbGxpc2Vjb25kcyh0ZXN0RGF0ZS52YWx1ZU9mKCkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NoYW5nZWQuZm9yRWFjaChvbkNoYW5nZWQgPT4gb25DaGFuZ2VkKHRoaXMuX3ZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYW5nZWQucHVzaChvbkNoYW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl90b3VjaGVkLnB1c2gob25Ub3VjaGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UodmFsaWRhdG9yT25DaGFuZ2U6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl92YWxpZGF0b3JPbkNoYW5nZSA9IHZhbGlkYXRvck9uQ2hhbmdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yKGNvbnRyb2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRCk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gJydcbiAgICAgIDogbW9tZW50KHZhbHVlKS5mb3JtYXQodGhpcy5fZGlzcGxheUZvcm1hdCk7XG4gICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBub3JtYWxpemVkVmFsdWUpO1xuICB9XG59XG4iXX0=