ng-devui
Version:
DevUI components based on Angular
125 lines • 20.8 kB
JavaScript
import { ChangeDetectorRef, Component, ElementRef, Input, ViewChild, } from '@angular/core';
import { GanttService } from '../gantt.service';
import * as i0 from "@angular/core";
import * as i1 from "../gantt.service";
import * as i2 from "@angular/common";
import * as i3 from "ng-devui/tooltip";
export class GanttBarParentComponent {
constructor(cdr, ganttService) {
this.cdr = cdr;
this.ganttService = ganttService;
this.progressRate = 0;
this.tipHovered = false;
this.left = 0;
this.width = 0;
this.max = 100;
this.min = 0;
}
ngOnInit() {
if (this.progressRate === null) {
this.setValue(this.ensureValueInRange(null));
}
this.duration = this.ganttService.getDuration(this.startDate, this.endDate) + 'd';
this.ganttScaleStatusHandler = this.ganttService.ganttScaleConfigChange.subscribe((config) => {
if (config.startDate) {
this.left = this.ganttService.getDatePostionOffset(this.startDate);
}
if (config.unit) {
this.left = this.ganttService.getDatePostionOffset(this.startDate);
this.width = this.ganttService.getDurationWidth(this.startDate, this.endDate);
}
});
}
ngOnChanges(changes) {
const { progressRate, startDate, endDate } = changes;
if (progressRate && this.progressRate > 0) {
this.updateTrackAndHandle();
}
if (startDate) {
this.left = this.ganttService.getDatePostionOffset(this.startDate);
this.width = this.ganttService.getDurationWidth(this.startDate, this.endDate);
}
if (endDate) {
this.width = this.ganttService.getDurationWidth(this.startDate, this.endDate);
}
}
ngAfterViewInit() {
if (this.progressRate && this.progressRate > 0) {
this.updateTrackAndHandle();
}
}
setValue(value) {
if (this.progressRate !== value) {
this.progressRate = value;
this.updateTrackAndHandle();
}
}
ensureValueInRange(value) {
let safeValue;
if (!this.valueMustBeValid(value)) {
safeValue = this.min;
}
else {
safeValue = this.clamp(this.min, value, this.max);
}
return safeValue;
}
valueMustBeValid(value) {
return !isNaN(typeof value !== 'number' ? parseFloat(value) : value);
}
clamp(min, n, max) {
return Math.max(min, Math.min(n, max));
}
updateTrackAndHandle() {
const value = this.progressRate;
const offset = this.valueToOffset(value);
this.updateStyle(offset / 100);
this.cdr.markForCheck();
}
valueToOffset(value) {
return ((value - this.min) / (this.max - this.min)) * 100;
}
updateStyle(percentage) {
this.percentage = Math.min(1, Math.max(0, percentage));
if (this.ganttBarTrack && this.ganttBarTrack.nativeElement) {
this.ganttBarTrack.nativeElement.style.width = `${this.percentage * 100}%`;
}
if (this.ganttBarProgress && this.ganttBarProgress.nativeElement) {
this.ganttBarProgress.nativeElement.style.left = `${this.percentage * 100}%`;
}
}
ngOnDestroy() {
if (this.ganttScaleStatusHandler) {
this.ganttScaleStatusHandler.unsubscribe();
this.ganttScaleStatusHandler = null;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GanttBarParentComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.GanttService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GanttBarParentComponent, selector: "d-gantt-bar-parent", inputs: { startDate: "startDate", endDate: "endDate", progressRate: "progressRate", data: "data", id: "id", tip: "tip" }, viewQueries: [{ propertyName: "ganttBarProgress", first: true, predicate: ["ganttBarProgress"], descendants: true }, { propertyName: "ganttBarTrack", first: true, predicate: ["ganttBarTrack"], descendants: true }, { propertyName: "ganttBarRail", first: true, predicate: ["ganttBarRail"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"startDate && endDate\"\n #ganttBar\n class=\"devui-gantt-bar-parent\"\n [style.left]=\"left + 'px'\"\n [style.width]=\"width + 'px'\"\n dTooltip\n [content]=\"tip\"\n>\n <div class=\"devui-gantt-bar-rail\" #ganttBarRail></div>\n <div class=\"devui-gantt-bar-track\" [ngClass]=\"{ head: percentage > 0, tail: percentage === 1 }\" #ganttBarTrack></div>\n</div>\n", styles: [".devui-gantt-bar-parent{width:100%;box-sizing:border-box;height:24px;z-index:3;position:relative}.devui-gantt-bar-parent .devui-gantt-bar-rail{position:absolute;background:#eaecf0;height:12px;width:100%;margin-top:4px}.devui-gantt-bar-parent .devui-gantt-bar-rail:before{width:0;height:0;border:3px transparent solid;border-top-color:#eaecf0;border-left-color:#eaecf0;position:absolute;left:0;bottom:-6px;content:\"\"}.devui-gantt-bar-parent .devui-gantt-bar-rail:after{width:0;height:0;border:3px transparent solid;border-top-color:#eaecf0;border-right-color:#eaecf0;position:absolute;right:0;bottom:-6px;content:\"\"}.devui-gantt-bar-parent .devui-gantt-bar-track{position:absolute;background-color:#cacfd8;height:12px;margin-top:4px;width:0}.devui-gantt-bar-parent .devui-gantt-bar-track.head:before{width:0;height:0;border:3px transparent solid;border-top-color:#cacfd8;border-left-color:#cacfd8;position:absolute;left:0;bottom:-6px;content:\"\"}.devui-gantt-bar-parent .devui-gantt-bar-track.tail:after{width:0;height:0;border:3px transparent solid;border-top-color:#cacfd8;border-right-color:#cacfd8;position:absolute;right:0;bottom:-6px;content:\"\"}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.TooltipDirective, selector: "[dTooltip]", inputs: ["content", "position", "showAnimation", "showAnimate", "mouseEnterDelay", "mouseLeaveDelay"], exportAs: ["dTooltip"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GanttBarParentComponent, decorators: [{
type: Component,
args: [{ selector: 'd-gantt-bar-parent', template: "<div\n *ngIf=\"startDate && endDate\"\n #ganttBar\n class=\"devui-gantt-bar-parent\"\n [style.left]=\"left + 'px'\"\n [style.width]=\"width + 'px'\"\n dTooltip\n [content]=\"tip\"\n>\n <div class=\"devui-gantt-bar-rail\" #ganttBarRail></div>\n <div class=\"devui-gantt-bar-track\" [ngClass]=\"{ head: percentage > 0, tail: percentage === 1 }\" #ganttBarTrack></div>\n</div>\n", styles: [".devui-gantt-bar-parent{width:100%;box-sizing:border-box;height:24px;z-index:3;position:relative}.devui-gantt-bar-parent .devui-gantt-bar-rail{position:absolute;background:#eaecf0;height:12px;width:100%;margin-top:4px}.devui-gantt-bar-parent .devui-gantt-bar-rail:before{width:0;height:0;border:3px transparent solid;border-top-color:#eaecf0;border-left-color:#eaecf0;position:absolute;left:0;bottom:-6px;content:\"\"}.devui-gantt-bar-parent .devui-gantt-bar-rail:after{width:0;height:0;border:3px transparent solid;border-top-color:#eaecf0;border-right-color:#eaecf0;position:absolute;right:0;bottom:-6px;content:\"\"}.devui-gantt-bar-parent .devui-gantt-bar-track{position:absolute;background-color:#cacfd8;height:12px;margin-top:4px;width:0}.devui-gantt-bar-parent .devui-gantt-bar-track.head:before{width:0;height:0;border:3px transparent solid;border-top-color:#cacfd8;border-left-color:#cacfd8;position:absolute;left:0;bottom:-6px;content:\"\"}.devui-gantt-bar-parent .devui-gantt-bar-track.tail:after{width:0;height:0;border:3px transparent solid;border-top-color:#cacfd8;border-right-color:#cacfd8;position:absolute;right:0;bottom:-6px;content:\"\"}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.GanttService }], propDecorators: { ganttBarProgress: [{
type: ViewChild,
args: ['ganttBarProgress']
}], ganttBarTrack: [{
type: ViewChild,
args: ['ganttBarTrack']
}], ganttBarRail: [{
type: ViewChild,
args: ['ganttBarRail']
}], startDate: [{
type: Input
}], endDate: [{
type: Input
}], progressRate: [{
type: Input
}], data: [{
type: Input
}], id: [{
type: Input
}], tip: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtYmFyLXBhcmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kZXZ1aS9nYW50dC9nYW50dC1iYXItcGFyZW50L2dhbnR0LWJhci1wYXJlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZGV2dWkvZ2FudHQvZ2FudHQtYmFyLXBhcmVudC9nYW50dC1iYXItcGFyZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBS0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7QUFPaEQsTUFBTSxPQUFPLHVCQUF1QjtJQW9CbEMsWUFBb0IsR0FBc0IsRUFBVSxZQUEwQjtRQUExRCxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBZHJFLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBTW5CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFMUIsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULFVBQUssR0FBRyxDQUFDLENBQUM7UUFDRixRQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ1YsUUFBRyxHQUFHLENBQUMsQ0FBQztJQUdpRSxDQUFDO0lBRWxGLFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7UUFF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VUFBVSxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQy9FLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7K0dBakhVLHVCQUF1QjttR0FBdkIsdUJBQXVCLCtmQ3BCcEMsa1lBWUE7OzRGRFFhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxvQkFBb0I7aUhBS0MsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFDRCxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0MsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNoQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR2FudHRTZXJ2aWNlIH0gZnJvbSAnLi4vZ2FudHQuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtZ2FudHQtYmFyLXBhcmVudCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dhbnR0LWJhci1wYXJlbnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dhbnR0LWJhci1wYXJlbnQuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEdhbnR0QmFyUGFyZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnZ2FudHRCYXJQcm9ncmVzcycpIGdhbnR0QmFyUHJvZ3Jlc3M6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZ2FudHRCYXJUcmFjaycpIGdhbnR0QmFyVHJhY2s6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZ2FudHRCYXJSYWlsJykgZ2FudHRCYXJSYWlsOiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIHN0YXJ0RGF0ZTogRGF0ZTtcclxuICBASW5wdXQoKSBlbmREYXRlOiBEYXRlO1xyXG4gIEBJbnB1dCgpIHByb2dyZXNzUmF0ZSA9IDA7XHJcbiAgQElucHV0KCkgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdGlwOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgZ2FudHRTY2FsZVN0YXR1c0hhbmRsZXI6IFN1YnNjcmlwdGlvbjtcclxuICBwdWJsaWMgdGlwSG92ZXJlZCA9IGZhbHNlO1xyXG4gIHBlcmNlbnRhZ2U6IG51bWJlcjtcclxuICBsZWZ0ID0gMDtcclxuICB3aWR0aCA9IDA7XHJcbiAgcHJpdmF0ZSBtYXggPSAxMDA7XHJcbiAgcHJpdmF0ZSBtaW4gPSAwO1xyXG4gIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZ2FudHRTZXJ2aWNlOiBHYW50dFNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NSYXRlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbnN1cmVWYWx1ZUluUmFuZ2UobnVsbCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMuZ2FudHRTZXJ2aWNlLmdldER1cmF0aW9uKHRoaXMuc3RhcnREYXRlLCB0aGlzLmVuZERhdGUpICsgJ2QnO1xyXG5cclxuICAgIHRoaXMuZ2FudHRTY2FsZVN0YXR1c0hhbmRsZXIgPSB0aGlzLmdhbnR0U2VydmljZS5nYW50dFNjYWxlQ29uZmlnQ2hhbmdlLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XHJcbiAgICAgIGlmIChjb25maWcuc3RhcnREYXRlKSB7XHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5nYW50dFNlcnZpY2UuZ2V0RGF0ZVBvc3Rpb25PZmZzZXQodGhpcy5zdGFydERhdGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb25maWcudW5pdCkge1xyXG4gICAgICAgIHRoaXMubGVmdCA9IHRoaXMuZ2FudHRTZXJ2aWNlLmdldERhdGVQb3N0aW9uT2Zmc2V0KHRoaXMuc3RhcnREYXRlKTtcclxuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5nYW50dFNlcnZpY2UuZ2V0RHVyYXRpb25XaWR0aCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5lbmREYXRlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBjb25zdCB7IHByb2dyZXNzUmF0ZSwgc3RhcnREYXRlLCBlbmREYXRlIH0gPSBjaGFuZ2VzO1xyXG4gICAgaWYgKHByb2dyZXNzUmF0ZSAmJiB0aGlzLnByb2dyZXNzUmF0ZSA+IDApIHtcclxuICAgICAgdGhpcy51cGRhdGVUcmFja0FuZEhhbmRsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGFydERhdGUpIHtcclxuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5nYW50dFNlcnZpY2UuZ2V0RGF0ZVBvc3Rpb25PZmZzZXQodGhpcy5zdGFydERhdGUpO1xyXG4gICAgICB0aGlzLndpZHRoID0gdGhpcy5nYW50dFNlcnZpY2UuZ2V0RHVyYXRpb25XaWR0aCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5lbmREYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kRGF0ZSkge1xyXG4gICAgICB0aGlzLndpZHRoID0gdGhpcy5nYW50dFNlcnZpY2UuZ2V0RHVyYXRpb25XaWR0aCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5lbmREYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnByb2dyZXNzUmF0ZSAmJiB0aGlzLnByb2dyZXNzUmF0ZSA+IDApIHtcclxuICAgICAgdGhpcy51cGRhdGVUcmFja0FuZEhhbmRsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NSYXRlICE9PSB2YWx1ZSkge1xyXG4gICAgICB0aGlzLnByb2dyZXNzUmF0ZSA9IHZhbHVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRyYWNrQW5kSGFuZGxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVuc3VyZVZhbHVlSW5SYW5nZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IG51bWJlciB7XHJcbiAgICBsZXQgc2FmZVZhbHVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbHVlTXVzdEJlVmFsaWQodmFsdWUpKSB7XHJcbiAgICAgIHNhZmVWYWx1ZSA9IHRoaXMubWluO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2FmZVZhbHVlID0gdGhpcy5jbGFtcCh0aGlzLm1pbiwgdmFsdWUgYXMgbnVtYmVyLCB0aGlzLm1heCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2FmZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWx1ZU11c3RCZVZhbGlkKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhaXNOYU4odHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyA/IHBhcnNlRmxvYXQodmFsdWUpIDogdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGFtcChtaW46IG51bWJlciwgbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obiwgbWF4KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRyYWNrQW5kSGFuZGxlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnByb2dyZXNzUmF0ZTtcclxuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMudmFsdWVUb09mZnNldCh2YWx1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZVN0eWxlKG9mZnNldCAvIDEwMCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsdWVUb09mZnNldCh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoKHZhbHVlIC0gdGhpcy5taW4pIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pKSAqIDEwMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3R5bGUocGVyY2VudGFnZSkge1xyXG4gICAgdGhpcy5wZXJjZW50YWdlID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgcGVyY2VudGFnZSkpO1xyXG4gICAgaWYgKHRoaXMuZ2FudHRCYXJUcmFjayAmJiB0aGlzLmdhbnR0QmFyVHJhY2submF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmdhbnR0QmFyVHJhY2submF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RoaXMucGVyY2VudGFnZSAqIDEwMH0lYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5nYW50dEJhclByb2dyZXNzICYmIHRoaXMuZ2FudHRCYXJQcm9ncmVzcy5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuZ2FudHRCYXJQcm9ncmVzcy5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHt0aGlzLnBlcmNlbnRhZ2UgKiAxMDB9JWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdhbnR0U2NhbGVTdGF0dXNIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZ2FudHRTY2FsZVN0YXR1c0hhbmRsZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5nYW50dFNjYWxlU3RhdHVzSGFuZGxlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcbiAgKm5nSWY9XCJzdGFydERhdGUgJiYgZW5kRGF0ZVwiXG4gICNnYW50dEJhclxuICBjbGFzcz1cImRldnVpLWdhbnR0LWJhci1wYXJlbnRcIlxuICBbc3R5bGUubGVmdF09XCJsZWZ0ICsgJ3B4J1wiXG4gIFtzdHlsZS53aWR0aF09XCJ3aWR0aCArICdweCdcIlxuICBkVG9vbHRpcFxuICBbY29udGVudF09XCJ0aXBcIlxuPlxuICA8ZGl2IGNsYXNzPVwiZGV2dWktZ2FudHQtYmFyLXJhaWxcIiAjZ2FudHRCYXJSYWlsPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZGV2dWktZ2FudHQtYmFyLXRyYWNrXCIgW25nQ2xhc3NdPVwieyBoZWFkOiBwZXJjZW50YWdlID4gMCwgdGFpbDogcGVyY2VudGFnZSA9PT0gMSB9XCIgI2dhbnR0QmFyVHJhY2s+PC9kaXY+XG48L2Rpdj5cbiJdfQ==