ng-jalali-date-time
Version:
Jalali date / month / range picker for Angular with Material Design support
104 lines • 21.8 kB
JavaScript
import { Component, Output, EventEmitter } from '@angular/core';
import { FormControl } from '@angular/forms';
import { trigger, state, style, transition, animate } from '@angular/animations';
import { NgJalaliDateTimeService } from '../../ng-jalali-date-time.service';
import { JalaliLocale } from '../../shared/jalali.locale';
export class NgJalaliMonthComponent {
constructor(service) {
this.service = service;
this.show = false;
this.random = Date.now().toString();
this.month = '';
this.year = '';
this.current = '';
this.reset = false;
this.jalaliLocale = new JalaliLocale();
this.calendar = [
[
{ month: '01', title: this.jalaliLocale.monthNames[0] },
{ month: '02', title: this.jalaliLocale.monthNames[1] },
{ month: '03', title: this.jalaliLocale.monthNames[2] }
],
[
{ month: '04', title: this.jalaliLocale.monthNames[3] },
{ month: '05', title: this.jalaliLocale.monthNames[4] },
{ month: '06', title: this.jalaliLocale.monthNames[5] }
],
[
{ month: '07', title: this.jalaliLocale.monthNames[6] },
{ month: '08', title: this.jalaliLocale.monthNames[7] },
{ month: '09', title: this.jalaliLocale.monthNames[8] }
],
[
{ month: '10', title: this.jalaliLocale.monthNames[9] },
{ month: '11', title: this.jalaliLocale.monthNames[10] },
{ month: '12', title: this.jalaliLocale.monthNames[11] }
]
];
this.changed = new EventEmitter();
}
ngOnInit() {
this.year = this.value.month ? this.value.month.substr(0, 4) : this.service.jalali.now({ format: 'Y' });
this.current = this.service.jalali.now({ format: 'Y-M' });
const validators = [];
if (this.config.required)
validators.push(this.validate.bind(this));
this.form.addControl(this.name, new FormControl(this.value));
this.form.addControl(this.name + '-title', new FormControl('', validators));
this.setTitle();
}
validate() {
return this.value.month ? null : { required: true };
}
showCalendar(show) {
const input = document.querySelector('#input' + this.random);
input.blur();
if (this.reset) {
this.reset = false;
show = false;
}
this.show = show;
if (this.show) {
this.form.get(this.name + '-title').markAsUntouched();
this.year = this.value.month ? this.value.month.substr(0, 4) : this.service.jalali.now({ format: 'Y' });
}
else
this.form.get(this.name + '-title').markAsTouched();
}
changeYear(change) {
const year = Number(this.year) + change;
this.year = year < 1000 ? '1000' : year.toString();
}
setTitle() {
this.form.get(this.name).setValue(this.value);
const title = this.service.getMonthTitle(this.value);
this.form.get(this.name + '-title').setValue(title);
}
setMonth(month) {
this.value = this.service.getMonthValue(month ? this.year + '-' + month : '');
this.setTitle();
this.showCalendar(false);
this.changed.emit(this.value.month ? this.value : null);
this.form.get(this.name + '-title').updateValueAndValidity();
}
}
NgJalaliMonthComponent.decorators = [
{ type: Component, args: [{
template: "<div class=\"ng-jalali-back\" *ngIf=\"show\" (click)=\"showCalendar(false)\"></div>\n\n<div [formGroup]=\"form\" [ngStyle]=\"{ display: 'none' }\">\n <input type=\"text\" [formControlName]=\"name\" />\n</div>\n\n<content class=\"ng-jalali\" dir=\"rtl\">\n <mat-form-field [ngStyle]=\"css.field\" class=\"ng-jalali\" [formGroup]=\"form\" [appearance]=\"appearance\">\n <mat-label [ngStyle]=\"{ fontFamily: css.font }\">{{ label }}</mat-label>\n <input\n matInput\n id=\"input{{ random }}\"\n type=\"text\"\n [formControlName]=\"name + '-title'\"\n (focus)=\"showCalendar(true)\"\n [ngStyle]=\"css.input\"\n class=\"ng-jalali\"\n />\n <span *ngIf=\"config.reset && value.month !== ''\" matSuffix (click)=\"setMonth(''); reset = true\">\n <button mat-button type=\"button\" [ngStyle]=\"css.reset\" class=\"ng-jalali-reset\">x</button>\n </span>\n <mat-error [ngStyle]=\"{ fontFamily: css.font }\" *ngIf=\"form.get(name + '-title').hasError('required')\">\n {{ config.error }}\n </mat-error>\n </mat-form-field>\n\n <div class=\"ng-jalali-calendar\" [ngStyle]=\"css.box\" [@calendar] *ngIf=\"show\">\n <div class=\"ng-jalali-header\">\n <div>\n <button\n mat-icon-button\n type=\"button\"\n [ngStyle]=\"css.arrow\"\n (click)=\"changeYear(-10)\"\n [disabled]=\"year <= '1010'\"\n >\n <<\n </button>\n </div>\n <div>\n <button\n mat-icon-button\n type=\"button\"\n [ngStyle]=\"css.arrow\"\n (click)=\"changeYear(-1)\"\n [disabled]=\"year === '1000'\"\n >\n <\n </button>\n </div>\n <div class=\"ng-jalali-title\" [ngStyle]=\"css.header\">{{ year }}</div>\n <div>\n <button mat-icon-button type=\"button\" [ngStyle]=\"css.arrow\" (click)=\"changeYear(1)\">></button>\n </div>\n <div>\n <button mat-icon-button type=\"button\" [ngStyle]=\"css.arrow\" (click)=\"changeYear(10)\">>></button>\n </div>\n </div>\n <mat-divider></mat-divider>\n <div *ngFor=\"let season of calendar\" class=\"ng-jalali-month-season\">\n <ng-container *ngFor=\"let month of season\">\n <button\n mat-button\n type=\"button\"\n [disabled]=\"\n (config.min && year + '-' + month.month < config.min) ||\n (config.max && year + '-' + month.month > config.max)\n \"\n [ngClass]=\"{\n 'ng-jalali-selected': year + '-' + month.month === value.month,\n 'ng-jalali-current': year + '-' + month.month === current\n }\"\n [ngStyle]=\"\n year + '-' + month.month === current\n ? css.current\n : year + '-' + month.month === value.month\n ? css.selected\n : css.item\n \"\n (click)=\"setMonth(month.month)\"\n >\n {{ month.title }}\n </button>\n </ng-container>\n </div>\n </div>\n</content>\n",
animations: [
trigger('calendar', [
state('init', style({ opacity: 1, transform: 'translateY(0) scaleY(1)' })),
transition('void => *', [style({ opacity: 0, transform: 'translateY(-45%) scaleY(0)' }), animate(100)]),
transition('* => void', animate(100, style({ opacity: 0, transform: 'translateY(-45%) scaleY(0)' })))
])
],
styles: ["div.ng-jalali-month-season{display:flex}div.ng-jalali-month-season button{flex:1;padding:.5rem 2rem}", "div.ng-jalali-back{background-color:transparent;bottom:0;left:0;position:fixed;right:0;top:0;z-index:999}content.ng-jalali{display:block;position:relative}mat-form-field.ng-jalali{direction:rtl;margin:0;text-align:right;width:100%}input.ng-jalali{cursor:default;text-align:right}button.ng-jalali-reset{color:#555;line-height:30px;min-width:auto;padding:0 .5rem}div.ng-jalali-calendar{background-color:#fff;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);direction:rtl;position:absolute;right:0;top:45px;z-index:1000}div.ng-jalali-header{align-items:center;display:flex}div.ng-jalali-header div{flex:1;padding:.5rem .2rem;text-align:center}div.ng-jalali-header div.ng-jalali-title{flex:3}button.ng-jalali-selected{background-color:#eee;border:1px solid #999}button.ng-jalali-current{color:#009}"]
},] }
];
NgJalaliMonthComponent.ctorParameters = () => [
{ type: NgJalaliDateTimeService }
];
NgJalaliMonthComponent.propDecorators = {
changed: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctamFsYWxpLW1vbnRoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWphbGFsaS1kYXRlLXRpbWUvc3JjL2xpYi9jb21wb25lbnQvbmctamFsYWxpLW1vbnRoL25nLWphbGFsaS1tb250aC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBYSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQWExRCxNQUFNLE9BQU8sc0JBQXNCO0lBMkMvQixZQUE2QixPQUFnQztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQWpDdEQsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUN0QixXQUFNLEdBQVcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUNsQixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLFVBQUssR0FBWSxLQUFLLENBQUM7UUFFdkIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xDLGFBQVEsR0FBeUM7WUFDcEQ7Z0JBQ0ksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkQsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkQsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUMxRDtZQUNEO2dCQUNJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZELEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZELEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDMUQ7WUFDRDtnQkFDSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2RCxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2RCxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO2FBQzFEO1lBQ0Q7Z0JBQ0ksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkQsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDeEQsRUFB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QUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLHlCQUF5QixFQUFFLENBQUMsQ0FBQzt3QkFDMUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLDRCQUE0QixFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDdkcsVUFBVSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN4RyxDQUFDO2lCQUNMOzthQUNKOzs7WUFkUSx1QkFBdUI7OztzQkF3RDNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0cmlnZ2VyLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIGFuaW1hdGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuaW1wb3J0IHsgTmdKYWxhbGlNb250aFZhbHVlSW50ZXJmYWNlIH0gZnJvbSAnLi9uZy1qYWxhbGktbW9udGguaW50ZXJmYWNlJztcbmltcG9ydCB7IE5nSmFsYWxpRGF0ZVRpbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbmctamFsYWxpLWRhdGUtdGltZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5nSmFsYWxpRGF0ZVRpbWVDb25maWdJbnRlcmZhY2UsIE5nSmFsYWxpRGF0ZVRpbWVDc3NJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9uZy1qYWxhbGktZGF0ZS10aW1lLmludGVyZmFjZSc7XG5pbXBvcnQgeyBKYWxhbGlMb2NhbGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvamFsYWxpLmxvY2FsZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlVXJsOiAnLi9uZy1qYWxhbGktbW9udGguY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL25nLWphbGFsaS1tb250aC5jb21wb25lbnQuY3NzJywgJy4uLy4uL3NoYXJlZC9uZy1qYWxhbGkuc3R5bGUuY3NzJ10sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCdjYWxlbmRhcicsIFtcbiAgICAgICAgICAgIHN0YXRlKCdpbml0Jywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApIHNjYWxlWSgxKScgfSkpLFxuICAgICAgICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW3N0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNDUlKSBzY2FsZVkoMCknIH0pLCBhbmltYXRlKDEwMCldKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIGFuaW1hdGUoMTAwLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTQ1JSkgc2NhbGVZKDApJyB9KSkpXG4gICAgICAgIF0pXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0phbGFsaU1vbnRoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGFwcGVhcmFuY2U6IHN0cmluZztcbiAgICBwdWJsaWMgY29uZmlnOiBOZ0phbGFsaURhdGVUaW1lQ29uZmlnSW50ZXJmYWNlO1xuICAgIHB1YmxpYyBjc3M6IE5nSmFsYWxpRGF0ZVRpbWVDc3NJbnRlcmZhY2U7XG5cbiAgICBwdWJsaWMgdmFsdWU6IE5nSmFsYWxpTW9udGhWYWx1ZUludGVyZmFjZTtcbiAgICBwdWJsaWMgbGFiZWw6IHN0cmluZztcblxuICAgIHB1YmxpYyBzaG93OiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHJhbmRvbTogc3RyaW5nID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xuICAgIHB1YmxpYyBtb250aDogc3RyaW5nID0gJyc7XG4gICAgcHVibGljIHllYXI6IHN0cmluZyA9ICcnO1xuICAgIHB1YmxpYyBjdXJyZW50OiBzdHJpbmcgPSAnJztcbiAgICBwdWJsaWMgcmVzZXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBqYWxhbGlMb2NhbGUgPSBuZXcgSmFsYWxpTG9jYWxlKCk7XG4gICAgcHVibGljIGNhbGVuZGFyOiB7IG1vbnRoOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmcgfVtdW10gPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIHsgbW9udGg6ICcwMScsIHRpdGxlOiB0aGlzLmphbGFsaUxvY2FsZS5tb250aE5hbWVzWzBdIH0sXG4gICAgICAgICAgICB7IG1vbnRoOiAnMDInLCB0aXRsZTogdGhpcy5qYWxhbGlMb2NhbGUubW9udGhOYW1lc1sxXSB9LFxuICAgICAgICAgICAgeyBtb250aDogJzAzJywgdGl0bGU6IHRoaXMuamFsYWxpTG9jYWxlLm1vbnRoTmFtZXNbMl0gfVxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICB7IG1vbnRoOiAnMDQnLCB0aXRsZTogdGhpcy5qYWxhbGlMb2NhbGUubW9udGhOYW1lc1szXSB9LFxuICAgICAgICAgICAgeyBtb250aDogJzA1JywgdGl0bGU6IHRoaXMuamFsYWxpTG9jYWxlLm1vbnRoTmFtZXNbNF0gfSxcbiAgICAgICAgICAgIHsgbW9udGg6ICcwNicsIHRpdGxlOiB0aGlzLmphbGFsaUxvY2FsZS5tb250aE5hbWVzWzVdIH1cbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgeyBtb250aDogJzA3JywgdGl0bGU6IHRoaXMuamFsYWxpTG9jYWxlLm1vbnRoTmFtZXNbNl0gfSxcbiAgICAgICAgICAgIHsgbW9udGg6ICcwOCcsIHRpdGxlOiB0aGlzLmphbGFsaUxvY2FsZS5tb250aE5hbWVzWzddIH0sXG4gICAgICAgICAgICB7IG1vbnRoOiAnMDknLCB0aXRsZTogdGhpcy5qYWxhbGlMb2NhbGUubW9udGhOYW1lc1s4XSB9XG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIHsgbW9udGg6ICcxMCcsIHRpdGxlOiB0aGlzLmphbGFsaUxvY2FsZS5tb250aE5hbWVzWzldIH0sXG4gICAgICAgICAgICB7IG1vbnRoOiAnMTEnLCB0aXRsZTogdGhpcy5qYWxhbGlMb2NhbGUubW9udGhOYW1lc1sxMF0gfSxcbiAgICAgICAgICAgIHsgbW9udGg6ICcxMicsIHRpdGxlOiB0aGlzLmphbGFsaUxvY2FsZS5tb250aE5hbWVzWzExXSB9XG4gICAgICAgIF1cbiAgICBdO1xuXG4gICAgQE91dHB1dCgpIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE5nSmFsYWxpTW9udGhWYWx1ZUludGVyZmFjZT4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogTmdKYWxhbGlEYXRlVGltZVNlcnZpY2UpIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy55ZWFyID0gdGhpcy52YWx1ZS5tb250aCA/IHRoaXMudmFsdWUubW9udGguc3Vic3RyKDAsIDQpIDogdGhpcy5zZXJ2aWNlLmphbGFsaS5ub3coeyBmb3JtYXQ6ICdZJyB9KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zZXJ2aWNlLmphbGFsaS5ub3coeyBmb3JtYXQ6ICdZLU0nIH0pO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IGFueVtdID0gW107XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5yZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2wodGhpcy5uYW1lLCBuZXcgRm9ybUNvbnRyb2wodGhpcy52YWx1ZSkpO1xuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCh0aGlzLm5hbWUgKyAnLXRpdGxlJywgbmV3IEZvcm1Db250cm9sKCcnLCB2YWxpZGF0b3JzKSk7XG4gICAgICAgIHRoaXMuc2V0VGl0bGUoKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubW9udGggPyBudWxsIDogeyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHNob3dDYWxlbmRhcihzaG93OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2lucHV0JyArIHRoaXMucmFuZG9tKTtcbiAgICAgICAgaW5wdXQuYmx1cigpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlc2V0KSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBzaG93ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3cgPSBzaG93O1xuICAgICAgICBpZiAodGhpcy5zaG93KSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMubmFtZSArICctdGl0bGUnKS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgICAgIHRoaXMueWVhciA9IHRoaXMudmFsdWUubW9udGggPyB0aGlzLnZhbHVlLm1vbnRoLnN1YnN0cigwLCA0KSA6IHRoaXMuc2VydmljZS5qYWxhbGkubm93KHsgZm9ybWF0OiAnWScgfSk7XG4gICAgICAgIH0gZWxzZSB0aGlzLmZvcm0uZ2V0KHRoaXMubmFtZSArICctdGl0bGUnKS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgY2hhbmdlWWVhcihjaGFuZ2U6IG51bWJlcikge1xuICAgICAgICBjb25zdCB5ZWFyOiBudW1iZXIgPSBOdW1iZXIodGhpcy55ZWFyKSArIGNoYW5nZTtcbiAgICAgICAgdGhpcy55ZWFyID0geWVhciA8IDEwMDAgPyAnMTAwMCcgOiB5ZWFyLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgc2V0VGl0bGUoKSB7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5uYW1lKS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcblxuICAgICAgICBjb25zdCB0aXRsZTogc3RyaW5nID0gdGhpcy5zZXJ2aWNlLmdldE1vbnRoVGl0bGUodGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5uYW1lICsgJy10aXRsZScpLnNldFZhbHVlKHRpdGxlKTtcbiAgICB9XG5cbiAgICBzZXRNb250aChtb250aDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnNlcnZpY2UuZ2V0TW9udGhWYWx1ZShtb250aCA/IHRoaXMueWVhciArICctJyArIG1vbnRoIDogJycpO1xuICAgICAgICB0aGlzLnNldFRpdGxlKCk7XG4gICAgICAgIHRoaXMuc2hvd0NhbGVuZGFyKGZhbHNlKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkLmVtaXQodGhpcy52YWx1ZS5tb250aCA/IHRoaXMudmFsdWUgOiBudWxsKTtcbiAgICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLm5hbWUgKyAnLXRpdGxlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbn1cbiJdfQ==