UNPKG

@edugouvfr/ngx-dsfr

Version:

NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).

143 lines 20 kB
import { DateUtils } from '../../shared/utils/date-utils'; export const DATE_ERROR = { INVALID_FORMAT_DAY: 'err_invalid_format_day', INVALID_FORMAT_MONTH: 'err_invalid_format_month', INVALID_FORMAT_YEAR: 'err_invalid_format_year', INVALID_DAY: 'err_invalid_day', INVALID_MONTH: 'err_invalid_month', INVALID_DATE: 'err_invalid_date', REQUIRED: 'err_required', }; /** * Cette classe représente les valeurs saisies par un utilisateur sur 3 champs distincts, jour, mois année. * 🔥 Bien que ces propriétés soient en théorie des nombres, à l'exécution, on reçoit des strings. * - Chaque valeur est initialisée à `undefined` mais peut aussi avoir la valeur "" (chaine vide). * 👆 Par défaut la date est une date UTC. * L'objectif de la classe est de : * - Gérer des dates saisies par l'utilisateur, potentiellement avec des valeurs `undefined` ou "" * - Manipuler les mois de 1 à 12 (et non de 0 à 11) * - D'encapsuler l'api [Date](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Date) et plus tard l'API Temporal */ export class DateModel { constructor(fullYear, monthNum, dayNum, hourNum = 0) { this.fullYear = fullYear; this.monthNum = monthNum; this.dayNum = dayNum; this.hourNum = hourNum; } get month() { return this.monthNum ? this.monthNum - 1 : -1; } /** * @param value : 3 formes basiques pour utiliser la méthode * - string : Une chaîne de caractères qui représente une date, selon le format reconnu par la méthode `Date.parse()` (ex : '04 Dec 1995 00:12:00 GMT') * - number : Une valeur entière qui représente le nombre de millisecondes depuis le premier janvier 1970 * - date : Un objet de type date */ static of(value, loggerService) { const date = DateUtils.dateUtcOfWithHours(value); if (!date && typeof value === 'string') { loggerService.warn(`La date '${value}' n'est pas valide`); } if (!date) { return new DateModel(); } else { return new DateModel(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours()); } } isValid() { const date = new Date(this.fullYear, this.month, this.dayNum); // Nécessaire car les années à deux digits sont prises en compte comme des dates de format 19XX if (DateUtils.isTwoDigitsYear(this.fullYear)) { date.setFullYear(this.fullYear); } return (date.getFullYear() === Number(this.fullYear) && date.getMonth() === Number(this.month) && date.getDate() === Number(this.dayNum)); } toDate(hourTimezoneOffset) { let date = undefined; let fullYear = Number(this.fullYear); let monthNum = Number(this.monthNum); let dayNum = Number(this.dayNum); let hourNum = Number(this.hourNum); // on vérifie quand même qu'on a bien affaire à des nombres if (fullYear !== null && fullYear !== undefined && monthNum !== null && monthNum !== undefined && dayNum !== null && dayNum !== undefined && hourNum !== null && hourNum !== undefined && !isNaN(fullYear) && !isNaN(monthNum) && !isNaN(dayNum) && !isNaN(hourNum) && 1 <= monthNum && monthNum <= 12 && 1 <= dayNum && dayNum <= 31) { const hourToOutput = hourTimezoneOffset ?? hourNum; const dateWithoutTwoDigitsProblems = DateUtils.createDate(fullYear, this.month, dayNum, hourToOutput, typeof hourTimezoneOffset === 'number'); date = this.isValid() ? dateWithoutTwoDigitsProblems : undefined; } return date; } /** * Valide le model. * @param required indique si la date est requise ou non * @return une liste de codes d'erreur ou tableau vide */ validate(required = false) { const errors = []; const dayNum = this.dayNum; const monthNum = this.monthNum; const fullYear = this.fullYear; // Format if (!this.isNumber(dayNum) || !this.isNumber(monthNum) || !this.isNumber(fullYear)) { if (!this.isNumber(dayNum)) { errors.push(DATE_ERROR.INVALID_FORMAT_DAY); } if (!this.isNumber(monthNum)) { errors.push(DATE_ERROR.INVALID_FORMAT_MONTH); } if (!this.isNumber(fullYear)) { errors.push(DATE_ERROR.INVALID_FORMAT_YEAR); } } else { // Erreur sur le jour, le mois if (dayNum && (dayNum < 1 || dayNum > 31)) errors.push(DATE_ERROR.INVALID_DAY); if (monthNum && (monthNum < 1 || monthNum > 12)) errors.push(DATE_ERROR.INVALID_MONTH); } // All touched : erreur sur la date elle-même if (errors.length === 0 && this.allTouched()) { // Tous les champs sont remplis, on vérifie la date if (this.allFilled()) { if (!this.isValid()) errors.push(DATE_ERROR.INVALID_DATE); } // Au moins 1 champ n'est pas rempli else { if (required) errors.push(DATE_ERROR.REQUIRED); } } return errors; } allTouched() { return this.fullYear !== undefined && this.monthNum !== undefined && this.dayNum !== undefined; } allFilled() { return !!this.dayNum && !!this.monthNum && !!this.fullYear; } /** @return true si undefined ou number */ isNumber(value) { return value === undefined || !isNaN(value); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9wYXR0ZXJucy9kYXRlL2RhdGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTFELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixrQkFBa0IsRUFBRSx3QkFBd0I7SUFDNUMsb0JBQW9CLEVBQUUsMEJBQTBCO0lBQ2hELG1CQUFtQixFQUFFLHlCQUF5QjtJQUM5QyxXQUFXLEVBQUUsaUJBQWlCO0lBQzlCLGFBQWEsRUFBRSxtQkFBbUI7SUFDbEMsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxRQUFRLEVBQUUsY0FBYztDQUN6QixDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFRcEIsWUFBWSxRQUFpQixFQUFFLFFBQWlCLEVBQUUsTUFBZSxFQUFFLFVBQWtCLENBQUM7UUFDcEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVksS0FBSztRQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBZ0QsRUFBRSxhQUFrQztRQUM1RixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENB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RUFBRSxDQUFDO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUM3QyxtREFBbUQ7WUFDbkQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUNELG9DQUFvQztpQkFDL0IsQ0FBQztnQkFDSixJQUFJLFFBQVE7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO0lBQ2pHLENBQUM7SUFFTyxTQUFTO1FBQ2YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM3RCxDQUFDO0lBRUQsMENBQTBDO0lBQ2xDLFFBQVEsQ0FBQyxLQUFVO1FBQ3pCLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kYXRlLXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IERBVEVfRVJST1IgPSB7XG4gIElOVkFMSURfRk9STUFUX0RBWTogJ2Vycl9pbnZhbGlkX2Zvcm1hdF9kYXknLFxuICBJTlZBTElEX0ZPUk1BVF9NT05USDogJ2Vycl9pbnZhbGlkX2Zvcm1hdF9tb250aCcsXG4gIElOVkFMSURfRk9STUFUX1lFQVI6ICdlcnJfaW52YWxpZF9mb3JtYXRfeWVhcicsXG4gIElOVkFMSURfREFZOiAnZXJyX2ludmFsaWRfZGF5JyxcbiAgSU5WQUxJRF9NT05USDogJ2Vycl9pbnZhbGlkX21vbnRoJyxcbiAgSU5WQUxJRF9EQVRFOiAnZXJyX2ludmFsaWRfZGF0ZScsXG4gIFJFUVVJUkVEOiAnZXJyX3JlcXVpcmVkJyxcbn07XG5cbi8qKlxuICogQ2V0dGUgY2xhc3NlIHJlcHLDqXNlbnRlIGxlcyB2YWxldXJzIHNhaXNpZXMgcGFyIHVuIHV0aWxpc2F0ZXVyIHN1ciAzIGNoYW1wcyBkaXN0aW5jdHMsIGpvdXIsIG1vaXMgYW5uw6llLlxuICog8J+UpSBCaWVuIHF1ZSBjZXMgcHJvcHJpw6l0w6lzIHNvaWVudCBlbiB0aMOpb3JpZSBkZXMgbm9tYnJlcywgw6AgbCdleMOpY3V0aW9uLCBvbiByZcOnb2l0IGRlcyBzdHJpbmdzLlxuICogLSBDaGFxdWUgdmFsZXVyIGVzdCBpbml0aWFsaXPDqWUgw6AgYHVuZGVmaW5lZGAgbWFpcyBwZXV0IGF1c3NpIGF2b2lyIGxhIHZhbGV1ciBcIlwiIChjaGFpbmUgdmlkZSkuXG4gKiDwn5GGIFBhciBkw6lmYXV0IGxhIGRhdGUgZXN0IHVuZSBkYXRlIFVUQy5cbiAqIEwnb2JqZWN0aWYgZGUgbGEgY2xhc3NlIGVzdCBkZSA6XG4gKiAtIEfDqXJlciBkZXMgZGF0ZXMgc2Fpc2llcyBwYXIgbCd1dGlsaXNhdGV1ciwgcG90ZW50aWVsbGVtZW50IGF2ZWMgZGVzIHZhbGV1cnMgYHVuZGVmaW5lZGAgb3UgXCJcIlxuICogLSBNYW5pcHVsZXIgbGVzIG1vaXMgZGUgMSDDoCAxMiAoZXQgbm9uIGRlIDAgw6AgMTEpXG4gKiAtIEQnZW5jYXBzdWxlciBsJ2FwaSBbRGF0ZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZSkgZXQgcGx1cyB0YXJkIGwnQVBJIFRlbXBvcmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRlTW9kZWwge1xuICAvLyBVbmUgZGF0ZSBlc3QgbGUgbm9tYnJlIGRlIG1pbGxpc2Vjb25kZXMgw6ljb3Vsw6llcyBkZXB1aXMgbGUgcHJlbWllciBqYW52aWVyIDE5NzAgc3VyIGwnw6ljaGVsbGUgVVRDIChpZGVtIGVwb2NoIFVOSVgpXG4gIC8vIE9uIGRpc3Rpbmd1ZSBsZXMgZGF0ZXMgcmVsYXRpdmVzIGF1IHRlbXBzIHVuaXZlcnNhbCBjb29yZG9ubsOpIChVVEMpIGR1IHRlbXBzIGRlIGxhIG1hY2hpbmUgZGUgbCd1dGlsaXNhdGV1ci5cbiAgZnVsbFllYXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbW9udGhOdW06IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGF5TnVtOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGhvdXJOdW06IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihmdWxsWWVhcj86IG51bWJlciwgbW9udGhOdW0/OiBudW1iZXIsIGRheU51bT86IG51bWJlciwgaG91ck51bTogbnVtYmVyID0gMCkge1xuICAgIHRoaXMuZnVsbFllYXIgPSBmdWxsWWVhcjtcbiAgICB0aGlzLm1vbnRoTnVtID0gbW9udGhOdW07XG4gICAgdGhpcy5kYXlOdW0gPSBkYXlOdW07XG4gICAgdGhpcy5ob3VyTnVtID0gaG91ck51bTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG1vbnRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9udGhOdW0gPyB0aGlzLm1vbnRoTnVtIC0gMSA6IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSA6IDMgZm9ybWVzIGJhc2lxdWVzIHBvdXIgdXRpbGlzZXIgbGEgbcOpdGhvZGVcbiAgICogLSBzdHJpbmcgOiBVbmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBxdWkgcmVwcsOpc2VudGUgdW5lIGRhdGUsIHNlbG9uIGxlIGZvcm1hdCByZWNvbm51IHBhciBsYSBtw6l0aG9kZSBgRGF0ZS5wYXJzZSgpYCAoZXggOiAnMDQgRGVjIDE5OTUgMDA6MTI6MDAgR01UJylcbiAgICogLSBudW1iZXIgOiBVbmUgdmFsZXVyIGVudGnDqHJlIHF1aSByZXByw6lzZW50ZSBsZSBub21icmUgZGUgbWlsbGlzZWNvbmRlcyBkZXB1aXMgbGUgcHJlbWllciBqYW52aWVyIDE5NzBcbiAgICogLSBkYXRlIDogVW4gb2JqZXQgZGUgdHlwZSBkYXRlXG4gICAqL1xuICBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCB1bmRlZmluZWQgfCBudWxsLCBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlIHwgYW55KTogRGF0ZU1vZGVsIHtcbiAgICBjb25zdCBkYXRlID0gRGF0ZVV0aWxzLmRhdGVVdGNPZldpdGhIb3Vycyh2YWx1ZSk7XG5cbiAgICBpZiAoIWRhdGUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgbG9nZ2VyU2VydmljZS53YXJuKGBMYSBkYXRlICcke3ZhbHVlfScgbidlc3QgcGFzIHZhbGlkZWApO1xuICAgIH1cblxuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlTW9kZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlTW9kZWwoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpKTtcbiAgICB9XG4gIH1cblxuICBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmZ1bGxZZWFyISwgdGhpcy5tb250aCEsIHRoaXMuZGF5TnVtKTtcblxuICAgIC8vIE7DqWNlc3NhaXJlIGNhciBsZXMgYW5uw6llcyDDoCBkZXV4IGRpZ2l0cyBzb250IHByaXNlcyBlbiBjb21wdGUgY29tbWUgZGVzIGRhdGVzIGRlIGZvcm1hdCAxOVhYXG4gICAgaWYgKERhdGVVdGlscy5pc1R3b0RpZ2l0c1llYXIodGhpcy5mdWxsWWVhciEpKSB7XG4gICAgICBkYXRlLnNldEZ1bGxZZWFyKHRoaXMuZnVsbFllYXIhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSBOdW1iZXIodGhpcy5mdWxsWWVhcikgJiZcbiAgICAgIGRhdGUuZ2V0TW9udGgoKSA9PT0gTnVtYmVyKHRoaXMubW9udGgpICYmXG4gICAgICBkYXRlLmdldERhdGUoKSA9PT0gTnVtYmVyKHRoaXMuZGF5TnVtKVxuICAgICk7XG4gIH1cblxuICB0b0RhdGUoaG91clRpbWV6b25lT2Zmc2V0PzogbnVtYmVyKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGZ1bGxZZWFyID0gTnVtYmVyKHRoaXMuZnVsbFllYXIpO1xuICAgIGxldCBtb250aE51bSA9IE51bWJlcih0aGlzLm1vbnRoTnVtKTtcbiAgICBsZXQgZGF5TnVtID0gTnVtYmVyKHRoaXMuZGF5TnVtKTtcbiAgICBsZXQgaG91ck51bSA9IE51bWJlcih0aGlzLmhvdXJOdW0pO1xuXG4gICAgLy8gb24gdsOpcmlmaWUgcXVhbmQgbcOqbWUgcXUnb24gYSBiaWVuIGFmZmFpcmUgw6AgZGVzIG5vbWJyZXNcbiAgICBpZiAoXG4gICAgICBmdWxsWWVhciAhPT0gbnVsbCAmJlxuICAgICAgZnVsbFllYXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgbW9udGhOdW0gIT09IG51bGwgJiZcbiAgICAgIG1vbnRoTnVtICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGRheU51bSAhPT0gbnVsbCAmJlxuICAgICAgZGF5TnVtICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGhvdXJOdW0gIT09IG51bGwgJiZcbiAgICAgIGhvdXJOdW0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIWlzTmFOKGZ1bGxZZWFyKSAmJlxuICAgICAgIWlzTmFOKG1vbnRoTnVtKSAmJlxuICAgICAgIWlzTmFOKGRheU51bSkgJiZcbiAgICAgICFpc05hTihob3VyTnVtKSAmJlxuICAgICAgMSA8PSBtb250aE51bSAmJlxuICAgICAgbW9udGhOdW0gPD0gMTIgJiZcbiAgICAgIDEgPD0gZGF5TnVtICYmXG4gICAgICBkYXlOdW0gPD0gMzFcbiAgICApIHtcbiAgICAgIGNvbnN0IGhvdXJUb091dHB1dCA9IGhvdXJUaW1lem9uZU9mZnNldCA/PyBob3VyTnVtO1xuXG4gICAgICBjb25zdCBkYXRlV2l0aG91dFR3b0RpZ2l0c1Byb2JsZW1zID0gRGF0ZVV0aWxzLmNyZWF0ZURhdGUoXG4gICAgICAgIGZ1bGxZZWFyLFxuICAgICAgICB0aGlzLm1vbnRoLFxuICAgICAgICBkYXlOdW0sXG4gICAgICAgIGhvdXJUb091dHB1dCxcbiAgICAgICAgdHlwZW9mIGhvdXJUaW1lem9uZU9mZnNldCA9PT0gJ251bWJlcicsXG4gICAgICApO1xuXG4gICAgICBkYXRlID0gdGhpcy5pc1ZhbGlkKCkgPyBkYXRlV2l0aG91dFR3b0RpZ2l0c1Byb2JsZW1zIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkZSBsZSBtb2RlbC5cbiAgICogQHBhcmFtIHJlcXVpcmVkIGluZGlxdWUgc2kgbGEgZGF0ZSBlc3QgcmVxdWlzZSBvdSBub25cbiAgICogQHJldHVybiB1bmUgbGlzdGUgZGUgY29kZXMgZCdlcnJldXIgb3UgdGFibGVhdSB2aWRlXG4gICAqL1xuICB2YWxpZGF0ZShyZXF1aXJlZCA9IGZhbHNlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGNvbnN0IGRheU51bSA9IHRoaXMuZGF5TnVtO1xuICAgIGNvbnN0IG1vbnRoTnVtID0gdGhpcy5tb250aE51bTtcbiAgICBjb25zdCBmdWxsWWVhciA9IHRoaXMuZnVsbFllYXI7XG5cbiAgICAvLyBGb3JtYXRcbiAgICBpZiAoIXRoaXMuaXNOdW1iZXIoZGF5TnVtKSB8fCAhdGhpcy5pc051bWJlcihtb250aE51bSkgfHwgIXRoaXMuaXNOdW1iZXIoZnVsbFllYXIpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNOdW1iZXIoZGF5TnVtKSkge1xuICAgICAgICBlcnJvcnMucHVzaChEQVRFX0VSUk9SLklOVkFMSURfRk9STUFUX0RBWSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNOdW1iZXIobW9udGhOdW0pKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKERBVEVfRVJST1IuSU5WQUxJRF9GT1JNQVRfTU9OVEgpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzTnVtYmVyKGZ1bGxZZWFyKSkge1xuICAgICAgICBlcnJvcnMucHVzaChEQVRFX0VSUk9SLklOVkFMSURfRk9STUFUX1lFQVIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFcnJldXIgc3VyIGxlIGpvdXIsIGxlIG1vaXNcbiAgICAgIGlmIChkYXlOdW0gJiYgKGRheU51bSA8IDEgfHwgZGF5TnVtID4gMzEpKSBlcnJvcnMucHVzaChEQVRFX0VSUk9SLklOVkFMSURfREFZKTtcbiAgICAgIGlmIChtb250aE51bSAmJiAobW9udGhOdW0gPCAxIHx8IG1vbnRoTnVtID4gMTIpKSBlcnJvcnMucHVzaChEQVRFX0VSUk9SLklOVkFMSURfTU9OVEgpO1xuICAgIH1cblxuICAgIC8vIEFsbCB0b3VjaGVkIDogZXJyZXVyIHN1ciBsYSBkYXRlIGVsbGUtbcOqbWVcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmFsbFRvdWNoZWQoKSkge1xuICAgICAgLy8gVG91cyBsZXMgY2hhbXBzIHNvbnQgcmVtcGxpcywgb24gdsOpcmlmaWUgbGEgZGF0ZVxuICAgICAgaWYgKHRoaXMuYWxsRmlsbGVkKCkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgZXJyb3JzLnB1c2goREFURV9FUlJPUi5JTlZBTElEX0RBVEUpO1xuICAgICAgfVxuICAgICAgLy8gQXUgbW9pbnMgMSBjaGFtcCBuJ2VzdCBwYXMgcmVtcGxpXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSBlcnJvcnMucHVzaChEQVRFX0VSUk9SLlJFUVVJUkVEKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxUb3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZ1bGxZZWFyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5tb250aE51bSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZGF5TnVtICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFsbEZpbGxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRheU51bSAmJiAhIXRoaXMubW9udGhOdW0gJiYgISF0aGlzLmZ1bGxZZWFyO1xuICB9XG5cbiAgLyoqIEByZXR1cm4gdHJ1ZSBzaSB1bmRlZmluZWQgb3UgbnVtYmVyICovXG4gIHByaXZhdGUgaXNOdW1iZXIodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFpc05hTih2YWx1ZSk7XG4gIH1cbn1cbiJdfQ==