UNPKG

@qeydar/datepicker

Version:

A comprehensive Date and Time Picker for Angular with Jalali calendar support

224 lines 31.5 kB
import { Directive, HostListener, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class DateMaskDirective { constructor(el) { this.el = el; this.dateFormat = 'yyyy/MM/dd'; this.disableInputMask = false; this.delimiters = []; this.parts = []; this.lastValue = ''; } ngOnInit() { this.parseFormat(); } parseFormat() { if (this.disableInputMask) return; this.parts = []; this.delimiters = []; let currentPart = ''; for (let i = 0; i < this.dateFormat.length; i++) { const char = this.dateFormat[i]; if (this.isFormatChar(char)) { currentPart += char; } else { if (currentPart) { this.parts.push(currentPart); currentPart = ''; } this.delimiters.push(char); } } if (currentPart) { this.parts.push(currentPart); } } isFormatChar(char) { return /[yMdHhmsa]/i.test(char); } onInput(event) { if (this.disableInputMask) return; const input = event.target; const cursorPosition = input.selectionStart || 0; let value = input.value.replace(/[^0-9APMapm\s:/\-\.]/g, ''); // Allow backspace/delete if (value.length < this.lastValue.length) { this.lastValue = value; return; } let formattedParts = []; let currentValue = value; let shouldAddDelimiter = false; let totalLength = 0; let newCursorPosition = cursorPosition; for (let i = 0; i < this.parts.length; i++) { const part = this.extractPart(currentValue, this.parts[i]); if (!part && part !== '0') break; const expectedLength = this.getPartLength(this.parts[i]); let formattedPart = part; if (formattedPart.length >= expectedLength) { formattedPart = this.validatePart(formattedPart.slice(0, expectedLength), this.parts[i]); shouldAddDelimiter = true; } formattedParts.push(formattedPart); totalLength += formattedPart.length; if (shouldAddDelimiter && i < this.parts.length - 1) { formattedParts.push(this.delimiters[i] || ''); totalLength += 1; shouldAddDelimiter = false; if (cursorPosition === totalLength - 1) { newCursorPosition = totalLength; } } currentValue = this.removeProcessedPart(currentValue, part); } const formattedValue = formattedParts.join(''); input.value = formattedValue; // Set cursor position newCursorPosition = Math.min(newCursorPosition, totalLength); input.setSelectionRange(newCursorPosition, newCursorPosition); this.lastValue = formattedValue; } extractPart(value, format) { if (!value) return ''; if (format[0].toLowerCase() === 'a') { // Handle AM/PM const match = value.match(/^[AaPp][Mm]?/); return match ? match[0].toUpperCase() : ''; } // Handle numeric parts const match = value.match(/^\d+/); return match ? match[0] : ''; } removeProcessedPart(value, part) { if (!part) return value; // Remove part and following delimiter if exists const remainingValue = value.slice(part.length); return remainingValue.replace(/^[:/\s-]/, ''); } onKeyDown(event) { if (this.disableInputMask) return; const input = event.target; const cursorPosition = input.selectionStart || 0; // Allow control keys if (event.key === 'Backspace' || event.key === 'Delete' || event.key === 'ArrowLeft' || event.key === 'ArrowRight' || event.key === 'Tab' || event.ctrlKey) { return; } const currentPartIndex = this.getCurrentPartIndex(input.value, cursorPosition); if (currentPartIndex === -1) return; const currentFormat = this.parts[currentPartIndex]; const isTimeDelimiter = event.key === ':' && cursorPosition > 0 && (this.parts[currentPartIndex - 1]?.includes('H') || this.parts[currentPartIndex - 1]?.includes('h')); // Allow time delimiter after hours if (isTimeDelimiter) { if (this.delimiters[currentPartIndex - 1] === ':') { const parts = input.value.split(/[:/\s-]/); const currentPart = this.validatePart(parts[currentPartIndex - 1], this.parts[currentPartIndex - 1]); parts[currentPartIndex - 1] = currentPart; const newValue = parts.slice(0, currentPartIndex).join(this.delimiters[currentPartIndex - 1]) + ':'; input.value = newValue + parts.slice(currentPartIndex).join(this.delimiters[currentPartIndex]); input.setSelectionRange(newValue.length, newValue.length); event.preventDefault(); } return; } // Handle AM/PM input if (currentFormat[0].toLowerCase() === 'a') { if (!/^[AaPpMm]$/.test(event.key)) { event.preventDefault(); } return; } // Allow only digits for other parts if (!/^\d$/.test(event.key)) { event.preventDefault(); } } validatePart(value, format) { if (value === '') return ''; const type = format[0].toLowerCase(); if (type === 'a') { const upperValue = value.toUpperCase(); if (value.length === 1) { return upperValue === 'A' || upperValue === 'P' ? upperValue : ''; } return ['AM', 'PM'].includes(upperValue) ? upperValue : upperValue[0]; } const numValue = parseInt(value, 10); switch (type) { case 'h': // 12-hour format if (format[0] == 'H') return Math.min(Math.max(numValue, 0), 23).toString().padStart(2, '0'); return Math.min(Math.max(numValue, 1), 12).toString().padStart(2, '0'); case 'm': // month or minute if (format === 'MM') { return Math.min(Math.max(numValue, 1), 12).toString().padStart(2, '0'); } return Math.min(Math.max(numValue, 0), 59).toString().padStart(2, '0'); case 's': // seconds return Math.min(Math.max(numValue, 0), 59).toString().padStart(2, '0'); case 'd': // day return Math.min(Math.max(numValue, 1), 31).toString().padStart(2, '0'); case 'y': // year if (format.length === 2) return value.padStart(2, '0'); return value.padStart(4, '0'); default: return value; } } getPartLength(format) { const type = format[0].toLowerCase(); switch (type) { case 'y': return format.length === 2 ? 2 : 4; case 'a': return format.length === 1 ? 1 : 2; default: return 2; } } getCurrentPartIndex(value, cursorPosition) { const parts = value.split(/[:/\s-]/); let currentIndex = 0; let totalLength = 0; for (let i = 0; i < parts.length; i++) { totalLength += parts[i].length; if (cursorPosition <= totalLength + i) { return i; } totalLength += 1; // Add delimiter length } return parts.length - 1; } } DateMaskDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DateMaskDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); DateMaskDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: DateMaskDirective, isStandalone: true, selector: "[qeydar-dateMask]", inputs: { dateFormat: ["qeydar-dateMask", "dateFormat"], disableInputMask: "disableInputMask" }, host: { listeners: { "input": "onInput($event)", "keydown": "onKeyDown($event)" } }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DateMaskDirective, decorators: [{ type: Directive, args: [{ selector: '[qeydar-dateMask]', standalone: true }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { dateFormat: [{ type: Input, args: ['qeydar-dateMask'] }], disableInputMask: [{ type: Input }], onInput: [{ type: HostListener, args: ['input', ['$event']] }], onKeyDown: [{ type: HostListener, args: ['keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9xZXlkYXItZGF0ZXBpY2tlci9zcmMvdXRpbHMvaW5wdXQtbWFzay5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0zRSxNQUFNLE9BQU8saUJBQWlCO0lBUTVCLFlBQW1CLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBUFAsZUFBVSxHQUFXLFlBQVksQ0FBQztRQUNuRCxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFFbEMsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixVQUFLLEdBQWEsRUFBRSxDQUFDO1FBQ3JCLGNBQVMsR0FBVyxFQUFFLENBQUM7SUFFYSxDQUFDO0lBRXJDLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkIsT0FBTztRQUVULElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzNCLFdBQVcsSUFBSSxJQUFJLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsSUFBSSxXQUFXLEVBQUU7b0JBQ2Ys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QWlCOzJGQUFqQixpQkFBaUI7a0JBSjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO2lHQUUyQixVQUFVO3NCQUFuQyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFDZixnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBNENOLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBa0ZqQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1txZXlkYXItZGF0ZU1hc2tdJyxcclxuICBzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlTWFza0RpcmVjdGl2ZSB7XHJcbiAgQElucHV0KCdxZXlkYXItZGF0ZU1hc2snKSBkYXRlRm9ybWF0OiBzdHJpbmcgPSAneXl5eS9NTS9kZCc7XHJcbiAgQElucHV0KCkgZGlzYWJsZUlucHV0TWFzayA9IGZhbHNlO1xyXG5cclxuICBkZWxpbWl0ZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGxhc3RWYWx1ZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbDogRWxlbWVudFJlZikge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnBhcnNlRm9ybWF0KCk7XHJcbiAgfVxyXG5cclxuICBwYXJzZUZvcm1hdCgpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVJbnB1dE1hc2spXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnBhcnRzID0gW107XHJcbiAgICB0aGlzLmRlbGltaXRlcnMgPSBbXTtcclxuICAgIGxldCBjdXJyZW50UGFydCA9ICcnO1xyXG4gICAgXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0ZUZvcm1hdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGFyID0gdGhpcy5kYXRlRm9ybWF0W2ldO1xyXG4gICAgICBcclxuICAgICAgaWYgKHRoaXMuaXNGb3JtYXRDaGFyKGNoYXIpKSB7XHJcbiAgICAgICAgY3VycmVudFBhcnQgKz0gY2hhcjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoY3VycmVudFBhcnQpIHtcclxuICAgICAgICAgIHRoaXMucGFydHMucHVzaChjdXJyZW50UGFydCk7XHJcbiAgICAgICAgICBjdXJyZW50UGFydCA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRlbGltaXRlcnMucHVzaChjaGFyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoY3VycmVudFBhcnQpIHtcclxuICAgICAgdGhpcy5wYXJ0cy5wdXNoKGN1cnJlbnRQYXJ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRm9ybWF0Q2hhcihjaGFyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAvW3lNZEhobXNhXS9pLnRlc3QoY2hhcik7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXHJcbiAgb25JbnB1dChldmVudDogSW5wdXRFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZUlucHV0TWFzaylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IGlucHV0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XHJcbiAgICBsZXQgdmFsdWUgPSBpbnB1dC52YWx1ZS5yZXBsYWNlKC9bXjAtOUFQTWFwbVxcczovXFwtXFwuXS9nLCAnJyk7XHJcbiAgICBcclxuICAgIC8vIEFsbG93IGJhY2tzcGFjZS9kZWxldGVcclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLmxhc3RWYWx1ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBmb3JtYXR0ZWRQYXJ0czogc3RyaW5nW10gPSBbXTtcclxuICAgIGxldCBjdXJyZW50VmFsdWUgPSB2YWx1ZTtcclxuICAgIGxldCBzaG91bGRBZGREZWxpbWl0ZXIgPSBmYWxzZTtcclxuICAgIGxldCB0b3RhbExlbmd0aCA9IDA7XHJcbiAgICBsZXQgbmV3Q3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgcGFydCA9IHRoaXMuZXh0cmFjdFBhcnQoY3VycmVudFZhbHVlLCB0aGlzLnBhcnRzW2ldKTtcclxuICAgICAgaWYgKCFwYXJ0ICYmIHBhcnQgIT09ICcwJykgYnJlYWs7XHJcblxyXG4gICAgICBjb25zdCBleHBlY3RlZExlbmd0aCA9IHRoaXMuZ2V0UGFydExlbmd0aCh0aGlzLnBhcnRzW2ldKTtcclxuICAgICAgbGV0IGZvcm1hdHRlZFBhcnQgPSBwYXJ0O1xyXG5cclxuICAgICAgaWYgKGZvcm1hdHRlZFBhcnQubGVuZ3RoID49IGV4cGVjdGVkTGVuZ3RoKSB7XHJcbiAgICAgICAgZm9ybWF0dGVkUGFydCA9IHRoaXMudmFsaWRhdGVQYXJ0KGZvcm1hdHRlZFBhcnQuc2xpY2UoMCwgZXhwZWN0ZWRMZW5ndGgpLCB0aGlzLnBhcnRzW2ldKTtcclxuICAgICAgICBzaG91bGRBZGREZWxpbWl0ZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3JtYXR0ZWRQYXJ0cy5wdXNoKGZvcm1hdHRlZFBhcnQpO1xyXG4gICAgICB0b3RhbExlbmd0aCArPSBmb3JtYXR0ZWRQYXJ0Lmxlbmd0aDtcclxuXHJcbiAgICAgIGlmIChzaG91bGRBZGREZWxpbWl0ZXIgJiYgaSA8IHRoaXMucGFydHMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGZvcm1hdHRlZFBhcnRzLnB1c2godGhpcy5kZWxpbWl0ZXJzW2ldIHx8ICcnKTtcclxuICAgICAgICB0b3RhbExlbmd0aCArPSAxO1xyXG4gICAgICAgIHNob3VsZEFkZERlbGltaXRlciA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoY3Vyc29yUG9zaXRpb24gPT09IHRvdGFsTGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgbmV3Q3Vyc29yUG9zaXRpb24gPSB0b3RhbExlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMucmVtb3ZlUHJvY2Vzc2VkUGFydChjdXJyZW50VmFsdWUsIHBhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkUGFydHMuam9pbignJyk7XHJcbiAgICBpbnB1dC52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xyXG5cclxuICAgIC8vIFNldCBjdXJzb3IgcG9zaXRpb25cclxuICAgIG5ld0N1cnNvclBvc2l0aW9uID0gTWF0aC5taW4obmV3Q3Vyc29yUG9zaXRpb24sIHRvdGFsTGVuZ3RoKTtcclxuICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvc2l0aW9uLCBuZXdDdXJzb3JQb3NpdGlvbik7XHJcblxyXG4gICAgdGhpcy5sYXN0VmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGV4dHJhY3RQYXJ0KHZhbHVlOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcclxuXHJcbiAgICBpZiAoZm9ybWF0WzBdLnRvTG93ZXJDYXNlKCkgPT09ICdhJykge1xyXG4gICAgICAvLyBIYW5kbGUgQU0vUE1cclxuICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXltBYVBwXVtNbV0/Lyk7XHJcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdLnRvVXBwZXJDYXNlKCkgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgbnVtZXJpYyBwYXJ0c1xyXG4gICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXlxcZCsvKTtcclxuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogJyc7XHJcbiAgfVxyXG5cclxuICByZW1vdmVQcm9jZXNzZWRQYXJ0KHZhbHVlOiBzdHJpbmcsIHBhcnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXBhcnQpIHJldHVybiB2YWx1ZTtcclxuICAgIFxyXG4gICAgLy8gUmVtb3ZlIHBhcnQgYW5kIGZvbGxvd2luZyBkZWxpbWl0ZXIgaWYgZXhpc3RzXHJcbiAgICBjb25zdCByZW1haW5pbmdWYWx1ZSA9IHZhbHVlLnNsaWNlKHBhcnQubGVuZ3RoKTtcclxuICAgIHJldHVybiByZW1haW5pbmdWYWx1ZS5yZXBsYWNlKC9eWzovXFxzLV0vLCAnJyk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVJbnB1dE1hc2spXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBpbnB1dC5zZWxlY3Rpb25TdGFydCB8fCAwO1xyXG4gICAgXHJcbiAgICAvLyBBbGxvdyBjb250cm9sIGtleXNcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScgfHwgXHJcbiAgICAgICAgZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBcclxuICAgICAgICBldmVudC5rZXkgPT09ICdUYWInIHx8IGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRQYXJ0SW5kZXggPSB0aGlzLmdldEN1cnJlbnRQYXJ0SW5kZXgoaW5wdXQudmFsdWUsIGN1cnNvclBvc2l0aW9uKTtcclxuICAgIGlmIChjdXJyZW50UGFydEluZGV4ID09PSAtMSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRGb3JtYXQgPSB0aGlzLnBhcnRzW2N1cnJlbnRQYXJ0SW5kZXhdO1xyXG4gICAgY29uc3QgaXNUaW1lRGVsaW1pdGVyID0gZXZlbnQua2V5ID09PSAnOicgJiYgY3Vyc29yUG9zaXRpb24gPiAwICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5wYXJ0c1tjdXJyZW50UGFydEluZGV4IC0gMV0/LmluY2x1ZGVzKCdIJykgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRzW2N1cnJlbnRQYXJ0SW5kZXggLSAxXT8uaW5jbHVkZXMoJ2gnKSk7XHJcblxyXG4gICAgLy8gQWxsb3cgdGltZSBkZWxpbWl0ZXIgYWZ0ZXIgaG91cnNcclxuICAgIGlmIChpc1RpbWVEZWxpbWl0ZXIpIHtcclxuICAgICAgaWYgKHRoaXMuZGVsaW1pdGVyc1tjdXJyZW50UGFydEluZGV4IC0gMV0gPT09ICc6Jykge1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gaW5wdXQudmFsdWUuc3BsaXQoL1s6L1xccy1dLyk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFBhcnQgPSB0aGlzLnZhbGlkYXRlUGFydChwYXJ0c1tjdXJyZW50UGFydEluZGV4IC0gMV0sIHRoaXMucGFydHNbY3VycmVudFBhcnRJbmRleCAtIDFdKTtcclxuICAgICAgICBwYXJ0c1tjdXJyZW50UGFydEluZGV4IC0gMV0gPSBjdXJyZW50UGFydDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHBhcnRzLnNsaWNlKDAsIGN1cnJlbnRQYXJ0SW5kZXgpLmpvaW4odGhpcy5kZWxpbWl0ZXJzW2N1cnJlbnRQYXJ0SW5kZXggLSAxXSkgKyAnOic7XHJcbiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdWYWx1ZSArIHBhcnRzLnNsaWNlKGN1cnJlbnRQYXJ0SW5kZXgpLmpvaW4odGhpcy5kZWxpbWl0ZXJzW2N1cnJlbnRQYXJ0SW5kZXhdKTtcclxuICAgICAgICBcclxuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShuZXdWYWx1ZS5sZW5ndGgsIG5ld1ZhbHVlLmxlbmd0aCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIEFNL1BNIGlucHV0XHJcbiAgICBpZiAoY3VycmVudEZvcm1hdFswXS50b0xvd2VyQ2FzZSgpID09PSAnYScpIHtcclxuICAgICAgaWYgKCEvXltBYVBwTW1dJC8udGVzdChldmVudC5rZXkpKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWxsb3cgb25seSBkaWdpdHMgZm9yIG90aGVyIHBhcnRzXHJcbiAgICBpZiAoIS9eXFxkJC8udGVzdChldmVudC5rZXkpKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVBhcnQodmFsdWU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSAnJykgcmV0dXJuICcnO1xyXG4gICAgXHJcbiAgICBjb25zdCB0eXBlID0gZm9ybWF0WzBdLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAodHlwZSA9PT0gJ2EnKSB7XHJcbiAgICAgIGNvbnN0IHVwcGVyVmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuIHVwcGVyVmFsdWUgPT09ICdBJyB8fCB1cHBlclZhbHVlID09PSAnUCcgPyB1cHBlclZhbHVlIDogJyc7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFsnQU0nLCAnUE0nXS5pbmNsdWRlcyh1cHBlclZhbHVlKSA/IHVwcGVyVmFsdWUgOiB1cHBlclZhbHVlWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG51bVZhbHVlID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdoJzogLy8gMTItaG91ciBmb3JtYXRcclxuICAgICAgICBpZiAoZm9ybWF0WzBdID09ICdIJylcclxuICAgICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChudW1WYWx1ZSwgMCksIDIzKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChudW1WYWx1ZSwgMSksIDEyKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIFxyXG4gICAgICBjYXNlICdtJzogLy8gbW9udGggb3IgbWludXRlXHJcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NJykge1xyXG4gICAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG51bVZhbHVlLCAxKSwgMTIpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG51bVZhbHVlLCAwKSwgNTkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgXHJcbiAgICAgIGNhc2UgJ3MnOiAvLyBzZWNvbmRzXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG51bVZhbHVlLCAwKSwgNTkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgXHJcbiAgICAgIGNhc2UgJ2QnOiAvLyBkYXlcclxuICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobnVtVmFsdWUsIDEpLCAzMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICBcclxuICAgICAgY2FzZSAneSc6IC8vIHllYXJcclxuICAgICAgICBpZiAoZm9ybWF0Lmxlbmd0aCA9PT0gMikgcmV0dXJuIHZhbHVlLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlLnBhZFN0YXJ0KDQsICcwJyk7XHJcbiAgICAgIFxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFBhcnRMZW5ndGgoZm9ybWF0OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgY29uc3QgdHlwZSA9IGZvcm1hdFswXS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3knOiByZXR1cm4gZm9ybWF0Lmxlbmd0aCA9PT0gMiA/IDIgOiA0O1xyXG4gICAgICBjYXNlICdhJzogcmV0dXJuIGZvcm1hdC5sZW5ndGggPT09IDEgPyAxIDogMjtcclxuICAgICAgZGVmYXVsdDogcmV0dXJuIDI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50UGFydEluZGV4KHZhbHVlOiBzdHJpbmcsIGN1cnNvclBvc2l0aW9uOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCgvWzovXFxzLV0vKTtcclxuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xyXG4gICAgbGV0IHRvdGFsTGVuZ3RoID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRvdGFsTGVuZ3RoICs9IHBhcnRzW2ldLmxlbmd0aDtcclxuICAgICAgaWYgKGN1cnNvclBvc2l0aW9uIDw9IHRvdGFsTGVuZ3RoICsgaSkge1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICAgIHRvdGFsTGVuZ3RoICs9IDE7IC8vIEFkZCBkZWxpbWl0ZXIgbGVuZ3RoXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgfVxyXG59Il19