@edugouvfr/ngx-dsfr-ext
Version:
NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)
201 lines • 24 kB
JavaScript
import { Directive, ElementRef, inject, Input, Renderer2 } from '@angular/core';
import { DsfrDatePickerComponent } from '../datepicker.component';
import * as i0 from "@angular/core";
const MASK_DATE = '__/__/____';
/**
* L'objectif de cette directive est de proposer un masque de saisie sous la forme dd/dd/ddddd.
* @author pfontanet
* @since 0.10
*/
export class DateMaskDirective {
constructor() {
this.hostComponent = inject(DsfrDatePickerComponent);
this.elementRef = inject(ElementRef);
this.renderer = inject(Renderer2);
}
set dsfrDateMask(value) {
this._dsfrDateMask = value;
this.doHideShowMask();
}
/**
* NOTE : Pourquoi ngAfterViewInit plutôt que ngOnInit ?
* Et bien, parce que dans ngOnInit, le DOM n'est pas encore construit et que l'ajout de listeners en fonction
* de la valeur du masque ne marche pas car, this.elementRef.nativeElement.querySelector('.fr-input') === null
* et du coup rien ne marche !!!
*/
ngAfterViewInit() {
this.doHideShowMask();
}
ngOnDestroy() {
this.removeListeners();
}
/**
* Cache / affiche le masque en fonction de la propriété `mask`.
* @private
*/
doHideShowMask() {
const showMask = this._dsfrDateMask !== '';
if (showMask) {
this.addListeners();
}
else {
this.removeListeners();
}
}
addListeners() {
this.hostComponent.value = formatDateMaskValue(this.hostComponent.value);
// NOTE : Pourquoi ne pas utiliser renderer.selectRootElement() ?
// Parce que le setter de dsfrDateMask est invoqué lors de l'étape d'init, le DOM n'est pas construit
// et que selectRootElement affiche une exception dans la console, contrairement à querySelector
// A l'init inputElt === null
const inputElt = this.elementRef.nativeElement.querySelector('.fr-input');
if (inputElt) {
this.listenKeydown = this.renderer.listen(inputElt, 'keydown', onInputKeyDown);
this.listenKeyup = this.renderer.listen(inputElt, 'keyup', onInputKeyUp);
}
}
removeListeners() {
if (this.listenKeydown) {
this.listenKeydown();
}
if (this.listenKeyup) {
this.listenKeyup();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DateMaskDirective, isStandalone: true, selector: "[dsfrDateMask]", inputs: { dsfrDateMask: "dsfrDateMask" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateMaskDirective, decorators: [{
type: Directive,
args: [{
selector: '[dsfrDateMask]',
standalone: true,
}]
}], propDecorators: { dsfrDateMask: [{
type: Input
}] } });
/* -- Traitement du masque ------------------------------------------------------------------------------------------ */
/**
* Traite les événements du clavier dans le champ date.
* - Permet la saisie des chiffres de 0 à 9
* - Permet la tabulation avant / arrière dans les parties jour / mois / année
* @param event
*/
function onInputKeyDown(event) {
// Si ce n'est pas un nombre, on ne fait rien
const inputElt = event.currentTarget;
const isDigit = /\d/.test(event.key);
if (isDigit) {
doDigitKeyDown(inputElt);
}
else {
switch (event.key) {
case 'Tab':
const eventProcessed = event.shiftKey ? doShiftTabKey(inputElt) : doTabKey(inputElt);
if (eventProcessed) {
event.preventDefault();
}
break;
default: {
const isLetter = /[a-zA-Z]/.test(event.key);
if (isLetter) {
event.stopPropagation();
}
}
}
}
}
/**
* Finalise le traitement du clavier après insertion d'un digit.
*/
function onInputKeyUp(event) {
// Si ce n'est pas un nombre, on ne fait rien
const inputElt = event.currentTarget;
const isDigit = /\d/.test(event.key);
if (isDigit) {
doDigitKeyUp(inputElt);
}
}
/**
* Traitement AVANT insertion d'un digit dans le champ date
* - Suppression de '_' qui sera remplacé par le digit (le champ ne dépasse pas 10 caractères)
* - On replace le curseur où il était
*/
function doDigitKeyDown(inputElt) {
// Au cas où l'utilisateur a cliqué devant un séparateur, on le saute
// Et ben NON, car si on a 1/1^/2024 (le chapeau représentant le point d'insertion), on laisse faire
const value = inputElt.value || '';
let selStart = inputElt.selectionStart || 0;
// On supprime le '_' afin de pouvoir insérer le digit à la place
if (value[selStart] == '_') {
inputElt.value = value.slice(0, selStart) + value.slice(selStart + 1);
inputElt.selectionStart = selStart;
inputElt.selectionEnd = selStart;
}
}
/**
* Traitement APRES insertion d'un caractère dans le champ date
* - Saut d'un séparateur s'il y a lieu
* - Reformatage du champ si l'utilisateur a supprimé des éléments du masque
*/
function doDigitKeyUp(inputElt) {
// Au cas où l'utilisateur se retrouve devant un séparateur, on le saute
const value = inputElt.value || '';
let selStart = inputElt.selectionStart || 0;
if (value[selStart] === '/' && (selStart === 2 || selStart == 5)) {
inputElt.selectionStart = ++selStart;
}
// On reformate si nécessaire
if (value.length < 8) {
inputElt.value = formatDateMaskValue(inputElt.value);
}
}
/**
* Tab AVANT dans le champ date
* - Tabulation en avant de part en part (jour, mois, année), puis tabulation sur champ suivant
*/
function doTabKey(inputElt) {
const value = inputElt.value || '';
const selEnd = inputElt.selectionEnd || 0;
const pos = value.indexOf('/', selEnd);
if (pos > -1) {
inputElt.selectionStart = pos + 1;
inputElt.selectionEnd = inputElt.selectionStart;
}
return pos > -1;
}
/**
* Tab ARRIERE dans le champ date
* - Tabulation en arrière de part en part (année, mois, jour), puis tabulation sur champ précédent
*/
function doShiftTabKey(inputElt) {
const value = inputElt.value || '';
const selStart = inputElt.selectionStart || 0;
const pos = value.substring(0, selStart).lastIndexOf('/');
if (pos > -1) {
inputElt.selectionStart = pos;
inputElt.selectionEnd = inputElt.selectionStart;
}
return pos > -1;
}
/**
* Reformatage de la valeur, quelle que soit la saisie
* @param input
*/
export function formatDateMaskValue(input) {
const regexp = /^(?<day>[\d_]{0,2})(?<s1>\/?)(?<month>[\d_]{0,2})(?<s2>\/?)(?<year>[\d_]{0,4})$/;
const reArr = regexp.exec(input || '');
const groups = reArr?.groups;
let value = MASK_DATE;
if (groups) {
let day = groups['day'] || '__';
day = groups['s1'] ? day : day.padEnd(2, '_');
let month = groups['month'] || '__';
month = groups['s2'] ? month : month.padEnd(2, '_');
let year = groups['year'] || '____';
year = year.padEnd(4, '_');
value = day + '/' + month + '/' + year;
}
return value;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1tYXNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWV4dC9zcmMvbGliL2RhdGVwaWNrZXIvbWFzay9kYXRlLW1hc2suZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFbEUsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO0FBTS9COzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBVDlCO1FBZW1CLGtCQUFhLEdBQTRCLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pFLGVBQVUsR0FBZSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsYUFBUSxHQUFjLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztLQXVEMUQ7SUFyREMsSUFBYSxZQUFZLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYztRQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxLQUFLLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxD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QUUsTUFBTSxDQUFDO0lBQzdCLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQztJQUN0QixJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNoQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDcEMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDO1FBQ3BDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQixLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHNmckRhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5cbmNvbnN0IE1BU0tfREFURSA9ICdfXy9fXy9fX19fJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RzZnJEYXRlTWFza10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbi8qKlxuICogTCdvYmplY3RpZiBkZSBjZXR0ZSBkaXJlY3RpdmUgZXN0IGRlIHByb3Bvc2VyIHVuIG1hc3F1ZSBkZSBzYWlzaWUgc291cyBsYSBmb3JtZSBkZC9kZC9kZGRkZC5cbiAqIEBhdXRob3IgcGZvbnRhbmV0XG4gKiBAc2luY2UgMC4xMFxuICovXG5leHBvcnQgY2xhc3MgRGF0ZU1hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9kc2ZyRGF0ZU1hc2s6IHN0cmluZztcblxuICBwcml2YXRlIGxpc3RlbktleXVwOiBhbnk7XG4gIHByaXZhdGUgbGlzdGVuS2V5ZG93bjogYW55O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdENvbXBvbmVudDogRHNmckRhdGVQaWNrZXJDb21wb25lbnQgPSBpbmplY3QoRHNmckRhdGVQaWNrZXJDb21wb25lbnQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMiA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIEBJbnB1dCgpIHNldCBkc2ZyRGF0ZU1hc2sodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RzZnJEYXRlTWFzayA9IHZhbHVlO1xuICAgIHRoaXMuZG9IaWRlU2hvd01hc2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOT1RFIDogUG91cnF1b2kgbmdBZnRlclZpZXdJbml0IHBsdXTDtHQgcXVlIG5nT25Jbml0ID9cbiAgICogRXQgYmllbiwgcGFyY2UgcXVlIGRhbnMgbmdPbkluaXQsIGxlIERPTSBuJ2VzdCBwYXMgZW5jb3JlIGNvbnN0cnVpdCBldCBxdWUgbCdham91dCBkZSBsaXN0ZW5lcnMgZW4gZm9uY3Rpb25cbiAgICogZGUgbGEgdmFsZXVyIGR1IG1hc3F1ZSBuZSBtYXJjaGUgcGFzIGNhciwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZyLWlucHV0JykgPT09IG51bGxcbiAgICogZXQgZHUgY291cCByaWVuIG5lIG1hcmNoZSAhISFcbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmRvSGlkZVNob3dNYXNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhY2hlIC8gYWZmaWNoZSBsZSBtYXNxdWUgZW4gZm9uY3Rpb24gZGUgbGEgcHJvcHJpw6l0w6kgYG1hc2tgLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBkb0hpZGVTaG93TWFzaygpIHtcbiAgICBjb25zdCBzaG93TWFzayA9IHRoaXMuX2RzZnJEYXRlTWFzayAhPT0gJyc7XG4gICAgaWYgKHNob3dNYXNrKSB7XG4gICAgICB0aGlzLmFkZExpc3RlbmVycygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuaG9zdENvbXBvbmVudC52YWx1ZSA9IGZvcm1hdERhdGVNYXNrVmFsdWUodGhpcy5ob3N0Q29tcG9uZW50LnZhbHVlKTtcbiAgICAvLyBOT1RFIDogUG91cnF1b2kgbmUgcGFzIHV0aWxpc2VyIHJlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KCkgP1xuICAgIC8vIFBhcmNlIHF1ZSBsZSBzZXR0ZXIgZGUgZHNmckRhdGVNYXNrIGVzdCBpbnZvcXXDqSBsb3JzIGRlIGwnw6l0YXBlIGQnaW5pdCwgbGUgRE9NIG4nZXN0IHBhcyBjb25zdHJ1aXRcbiAgICAvLyBldCBxdWUgc2VsZWN0Um9vdEVsZW1lbnQgYWZmaWNoZSB1bmUgZXhjZXB0aW9uIGRhbnMgbGEgY29uc29sZSwgY29udHJhaXJlbWVudCDDoCBxdWVyeVNlbGVjdG9yXG4gICAgLy8gQSBsJ2luaXQgaW5wdXRFbHQgPT09IG51bGxcbiAgICBjb25zdCBpbnB1dEVsdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mci1pbnB1dCcpO1xuICAgIGlmIChpbnB1dEVsdCkge1xuICAgICAgdGhpcy5saXN0ZW5LZXlkb3duID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oaW5wdXRFbHQsICdrZXlkb3duJywgb25JbnB1dEtleURvd24pO1xuICAgICAgdGhpcy5saXN0ZW5LZXl1cCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGlucHV0RWx0LCAna2V5dXAnLCBvbklucHV0S2V5VXApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxpc3RlbktleWRvd24pIHtcbiAgICAgIHRoaXMubGlzdGVuS2V5ZG93bigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5saXN0ZW5LZXl1cCkge1xuICAgICAgdGhpcy5saXN0ZW5LZXl1cCgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAtLSBUcmFpdGVtZW50IGR1IG1hc3F1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUcmFpdGUgbGVzIMOpdsOpbmVtZW50cyBkdSBjbGF2aWVyIGRhbnMgbGUgY2hhbXAgZGF0ZS5cbiAqIC0gUGVybWV0IGxhIHNhaXNpZSBkZXMgY2hpZmZyZXMgZGUgMCDDoCA5XG4gKiAtIFBlcm1ldCBsYSB0YWJ1bGF0aW9uIGF2YW50IC8gYXJyacOocmUgZGFucyBsZXMgcGFydGllcyBqb3VyIC8gbW9pcyAvIGFubsOpZVxuICogQHBhcmFtIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uSW5wdXRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIC8vIFNpIGNlIG4nZXN0IHBhcyB1biBub21icmUsIG9uIG5lIGZhaXQgcmllblxuICBjb25zdCBpbnB1dEVsdCA9IDxIVE1MSW5wdXRFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGNvbnN0IGlzRGlnaXQgPSAvXFxkLy50ZXN0KGV2ZW50LmtleSk7XG4gIGlmIChpc0RpZ2l0KSB7XG4gICAgZG9EaWdpdEtleURvd24oaW5wdXRFbHQpO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICBjb25zdCBldmVudFByb2Nlc3NlZCA9IGV2ZW50LnNoaWZ0S2V5ID8gZG9TaGlmdFRhYktleShpbnB1dEVsdCkgOiBkb1RhYktleShpbnB1dEVsdCk7XG4gICAgICAgIGlmIChldmVudFByb2Nlc3NlZCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGlzTGV0dGVyID0gL1thLXpBLVpdLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgIGlmIChpc0xldHRlcikge1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluYWxpc2UgbGUgdHJhaXRlbWVudCBkdSBjbGF2aWVyIGFwcsOocyBpbnNlcnRpb24gZCd1biBkaWdpdC5cbiAqL1xuZnVuY3Rpb24gb25JbnB1dEtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIC8vIFNpIGNlIG4nZXN0IHBhcyB1biBub21icmUsIG9uIG5lIGZhaXQgcmllblxuICBjb25zdCBpbnB1dEVsdCA9IDxIVE1MSW5wdXRFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGNvbnN0IGlzRGlnaXQgPSAvXFxkLy50ZXN0KGV2ZW50LmtleSk7XG4gIGlmIChpc0RpZ2l0KSB7XG4gICAgZG9EaWdpdEtleVVwKGlucHV0RWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWl0ZW1lbnQgQVZBTlQgaW5zZXJ0aW9uIGQndW4gZGlnaXQgZGFucyBsZSBjaGFtcCBkYXRlXG4gKiAtIFN1cHByZXNzaW9uIGRlICdfJyBxdWkgc2VyYSByZW1wbGFjw6kgcGFyIGxlIGRpZ2l0IChsZSBjaGFtcCBuZSBkw6lwYXNzZSBwYXMgMTAgY2FyYWN0w6hyZXMpXG4gKiAtIE9uIHJlcGxhY2UgbGUgY3Vyc2V1ciBvw7kgaWwgw6l0YWl0XG4gKi9cbmZ1bmN0aW9uIGRvRGlnaXRLZXlEb3duKGlucHV0RWx0OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gIC8vIEF1IGNhcyBvw7kgbCd1dGlsaXNhdGV1ciBhIGNsaXF1w6kgZGV2YW50IHVuIHPDqXBhcmF0ZXVyLCBvbiBsZSBzYXV0ZVxuICAvLyBFdCBiZW4gTk9OLCBjYXIgc2kgb24gYSAxLzFeLzIwMjQgKGxlIGNoYXBlYXUgcmVwcsOpc2VudGFudCBsZSBwb2ludCBkJ2luc2VydGlvbiksIG9uIGxhaXNzZSBmYWlyZVxuICBjb25zdCB2YWx1ZSA9IGlucHV0RWx0LnZhbHVlIHx8ICcnO1xuICBsZXQgc2VsU3RhcnQgPSBpbnB1dEVsdC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuXG4gIC8vIE9uIHN1cHByaW1lIGxlICdfJyBhZmluIGRlIHBvdXZvaXIgaW5zw6lyZXIgbGUgZGlnaXQgw6AgbGEgcGxhY2VcbiAgaWYgKHZhbHVlW3NlbFN0YXJ0XSA9PSAnXycpIHtcbiAgICBpbnB1dEVsdC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHNlbFN0YXJ0KSArIHZhbHVlLnNsaWNlKHNlbFN0YXJ0ICsgMSk7XG4gICAgaW5wdXRFbHQuc2VsZWN0aW9uU3RhcnQgPSBzZWxTdGFydDtcbiAgICBpbnB1dEVsdC5zZWxlY3Rpb25FbmQgPSBzZWxTdGFydDtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWl0ZW1lbnQgQVBSRVMgaW5zZXJ0aW9uIGQndW4gY2FyYWN0w6hyZSBkYW5zIGxlIGNoYW1wIGRhdGVcbiAqIC0gU2F1dCBkJ3VuIHPDqXBhcmF0ZXVyIHMnaWwgeSBhIGxpZXVcbiAqIC0gUmVmb3JtYXRhZ2UgZHUgY2hhbXAgc2kgbCd1dGlsaXNhdGV1ciBhIHN1cHByaW3DqSBkZXMgw6lsw6ltZW50cyBkdSBtYXNxdWVcbiAqL1xuZnVuY3Rpb24gZG9EaWdpdEtleVVwKGlucHV0RWx0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gIC8vIEF1IGNhcyBvw7kgbCd1dGlsaXNhdGV1ciBzZSByZXRyb3V2ZSBkZXZhbnQgdW4gc8OpcGFyYXRldXIsIG9uIGxlIHNhdXRlXG4gIGNvbnN0IHZhbHVlID0gaW5wdXRFbHQudmFsdWUgfHwgJyc7XG4gIGxldCBzZWxTdGFydCA9IGlucHV0RWx0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XG4gIGlmICh2YWx1ZVtzZWxTdGFydF0gPT09ICcvJyAmJiAoc2VsU3RhcnQgPT09IDIgfHwgc2VsU3RhcnQgPT0gNSkpIHtcbiAgICBpbnB1dEVsdC5zZWxlY3Rpb25TdGFydCA9ICsrc2VsU3RhcnQ7XG4gIH1cblxuICAvLyBPbiByZWZvcm1hdGUgc2kgbsOpY2Vzc2FpcmVcbiAgaWYgKHZhbHVlLmxlbmd0aCA8IDgpIHtcbiAgICBpbnB1dEVsdC52YWx1ZSA9IGZvcm1hdERhdGVNYXNrVmFsdWUoaW5wdXRFbHQudmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogVGFiIEFWQU5UIGRhbnMgbGUgY2hhbXAgZGF0ZVxuICogLSBUYWJ1bGF0aW9uIGVuIGF2YW50IGRlIHBhcnQgZW4gcGFydCAoam91ciwgbW9pcywgYW5uw6llKSwgcHVpcyB0YWJ1bGF0aW9uIHN1ciBjaGFtcCBzdWl2YW50XG4gKi9cbmZ1bmN0aW9uIGRvVGFiS2V5KGlucHV0RWx0OiBIVE1MSW5wdXRFbGVtZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbHVlID0gaW5wdXRFbHQudmFsdWUgfHwgJyc7XG4gIGNvbnN0IHNlbEVuZCA9IGlucHV0RWx0LnNlbGVjdGlvbkVuZCB8fCAwO1xuICBjb25zdCBwb3MgPSB2YWx1ZS5pbmRleE9mKCcvJywgc2VsRW5kKTtcbiAgaWYgKHBvcyA+IC0xKSB7XG4gICAgaW5wdXRFbHQuc2VsZWN0aW9uU3RhcnQgPSBwb3MgKyAxO1xuICAgIGlucHV0RWx0LnNlbGVjdGlvbkVuZCA9IGlucHV0RWx0LnNlbGVjdGlvblN0YXJ0O1xuICB9XG4gIHJldHVybiBwb3MgPiAtMTtcbn1cblxuLyoqXG4gKiBUYWIgQVJSSUVSRSBkYW5zIGxlIGNoYW1wIGRhdGVcbiAqIC0gVGFidWxhdGlvbiBlbiBhcnJpw6hyZSBkZSBwYXJ0IGVuIHBhcnQgKGFubsOpZSwgbW9pcywgam91ciksIHB1aXMgdGFidWxhdGlvbiBzdXIgY2hhbXAgcHLDqWPDqWRlbnRcbiAqL1xuZnVuY3Rpb24gZG9TaGlmdFRhYktleShpbnB1dEVsdDogSFRNTElucHV0RWxlbWVudCk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWx1ZSA9IGlucHV0RWx0LnZhbHVlIHx8ICcnO1xuICBjb25zdCBzZWxTdGFydCA9IGlucHV0RWx0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XG4gIGNvbnN0IHBvcyA9IHZhbHVlLnN1YnN0cmluZygwLCBzZWxTdGFydCkubGFzdEluZGV4T2YoJy8nKTtcbiAgaWYgKHBvcyA+IC0xKSB7XG4gICAgaW5wdXRFbHQuc2VsZWN0aW9uU3RhcnQgPSBwb3M7XG4gICAgaW5wdXRFbHQuc2VsZWN0aW9uRW5kID0gaW5wdXRFbHQuc2VsZWN0aW9uU3RhcnQ7XG4gIH1cbiAgcmV0dXJuIHBvcyA+IC0xO1xufVxuXG4vKipcbiAqIFJlZm9ybWF0YWdlIGRlIGxhIHZhbGV1ciwgcXVlbGxlIHF1ZSBzb2l0IGxhIHNhaXNpZVxuICogQHBhcmFtIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlTWFza1ZhbHVlKGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCByZWdleHAgPSAvXig/PGRheT5bXFxkX117MCwyfSkoPzxzMT5cXC8/KSg/PG1vbnRoPltcXGRfXXswLDJ9KSg/PHMyPlxcLz8pKD88eWVhcj5bXFxkX117MCw0fSkkLztcbiAgY29uc3QgcmVBcnIgPSByZWdleHAuZXhlYyhpbnB1dCB8fCAnJyk7XG4gIGNvbnN0IGdyb3VwcyA9IHJlQXJyPy5ncm91cHM7XG4gIGxldCB2YWx1ZSA9IE1BU0tfREFURTtcbiAgaWYgKGdyb3Vwcykge1xuICAgIGxldCBkYXkgPSBncm91cHNbJ2RheSddIHx8ICdfXyc7XG4gICAgZGF5ID0gZ3JvdXBzWydzMSddID8gZGF5IDogZGF5LnBhZEVuZCgyLCAnXycpO1xuICAgIGxldCBtb250aCA9IGdyb3Vwc1snbW9udGgnXSB8fCAnX18nO1xuICAgIG1vbnRoID0gZ3JvdXBzWydzMiddID8gbW9udGggOiBtb250aC5wYWRFbmQoMiwgJ18nKTtcbiAgICBsZXQgeWVhciA9IGdyb3Vwc1sneWVhciddIHx8ICdfX19fJztcbiAgICB5ZWFyID0geWVhci5wYWRFbmQoNCwgJ18nKTtcbiAgICB2YWx1ZSA9IGRheSArICcvJyArIG1vbnRoICsgJy8nICsgeWVhcjtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==