truly-ui
Version:
Web Components for Desktop Applications.
232 lines (230 loc) • 28.2 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../../i18n/i18n.service";
export class NavigatorManagerService {
get monthsDescription() {
return this.i18n.getLocale().Navigator.monthsDescription;
}
get daysDescription() {
return this.i18n.getLocale().Navigator.daysDescription;
}
constructor(i18n) {
this.i18n = i18n;
this.date = new Date();
}
previous() {
this.managerPreviousAction();
}
next() {
this.managerNextAction();
}
setType(type) {
this.type = type;
}
setRange(range) {
this.range = range;
}
setDate(date) {
this.date = date;
this.currentMonth = this.date.getMonth();
this.currentYear = this.date.getFullYear();
this.currentDay = this.date.getDate();
this.startYear = this.date.getFullYear();
this.endYear = this.date.getFullYear() + this.range;
}
getDataObject() {
return {
day: this.currentDay,
month: this.currentMonth,
year: this.currentYear,
fullDate: new Date(this.currentYear, this.currentMonth, this.currentDay, new Date().getHours(), new Date().getMinutes()),
rangeYear: { start: this.startYear, end: this.endYear }
};
}
getDescription() {
switch (this.type) {
case 'monthyear': {
return this.getMonthDescription() + ' ' + this.getYearDescription();
}
case 'year': {
return this.getYearDescription().toString();
}
case 'rangeyear': {
return this.getRangeYear().toString();
}
case 'day': {
return this.getDayDescription().toString();
}
case 'rangeweek': {
return this.getRangeWeekDescription().toString();
}
}
}
managerPreviousAction() {
switch (this.type) {
case 'monthyear': {
this.monthYearTypePrevious();
break;
}
case 'year': {
this.yearTypePrevious();
break;
}
case 'rangeyear': {
this.rangeYearTypePrevious();
break;
}
case 'day': {
this.dayTypePrevious();
break;
}
case 'rangeweek': {
this.rangeWeekTypePrevious();
break;
}
}
}
managerNextAction() {
switch (this.type) {
case 'monthyear': {
this.monthYearTypeNext();
break;
}
case 'year': {
this.yearTypeNext();
break;
}
case 'rangeyear': {
this.rangeYearTypeNext();
break;
}
case 'day': {
this.dayTypeNext();
break;
}
case 'rangeweek': {
this.rangeWeekTypeNext();
break;
}
}
}
getYearDescription() {
return this.currentYear;
}
getRangeYear() {
return this.startYear + ' - ' + this.endYear;
}
getDayDescription() {
const dayOfMonth = new Date(this.currentYear, this.currentMonth, this.currentDay).getDate();
const weekDay = this.daysDescription[new Date(this.currentYear, this.currentMonth, this.currentDay).getDay()];
return dayOfMonth + ' ' + weekDay;
}
getRangeWeekDescription() {
const startDate = this.getAtualDateFromParameters();
const endDate = new Date(startDate.getTime() + 6 * 24 * 60 * 60 * 1000);
// Ajustar a data de início para a segunda-feira
const diff = startDate.getDay() - 1; // Calcule a diferença em dias de domingo para segunda-feira
startDate.setDate(startDate.getDate() - diff);
// Ajustar a data de término para o domingo
const diffEnd = 0 - endDate.getDay(); // Calcule a diferença em dias de segunda a domingo
endDate.setDate(endDate.getDate() + diffEnd);
const startDay = startDate.getDate();
const endDay = endDate.getDate();
const startMonth = this.monthsDescription[startDate.getMonth()];
const startYear = startDate.getFullYear();
return `${startDay} - ${endDay} ${startMonth} ${startYear}`;
}
getMonthDescription() {
return this.monthsDescription[this.currentMonth];
}
// =============================== \\
monthYearTypeNext() {
const date = this.getAtualDateFromParameters();
date.setMonth(this.date.getMonth() + 1);
this.setDate(date);
}
monthYearTypePrevious() {
const date = this.getAtualDateFromParameters();
date.setMonth(this.date.getMonth() - 1);
this.setDate(date);
}
yearTypePrevious() {
const date = this.getAtualDateFromParameters();
date.setFullYear(this.date.getFullYear() - 1);
this.setDate(date);
}
yearTypeNext() {
const date = this.getAtualDateFromParameters();
date.setFullYear(this.date.getFullYear() + 1);
this.setDate(date);
}
dayTypePrevious() {
const date = this.getAtualDateFromParameters();
date.setDate(this.date.getDate() - 1);
this.setDate(date);
}
dayTypeNext() {
const date = this.getAtualDateFromParameters();
date.setDate(this.date.getDate() + 1);
this.setDate(date);
}
rangeYearTypePrevious() {
this.startYear -= this.range;
this.endYear -= this.range;
}
rangeYearTypeNext() {
this.startYear += this.range;
this.endYear += this.range;
}
getAtualDateFromParameters() {
return new Date(this.currentYear, this.currentMonth, this.currentDay);
}
rangeWeekTypePrevious() {
const date = this.getAtualDateFromParameters();
const currentDayOfWeek = date.getDay();
const startOfWeek = new Date(date.getTime() - currentDayOfWeek * 24 * 60 * 60 * 1000);
const endOfWeek = new Date(startOfWeek.getTime() - 6 * 24 * 60 * 60 * 1000);
// Verificar se o início da semana é segunda
if (currentDayOfWeek === 0) {
startOfWeek.setDate(startOfWeek.getDate() - 1); // Ajustar de segunda a domingo
}
if (endOfWeek >= this.date) {
this.setDate(startOfWeek);
}
else {
this.setDate(endOfWeek);
}
}
rangeWeekTypeNext() {
const date = this.getAtualDateFromParameters();
const currentDayOfWeek = date.getDay();
const startOfWeek = new Date(date.getTime() + (8 - currentDayOfWeek) * 24 * 60 * 60 * 1000);
const endOfWeek = new Date(startOfWeek.getTime() + 6 * 24 * 60 * 60 * 1000);
this.setDate(startOfWeek);
}
}
/** @nocollapse */ NavigatorManagerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigatorManagerService, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ NavigatorManagerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigatorManagerService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigatorManagerService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.I18nService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdG9yLW1hbmFnZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL25hdmlnYXRvci9zZXJ2aWNlcy9uYXZpZ2F0b3ItbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW9CRTtBQUVGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQUkzQyxNQUFNLE9BQU8sdUJBQXVCO0lBa0JsQyxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFDekQsQ0FBQztJQUVELFlBQXFCLElBQWlCO1FBQWpCLFNBQUksR0FBSixJQUFJLENBQWE7UUFiOUIsU0FBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFhZ0IsQ0FBQztJQUUzQyxRQUFRO1FBQ04sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUk7UUFDVixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQUs7UUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUk7UUFDVixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUks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UyxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVGLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1QixDQUFDOzt3SUFqTlUsdUJBQXVCOzRJQUF2Qix1QkFBdUI7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgTUlUIExpY2Vuc2VcblxuICAgIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICAgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAgICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICAgIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICAgIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gICAgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAgICBTT0ZUV0FSRS5cbiovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaTE4bi9pMThuLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmF2aWdhdG9yTWFuYWdlclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgY3VycmVudE1vbnRoOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBjdXJyZW50WWVhcjogbnVtYmVyO1xuXG4gIHByaXZhdGUgY3VycmVudERheTogbnVtYmVyO1xuXG4gIHByaXZhdGUgc3RhcnRZZWFyOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBlbmRZZWFyOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBkYXRlID0gbmV3IERhdGUoKTtcblxuICBwcml2YXRlIHR5cGU6IHN0cmluZztcblxuICBwcml2YXRlIHJhbmdlOiBudW1iZXI7XG5cbiAgZ2V0IG1vbnRoc0Rlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuTmF2aWdhdG9yLm1vbnRoc0Rlc2NyaXB0aW9uO1xuICB9XG4gIGdldCBkYXlzRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi5nZXRMb2NhbGUoKS5OYXZpZ2F0b3IuZGF5c0Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgY29uc3RydWN0b3IoIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UgKSB7fVxuXG4gIHByZXZpb3VzKCkge1xuICAgIHRoaXMubWFuYWdlclByZXZpb3VzQWN0aW9uKCk7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIHRoaXMubWFuYWdlck5leHRBY3Rpb24oKTtcbiAgfVxuXG4gIHNldFR5cGUodHlwZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBzZXRSYW5nZShyYW5nZSkge1xuICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcbiAgfVxuXG4gIHNldERhdGUoZGF0ZSkge1xuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB0aGlzLmRhdGUuZ2V0TW9udGgoKTtcbiAgICB0aGlzLmN1cnJlbnRZZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50RGF5ID0gdGhpcy5kYXRlLmdldERhdGUoKTtcblxuICAgIHRoaXMuc3RhcnRZZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgdGhpcy5lbmRZZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCkgKyB0aGlzLnJhbmdlO1xuXG4gIH1cblxuICBnZXREYXRhT2JqZWN0KCkge1xuICAgIHJldHVybiB7XG4gICAgICBkYXk6IHRoaXMuY3VycmVudERheSxcbiAgICAgIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgIHllYXI6IHRoaXMuY3VycmVudFllYXIsXG4gICAgICBmdWxsRGF0ZTogbmV3IERhdGUoIHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnREYXksIG5ldyBEYXRlKCkuZ2V0SG91cnMoKSwgbmV3IERhdGUoKS5nZXRNaW51dGVzKCkgKSxcbiAgICAgIHJhbmdlWWVhcjoge3N0YXJ0OiB0aGlzLnN0YXJ0WWVhciwgZW5kOiB0aGlzLmVuZFllYXJ9XG4gICAgfTtcbiAgfVxuXG4gIGdldERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICggdGhpcy50eXBlICkgIHtcbiAgICAgIGNhc2UgJ21vbnRoeWVhcic6IHsgcmV0dXJuIHRoaXMuZ2V0TW9udGhEZXNjcmlwdGlvbigpICsgJyAnICsgdGhpcy5nZXRZZWFyRGVzY3JpcHRpb24oKTsgfVxuICAgICAgY2FzZSAneWVhcic6IHsgcmV0dXJuIHRoaXMuZ2V0WWVhckRlc2NyaXB0aW9uKCkudG9TdHJpbmcoKTsgfVxuICAgICAgY2FzZSAncmFuZ2V5ZWFyJzogeyByZXR1cm4gdGhpcy5nZXRSYW5nZVllYXIoKS50b1N0cmluZygpOyB9XG4gICAgICBjYXNlICdkYXknOiB7IHJldHVybiB0aGlzLmdldERheURlc2NyaXB0aW9uKCkudG9TdHJpbmcoKTsgfVxuICAgICAgY2FzZSAncmFuZ2V3ZWVrJzogeyByZXR1cm4gdGhpcy5nZXRSYW5nZVdlZWtEZXNjcmlwdGlvbigpLnRvU3RyaW5nKCk7IH1cbiAgICB9XG4gIH1cblxuXG4gIHByaXZhdGUgbWFuYWdlclByZXZpb3VzQWN0aW9uKCkge1xuICAgIHN3aXRjaCAoIHRoaXMudHlwZSApICB7XG4gICAgICBjYXNlICdtb250aHllYXInOiB7IHRoaXMubW9udGhZZWFyVHlwZVByZXZpb3VzKCk7IGJyZWFrOyB9XG4gICAgICBjYXNlICd5ZWFyJzogeyB0aGlzLnllYXJUeXBlUHJldmlvdXMoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ3JhbmdleWVhcic6IHsgdGhpcy5yYW5nZVllYXJUeXBlUHJldmlvdXMoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ2RheSc6IHsgdGhpcy5kYXlUeXBlUHJldmlvdXMoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ3Jhbmdld2Vlayc6IHsgdGhpcy5yYW5nZVdlZWtUeXBlUHJldmlvdXMoKTsgYnJlYWs7IH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hbmFnZXJOZXh0QWN0aW9uKCkge1xuICAgIHN3aXRjaCAoIHRoaXMudHlwZSApICB7XG4gICAgICBjYXNlICdtb250aHllYXInOiB7IHRoaXMubW9udGhZZWFyVHlwZU5leHQoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ3llYXInOiB7IHRoaXMueWVhclR5cGVOZXh0KCk7IGJyZWFrOyB9XG4gICAgICBjYXNlICdyYW5nZXllYXInOiB7IHRoaXMucmFuZ2VZZWFyVHlwZU5leHQoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ2RheSc6IHsgdGhpcy5kYXlUeXBlTmV4dCgpOyBicmVhazsgfVxuICAgICAgY2FzZSAncmFuZ2V3ZWVrJzogeyB0aGlzLnJhbmdlV2Vla1R5cGVOZXh0KCk7IGJyZWFrOyB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRZZWFyRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFllYXI7XG4gIH1cblxuXG4gIHByaXZhdGUgZ2V0UmFuZ2VZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0WWVhciArICcgLSAnICsgdGhpcy5lbmRZZWFyO1xuICB9XG5cblxuICBwcml2YXRlIGdldERheURlc2NyaXB0aW9uKCkge1xuICAgIGNvbnN0IGRheU9mTW9udGggPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgdGhpcy5jdXJyZW50RGF5KS5nZXREYXRlKCk7XG4gICAgY29uc3Qgd2Vla0RheSA9IHRoaXMuZGF5c0Rlc2NyaXB0aW9uWyBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgdGhpcy5jdXJyZW50RGF5KS5nZXREYXkoKSBdO1xuICAgIHJldHVybiBkYXlPZk1vbnRoICsgJyAnICsgd2Vla0RheTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmFuZ2VXZWVrRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLmdldEF0dWFsRGF0ZUZyb21QYXJhbWV0ZXJzKCk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRUaW1lKCkgKyA2ICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG5cbiAgICAvLyBBanVzdGFyIGEgZGF0YSBkZSBpbsOtY2lvIHBhcmEgYSBzZWd1bmRhLWZlaXJhXG4gICAgY29uc3QgZGlmZiA9IHN0YXJ0RGF0ZS5nZXREYXkoKSAtIDE7IC8vIENhbGN1bGUgYSBkaWZlcmVuw6dhIGVtIGRpYXMgZGUgZG9taW5nbyBwYXJhIHNlZ3VuZGEtZmVpcmFcbiAgICBzdGFydERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG5cbiAgICAvLyBBanVzdGFyIGEgZGF0YSBkZSB0w6lybWlubyBwYXJhIG8gZG9taW5nb1xuICAgIGNvbnN0IGRpZmZFbmQgPSAwIC0gZW5kRGF0ZS5nZXREYXkoKTsgLy8gQ2FsY3VsZSBhIGRpZmVyZW7Dp2EgZW0gZGlhcyBkZSBzZWd1bmRhIGEgZG9taW5nb1xuICAgIGVuZERhdGUuc2V0RGF0ZShlbmREYXRlLmdldERhdGUoKSArIGRpZmZFbmQpO1xuXG4gICAgY29uc3Qgc3RhcnREYXkgPSBzdGFydERhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZERheSA9IGVuZERhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0TW9udGggPSB0aGlzLm1vbnRoc0Rlc2NyaXB0aW9uW3N0YXJ0RGF0ZS5nZXRNb250aCgpXTtcbiAgICBjb25zdCBzdGFydFllYXIgPSBzdGFydERhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgIHJldHVybiBgJHtzdGFydERheX0gLSAke2VuZERheX0gJHtzdGFydE1vbnRofSAke3N0YXJ0WWVhcn1gO1xuICB9XG5cblxuICBwcml2YXRlIGdldE1vbnRoRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubW9udGhzRGVzY3JpcHRpb25bdGhpcy5jdXJyZW50TW9udGhdO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBcXFxcXG4gIHByaXZhdGUgbW9udGhZZWFyVHlwZU5leHQoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0QXR1YWxEYXRlRnJvbVBhcmFtZXRlcnMoKTtcbiAgICBkYXRlLnNldE1vbnRoKCB0aGlzLmRhdGUuZ2V0TW9udGgoKSArIDEgKTtcbiAgICB0aGlzLnNldERhdGUoIGRhdGUgKTtcbiAgfVxuXG4gIHByaXZhdGUgbW9udGhZZWFyVHlwZVByZXZpb3VzKCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldEF0dWFsRGF0ZUZyb21QYXJhbWV0ZXJzKCk7XG4gICAgZGF0ZS5zZXRNb250aCggdGhpcy5kYXRlLmdldE1vbnRoKCkgLSAxICk7XG4gICAgdGhpcy5zZXREYXRlKCBkYXRlICk7XG4gIH1cblxuICBwcml2YXRlIHllYXJUeXBlUHJldmlvdXMoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0QXR1YWxEYXRlRnJvbVBhcmFtZXRlcnMoKTtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKCB0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKSAtIDEgKTtcbiAgICB0aGlzLnNldERhdGUoIGRhdGUgKTtcbiAgfVxuXG4gIHByaXZhdGUgeWVhclR5cGVOZXh0KCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldEF0dWFsRGF0ZUZyb21QYXJhbWV0ZXJzKCk7XG4gICAgZGF0ZS5zZXRGdWxsWWVhciggdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCkgKyAxICk7XG4gICAgdGhpcy5zZXREYXRlKCBkYXRlICk7XG4gIH1cblxuICBwcml2YXRlIGRheVR5cGVQcmV2aW91cygpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5nZXRBdHVhbERhdGVGcm9tUGFyYW1ldGVycygpO1xuICAgIGRhdGUuc2V0RGF0ZSggdGhpcy5kYXRlLmdldERhdGUoKSAtIDEgKTtcbiAgICB0aGlzLnNldERhdGUoIGRhdGUgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGF5VHlwZU5leHQoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0QXR1YWxEYXRlRnJvbVBhcmFtZXRlcnMoKTtcbiAgICBkYXRlLnNldERhdGUoIHRoaXMuZGF0ZS5nZXREYXRlKCkgKyAxICk7XG4gICAgdGhpcy5zZXREYXRlKCBkYXRlICk7XG4gIH1cblxuICBwcml2YXRlIHJhbmdlWWVhclR5cGVQcmV2aW91cygpIHtcbiAgICB0aGlzLnN0YXJ0WWVhciAtPSB0aGlzLnJhbmdlO1xuICAgIHRoaXMuZW5kWWVhciAtPSB0aGlzLnJhbmdlO1xuICB9XG5cbiAgcHJpdmF0ZSByYW5nZVllYXJUeXBlTmV4dCgpIHtcbiAgICB0aGlzLnN0YXJ0WWVhciArPSB0aGlzLnJhbmdlO1xuICAgIHRoaXMuZW5kWWVhciArPSB0aGlzLnJhbmdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdHVhbERhdGVGcm9tUGFyYW1ldGVycygpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIHRoaXMuY3VycmVudERheSk7XG4gIH1cblxuICBwcml2YXRlIHJhbmdlV2Vla1R5cGVQcmV2aW91cygpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5nZXRBdHVhbERhdGVGcm9tUGFyYW1ldGVycygpO1xuICAgIGNvbnN0IGN1cnJlbnREYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IHN0YXJ0T2ZXZWVrID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBjdXJyZW50RGF5T2ZXZWVrICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgY29uc3QgZW5kT2ZXZWVrID0gbmV3IERhdGUoc3RhcnRPZldlZWsuZ2V0VGltZSgpIC0gNiAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgICAgLy8gVmVyaWZpY2FyIHNlIG8gaW7DrWNpbyBkYSBzZW1hbmEgw6kgc2VndW5kYVxuICBpZiAoY3VycmVudERheU9mV2VlayA9PT0gMCkge1xuICAgIHN0YXJ0T2ZXZWVrLnNldERhdGUoc3RhcnRPZldlZWsuZ2V0RGF0ZSgpIC0gMSk7IC8vIEFqdXN0YXIgZGUgc2VndW5kYSBhIGRvbWluZ29cbiAgfVxuICAgIGlmIChlbmRPZldlZWsgPj0gdGhpcy5kYXRlKSB7XG4gICAgICB0aGlzLnNldERhdGUoc3RhcnRPZldlZWspO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldERhdGUoZW5kT2ZXZWVrKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJhbmdlV2Vla1R5cGVOZXh0KCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldEF0dWFsRGF0ZUZyb21QYXJhbWV0ZXJzKCk7XG4gICAgY29uc3QgY3VycmVudERheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgY29uc3Qgc3RhcnRPZldlZWsgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSArICg4IC0gY3VycmVudERheU9mV2VlaykgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBjb25zdCBlbmRPZldlZWsgPSBuZXcgRGF0ZShzdGFydE9mV2Vlay5nZXRUaW1lKCkgKyA2ICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgdGhpcy5zZXREYXRlKHN0YXJ0T2ZXZWVrKTtcbiAgfVxuXG59XG4iXX0=