UNPKG

angular-gradient-progressbar

Version:

<p align="center"> <h1>Angular Gradient Progress Bar</h1> </p> <!-- Badges --> <p align="center"> <a href="https://www.npmjs.com/package/angular-gradient-progressbar"><img src="https://img.shields.io/npm/dw/angular-gradient-progressbar"/> </a> <

134 lines 32.8 kB
import { Component, Input, ViewChild, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class AngularGradientProgressbarComponent { constructor() { //type of progress bar this.type = 1; //default is 1 //end //tool tip textcolor this.lowTextColor = ''; this.mediumTextColor = ''; this.highTextColor = ''; //end //adjusting width of the progress bar this.progressBarWidth = 7; //default is 7 //end // number of bars this.barCount = 7; // default is 7 and max is 10 //end // value of the progress bar this.value = 75; // default is 75 //end // Quartle value of the progress bar this.quartileValueLow = 3; //default to 3 this.quartileValueHigh = 6; // default to 6 this.quartileValue = 0; //end //show tooltip or not this.showToolTip = true; // default is true //end //simple progress bar value this.secondValue = 75; // default is 75 this.value1 = 0; this.elementArr = []; } ngOnInit() { } ngAfterViewInit() { setTimeout(() => { if (this.type === 1) { this.rangeArray(); this.toolTip(); } else if (this.type === 2) { this.value1 = 100 - this.secondValue; } }); } toolTip() { this.quartileValue = Math.round(this.value / this.quartilePercentage); this.potentialLabel = this.quartileValue < this.quartileValueLow ? 'low' : this.quartileValue <= this.quartileValueHigh ? 'medium' : 'high'; this.toolTipClass = 'indicator ' + this.potentialLabel; } rangeArray() { if (this.barCount <= 10) { this.quartilePercentage = 100 / this.barCount; this.elementArr = []; let percent; let quartileValue; for (let i = 1; i <= this.barCount; i++) { const currentPoint = Math.round(this.quartilePercentage * i); if (this.value <= currentPoint) { //Check if percent and quartile value is present of not. This runs only one time if (!percent && !quartileValue) { const previousPoint = Math.round(this.quartilePercentage * (i - 1)); const difference = currentPoint - previousPoint; quartileValue = i; percent = Math.round(((this.value - previousPoint) / difference) * 100) + '%'; } if (percent && quartileValue) { if (i === quartileValue) { // set specified block value so that it can be used to make gradient this.divView.nativeElement.style.setProperty('--block-' + i, percent); // set left value to position the indicator and tooltip this.divView.nativeElement.style.setProperty('--left-value', percent); } if (this.showToolTip) { this.blockClass = 'item ' + (i === quartileValue ? 'current filled' : ''); this.elementArr.push(this.blockClass); } else { this.blockClass = 'item ' + (i === quartileValue ? 'tool filled' : ''); this.elementArr.push(this.blockClass); } } } else { this.blockClass = 'item filled'; this.elementArr.push(this.blockClass); } } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AngularGradientProgressbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.2", type: AngularGradientProgressbarComponent, selector: "angular-gradient-progressbar", inputs: { type: "type", lowTextColor: "lowTextColor", mediumTextColor: "mediumTextColor", highTextColor: "highTextColor", progressBarWidth: "progressBarWidth", barCount: "barCount", value: "value", quartileValueLow: "quartileValueLow", quartileValueHigh: "quartileValueHigh", showToolTip: "showToolTip", secondValue: "secondValue" }, viewQueries: [{ propertyName: "divView", first: true, predicate: ["myDiv"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"type === 1\">\r\n <div>\r\n <div\r\n #myDiv\r\n class=\"potential__range\"\r\n style=\"--lowText:{{ lowTextColor }} ; --mediumText:{{mediumTextColor}}; --highText:{{highTextColor}}; --progressBarWidth:{{progressBarWidth}};\"\r\n >\r\n <div class=\"range\">\r\n <div *ngFor=\"let item of elementArr; let i = index\" [class]=\"item\">\r\n <div\r\n *ngIf=\"item === 'item current filled' && showToolTip\"\r\n [class]=\"toolTipClass\"\r\n >\r\n <span *ngIf=\"showToolTip\">{{ potentialLabel }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"type === 2 && secondValue <=100 \">\r\n <div class=\"display_\">\r\n <div class=\"progress\"></div>\r\n <div class=\"progress_1\" style=\"--p:{{ value1 }}%\"></div>\r\n </div>\r\n</ng-container>\r\n", styles: [".potential__range{--block-1: 100%;--white-block-1: 0%;--block-2: 100%;--white-block-2: 0%;--block-3: 100%;--white-block-3: 0%;--block-4: 100%;--white-block-4: 0%;--block-5: 100%;--white-block-5: 0%;--block-6: 100%;--white-block-6: 0%;--block-7: 100%;--white-block-7: 0%;--block-8: 100%;--white-block-8: 0%;--block-9: 100%;--white-block-9: 0%;--block-10: 100%;--white-block-10: 0%;--lowText: #f14913;--mediumText: #fbaf00;--highText: #0a7a30;--progressBarWidth: 7;--left-value: 0;color:#1d1d1d;margin:3rem 4rem;padding:1.6rem 0}.potential__range h3{font-size:2rem;font-weight:500}.potential__range h3 b{text-transform:capitalize}.potential__range .range{display:flex}.potential__range .range .item{width:calc(100% / var(--progressBarWidth));height:17px;position:relative;background-color:#c8cfd580}.potential__range .range .item .indicator{width:90px;height:32px;box-shadow:0 14px 20px #00000014;border:solid 2px #fff;border-radius:16px;position:absolute;left:calc(var(--left-value) - 45px);top:-60px;display:flex;align-items:center;justify-content:center}.potential__range .range .item .indicator.low{background-color:#f8e2dd}.potential__range .range .item .indicator.low span{color:var(--lowText)}.potential__range .range .item .indicator.low:after{border-top:8px solid #f8e2dd}.potential__range .range .item .indicator.medium{background-color:#fff7e3}.potential__range .range .item .indicator.medium span{color:var(--mediumText)}.potential__range .range .item .indicator.medium:after{border-top:8px solid #fff7e3}.potential__range .range .item .indicator.high{background-color:#e3f5ea}.potential__range .range .item .indicator.high span{color:var(--highText)}.potential__range .range .item .indicator.high:after{border-top:8px solid #e3f5ea}.potential__range .range .item .indicator span{font-size:1.3rem;font-family:Poppins,Arial,Helvetica,sans-serif;font-weight:700}.potential__range .range .item .indicator:before{content:\"\";width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid white;position:absolute;left:50%;top:50%;transform:translate(-50%,140%)}.potential__range .range .item .indicator:after{content:\"\";width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid white;position:absolute;left:50%;top:50%;transform:translate(-50%,140%)}.potential__range .range .item:not(:last-child){margin-right:.2rem}.potential__range .range .item.filled{position:relative}.potential__range .range .item.filled.current:before{content:\"\";height:32px;width:32px;border-radius:50%;border:3px solid white;box-shadow:0 2px 4px #00000038;background-color:#0a7a30;position:absolute;top:50%;left:calc(var(--left-value) - 19px);transform:translateY(-50%);z-index:1}.potential__range .range .item.filled.current:after{content:\"\";width:16px;height:16px;border-radius:50%;background-color:#fff;position:absolute;top:50%;left:calc(var(--left-value) - 8.25px);transform:translateY(-50%);z-index:2}.potential__range .range .item.filled:nth-child(1){background:linear-gradient(90deg,#f14913 var(--block-1),rgba(200,207,213,.5) var(--white-block-1))}.potential__range .range .item.filled:nth-child(1).current:before{background:#f14913}.potential__range .range .item.filled:nth-child(2){background:linear-gradient(90deg,#f17613 var(--block-2),rgba(200,207,213,.5) var(--white-block-2))}.potential__range .range .item.filled:nth-child(2).current:before{background:#f17613}.potential__range .range .item.filled:nth-child(3){background:linear-gradient(90deg,#f19e13 var(--block-3),rgba(200,207,213,.5) var(--white-block-3))}.potential__range .range .item.filled:nth-child(3).current:before{background:#f19e13}.potential__range .range .item.filled:nth-child(4){background:linear-gradient(90deg,#f1b113 var(--block-4),rgba(200,207,213,.5) var(--white-block-4))}.potential__range .range .item.filled:nth-child(4).current:before{background:#f1b113}.potential__range .range .item.filled:nth-child(5){background:linear-gradient(90deg,#f1de13 var(--block-5),rgba(200,207,213,.5) var(--white-block-5))}.potential__range .range .item.filled:nth-child(5).current:before{background:#f1de13}.potential__range .range .item.filled:nth-child(6){background:linear-gradient(90deg,#ccd948 var(--block-6),rgba(200,207,213,.5) var(--white-block-6))}.potential__range .range .item.filled:nth-child(6).current:before{background:#ccd948}.potential__range .range .item.filled:nth-child(7){background:linear-gradient(90deg,#a7b429 var(--block-7),rgba(200,213,200,.5) var(--white-block-7))}.potential__range .range .item.filled:nth-child(7).current:before{background:#a7b429}.potential__range .range .item.filled:nth-child(8){background:linear-gradient(90deg,#53cc7c var(--block-8),rgba(200,207,213,.5) var(--white-block-8))}.potential__range .range .item.filled:nth-child(8).current:before{background:#53cc7c}.potential__range .range .item.filled:nth-child(9){background:linear-gradient(90deg,#43c770 var(--block-9),rgba(200,207,213,.5) var(--white-block-9))}.potential__range .range .item.filled:nth-child(9).current:before{background:#43c770}.potential__range .range .item.filled:nth-child(10){background:#0a7a30;background:linear-gradient(90deg,#0a7a30 var(--block-10),rgba(200,207,213,.5) var(--white-block-10))}.potential__range .range .item.filled:nth-child(10) .indicator{right:-30px}.potential__range .range .item.empty.current:before{content:\"\";height:32px;width:32px;border-radius:50%;border:3px solid white;box-shadow:0 2px 4px #00000038;background-color:#0a7a30;position:absolute;top:50%;left:-10px;transform:translateY(-50%);z-index:1}.potential__range .range .item.empty.current:after{content:\"\";width:16px;height:16px;border-radius:50%;background-color:#fff;position:absolute;top:50%;left:1px;transform:translateY(-50%);z-index:2}.potential__range .range .item.empty .indicator{left:-15px}.potential__range .range .item:nth-child(10) svg{position:absolute;right:-24px;top:50%;transform:translateY(-50%)}.progress{height:7px;margin-bottom:-8px;background-image:linear-gradient(90deg,red,#fff200,#0f0);background-size:100% 100%,100% 100%;background-repeat:no-repeat}.progress_1{height:9px;width:103%;margin-bottom:-8px;background-image:linear-gradient(#fff,#ccc);background-size:var(--p, 50%) 100%,100% 100%;transform:rotate(180deg);z-index:100;background-repeat:no-repeat}.display_{margin:3rem 10rem;padding:1.6rem 0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AngularGradientProgressbarComponent, decorators: [{ type: Component, args: [{ selector: 'angular-gradient-progressbar', template: "<ng-container *ngIf=\"type === 1\">\r\n <div>\r\n <div\r\n #myDiv\r\n class=\"potential__range\"\r\n style=\"--lowText:{{ lowTextColor }} ; --mediumText:{{mediumTextColor}}; --highText:{{highTextColor}}; --progressBarWidth:{{progressBarWidth}};\"\r\n >\r\n <div class=\"range\">\r\n <div *ngFor=\"let item of elementArr; let i = index\" [class]=\"item\">\r\n <div\r\n *ngIf=\"item === 'item current filled' && showToolTip\"\r\n [class]=\"toolTipClass\"\r\n >\r\n <span *ngIf=\"showToolTip\">{{ potentialLabel }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"type === 2 && secondValue <=100 \">\r\n <div class=\"display_\">\r\n <div class=\"progress\"></div>\r\n <div class=\"progress_1\" style=\"--p:{{ value1 }}%\"></div>\r\n </div>\r\n</ng-container>\r\n", styles: [".potential__range{--block-1: 100%;--white-block-1: 0%;--block-2: 100%;--white-block-2: 0%;--block-3: 100%;--white-block-3: 0%;--block-4: 100%;--white-block-4: 0%;--block-5: 100%;--white-block-5: 0%;--block-6: 100%;--white-block-6: 0%;--block-7: 100%;--white-block-7: 0%;--block-8: 100%;--white-block-8: 0%;--block-9: 100%;--white-block-9: 0%;--block-10: 100%;--white-block-10: 0%;--lowText: #f14913;--mediumText: #fbaf00;--highText: #0a7a30;--progressBarWidth: 7;--left-value: 0;color:#1d1d1d;margin:3rem 4rem;padding:1.6rem 0}.potential__range h3{font-size:2rem;font-weight:500}.potential__range h3 b{text-transform:capitalize}.potential__range .range{display:flex}.potential__range .range .item{width:calc(100% / var(--progressBarWidth));height:17px;position:relative;background-color:#c8cfd580}.potential__range .range .item .indicator{width:90px;height:32px;box-shadow:0 14px 20px #00000014;border:solid 2px #fff;border-radius:16px;position:absolute;left:calc(var(--left-value) - 45px);top:-60px;display:flex;align-items:center;justify-content:center}.potential__range .range .item .indicator.low{background-color:#f8e2dd}.potential__range .range .item .indicator.low span{color:var(--lowText)}.potential__range .range .item .indicator.low:after{border-top:8px solid #f8e2dd}.potential__range .range .item .indicator.medium{background-color:#fff7e3}.potential__range .range .item .indicator.medium span{color:var(--mediumText)}.potential__range .range .item .indicator.medium:after{border-top:8px solid #fff7e3}.potential__range .range .item .indicator.high{background-color:#e3f5ea}.potential__range .range .item .indicator.high span{color:var(--highText)}.potential__range .range .item .indicator.high:after{border-top:8px solid #e3f5ea}.potential__range .range .item .indicator span{font-size:1.3rem;font-family:Poppins,Arial,Helvetica,sans-serif;font-weight:700}.potential__range .range .item .indicator:before{content:\"\";width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid white;position:absolute;left:50%;top:50%;transform:translate(-50%,140%)}.potential__range .range .item .indicator:after{content:\"\";width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid white;position:absolute;left:50%;top:50%;transform:translate(-50%,140%)}.potential__range .range .item:not(:last-child){margin-right:.2rem}.potential__range .range .item.filled{position:relative}.potential__range .range .item.filled.current:before{content:\"\";height:32px;width:32px;border-radius:50%;border:3px solid white;box-shadow:0 2px 4px #00000038;background-color:#0a7a30;position:absolute;top:50%;left:calc(var(--left-value) - 19px);transform:translateY(-50%);z-index:1}.potential__range .range .item.filled.current:after{content:\"\";width:16px;height:16px;border-radius:50%;background-color:#fff;position:absolute;top:50%;left:calc(var(--left-value) - 8.25px);transform:translateY(-50%);z-index:2}.potential__range .range .item.filled:nth-child(1){background:linear-gradient(90deg,#f14913 var(--block-1),rgba(200,207,213,.5) var(--white-block-1))}.potential__range .range .item.filled:nth-child(1).current:before{background:#f14913}.potential__range .range .item.filled:nth-child(2){background:linear-gradient(90deg,#f17613 var(--block-2),rgba(200,207,213,.5) var(--white-block-2))}.potential__range .range .item.filled:nth-child(2).current:before{background:#f17613}.potential__range .range .item.filled:nth-child(3){background:linear-gradient(90deg,#f19e13 var(--block-3),rgba(200,207,213,.5) var(--white-block-3))}.potential__range .range .item.filled:nth-child(3).current:before{background:#f19e13}.potential__range .range .item.filled:nth-child(4){background:linear-gradient(90deg,#f1b113 var(--block-4),rgba(200,207,213,.5) var(--white-block-4))}.potential__range .range .item.filled:nth-child(4).current:before{background:#f1b113}.potential__range .range .item.filled:nth-child(5){background:linear-gradient(90deg,#f1de13 var(--block-5),rgba(200,207,213,.5) var(--white-block-5))}.potential__range .range .item.filled:nth-child(5).current:before{background:#f1de13}.potential__range .range .item.filled:nth-child(6){background:linear-gradient(90deg,#ccd948 var(--block-6),rgba(200,207,213,.5) var(--white-block-6))}.potential__range .range .item.filled:nth-child(6).current:before{background:#ccd948}.potential__range .range .item.filled:nth-child(7){background:linear-gradient(90deg,#a7b429 var(--block-7),rgba(200,213,200,.5) var(--white-block-7))}.potential__range .range .item.filled:nth-child(7).current:before{background:#a7b429}.potential__range .range .item.filled:nth-child(8){background:linear-gradient(90deg,#53cc7c var(--block-8),rgba(200,207,213,.5) var(--white-block-8))}.potential__range .range .item.filled:nth-child(8).current:before{background:#53cc7c}.potential__range .range .item.filled:nth-child(9){background:linear-gradient(90deg,#43c770 var(--block-9),rgba(200,207,213,.5) var(--white-block-9))}.potential__range .range .item.filled:nth-child(9).current:before{background:#43c770}.potential__range .range .item.filled:nth-child(10){background:#0a7a30;background:linear-gradient(90deg,#0a7a30 var(--block-10),rgba(200,207,213,.5) var(--white-block-10))}.potential__range .range .item.filled:nth-child(10) .indicator{right:-30px}.potential__range .range .item.empty.current:before{content:\"\";height:32px;width:32px;border-radius:50%;border:3px solid white;box-shadow:0 2px 4px #00000038;background-color:#0a7a30;position:absolute;top:50%;left:-10px;transform:translateY(-50%);z-index:1}.potential__range .range .item.empty.current:after{content:\"\";width:16px;height:16px;border-radius:50%;background-color:#fff;position:absolute;top:50%;left:1px;transform:translateY(-50%);z-index:2}.potential__range .range .item.empty .indicator{left:-15px}.potential__range .range .item:nth-child(10) svg{position:absolute;right:-24px;top:50%;transform:translateY(-50%)}.progress{height:7px;margin-bottom:-8px;background-image:linear-gradient(90deg,red,#fff200,#0f0);background-size:100% 100%,100% 100%;background-repeat:no-repeat}.progress_1{height:9px;width:103%;margin-bottom:-8px;background-image:linear-gradient(#fff,#ccc);background-size:var(--p, 50%) 100%,100% 100%;transform:rotate(180deg);z-index:100;background-repeat:no-repeat}.display_{margin:3rem 10rem;padding:1.6rem 0}\n"] }] }], ctorParameters: () => [], propDecorators: { type: [{ type: Input }], lowTextColor: [{ type: Input }], mediumTextColor: [{ type: Input }], highTextColor: [{ type: Input }], progressBarWidth: [{ type: Input }], barCount: [{ type: Input }], value: [{ type: Input }], quartileValueLow: [{ type: Input }], quartileValueHigh: [{ type: Input }], showToolTip: [{ type: Input }], secondValue: [{ type: Input }], divView: [{ type: ViewChild, args: ['myDiv'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1ncmFkaWVudC1wcm9ncmVzc2Jhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWdyYWRpZW50LXByb2dyZXNzYmFyL3NyYy9saWIvYW5ndWxhci1ncmFkaWVudC1wcm9ncmVzc2Jhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWdyYWRpZW50LXByb2dyZXNzYmFyL3NyYy9saWIvYW5ndWxhci1ncmFkaWVudC1wcm9ncmVzc2Jhci1jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7OztBQU92QixNQUFNLE9BQU8sbUNBQW1DO0lBMkM5QztRQXhDQSxzQkFBc0I7UUFDYixTQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYztRQUNqQyxLQUFLO1FBQ0wsb0JBQW9CO1FBQ1gsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDNUIsS0FBSztRQUNMLHFDQUFxQztRQUM1QixxQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxjQUFjO1FBQzdDLEtBQUs7UUFDTCxpQkFBaUI7UUFDUixhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1FBQ3BELEtBQUs7UUFDTCw0QkFBNEI7UUFDbkIsVUFBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtRQUNyQyxLQUFLO1FBQ0wsb0NBQW9DO1FBQzNCLHFCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWM7UUFDcEMsc0JBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsZUFBZTtRQUMvQyxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVsQixLQUFLO1FBRUwscUJBQXFCO1FBQ1os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LEtBQUs7c0JBQWIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFTYyxPQUFPO3NCQUExQixTQUFTO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgSW5wdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmd1bGFyLWdyYWRpZW50LXByb2dyZXNzYmFyLWNvbXBvbmVudC5odG1sJyxcclxuICBzZWxlY3RvcjogJ2FuZ3VsYXItZ3JhZGllbnQtcHJvZ3Jlc3NiYXInLFxyXG4gIHN0eWxlVXJsczogWycuL2FuZ3VsYXItZ3JhZGllbnQtcHJvZ3Jlc3NiYXIuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckdyYWRpZW50UHJvZ3Jlc3NiYXJDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdFxyXG57XHJcbiAgLy90eXBlIG9mIHByb2dyZXNzIGJhclxyXG4gIEBJbnB1dCgpIHR5cGUgPSAxOyAvL2RlZmF1bHQgaXMgMVxyXG4gIC8vZW5kXHJcbiAgLy90b29sIHRpcCB0ZXh0Y29sb3JcclxuICBASW5wdXQoKSBsb3dUZXh0Q29sb3IgPSAnJztcclxuICBASW5wdXQoKSBtZWRpdW1UZXh0Q29sb3IgPSAnJztcclxuICBASW5wdXQoKSBoaWdoVGV4dENvbG9yID0gJyc7XHJcbiAgLy9lbmRcclxuICAvL2FkanVzdGluZyB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyXHJcbiAgQElucHV0KCkgcHJvZ3Jlc3NCYXJXaWR0aCA9IDc7IC8vZGVmYXVsdCBpcyA3XHJcbiAgLy9lbmRcclxuICAvLyBudW1iZXIgb2YgYmFyc1xyXG4gIEBJbnB1dCgpIGJhckNvdW50ID0gNzsgLy8gZGVmYXVsdCBpcyA3IGFuZCBtYXggaXMgMTBcclxuICAvL2VuZFxyXG4gIC8vIHZhbHVlIG9mIHRoZSBwcm9ncmVzcyBiYXJcclxuICBASW5wdXQoKSB2YWx1ZSA9IDc1OyAvLyBkZWZhdWx0IGlzIDc1XHJcbiAgLy9lbmRcclxuICAvLyBRdWFydGxlIHZhbHVlIG9mIHRoZSBwcm9ncmVzcyBiYXJcclxuICBASW5wdXQoKSBxdWFydGlsZVZhbHVlTG93ID0gMzsgLy9kZWZhdWx0IHRvIDNcclxuICBASW5wdXQoKSBxdWFydGlsZVZhbHVlSGlnaCA9IDY7IC8vIGRlZmF1bHQgdG8gNlxyXG4gIHF1YXJ0aWxlVmFsdWUgPSAwO1xyXG4gIHF1YXJ0aWxlUGVyY2VudGFnZTogYW55O1xyXG4gIC8vZW5kXHJcblxyXG4gIC8vc2hvdyB0b29sdGlwIG9yIG5vdFxyXG4gIEBJbnB1dCgpIHNob3dUb29sVGlwID0gdHJ1ZTsgLy8gZGVmYXVsdCBpcyB0cnVlXHJcbiAgLy9lbmRcclxuXHJcbiAgLy9zaW1wbGUgcHJvZ3Jlc3MgYmFyIHZhbHVlXHJcbiAgQElucHV0KCkgc2Vjb25kVmFsdWUgPSA3NTsgLy8gZGVmYXVsdCBpcyA3NVxyXG4gIHZhbHVlMSA9IDA7XHJcbiAgLy9lbmRcclxuXHJcbiAgYmxvY2tDbGFzczogYW55O1xyXG4gIGVsZW1lbnRBcnIgPSBbXTtcclxuICBwb3RlbnRpYWxMYWJlbDogYW55O1xyXG4gIHRvb2xUaXBDbGFzczogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdteURpdicpIGRpdlZpZXc6IEVsZW1lbnRSZWY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gMSkge1xyXG4gICAgICAgIHRoaXMucmFuZ2VBcnJheSgpO1xyXG4gICAgICAgIHRoaXMudG9vbFRpcCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gMikge1xyXG4gICAgICAgIHRoaXMudmFsdWUxID0gMTAwIC0gdGhpcy5zZWNvbmRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b29sVGlwKCkge1xyXG4gICAgdGhpcy5xdWFydGlsZVZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLnZhbHVlIC8gdGhpcy5xdWFydGlsZVBlcmNlbnRhZ2UpO1xyXG4gICAgdGhpcy5wb3RlbnRpYWxMYWJlbCA9XHJcbiAgICAgIHRoaXMucXVhcnRpbGVWYWx1ZSA8IHRoaXMucXVhcnRpbGVWYWx1ZUxvd1xyXG4gICAgICAgID8gJ2xvdydcclxuICAgICAgICA6IHRoaXMucXVhcnRpbGVWYWx1ZSA8PSB0aGlzLnF1YXJ0aWxlVmFsdWVIaWdoXHJcbiAgICAgICAgPyAnbWVkaXVtJ1xyXG4gICAgICAgIDogJ2hpZ2gnO1xyXG4gICAgdGhpcy50b29sVGlwQ2xhc3MgPSAnaW5kaWNhdG9yICcgKyB0aGlzLnBvdGVudGlhbExhYmVsO1xyXG4gIH1cclxuXHJcbiAgcmFuZ2VBcnJheSgpIHtcclxuICAgIGlmICh0aGlzLmJhckNvdW50IDw9IDEwKSB7XHJcbiAgICAgIHRoaXMucXVhcnRpbGVQZXJjZW50YWdlID0gMTAwIC8gdGhpcy5iYXJDb3VudDtcclxuICAgICAgdGhpcy5lbGVtZW50QXJyID0gW107XHJcbiAgICAgIGxldCBwZXJjZW50OiBhbnk7XHJcbiAgICAgIGxldCBxdWFydGlsZVZhbHVlOiBhbnk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMuYmFyQ291bnQ7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb2ludCA9IE1hdGgucm91bmQodGhpcy5xdWFydGlsZVBlcmNlbnRhZ2UgKiBpKTtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZSA8PSBjdXJyZW50UG9pbnQpIHtcclxuICAgICAgICAgIC8vQ2hlY2sgaWYgcGVyY2VudCBhbmQgcXVhcnRpbGUgdmFsdWUgaXMgcHJlc2VudCBvZiBub3QuIFRoaXMgcnVucyBvbmx5IG9uZSB0aW1lXHJcbiAgICAgICAgICBpZiAoIXBlcmNlbnQgJiYgIXF1YXJ0aWxlVmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQb2ludCA9IE1hdGgucm91bmQodGhpcy5xdWFydGlsZVBlcmNlbnRhZ2UgKiAoaSAtIDEpKTtcclxuICAgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IGN1cnJlbnRQb2ludCAtIHByZXZpb3VzUG9pbnQ7XHJcbiAgICAgICAgICAgIHF1YXJ0aWxlVmFsdWUgPSBpO1xyXG4gICAgICAgICAgICBwZXJjZW50ID1cclxuICAgICAgICAgICAgICBNYXRoLnJvdW5kKCgodGhpcy52YWx1ZSAtIHByZXZpb3VzUG9pbnQpIC8gZGlmZmVyZW5jZSkgKiAxMDApICtcclxuICAgICAgICAgICAgICAnJSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocGVyY2VudCAmJiBxdWFydGlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmIChpID09PSBxdWFydGlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgLy8gc2V0IHNwZWNpZmllZCBibG9jayB2YWx1ZSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIG1ha2UgZ3JhZGllbnRcclxuICAgICAgICAgICAgICB0aGlzLmRpdlZpZXcubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcclxuICAgICAgICAgICAgICAgICctLWJsb2NrLScgKyBpLFxyXG4gICAgICAgICAgICAgICAgcGVyY2VudFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgLy8gc2V0IGxlZnQgdmFsdWUgdG8gcG9zaXRpb24gdGhlIGluZGljYXRvciBhbmQgdG9vbHRpcFxyXG4gICAgICAgICAgICAgIHRoaXMuZGl2Vmlldy5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFxyXG4gICAgICAgICAgICAgICAgJy0tbGVmdC12YWx1ZScsXHJcbiAgICAgICAgICAgICAgICBwZXJjZW50XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93VG9vbFRpcCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYmxvY2tDbGFzcyA9XHJcbiAgICAgICAgICAgICAgICAnaXRlbSAnICsgKGkgPT09IHF1YXJ0aWxlVmFsdWUgPyAnY3VycmVudCBmaWxsZWQnIDogJycpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZWxlbWVudEFyci5wdXNoKHRoaXMuYmxvY2tDbGFzcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ibG9ja0NsYXNzID1cclxuICAgICAgICAgICAgICAgICdpdGVtICcgKyAoaSA9PT0gcXVhcnRpbGVWYWx1ZSA/ICd0b29sIGZpbGxlZCcgOiAnJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5lbGVtZW50QXJyLnB1c2godGhpcy5ibG9ja0NsYXNzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmJsb2NrQ2xhc3MgPSAnaXRlbSBmaWxsZWQnO1xyXG4gICAgICAgICAgdGhpcy5lbGVtZW50QXJyLnB1c2godGhpcy5ibG9ja0NsYXNzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09IDFcIj5cclxuICA8ZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICAjbXlEaXZcclxuICAgICAgY2xhc3M9XCJwb3RlbnRpYWxfX3JhbmdlXCJcclxuICAgICAgc3R5bGU9XCItLWxvd1RleHQ6e3sgbG93VGV4dENvbG9yIH19IDsgLS1tZWRpdW1UZXh0Ont7bWVkaXVtVGV4dENvbG9yfX07IC0taGlnaFRleHQ6e3toaWdoVGV4dENvbG9yfX07IC0tcHJvZ3Jlc3NCYXJXaWR0aDp7e3Byb2dyZXNzQmFyV2lkdGh9fTtcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicmFuZ2VcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGVsZW1lbnRBcnI7IGxldCBpID0gaW5kZXhcIiBbY2xhc3NdPVwiaXRlbVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cIml0ZW0gPT09ICdpdGVtIGN1cnJlbnQgZmlsbGVkJyAmJiBzaG93VG9vbFRpcFwiXHJcbiAgICAgICAgICAgIFtjbGFzc109XCJ0b29sVGlwQ2xhc3NcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dUb29sVGlwXCI+e3sgcG90ZW50aWFsTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PT0gMiAmJiBzZWNvbmRWYWx1ZSA8PTEwMCBcIj5cclxuICA8ZGl2IGNsYXNzPVwiZGlzcGxheV9cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXzFcIiBzdHlsZT1cIi0tcDp7eyB2YWx1ZTEgfX0lXCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=