angular-weblineindia-date-picker
Version:
Date Picker component built in AngularJS to select date and time. Supports Angular 9 version.
310 lines • 37.9 kB
JavaScript
import { __decorate } from "tslib";
import { ECalendarValue } from '../../types/calendar-value-enum';
import { Injectable } from '@angular/core';
import * as momentNs from 'moment';
import * as i0 from "@angular/core";
const moment = momentNs;
let UtilsService = class UtilsService {
static debounce(func, wait) {
let timeout;
return function () {
const context = this, args = arguments;
timeout = clearTimeout(timeout);
setTimeout(() => {
func.apply(context, args);
}, wait);
};
}
;
createArray(size) {
return new Array(size).fill(1);
}
convertToMoment(date, format) {
if (!date) {
return null;
}
else if (typeof date === 'string') {
return moment(date, format);
}
else {
return date.clone();
}
}
isDateValid(date, format) {
if (date === '') {
return true;
}
return moment(date, format, true).isValid();
}
// todo:: add unit test
getDefaultDisplayDate(current, selected, allowMultiSelect, minDate) {
if (current) {
return current.clone();
}
else if (minDate && minDate.isAfter(moment())) {
return minDate.clone();
}
else if (allowMultiSelect) {
if (selected && selected[selected.length]) {
return selected[selected.length].clone();
}
}
else if (selected && selected[0]) {
return selected[0].clone();
}
return moment();
}
// todo:: add unit test
getInputType(value, allowMultiSelect) {
if (Array.isArray(value)) {
if (!value.length) {
return ECalendarValue.MomentArr;
}
else if (typeof value[0] === 'string') {
return ECalendarValue.StringArr;
}
else if (moment.isMoment(value[0])) {
return ECalendarValue.MomentArr;
}
}
else {
if (typeof value === 'string') {
return ECalendarValue.String;
}
else if (moment.isMoment(value)) {
return ECalendarValue.Moment;
}
}
return allowMultiSelect ? ECalendarValue.MomentArr : ECalendarValue.Moment;
}
// todo:: add unit test
convertToMomentArray(value, config) {
let retVal;
switch (this.getInputType(value, config.allowMultiSelect)) {
case (ECalendarValue.String):
retVal = value ? [moment(value, config.format, true)] : [];
break;
case (ECalendarValue.StringArr):
retVal = value.map(v => v ? moment(v, config.format, true) : null).filter(Boolean);
break;
case (ECalendarValue.Moment):
retVal = value ? [value.clone()] : [];
break;
case (ECalendarValue.MomentArr):
retVal = (value || []).map(v => v.clone());
break;
default:
retVal = [];
}
return retVal;
}
// todo:: add unit test
convertFromMomentArray(format, value, convertTo) {
switch (convertTo) {
case (ECalendarValue.String):
return value[0] && value[0].format(format);
case (ECalendarValue.StringArr):
return value.filter(Boolean).map(v => v.format(format));
case (ECalendarValue.Moment):
return value[0] ? value[0].clone() : value[0];
case (ECalendarValue.MomentArr):
return value ? value.map(v => v.clone()) : value;
default:
return value;
}
}
convertToString(value, format) {
let tmpVal;
if (typeof value === 'string') {
tmpVal = [value];
}
else if (Array.isArray(value)) {
if (value.length) {
tmpVal = value.map((v) => {
return this.convertToMoment(v, format).format(format);
});
}
else {
tmpVal = value;
}
}
else if (moment.isMoment(value)) {
tmpVal = [value.format(format)];
}
else {
return '';
}
return tmpVal.filter(Boolean).join(' | ');
}
// todo:: add unit test
clearUndefined(obj) {
if (!obj) {
return obj;
}
Object.keys(obj).forEach((key) => (obj[key] === undefined) && delete obj[key]);
return obj;
}
updateSelected(isMultiple, currentlySelected, date, granularity = 'day') {
if (isMultiple) {
return !date.selected
? currentlySelected.concat([date.date])
: currentlySelected.filter(d => !d.isSame(date.date, granularity));
}
else {
return !date.selected ? [date.date] : [];
}
}
closestParent(element, selector) {
if (!element) {
return undefined;
}
const match = element.querySelector(selector);
return match || this.closestParent(element.parentElement, selector);
}
onlyTime(m) {
return m && moment.isMoment(m) && moment(m.format('HH:mm:ss'), 'HH:mm:ss');
}
granularityFromType(calendarType) {
switch (calendarType) {
case 'time':
return 'second';
case 'daytime':
return 'second';
default:
return calendarType;
}
}
createValidator({ minDate, maxDate, minTime, maxTime }, format, calendarType) {
let isValid;
let value;
const validators = [];
const granularity = this.granularityFromType(calendarType);
if (minDate) {
const md = this.convertToMoment(minDate, format);
validators.push({
key: 'minDate',
isValid: () => {
const _isValid = value.every(val => val.isSameOrAfter(md, granularity));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (maxDate) {
const md = this.convertToMoment(maxDate, format);
validators.push({
key: 'maxDate',
isValid: () => {
const _isValid = value.every(val => val.isSameOrBefore(md, granularity));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (minTime) {
const md = this.onlyTime(this.convertToMoment(minTime, format));
validators.push({
key: 'minTime',
isValid: () => {
const _isValid = value.every(val => this.onlyTime(val).isSameOrAfter(md));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (maxTime) {
const md = this.onlyTime(this.convertToMoment(maxTime, format));
validators.push({
key: 'maxTime',
isValid: () => {
const _isValid = value.every(val => this.onlyTime(val).isSameOrBefore(md));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
return (inputVal) => {
isValid = true;
value = this.convertToMomentArray(inputVal, {
format,
allowMultiSelect: true
}).filter(Boolean);
if (!value.every(val => val.isValid())) {
return {
format: {
given: inputVal
}
};
}
const errors = validators.reduce((map, err) => {
if (!err.isValid()) {
map[err.key] = {
given: value
};
}
return map;
}, {});
return !isValid ? errors : null;
};
}
datesStringToStringArray(value) {
return (value || '').split('|').map(m => m.trim()).filter(Boolean);
}
getValidMomentArray(value, format) {
return this.datesStringToStringArray(value)
.filter(d => this.isDateValid(d, format))
.map(d => moment(d, format));
}
shouldShowCurrent(showGoToCurrent, mode, min, max) {
return showGoToCurrent &&
mode !== 'time' &&
this.isDateInRange(moment(), min, max);
}
isDateInRange(date, from, to) {
return date.isBetween(from, to, 'day', '[]');
}
convertPropsToMoment(obj, format, props) {
props.forEach((prop) => {
if (obj.hasOwnProperty(prop)) {
obj[prop] = this.convertToMoment(obj[prop], format);
}
});
}
shouldResetCurrentView(prevConf, currentConf) {
if (prevConf && currentConf) {
if (!prevConf.min && currentConf.min) {
return true;
}
else if (prevConf.min && currentConf.min && !prevConf.min.isSame(currentConf.min, 'd')) {
return true;
}
else if (!prevConf.max && currentConf.max) {
return true;
}
else if (prevConf.max && currentConf.max && !prevConf.max.isSame(currentConf.max, 'd')) {
return true;
}
return false;
}
return false;
}
getNativeElement(elem) {
if (!elem) {
return null;
}
else if (typeof elem === 'string') {
return document.querySelector(elem);
}
else {
return elem;
}
}
};
UtilsService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UtilsService_Factory() { return new UtilsService(); }, token: UtilsService, providedIn: "root" });
UtilsService = __decorate([
Injectable({
providedIn: 'root'
})
], UtilsService);
export { UtilsService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nMi1kYXRlLXBpY2tlci8iLCJzb3VyY2VzIjpbImNvbW1vbi9zZXJ2aWNlcy91dGlscy91dGlscy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLFFBQVEsQ0FBQzs7QUFRbkMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBWXhCLElBQWEsWUFBWSxHQUF6QixNQUFhLFlBQVk7SUFDdkIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFjLEVBQUUsSUFBWTtRQUMxQyxJQUFJLE9BQU8sQ0FBQztRQUNaLE9BQU87WUFDTCxNQUFNLE9BQU8sR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLFNBQVMsQ0FBQztZQUN2QyxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUFBLENBQUM7SUFFRixXQUFXLENBQUMsSUFBWTtRQUN0QixPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQXlCLEVBQUUsTUFBYztRQUN2RCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ25DLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FB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VCxPQUFPLElBQUksQ0FBQztTQUNiO2FBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDbkMsT0FBb0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsRDthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7Q0FDRixDQUFBOztBQXpVWSxZQUFZO0lBSHhCLFVBQVUsQ0FBQztRQUNWLFVBQVUsRUFBRSxNQUFNO0tBQ25CLENBQUM7R0FDVyxZQUFZLENBeVV4QjtTQXpVWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFQ2FsZW5kYXJWYWx1ZX0gZnJvbSAnLi4vLi4vdHlwZXMvY2FsZW5kYXItdmFsdWUtZW51bSc7XG5pbXBvcnQge1NpbmdsZUNhbGVuZGFyVmFsdWV9IGZyb20gJy4uLy4uL3R5cGVzL3NpbmdsZS1jYWxlbmRhci12YWx1ZSc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgbW9tZW50TnMgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7TW9tZW50LCB1bml0T2ZUaW1lfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtDYWxlbmRhclZhbHVlfSBmcm9tICcuLi8uLi90eXBlcy9jYWxlbmRhci12YWx1ZSc7XG5pbXBvcnQge0lEYXRlfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZS5tb2RlbCc7XG5pbXBvcnQge0NhbGVuZGFyTW9kZX0gZnJvbSAnLi4vLi4vdHlwZXMvY2FsZW5kYXItbW9kZSc7XG5pbXBvcnQge0RhdGVWYWxpZGF0b3J9IGZyb20gJy4uLy4uL3R5cGVzL3ZhbGlkYXRvci50eXBlJztcbmltcG9ydCB7SUNhbGVuZGFySW50ZXJuYWx9IGZyb20gJy4uLy4uL21vZGVscy9jYWxlbmRhci5tb2RlbCc7XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudE5zO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVMaW1pdHMge1xuICBtaW5EYXRlPzogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgbWF4RGF0ZT86IFNpbmdsZUNhbGVuZGFyVmFsdWU7XG4gIG1pblRpbWU/OiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBtYXhUaW1lPzogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVXRpbHNTZXJ2aWNlIHtcbiAgc3RhdGljIGRlYm91bmNlKGZ1bmM6IEZ1bmN0aW9uLCB3YWl0OiBudW1iZXIpIHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICB9LCB3YWl0KTtcbiAgICB9O1xuICB9O1xuXG4gIGNyZWF0ZUFycmF5KHNpemU6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICByZXR1cm4gbmV3IEFycmF5KHNpemUpLmZpbGwoMSk7XG4gIH1cblxuICBjb252ZXJ0VG9Nb21lbnQoZGF0ZTogU2luZ2xlQ2FsZW5kYXJWYWx1ZSwgZm9ybWF0OiBzdHJpbmcpOiBNb21lbnQge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtb21lbnQoZGF0ZSwgZm9ybWF0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRhdGUuY2xvbmUoKTtcbiAgICB9XG4gIH1cblxuICBpc0RhdGVWYWxpZChkYXRlOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGRhdGUgPT09ICcnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50KGRhdGUsIGZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpO1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RcbiAgZ2V0RGVmYXVsdERpc3BsYXlEYXRlKGN1cnJlbnQ6IE1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBNb21lbnRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93TXVsdGlTZWxlY3Q6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5EYXRlOiBNb21lbnQpOiBNb21lbnQge1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gY3VycmVudC5jbG9uZSgpO1xuICAgIH0gZWxzZSBpZiAobWluRGF0ZSAmJiBtaW5EYXRlLmlzQWZ0ZXIobW9tZW50KCkpKSB7XG4gICAgICByZXR1cm4gbWluRGF0ZS5jbG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoYWxsb3dNdWx0aVNlbGVjdCkge1xuICAgICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkW3NlbGVjdGVkLmxlbmd0aF0pIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkW3NlbGVjdGVkLmxlbmd0aF0uY2xvbmUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkWzBdKSB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRbMF0uY2xvbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50KCk7XG4gIH1cblxuICAvLyB0b2RvOjogYWRkIHVuaXQgdGVzdFxuICBnZXRJbnB1dFR5cGUodmFsdWU6IENhbGVuZGFyVmFsdWUsIGFsbG93TXVsdGlTZWxlY3Q6IGJvb2xlYW4pOiBFQ2FsZW5kYXJWYWx1ZSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gRUNhbGVuZGFyVmFsdWUuTW9tZW50QXJyO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5TdHJpbmdBcnI7XG4gICAgICB9IGVsc2UgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZVswXSkpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxlbmRhclZhbHVlLk1vbWVudEFycjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxlbmRhclZhbHVlLlN0cmluZztcbiAgICAgIH0gZWxzZSBpZiAobW9tZW50LmlzTW9tZW50KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gRUNhbGVuZGFyVmFsdWUuTW9tZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhbGxvd011bHRpU2VsZWN0ID8gRUNhbGVuZGFyVmFsdWUuTW9tZW50QXJyIDogRUNhbGVuZGFyVmFsdWUuTW9tZW50O1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RcbiAgY29udmVydFRvTW9tZW50QXJyYXkodmFsdWU6IENhbGVuZGFyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzoge2FsbG93TXVsdGlTZWxlY3Q/OiBib29sZWFuLCBmb3JtYXQ/OiBzdHJpbmd9KTogTW9tZW50W10ge1xuICAgIGxldCByZXRWYWw6IE1vbWVudFtdO1xuICAgIHN3aXRjaCAodGhpcy5nZXRJbnB1dFR5cGUodmFsdWUsIGNvbmZpZy5hbGxvd011bHRpU2VsZWN0KSkge1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nKTpcbiAgICAgICAgcmV0VmFsID0gdmFsdWUgPyBbbW9tZW50KDxzdHJpbmc+dmFsdWUsIGNvbmZpZy5mb3JtYXQsIHRydWUpXSA6IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLlN0cmluZ0Fycik6XG4gICAgICAgIHJldFZhbCA9ICg8c3RyaW5nW10+dmFsdWUpLm1hcCh2ID0+IHYgPyBtb21lbnQodiwgY29uZmlnLmZvcm1hdCwgdHJ1ZSkgOiBudWxsKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuTW9tZW50KTpcbiAgICAgICAgcmV0VmFsID0gdmFsdWUgPyBbKDxNb21lbnQ+dmFsdWUpLmNsb25lKCldIDogW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuTW9tZW50QXJyKTpcbiAgICAgICAgcmV0VmFsID0gKDxNb21lbnRbXT52YWx1ZSB8fCBbXSkubWFwKHYgPT4gdi5jbG9uZSgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXRWYWwgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0VmFsO1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RcbiAgY29udmVydEZyb21Nb21lbnRBcnJheShmb3JtYXQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTW9tZW50W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvOiBFQ2FsZW5kYXJWYWx1ZSk6IENhbGVuZGFyVmFsdWUge1xuICAgIHN3aXRjaCAoY29udmVydFRvKSB7XG4gICAgICBjYXNlIChFQ2FsZW5kYXJWYWx1ZS5TdHJpbmcpOlxuICAgICAgICByZXR1cm4gdmFsdWVbMF0gJiYgdmFsdWVbMF0uZm9ybWF0KGZvcm1hdCk7XG4gICAgICBjYXNlIChFQ2FsZW5kYXJWYWx1ZS5TdHJpbmdBcnIpOlxuICAgICAgICByZXR1cm4gdmFsdWUuZmlsdGVyKEJvb2xlYW4pLm1hcCh2ID0+IHYuZm9ybWF0KGZvcm1hdCkpO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuTW9tZW50KTpcbiAgICAgICAgcmV0dXJuIHZhbHVlWzBdID8gdmFsdWVbMF0uY2xvbmUoKSA6IHZhbHVlWzBdO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuTW9tZW50QXJyKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlID8gdmFsdWUubWFwKHYgPT4gdi5jbG9uZSgpKSA6IHZhbHVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnZlcnRUb1N0cmluZyh2YWx1ZTogQ2FsZW5kYXJWYWx1ZSwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB0bXBWYWw6IHN0cmluZ1tdO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRtcFZhbCA9IFt2YWx1ZV07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlLmxlbmd0aCkge1xuICAgICAgICB0bXBWYWwgPSAoPFNpbmdsZUNhbGVuZGFyVmFsdWVbXT52YWx1ZSkubWFwKCh2KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRvTW9tZW50KHYsIGZvcm1hdCkuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG1wVmFsID0gPHN0cmluZ1tdPnZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobW9tZW50LmlzTW9tZW50KHZhbHVlKSkge1xuICAgICAgdG1wVmFsID0gW3ZhbHVlLmZvcm1hdChmb3JtYXQpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiB0bXBWYWwuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyB8ICcpO1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RcbiAgY2xlYXJVbmRlZmluZWQ8VD4ob2JqOiBUKTogVCB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IChvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSAmJiBkZWxldGUgb2JqW2tleV0pO1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB1cGRhdGVTZWxlY3RlZChpc011bHRpcGxlOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICBjdXJyZW50bHlTZWxlY3RlZDogTW9tZW50W10sXG4gICAgICAgICAgICAgICAgIGRhdGU6IElEYXRlLFxuICAgICAgICAgICAgICAgICBncmFudWxhcml0eTogdW5pdE9mVGltZS5CYXNlID0gJ2RheScpOiBNb21lbnRbXSB7XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiAhZGF0ZS5zZWxlY3RlZFxuICAgICAgICA/IGN1cnJlbnRseVNlbGVjdGVkLmNvbmNhdChbZGF0ZS5kYXRlXSlcbiAgICAgICAgOiBjdXJyZW50bHlTZWxlY3RlZC5maWx0ZXIoZCA9PiAhZC5pc1NhbWUoZGF0ZS5kYXRlLCBncmFudWxhcml0eSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWRhdGUuc2VsZWN0ZWQgPyBbZGF0ZS5kYXRlXSA6IFtdO1xuICAgIH1cbiAgfVxuXG4gIGNsb3Nlc3RQYXJlbnQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaCA9IDxIVE1MRWxlbWVudD5lbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIHJldHVybiBtYXRjaCB8fCB0aGlzLmNsb3Nlc3RQYXJlbnQoZWxlbWVudC5wYXJlbnRFbGVtZW50LCBzZWxlY3Rvcik7XG4gIH1cblxuICBvbmx5VGltZShtOiBNb21lbnQpOiBNb21lbnQge1xuICAgIHJldHVybiBtICYmIG1vbWVudC5pc01vbWVudChtKSAmJiBtb21lbnQobS5mb3JtYXQoJ0hIOm1tOnNzJyksICdISDptbTpzcycpO1xuICB9XG5cbiAgZ3JhbnVsYXJpdHlGcm9tVHlwZShjYWxlbmRhclR5cGU6IENhbGVuZGFyTW9kZSk6IHVuaXRPZlRpbWUuQmFzZSB7XG4gICAgc3dpdGNoIChjYWxlbmRhclR5cGUpIHtcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICByZXR1cm4gJ3NlY29uZCc7XG4gICAgICBjYXNlICdkYXl0aW1lJzpcbiAgICAgICAgcmV0dXJuICdzZWNvbmQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNhbGVuZGFyVHlwZTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVWYWxpZGF0b3Ioe21pbkRhdGUsIG1heERhdGUsIG1pblRpbWUsIG1heFRpbWV9OiBEYXRlTGltaXRzLFxuICAgICAgICAgICAgICAgICAgZm9ybWF0OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICBjYWxlbmRhclR5cGU6IENhbGVuZGFyTW9kZSk6IERhdGVWYWxpZGF0b3Ige1xuICAgIGxldCBpc1ZhbGlkOiBib29sZWFuO1xuICAgIGxldCB2YWx1ZTogTW9tZW50W107XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5ncmFudWxhcml0eUZyb21UeXBlKGNhbGVuZGFyVHlwZSk7XG5cbiAgICBpZiAobWluRGF0ZSkge1xuICAgICAgY29uc3QgbWQgPSB0aGlzLmNvbnZlcnRUb01vbWVudChtaW5EYXRlLCBmb3JtYXQpO1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKHtcbiAgICAgICAga2V5OiAnbWluRGF0ZScsXG4gICAgICAgIGlzVmFsaWQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBfaXNWYWxpZCA9IHZhbHVlLmV2ZXJ5KHZhbCA9PiB2YWwuaXNTYW1lT3JBZnRlcihtZCwgZ3JhbnVsYXJpdHkpKTtcbiAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCA/IF9pc1ZhbGlkIDogZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIF9pc1ZhbGlkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWF4RGF0ZSkge1xuICAgICAgY29uc3QgbWQgPSB0aGlzLmNvbnZlcnRUb01vbWVudChtYXhEYXRlLCBmb3JtYXQpO1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKHtcbiAgICAgICAga2V5OiAnbWF4RGF0ZScsXG4gICAgICAgIGlzVmFsaWQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBfaXNWYWxpZCA9IHZhbHVlLmV2ZXJ5KHZhbCA9PiB2YWwuaXNTYW1lT3JCZWZvcmUobWQsIGdyYW51bGFyaXR5KSk7XG4gICAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgPyBfaXNWYWxpZCA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBfaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1pblRpbWUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5vbmx5VGltZSh0aGlzLmNvbnZlcnRUb01vbWVudChtaW5UaW1lLCBmb3JtYXQpKTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21pblRpbWUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdGhpcy5vbmx5VGltZSh2YWwpLmlzU2FtZU9yQWZ0ZXIobWQpKTtcbiAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCA/IF9pc1ZhbGlkIDogZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIF9pc1ZhbGlkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWF4VGltZSkge1xuICAgICAgY29uc3QgbWQgPSB0aGlzLm9ubHlUaW1lKHRoaXMuY29udmVydFRvTW9tZW50KG1heFRpbWUsIGZvcm1hdCkpO1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKHtcbiAgICAgICAga2V5OiAnbWF4VGltZScsXG4gICAgICAgIGlzVmFsaWQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBfaXNWYWxpZCA9IHZhbHVlLmV2ZXJ5KHZhbCA9PiB0aGlzLm9ubHlUaW1lKHZhbCkuaXNTYW1lT3JCZWZvcmUobWQpKTtcbiAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCA/IF9pc1ZhbGlkIDogZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIF9pc1ZhbGlkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGlucHV0VmFsOiBDYWxlbmRhclZhbHVlKSA9PiB7XG4gICAgICBpc1ZhbGlkID0gdHJ1ZTtcblxuICAgICAgdmFsdWUgPSB0aGlzLmNvbnZlcnRUb01vbWVudEFycmF5KGlucHV0VmFsLCB7XG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgYWxsb3dNdWx0aVNlbGVjdDogdHJ1ZVxuICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICBpZiAoIXZhbHVlLmV2ZXJ5KHZhbCA9PiB2YWwuaXNWYWxpZCgpKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgZ2l2ZW46IGlucHV0VmFsXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0b3JzLnJlZHVjZSgobWFwLCBlcnIpID0+IHtcbiAgICAgICAgaWYgKCFlcnIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgbWFwW2Vyci5rZXldID0ge1xuICAgICAgICAgICAgZ2l2ZW46IHZhbHVlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIHJldHVybiAhaXNWYWxpZCA/IGVycm9ycyA6IG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIGRhdGVzU3RyaW5nVG9TdHJpbmdBcnJheSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAodmFsdWUgfHwgJycpLnNwbGl0KCd8JykubWFwKG0gPT4gbS50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIGdldFZhbGlkTW9tZW50QXJyYXkodmFsdWU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpOiBNb21lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZXNTdHJpbmdUb1N0cmluZ0FycmF5KHZhbHVlKVxuICAgICAgLmZpbHRlcihkID0+IHRoaXMuaXNEYXRlVmFsaWQoZCwgZm9ybWF0KSlcbiAgICAgIC5tYXAoZCA9PiBtb21lbnQoZCwgZm9ybWF0KSk7XG4gIH1cblxuICBzaG91bGRTaG93Q3VycmVudChzaG93R29Ub0N1cnJlbnQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IENhbGVuZGFyTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgbWluOiBNb21lbnQsXG4gICAgICAgICAgICAgICAgICAgIG1heDogTW9tZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNob3dHb1RvQ3VycmVudCAmJlxuICAgICAgbW9kZSAhPT0gJ3RpbWUnICYmXG4gICAgICB0aGlzLmlzRGF0ZUluUmFuZ2UobW9tZW50KCksIG1pbiwgbWF4KTtcbiAgfVxuXG4gIGlzRGF0ZUluUmFuZ2UoZGF0ZTogTW9tZW50LCBmcm9tOiBNb21lbnQsIHRvOiBNb21lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF0ZS5pc0JldHdlZW4oZnJvbSwgdG8sICdkYXknLCAnW10nKTtcbiAgfVxuXG4gIGNvbnZlcnRQcm9wc1RvTW9tZW50KG9iajoge1trZXk6IHN0cmluZ106IGFueX0sIGZvcm1hdDogc3RyaW5nLCBwcm9wczogc3RyaW5nW10pIHtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIG9ialtwcm9wXSA9IHRoaXMuY29udmVydFRvTW9tZW50KG9ialtwcm9wXSwgZm9ybWF0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNob3VsZFJlc2V0Q3VycmVudFZpZXc8VCBleHRlbmRzIElDYWxlbmRhckludGVybmFsPihwcmV2Q29uZjogVCwgY3VycmVudENvbmY6IFQpOiBib29sZWFuIHtcbiAgICBpZiAocHJldkNvbmYgJiYgY3VycmVudENvbmYpIHtcbiAgICAgIGlmICghcHJldkNvbmYubWluICYmIGN1cnJlbnRDb25mLm1pbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocHJldkNvbmYubWluICYmIGN1cnJlbnRDb25mLm1pbiAmJiAhcHJldkNvbmYubWluLmlzU2FtZShjdXJyZW50Q29uZi5taW4sICdkJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2Q29uZi5tYXggJiYgY3VycmVudENvbmYubWF4KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwcmV2Q29uZi5tYXggJiYgY3VycmVudENvbmYubWF4ICYmICFwcmV2Q29uZi5tYXguaXNTYW1lKGN1cnJlbnRDb25mLm1heCwgJ2QnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldE5hdGl2ZUVsZW1lbnQoZWxlbTogSFRNTEVsZW1lbnQgfCBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKCFlbGVtKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIDxIVE1MRWxlbWVudD5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==