truly-ui
Version:
Web Components for Desktop Applications.
218 lines (216 loc) • 29.1 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Sistemas
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 { ElementRef, Injectable } from '@angular/core';
import { Subscription, Subject } from 'rxjs';
import * as i0 from "@angular/core";
export class ClockPickerService {
constructor(wrapperDial, wrapperDialMin, renderer) {
this.wrapperDial = wrapperDial;
this.wrapperDialMin = wrapperDialMin;
this.renderer = renderer;
this.subscribe = new Subscription();
this.opened = false;
this.numbers = 12;
this.minNumber = 12;
this.maxNumber = 60;
this.divisor = 30;
this.timeClock = { hour: '00', minute: '00' };
this.type = 'hour';
this.change = new Subject();
this.clockRadius = { height: 200, width: 200 };
}
createMinHourDial() {
this.numbers = 12;
this.minNumber = 0;
this.divisor = 30;
this.maxNumber = 12;
this.type = 'minHour';
this.setRelativeAngle();
this.setClockStep();
this.createNumbers();
this.angle = this.getClockAngle(this.timeClock.hour);
}
createHourDial() {
this.createMinHourDial();
this.clearWrapper();
this.numbers = 12;
this.minNumber = 12;
this.divisor = 30;
this.maxNumber = 24;
this.type = 'hour';
this.setRelativeAngle();
this.setClockStep();
this.createNumbers();
this.angle = this.getClockAngle(this.timeClock.hour);
}
createMinuteDial() {
this.clearWrapper();
this.clearWrapperMin();
this.numbers = 60;
this.minNumber = 0;
this.maxNumber = 60;
this.divisor = 6;
this.type = 'minute';
this.setRelativeAngle();
this.setClockStep();
this.createNumbers();
this.angle = this.getClockAngle(this.timeClock.minute);
}
clearWrapper() {
this.wrapperDial.nativeElement.innerHTML = '';
}
clearWrapperMin() {
this.wrapperDialMin.nativeElement.innerHTML = '';
}
getDivisorAngle() {
return this.divisor;
}
getAngleClock() {
return this.angle;
}
setRelativeAngle() {
this.relativeAngle = -90 * Math.PI / 180;
}
setClockStep() {
this.step = (2 * Math.PI) / this.numbers;
}
createNumbers() {
let hour = this.maxNumber;
for (let index = this.maxNumber; index > this.minNumber; index--) {
this.createElementNumber();
this.setElementNumberValue(hour);
hour--;
this.setRadiusNumber();
this.setStylesNumber();
this.listenClickNumber(index);
this.appendElementNumber();
this.relativeAngle -= this.step;
}
}
createElementNumber() {
this.elementNumber = new ElementRef(this.renderer.createElement('div'));
}
appendElementNumber() {
if (this.type === 'minHour') {
this.renderer.appendChild(this.wrapperDialMin.nativeElement, this.elementNumber.nativeElement);
}
else {
this.renderer.appendChild(this.wrapperDial.nativeElement, this.elementNumber.nativeElement);
}
}
listenClickNumber(index) {
this.subscribe.add(this.renderer.listen(this.elementNumber.nativeElement, 'click', ($event) => {
this.setAngleLineHour(index * this.divisor);
this.change.next(this.timeClock);
}));
}
setElementNumberValue(hour) {
const time = ((hour === 24) || (hour === 60)) ? 0 : hour;
if (this.type === 'minHour') {
this.renderer.addClass(this.elementNumber.nativeElement, 'clock-number');
this.elementNumber.nativeElement.innerHTML = ('0' + time).slice(-2);
}
if (this.type === 'minute' && (hour % 5) === 0) {
this.renderer.addClass(this.elementNumber.nativeElement, 'clock-number');
this.elementNumber.nativeElement.innerHTML = ('0' + time).slice(-2);
}
if (this.type === 'hour') {
this.renderer.addClass(this.elementNumber.nativeElement, 'clock-number');
this.elementNumber.nativeElement.innerHTML = ('0' + time).slice(-2);
}
}
setRadiusNumber() {
this.radius = Math.round((this.clockRadius.width / 2) - (this.type !== 'minHour' ? 15 : 40));
}
setStylesNumber() {
this.renderer.setStyle(this.elementNumber.nativeElement, 'position', 'absolute');
this.renderer.setStyle(this.elementNumber.nativeElement, 'left', this.getAngleX() + 'px');
this.renderer.setStyle(this.elementNumber.nativeElement, 'top', this.getAngleY() + 'px');
}
setAngleLineHour(angle) {
this.angle = angle;
if (this.type === 'minute') {
this.divisor = 6;
this.timeClock.minute = ('0' + angle / this.divisor).slice(-2);
}
else {
this.divisor = 30;
this.timeClock.hour = ('0' + angle / this.divisor).slice(-2);
}
}
setTimeClock(value) {
value.length > 2 ? this.createMinuteDial() : this.createHourDial();
if (value.length === 2) {
this.timeClock.hour = String(value.substring(0, 2));
this.angle = this.getClockAngle(this.timeClock.hour);
}
else if (value.length === 4) {
this.timeClock.hour = String(value.substring(0, 2));
this.timeClock.minute = String(value.substring(2, 4));
this.angle = this.getClockAngle(this.timeClock.minute);
}
}
closeClockPicker() {
this.opened = false;
}
getTimeByAngle(angle) {
if (this.type === 'hour') {
const time = Math.floor((12 * angle) / 360) + 12;
this.timeClock.hour = time > 12 ? time + '' : '00';
this.change.next(this.timeClock);
}
else {
const time = Math.floor((60 * angle) / 360);
this.timeClock.minute = ('0' + time).slice(-2);
this.change.next(this.timeClock);
}
}
getClockAngle(value) {
let radius = 12;
if (this.type === 'minute') {
radius = 60;
}
return (parseInt(value, 10) / radius) * 360;
}
getClockPickerValue() {
return this.timeClock;
}
openClockPicker() {
this.opened = true;
}
getOpened() {
return this.opened;
}
getAngleX() {
return Math.round(this.radius * Math.cos(this.relativeAngle) + (this.clockRadius.width / 2));
}
getAngleY() {
return Math.round(this.radius * Math.sin(this.relativeAngle) + (this.clockRadius.height / 2));
}
ngOnDestroy() {
this.subscribe.unsubscribe();
}
}
/** @nocollapse */ ClockPickerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClockPickerService, deps: [{ token: i0.ElementRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ ClockPickerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClockPickerService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClockPickerService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2twaWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2Nsb2NrcGlja2VyL3NlcnZpY2VzL2Nsb2NrcGlja2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUc3QyxNQUFNLE9BQU8sa0JBQWtCO0lBZ0M3QixZQUFxQixXQUF1QixFQUFVLGNBQTBCLEVBQVUsUUFBbUI7UUFBeEYsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUE5QnJHLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBTS9CLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFRZixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWIsY0FBUyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFMUMsU0FBSSxHQUFHLE1BQU0sQ0FBQztRQUVkLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXRCLGdCQUFXLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUdsRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxDQUFDO0lBQ3pELENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUMzQyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDM0MsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLEtBQU0sSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRztZQUNsRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUUsSUFBSSxDQUFFLENBQUM7WUFDbkMsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBRSxLQUFLLENBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxVQUFVLENBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUUsS0FBSyxDQUFFLENBQUUsQ0FBQztJQUM5RSxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUc7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUUsQ0FBQztTQUNsRzthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUUsQ0FBQztTQUMvRjtJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBRSxLQUFhO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFFLE1BQU0sRUFBRyxFQUFFO1lBQ2hHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxTQUFTLENBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUUsQ0FBRSxDQUFDO0lBQ1IsQ0FBQztJQUVELHFCQUFxQixDQUFFLElBQVk7UUFDakMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6RCxJQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFHO1lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBRSxDQUFDO1lBQzNFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUUsQ0FBQyxDQUFDLENBQUUsQ0FBQztTQUN2RTtRQUNELElBQUssSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFHO1lBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBRSxDQUFDO1lBQzNFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUUsQ0FBQyxDQUFDLENBQUUsQ0FBQztTQUN2RTtRQUNELElBQUssSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUc7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFFLENBQUM7WUFDM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMs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QUNyQixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFFLENBQUUsQ0FBQztJQUNwRyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFFLENBQUUsQ0FBQztJQUNyRyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQzs7bUlBbk9VLGtCQUFrQjt1SUFBbEIsa0JBQWtCOzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIE1JVCBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTkgVGVtYWluZm8gU2lzdGVtYXNcblxuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENsb2NrUGlja2VyU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmUgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50TnVtYmVyOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgc3RlcDtcblxuICBwcml2YXRlIG9wZW5lZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgYW5nbGU7XG5cbiAgcHJpdmF0ZSByZWxhdGl2ZUFuZ2xlO1xuXG4gIHByaXZhdGUgcmFkaXVzO1xuXG4gIHByaXZhdGUgbnVtYmVycyA9IDEyO1xuXG4gIHByaXZhdGUgbWluTnVtYmVyID0gMTI7XG5cbiAgcHJpdmF0ZSBtYXhOdW1iZXIgPSA2MDtcblxuICBwcml2YXRlIGRpdmlzb3IgPSAzMDtcblxuICBwcml2YXRlIHRpbWVDbG9jayA9IHsgaG91cjogJzAwJywgbWludXRlOiAnMDAnIH07XG5cbiAgcHVibGljIHR5cGUgPSAnaG91cic7XG5cbiAgcHVibGljIGNoYW5nZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBjbG9ja1JhZGl1cyA9IHsgaGVpZ2h0OiAyMDAsIHdpZHRoOiAyMDAgfTtcblxuICBjb25zdHJ1Y3RvciggcHJpdmF0ZSB3cmFwcGVyRGlhbDogRWxlbWVudFJlZiwgcHJpdmF0ZSB3cmFwcGVyRGlhbE1pbjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyICkge1xuICB9XG5cbiAgY3JlYXRlTWluSG91ckRpYWwoKSB7XG4gICAgdGhpcy5udW1iZXJzID0gMTI7XG4gICAgdGhpcy5taW5OdW1iZXIgPSAwO1xuICAgIHRoaXMuZGl2aXNvciA9IDMwO1xuICAgIHRoaXMubWF4TnVtYmVyID0gMTI7XG4gICAgdGhpcy50eXBlID0gJ21pbkhvdXInO1xuICAgIHRoaXMuc2V0UmVsYXRpdmVBbmdsZSgpO1xuICAgIHRoaXMuc2V0Q2xvY2tTdGVwKCk7XG4gICAgdGhpcy5jcmVhdGVOdW1iZXJzKCk7XG4gICAgdGhpcy5hbmdsZSA9IHRoaXMuZ2V0Q2xvY2tBbmdsZSggdGhpcy50aW1lQ2xvY2suaG91ciApO1xuICB9XG5cbiAgY3JlYXRlSG91ckRpYWwoKSB7XG4gICAgdGhpcy5jcmVhdGVNaW5Ib3VyRGlhbCgpO1xuICAgIHRoaXMuY2xlYXJXcmFwcGVyKCk7XG4gICAgdGhpcy5udW1iZXJzID0gMTI7XG4gICAgdGhpcy5taW5OdW1iZXIgPSAxMjtcbiAgICB0aGlzLmRpdmlzb3IgPSAzMDtcbiAgICB0aGlzLm1heE51bWJlciA9IDI0O1xuICAgIHRoaXMudHlwZSA9ICdob3VyJztcbiAgICB0aGlzLnNldFJlbGF0aXZlQW5nbGUoKTtcbiAgICB0aGlzLnNldENsb2NrU3RlcCgpO1xuICAgIHRoaXMuY3JlYXRlTnVtYmVycygpO1xuICAgIHRoaXMuYW5nbGUgPSB0aGlzLmdldENsb2NrQW5nbGUoIHRoaXMudGltZUNsb2NrLmhvdXIgKTtcbiAgfVxuXG4gIGNyZWF0ZU1pbnV0ZURpYWwoKSB7XG4gICAgdGhpcy5jbGVhcldyYXBwZXIoKTtcbiAgICB0aGlzLmNsZWFyV3JhcHBlck1pbigpO1xuICAgIHRoaXMubnVtYmVycyA9IDYwO1xuICAgIHRoaXMubWluTnVtYmVyID0gMDtcbiAgICB0aGlzLm1heE51bWJlciA9IDYwO1xuICAgIHRoaXMuZGl2aXNvciA9IDY7XG4gICAgdGhpcy50eXBlID0gJ21pbnV0ZSc7XG4gICAgdGhpcy5zZXRSZWxhdGl2ZUFuZ2xlKCk7XG4gICAgdGhpcy5zZXRDbG9ja1N0ZXAoKTtcbiAgICB0aGlzLmNyZWF0ZU51bWJlcnMoKTtcbiAgICB0aGlzLmFuZ2xlID0gdGhpcy5nZXRDbG9ja0FuZ2xlKCB0aGlzLnRpbWVDbG9jay5taW51dGUgKTtcbiAgfVxuXG4gIGNsZWFyV3JhcHBlcigpIHtcbiAgICB0aGlzLndyYXBwZXJEaWFsLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBjbGVhcldyYXBwZXJNaW4oKSB7XG4gICAgdGhpcy53cmFwcGVyRGlhbE1pbi5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuICB9XG5cbiAgZ2V0RGl2aXNvckFuZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLmRpdmlzb3I7XG4gIH1cblxuICBnZXRBbmdsZUNsb2NrKCkge1xuICAgIHJldHVybiB0aGlzLmFuZ2xlO1xuICB9XG5cbiAgc2V0UmVsYXRpdmVBbmdsZSgpIHtcbiAgICB0aGlzLnJlbGF0aXZlQW5nbGUgPSAtOTAgKiBNYXRoLlBJIC8gMTgwO1xuICB9XG5cbiAgc2V0Q2xvY2tTdGVwKCkge1xuICAgIHRoaXMuc3RlcCA9ICgyICogTWF0aC5QSSkgLyB0aGlzLm51bWJlcnM7XG4gIH1cblxuICBjcmVhdGVOdW1iZXJzKCkge1xuICAgIGxldCBob3VyID0gdGhpcy5tYXhOdW1iZXI7XG4gICAgZm9yICggbGV0IGluZGV4ID0gdGhpcy5tYXhOdW1iZXI7IGluZGV4ID4gdGhpcy5taW5OdW1iZXI7IGluZGV4LS0gKSB7XG4gICAgICB0aGlzLmNyZWF0ZUVsZW1lbnROdW1iZXIoKTtcbiAgICAgIHRoaXMuc2V0RWxlbWVudE51bWJlclZhbHVlKCBob3VyICk7XG4gICAgICBob3VyLS07XG4gICAgICB0aGlzLnNldFJhZGl1c051bWJlcigpO1xuICAgICAgdGhpcy5zZXRTdHlsZXNOdW1iZXIoKTtcbiAgICAgIHRoaXMubGlzdGVuQ2xpY2tOdW1iZXIoIGluZGV4ICk7XG4gICAgICB0aGlzLmFwcGVuZEVsZW1lbnROdW1iZXIoKTtcbiAgICAgIHRoaXMucmVsYXRpdmVBbmdsZSAtPSB0aGlzLnN0ZXA7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlRWxlbWVudE51bWJlcigpIHtcbiAgICB0aGlzLmVsZW1lbnROdW1iZXIgPSBuZXcgRWxlbWVudFJlZiggdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCAnZGl2JyApICk7XG4gIH1cblxuICBhcHBlbmRFbGVtZW50TnVtYmVyKCkge1xuICAgIGlmICggdGhpcy50eXBlID09PSAnbWluSG91cicgKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKCB0aGlzLndyYXBwZXJEaWFsTWluLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudE51bWJlci5uYXRpdmVFbGVtZW50ICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoIHRoaXMud3JhcHBlckRpYWwubmF0aXZlRWxlbWVudCwgdGhpcy5lbGVtZW50TnVtYmVyLm5hdGl2ZUVsZW1lbnQgKTtcbiAgICB9XG4gIH1cblxuICBsaXN0ZW5DbGlja051bWJlciggaW5kZXg6IG51bWJlciApIHtcbiAgICB0aGlzLnN1YnNjcmliZS5hZGQoIHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmVsZW1lbnROdW1iZXIubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgKCAkZXZlbnQgKSA9PiB7XG4gICAgICB0aGlzLnNldEFuZ2xlTGluZUhvdXIoIGluZGV4ICogdGhpcy5kaXZpc29yICk7XG4gICAgICB0aGlzLmNoYW5nZS5uZXh0KCB0aGlzLnRpbWVDbG9jayApO1xuICAgIH0gKSApO1xuICB9XG5cbiAgc2V0RWxlbWVudE51bWJlclZhbHVlKCBob3VyOiBudW1iZXIgKSB7XG4gICAgY29uc3QgdGltZSA9ICgoaG91ciA9PT0gMjQpIHx8IChob3VyID09PSA2MCkpID8gMCA6IGhvdXI7XG4gICAgaWYgKCB0aGlzLnR5cGUgPT09ICdtaW5Ib3VyJyApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuZWxlbWVudE51bWJlci5uYXRpdmVFbGVtZW50LCAnY2xvY2stbnVtYmVyJyApO1xuICAgICAgdGhpcy5lbGVtZW50TnVtYmVyLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gKCcwJyArIHRpbWUpLnNsaWNlKCAtMiApO1xuICAgIH1cbiAgICBpZiAoIHRoaXMudHlwZSA9PT0gJ21pbnV0ZScgJiYgKGhvdXIgJSA1KSA9PT0gMCApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuZWxlbWVudE51bWJlci5uYXRpdmVFbGVtZW50LCAnY2xvY2stbnVtYmVyJyApO1xuICAgICAgdGhpcy5lbGVtZW50TnVtYmVyLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gKCcwJyArIHRpbWUpLnNsaWNlKCAtMiApO1xuICAgIH1cbiAgICBpZiAoIHRoaXMudHlwZSA9PT0gJ2hvdXInICkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5lbGVtZW50TnVtYmVyLm5hdGl2ZUVsZW1lbnQsICdjbG9jay1udW1iZXInICk7XG4gICAgICB0aGlzLmVsZW1lbnROdW1iZXIubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAoJzAnICsgdGltZSkuc2xpY2UoIC0yICk7XG4gICAgfVxuICB9XG5cbiAgc2V0UmFkaXVzTnVtYmVyKCkge1xuICAgIHRoaXMucmFkaXVzID0gTWF0aC5yb3VuZCggKHRoaXMuY2xvY2tSYWRpdXMud2lkdGggLyAyKSAtICh0aGlzLnR5cGUgIT09ICdtaW5Ib3VyJyA/IDE1IDogNDApICk7XG4gIH1cblxuICBzZXRTdHlsZXNOdW1iZXIoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSggdGhpcy5lbGVtZW50TnVtYmVyLm5hdGl2ZUVsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKCB0aGlzLmVsZW1lbnROdW1iZXIubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCB0aGlzLmdldEFuZ2xlWCgpICsgJ3B4JyApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoIHRoaXMuZWxlbWVudE51bWJlci5uYXRpdmVFbGVtZW50LCAndG9wJywgdGhpcy5nZXRBbmdsZVkoKSArICdweCcgKTtcbiAgfVxuXG4gIHNldEFuZ2xlTGluZUhvdXIoIGFuZ2xlOiBudW1iZXIgKSB7XG4gICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgIGlmICggdGhpcy50eXBlID09PSAnbWludXRlJyApIHtcbiAgICAgIHRoaXMuZGl2aXNvciA9IDY7XG4gICAgICB0aGlzLnRpbWVDbG9jay5taW51dGUgPSAoJzAnICsgYW5nbGUgLyB0aGlzLmRpdmlzb3IpLnNsaWNlKCAtMiApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpdmlzb3IgPSAzMDtcbiAgICAgIHRoaXMudGltZUNsb2NrLmhvdXIgPSAoJzAnICsgYW5nbGUgLyB0aGlzLmRpdmlzb3IpLnNsaWNlKCAtMiApO1xuICAgIH1cbiAgfVxuXG4gIHNldFRpbWVDbG9jayggdmFsdWU6IHN0cmluZyApIHtcbiAgICB2YWx1ZS5sZW5ndGggPiAyID8gdGhpcy5jcmVhdGVNaW51dGVEaWFsKCkgOiB0aGlzLmNyZWF0ZUhvdXJEaWFsKCk7XG4gICAgaWYgKCB2YWx1ZS5sZW5ndGggPT09IDIgKSB7XG4gICAgICB0aGlzLnRpbWVDbG9jay5ob3VyID0gU3RyaW5nKCB2YWx1ZS5zdWJzdHJpbmcoIDAsIDIgKSApO1xuICAgICAgdGhpcy5hbmdsZSA9IHRoaXMuZ2V0Q2xvY2tBbmdsZSggdGhpcy50aW1lQ2xvY2suaG91ciApO1xuICAgIH0gZWxzZSBpZiAoIHZhbHVlLmxlbmd0aCA9PT0gNCApIHtcbiAgICAgIHRoaXMudGltZUNsb2NrLmhvdXIgPSBTdHJpbmcoIHZhbHVlLnN1YnN0cmluZyggMCwgMiApICk7XG4gICAgICB0aGlzLnRpbWVDbG9jay5taW51dGUgPSBTdHJpbmcoIHZhbHVlLnN1YnN0cmluZyggMiwgNCApICk7XG4gICAgICB0aGlzLmFuZ2xlID0gdGhpcy5nZXRDbG9ja0FuZ2xlKCB0aGlzLnRpbWVDbG9jay5taW51dGUgKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZUNsb2NrUGlja2VyKCkge1xuICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XG4gIH1cblxuICBnZXRUaW1lQnlBbmdsZSggYW5nbGUgKSB7XG4gICAgaWYgKCB0aGlzLnR5cGUgPT09ICdob3VyJyApIHtcbiAgICAgIGNvbnN0IHRpbWUgPSBNYXRoLmZsb29yKCAoMTIgKiBhbmdsZSkgLyAzNjAgKSArIDEyO1xuICAgICAgdGhpcy50aW1lQ2xvY2suaG91ciA9IHRpbWUgPiAxMiA/IHRpbWUgKyAnJyA6ICcwMCc7XG4gICAgICB0aGlzLmNoYW5nZS5uZXh0KCB0aGlzLnRpbWVDbG9jayApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0aW1lID0gTWF0aC5mbG9vciggKDYwICogYW5nbGUpIC8gMzYwICk7XG4gICAgICB0aGlzLnRpbWVDbG9jay5taW51dGUgPSAoICcwJyArIHRpbWUpLnNsaWNlKCAtMiApO1xuICAgICAgdGhpcy5jaGFuZ2UubmV4dCggdGhpcy50aW1lQ2xvY2sgKTtcbiAgICB9XG4gIH1cblxuICBnZXRDbG9ja0FuZ2xlKCB2YWx1ZSApIHtcbiAgICBsZXQgcmFkaXVzID0gMTI7XG4gICAgaWYgKCB0aGlzLnR5cGUgPT09ICdtaW51dGUnICkge1xuICAgICAgcmFkaXVzID0gNjA7XG4gICAgfVxuICAgIHJldHVybiAocGFyc2VJbnQoIHZhbHVlLCAxMCApIC8gcmFkaXVzKSAqIDM2MDtcbiAgfVxuXG4gIGdldENsb2NrUGlja2VyVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGltZUNsb2NrO1xuICB9XG5cbiAgb3BlbkNsb2NrUGlja2VyKCkge1xuICAgIHRoaXMub3BlbmVkID0gdHJ1ZTtcbiAgfVxuXG4gIGdldE9wZW5lZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuZWQ7XG4gIH1cblxuICBnZXRBbmdsZVgoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoIHRoaXMucmFkaXVzICogTWF0aC5jb3MoIHRoaXMucmVsYXRpdmVBbmdsZSApICsgKHRoaXMuY2xvY2tSYWRpdXMud2lkdGggLyAyICkgKTtcbiAgfVxuXG4gIGdldEFuZ2xlWSgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCggdGhpcy5yYWRpdXMgKiBNYXRoLnNpbiggdGhpcy5yZWxhdGl2ZUFuZ2xlICkgKyAodGhpcy5jbG9ja1JhZGl1cy5oZWlnaHQgLyAyICkgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaWJlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuXG59XG4iXX0=