@zulkarnainshah/ng-rating-bar
Version:
Fully customizable rating bar component for Angular based apps
117 lines • 18.1 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class NgRatingBarComponent {
constructor() {
this.rating = 0;
this.filledImgSrc = '../../assets/ng-rating-bar/star_filled.png';
this.emptyImgSrc = '../../assets/ng-rating-bar/star_empty.png';
this.halfFilledImgSrc = '../../assets/ng-rating-bar/star_half.png';
this.size = '15px';
this.totalStars = 5;
this.disabled = false;
this.animateOnHover = true;
this.gap = '3px';
this.ratingChanged = new EventEmitter();
this.editableRating = 0;
this.filledStars = 0;
this.hasFractions = false;
this.emptyStars = 5;
}
ngOnInit() {
this.editableRating = this.rating;
this.calculateStars();
}
calculateStars() {
//If totalStars supplied by user is a number with decimal point
this.totalStars = Math.ceil(this.totalStars);
if (this.editableRating != null && this.editableRating > this.totalStars) {
this.editableRating = this.totalStars;
}
let tokens = this.editableRating
? this.editableRating?.toString().split('.')
: null;
if (tokens) {
var wholeNumbers = tokens[0]
? tokens[0]
: this.editableRating?.toString();
this.hasFractions = tokens[1] ? true : false;
this.filledStars = wholeNumbers ? parseInt(wholeNumbers) : 0;
this.emptyStars = this.totalStars - Math.ceil(this.editableRating);
}
}
mouseEnteredFilledStar(event, index) {
this.filledStars = index + 1;
this.editableRating = this.filledStars;
this.calculateStars();
if (this.animateOnHover) {
event.target.classList.add('hover-animation');
}
}
mouseEnteredEmptyStar(event, index) {
this.editableRating = this.filledStars + (index + 1);
this.calculateStars();
if (this.animateOnHover) {
event.target.classList.add('hover-animation');
}
}
mouseEnteredHalfStar(event) {
if (this.animateOnHover) {
event.target.classList.add('hover-animation');
}
}
mouseLeftFilledStar(event, index) {
this.editableRating = this.filledStars - (index - 1);
this.calculateStars();
if (this.animateOnHover) {
event.target.classList.remove('hover-animation');
}
}
mouseLeftEmptyStar(event) {
if (this.animateOnHover) {
event.target.classList.remove('hover-animation');
}
}
mouseLeftHalfStar(event) {
if (this.animateOnHover) {
event.target.classList.remove('hover-animation');
}
}
onMouseLeftContainer() {
this.editableRating = this.rating;
this.calculateStars();
}
filledStarClicked(index) {
this.rating = index + 1;
this.editableRating = this.rating;
this.calculateStars();
this.ratingChanged?.emit(this.rating);
}
}
NgRatingBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgRatingBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
NgRatingBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: NgRatingBarComponent, selector: "ng-rating-bar", inputs: { rating: "rating", filledImgSrc: "filledImgSrc", emptyImgSrc: "emptyImgSrc", halfFilledImgSrc: "halfFilledImgSrc", size: "size", totalStars: "totalStars", disabled: "disabled", animateOnHover: "animateOnHover", gap: "gap" }, outputs: { ratingChanged: "ratingChanged" }, ngImport: i0, template: "<div class=\"container\" (mouseleave)=\"onMouseLeftContainer()\">\n <!-- Full-filled stars -->\n <img\n *ngFor=\"let _ of [].constructor(filledStars); let i = index\"\n src=\"{{ filledImgSrc }}\"\n class=\"star\"\n [ngStyle]=\"{ width: size, margin: '0px' + ' ' + gap }\"\n (mouseenter)=\"disabled ? '' : mouseEnteredFilledStar($event, i)\"\n (mouseleave)=\"disabled ? '' : mouseLeftFilledStar($event, i)\"\n (click)=\"disabled ? '' : filledStarClicked(i)\"\n />\n\n <!-- Half-filled stars -->\n <img\n *ngIf=\"hasFractions\"\n src=\"{{ halfFilledImgSrc }}\"\n class=\"star\"\n (mouseenter)=\"disabled ? '' : mouseEnteredHalfStar($event)\"\n (mouseleave)=\"disabled ? '' : mouseLeftHalfStar($event)\"\n [ngStyle]=\"{ width: size, margin: '0px' + ' ' + gap }\"\n />\n\n <!-- Empty stars -->\n <img\n *ngFor=\"let _ of [].constructor(emptyStars); let i = index\"\n src=\"{{ emptyImgSrc }}\"\n class=\"star\"\n [ngStyle]=\"{ width: size, margin: '0px' + ' ' + gap }\"\n (mouseenter)=\"disabled ? '' : mouseEnteredEmptyStar($event, i)\"\n (mouseleave)=\"disabled ? '' : mouseLeftEmptyStar($event)\"\n />\n</div>\n", styles: [".star{width:15px;transition:all .3s}.hover-animation{transform:rotate(-20deg) scale(1.3)}\n"], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgRatingBarComponent, decorators: [{
type: Component,
args: [{ selector: 'ng-rating-bar', template: "<div class=\"container\" (mouseleave)=\"onMouseLeftContainer()\">\n <!-- Full-filled stars -->\n <img\n *ngFor=\"let _ of [].constructor(filledStars); let i = index\"\n src=\"{{ filledImgSrc }}\"\n class=\"star\"\n [ngStyle]=\"{ width: size, margin: '0px' + ' ' + gap }\"\n (mouseenter)=\"disabled ? '' : mouseEnteredFilledStar($event, i)\"\n (mouseleave)=\"disabled ? '' : mouseLeftFilledStar($event, i)\"\n (click)=\"disabled ? '' : filledStarClicked(i)\"\n />\n\n <!-- Half-filled stars -->\n <img\n *ngIf=\"hasFractions\"\n src=\"{{ halfFilledImgSrc }}\"\n class=\"star\"\n (mouseenter)=\"disabled ? '' : mouseEnteredHalfStar($event)\"\n (mouseleave)=\"disabled ? '' : mouseLeftHalfStar($event)\"\n [ngStyle]=\"{ width: size, margin: '0px' + ' ' + gap }\"\n />\n\n <!-- Empty stars -->\n <img\n *ngFor=\"let _ of [].constructor(emptyStars); let i = index\"\n src=\"{{ emptyImgSrc }}\"\n class=\"star\"\n [ngStyle]=\"{ width: size, margin: '0px' + ' ' + gap }\"\n (mouseenter)=\"disabled ? '' : mouseEnteredEmptyStar($event, i)\"\n (mouseleave)=\"disabled ? '' : mouseLeftEmptyStar($event)\"\n />\n</div>\n", styles: [".star{width:15px;transition:all .3s}.hover-animation{transform:rotate(-20deg) scale(1.3)}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { rating: [{
type: Input
}], filledImgSrc: [{
type: Input
}], emptyImgSrc: [{
type: Input
}], halfFilledImgSrc: [{
type: Input
}], size: [{
type: Input
}], totalStars: [{
type: Input
}], disabled: [{
type: Input
}], animateOnHover: [{
type: Input
}], gap: [{
type: Input
}], ratingChanged: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcmF0aW5nLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1yYXRpbmctYmFyL3NyYy9saWIvbmctcmF0aW5nLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1yYXRpbmctYmFyL3NyYy9saWIvbmctcmF0aW5nLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPL0UsTUFBTSxPQUFPLG9CQUFvQjtJQWtCL0I7UUFqQlMsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixpQkFBWSxHQUFZLDRDQUE0QyxDQUFDO1FBQ3JFLGdCQUFXLEdBQVksMkNBQTJDLENBQUM7UUFDbkUscUJBQWdCLEdBQ3ZCLDBDQUEwQyxDQUFDO1FBQ3BDLFNBQUksR0FBVyxNQUFNLENBQUM7UUFDdEIsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLFFBQUcsR0FBVyxLQUFLLENBQUM7UUFDbkIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXJELG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGVBQVUsR0FBVyxDQUFDLENBQUM7SUFFUixDQUFDO0lBRWhCLFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLCtEQUErRDtRQUMvRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUks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SSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDOztpSEFqR1Usb0JBQW9CO3FHQUFwQixvQkFBb0IsNFVDUGpDLHlwQ0FnQ0E7MkZEekJhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxlQUFlOzBFQUtoQixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLXJhdGluZy1iYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vbmctcmF0aW5nLWJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25nLXJhdGluZy1iYXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTmdSYXRpbmdCYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSByYXRpbmc6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGZpbGxlZEltZ1NyYz86IHN0cmluZyA9ICcuLi8uLi9hc3NldHMvbmctcmF0aW5nLWJhci9zdGFyX2ZpbGxlZC5wbmcnO1xuICBASW5wdXQoKSBlbXB0eUltZ1NyYz86IHN0cmluZyA9ICcuLi8uLi9hc3NldHMvbmctcmF0aW5nLWJhci9zdGFyX2VtcHR5LnBuZyc7XG4gIEBJbnB1dCgpIGhhbGZGaWxsZWRJbWdTcmM/OiBzdHJpbmcgPVxuICAgICcuLi8uLi9hc3NldHMvbmctcmF0aW5nLWJhci9zdGFyX2hhbGYucG5nJztcbiAgQElucHV0KCkgc2l6ZTogc3RyaW5nID0gJzE1cHgnO1xuICBASW5wdXQoKSB0b3RhbFN0YXJzOiBudW1iZXIgPSA1O1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbmltYXRlT25Ib3ZlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGdhcDogc3RyaW5nID0gJzNweCc7XG4gIEBPdXRwdXQoKSByYXRpbmdDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgZWRpdGFibGVSYXRpbmc6IG51bWJlciA9IDA7XG4gIGZpbGxlZFN0YXJzOiBudW1iZXIgPSAwO1xuICBoYXNGcmFjdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZW1wdHlTdGFyczogbnVtYmVyID0gNTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0YWJsZVJhdGluZyA9IHRoaXMucmF0aW5nO1xuICAgIHRoaXMuY2FsY3VsYXRlU3RhcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlU3RhcnMoKSB7XG4gICAgLy9JZiB0b3RhbFN0YXJzIHN1cHBsaWVkIGJ5IHVzZXIgaXMgYSBudW1iZXIgd2l0aCBkZWNpbWFsIHBvaW50XG4gICAgdGhpcy50b3RhbFN0YXJzID0gTWF0aC5jZWlsKHRoaXMudG90YWxTdGFycyk7XG4gICAgaWYgKHRoaXMuZWRpdGFibGVSYXRpbmcgIT0gbnVsbCAmJiB0aGlzLmVkaXRhYmxlUmF0aW5nID4gdGhpcy50b3RhbFN0YXJzKSB7XG4gICAgICB0aGlzLmVkaXRhYmxlUmF0aW5nID0gdGhpcy50b3RhbFN0YXJzO1xuICAgIH1cbiAgICBsZXQgdG9rZW5zID0gdGhpcy5lZGl0YWJsZVJhdGluZ1xuICAgICAgPyB0aGlzLmVkaXRhYmxlUmF0aW5nPy50b1N0cmluZygpLnNwbGl0KCcuJylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAodG9rZW5zKSB7XG4gICAgICB2YXIgd2hvbGVOdW1iZXJzID0gdG9rZW5zWzBdXG4gICAgICAgID8gdG9rZW5zWzBdXG4gICAgICAgIDogdGhpcy5lZGl0YWJsZVJhdGluZz8udG9TdHJpbmcoKTtcbiAgICAgIHRoaXMuaGFzRnJhY3Rpb25zID0gdG9rZW5zWzFdID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgdGhpcy5maWxsZWRTdGFycyA9IHdob2xlTnVtYmVycyA/IHBhcnNlSW50KHdob2xlTnVtYmVycykgOiAwO1xuICAgICAgdGhpcy5lbXB0eVN0YXJzID0gdGhpcy50b3RhbFN0YXJzIC0gTWF0aC5jZWlsKHRoaXMuZWRpdGFibGVSYXRpbmchKTtcbiAgICB9XG4gIH1cblxuICBtb3VzZUVudGVyZWRGaWxsZWRTdGFyKGV2ZW50OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmZpbGxlZFN0YXJzID0gaW5kZXggKyAxO1xuICAgIHRoaXMuZWRpdGFibGVSYXRpbmcgPSB0aGlzLmZpbGxlZFN0YXJzO1xuICAgIHRoaXMuY2FsY3VsYXRlU3RhcnMoKTtcbiAgICBpZiAodGhpcy5hbmltYXRlT25Ib3Zlcikge1xuICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2hvdmVyLWFuaW1hdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIG1vdXNlRW50ZXJlZEVtcHR5U3RhcihldmVudDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5lZGl0YWJsZVJhdGluZyA9IHRoaXMuZmlsbGVkU3RhcnMgKyAoaW5kZXggKyAxKTtcbiAgICB0aGlzLmNhbGN1bGF0ZVN0YXJzKCk7XG4gICAgaWYgKHRoaXMuYW5pbWF0ZU9uSG92ZXIpIHtcbiAgICAgIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuYWRkKCdob3Zlci1hbmltYXRpb24nKTtcbiAgICB9XG4gIH1cblxuICBtb3VzZUVudGVyZWRIYWxmU3RhcihldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0ZU9uSG92ZXIpIHtcbiAgICAgIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuYWRkKCdob3Zlci1hbmltYXRpb24nKTtcbiAgICB9XG4gIH1cblxuICBtb3VzZUxlZnRGaWxsZWRTdGFyKGV2ZW50OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmVkaXRhYmxlUmF0aW5nID0gdGhpcy5maWxsZWRTdGFycyAtIChpbmRleCAtIDEpO1xuICAgIHRoaXMuY2FsY3VsYXRlU3RhcnMoKTtcbiAgICBpZiAodGhpcy5hbmltYXRlT25Ib3Zlcikge1xuICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2hvdmVyLWFuaW1hdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIG1vdXNlTGVmdEVtcHR5U3RhcihldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0ZU9uSG92ZXIpIHtcbiAgICAgIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdob3Zlci1hbmltYXRpb24nKTtcbiAgICB9XG4gIH1cblxuICBtb3VzZUxlZnRIYWxmU3RhcihldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0ZU9uSG92ZXIpIHtcbiAgICAgIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdob3Zlci1hbmltYXRpb24nKTtcbiAgICB9XG4gIH1cblxuICBvbk1vdXNlTGVmdENvbnRhaW5lcigpIHtcbiAgICB0aGlzLmVkaXRhYmxlUmF0aW5nID0gdGhpcy5yYXRpbmc7XG4gICAgdGhpcy5jYWxjdWxhdGVTdGFycygpO1xuICB9XG5cbiAgZmlsbGVkU3RhckNsaWNrZWQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMucmF0aW5nID0gaW5kZXggKyAxO1xuICAgIHRoaXMuZWRpdGFibGVSYXRpbmcgPSB0aGlzLnJhdGluZztcbiAgICB0aGlzLmNhbGN1bGF0ZVN0YXJzKCk7XG4gICAgdGhpcy5yYXRpbmdDaGFuZ2VkPy5lbWl0KHRoaXMucmF0aW5nKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiIChtb3VzZWxlYXZlKT1cIm9uTW91c2VMZWZ0Q29udGFpbmVyKClcIj5cbiAgPCEtLSBGdWxsLWZpbGxlZCBzdGFycyAtLT5cbiAgPGltZ1xuICAgICpuZ0Zvcj1cImxldCBfIG9mIFtdLmNvbnN0cnVjdG9yKGZpbGxlZFN0YXJzKTsgbGV0IGkgPSBpbmRleFwiXG4gICAgc3JjPVwie3sgZmlsbGVkSW1nU3JjIH19XCJcbiAgICBjbGFzcz1cInN0YXJcIlxuICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHNpemUsIG1hcmdpbjogJzBweCcgKyAnICcgKyBnYXAgfVwiXG4gICAgKG1vdXNlZW50ZXIpPVwiZGlzYWJsZWQgPyAnJyA6IG1vdXNlRW50ZXJlZEZpbGxlZFN0YXIoJGV2ZW50LCBpKVwiXG4gICAgKG1vdXNlbGVhdmUpPVwiZGlzYWJsZWQgPyAnJyA6IG1vdXNlTGVmdEZpbGxlZFN0YXIoJGV2ZW50LCBpKVwiXG4gICAgKGNsaWNrKT1cImRpc2FibGVkID8gJycgOiBmaWxsZWRTdGFyQ2xpY2tlZChpKVwiXG4gIC8+XG5cbiAgPCEtLSBIYWxmLWZpbGxlZCBzdGFycyAtLT5cbiAgPGltZ1xuICAgICpuZ0lmPVwiaGFzRnJhY3Rpb25zXCJcbiAgICBzcmM9XCJ7eyBoYWxmRmlsbGVkSW1nU3JjIH19XCJcbiAgICBjbGFzcz1cInN0YXJcIlxuICAgIChtb3VzZWVudGVyKT1cImRpc2FibGVkID8gJycgOiBtb3VzZUVudGVyZWRIYWxmU3RhcigkZXZlbnQpXCJcbiAgICAobW91c2VsZWF2ZSk9XCJkaXNhYmxlZCA/ICcnIDogbW91c2VMZWZ0SGFsZlN0YXIoJGV2ZW50KVwiXG4gICAgW25nU3R5bGVdPVwieyB3aWR0aDogc2l6ZSwgbWFyZ2luOiAnMHB4JyArICcgJyArIGdhcCB9XCJcbiAgLz5cblxuICA8IS0tIEVtcHR5IHN0YXJzIC0tPlxuICA8aW1nXG4gICAgKm5nRm9yPVwibGV0IF8gb2YgW10uY29uc3RydWN0b3IoZW1wdHlTdGFycyk7IGxldCBpID0gaW5kZXhcIlxuICAgIHNyYz1cInt7IGVtcHR5SW1nU3JjIH19XCJcbiAgICBjbGFzcz1cInN0YXJcIlxuICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHNpemUsIG1hcmdpbjogJzBweCcgKyAnICcgKyBnYXAgfVwiXG4gICAgKG1vdXNlZW50ZXIpPVwiZGlzYWJsZWQgPyAnJyA6IG1vdXNlRW50ZXJlZEVtcHR5U3RhcigkZXZlbnQsIGkpXCJcbiAgICAobW91c2VsZWF2ZSk9XCJkaXNhYmxlZCA/ICcnIDogbW91c2VMZWZ0RW1wdHlTdGFyKCRldmVudClcIlxuICAvPlxuPC9kaXY+XG4iXX0=