controlled-rising-skyline
Version:
This library provides a rising skyline chart with an horizontal control panel control. This widget is linked to a dynamic history of buildings. An animation displays the rising of the skyline.
172 lines • 16.9 kB
JavaScript
import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
import { RisingSkylineService } from 'rising-skyline';
import { BehaviorSubject } from 'rxjs';
export class ControlledRisingSkylineComponent {
constructor(skylineService) {
this.skylineService = skylineService;
/**
* The width of the container, with its units of mesure (px, %, em...).
* Defaut value is __'600px'__;
*/
this.width = '600px';
/**
* The height of the container, with its units of mesure (px, %, em...).
* Defaut value is _'400px'_;
*/
this.height = '400px';
/**
* The margin around the container.
* Defaut value is _'10px'_;
*/
this.margin = '10px';
/**
/**
* The width of each building on the skyline without the unit of measure.
* Defaut value is __40__;
*/
this.buildingWidth = 40;
/**
* This behaviorSubject emits the complete story of the rising skyline.
*
* This reveived array will be passed to the __SkylineService__.
*/
this.risingSkylineHistory$ = new BehaviorSubject([]);
/**
* Starting speed of the animation in ms.
* Default value is _30_
*/
this.speed = 30;
/**
* __Starting__ color of the color gradation.
* Default value is _ping_
*/
this.startingColor = 'red';
/**
* __Ending__ color of the color gradation.
* Default value is _blue_
*/
this.endingColor = 'green';
/**
* Always display the vertical title on top of each building.
*
* Default value is **false**.
*/
this.displayVerticalTitle = false;
/**
* Display the vertical title when the building height reaches this value.
*
* Default value is **10**.
*/
this.buildingMinimumHeightVerticalTitle = 10;
/**
* Color of the skyline container
*/
this.skylineBackgroundColor = 'transparent';
/**
* Color of the skyline control panel
*/
this.controlBackgroundColor = 'lightGrey';
/**
* __Slider__ color.
* Default value is _violet_
*/
this.sliderColor = 'violet';
/**
* (_Internal_) debug mode.
* Default value is **false**
*/
this.debug = false;
/**
* This messenger wil inform the parent container that the user has clicked a building.
*/
this.onClickBuilding = new EventEmitter();
/**
* This messenger will inform the parent container that the user is entering on a building.
*/
this.onEnterBuilding = new EventEmitter();
/**
* This messenger wil inform the parent container that the user is entering on a building.
*/
this.onLeaveBuilding = new EventEmitter();
/**
* The current position of floor _(or episode)_ being drawn.
*/
this.positionOfFloor = 0;
}
ngOnInit() {
if (this.debug) {
console.log('Skyline w ' + this.width + ', h ' + this.height);
}
this.subscriptionSkyline = this.skylineService.episode$
.subscribe({
next: floors => this.positionOfFloor++
});
}
/**
* After view initialization : Here, we set the width of the container.
*/
ngAfterViewInit() {
const mainDiv = document.getElementById('mainDiv');
if (mainDiv) {
mainDiv.setAttribute('style', 'width:' + this.width + 'px;height:' + this.height + 'px');
if (this.debug) {
console.log(mainDiv.getAttribute('style'));
}
}
else {
console.error('INTERNAL ERROR : Did not retrieve the main div');
}
}
/**
* Mouse is entering the building.
*/
mouseEnterBuilding($event) {
this.onEnterBuilding.emit($event);
}
/**
* Mouse is leaving the building.
*/
mouseLeaveBuilding($event) {
this.onLeaveBuilding.emit($event);
}
/**
* Mouse is clicking the building.
*/
mouseClickBuilding($event) {
this.onClickBuilding.emit($event);
}
ngOnDestroy() {
this.subscriptionSkyline.unsubscribe();
}
}
ControlledRisingSkylineComponent.decorators = [
{ type: Component, args: [{
selector: 'controlled-rising-skyline',
template: "<div id=\"mainDiv\" >\n\n\t<rising-skyline\n\t\t[width] = width\n\t\t[height] = height\n\t\t[margin] = margin\n\t\t[risingSkylineHistory$] = risingSkylineHistory$\n\t\t[speed] = speed\n\t\t[displayVerticalTitle] = displayVerticalTitle\n\t\t[buildingMinimumHeightVerticalTitle]=buildingMinimumHeightVerticalTitle\n\t\t[startingColor] = startingColor\n\t\t[endingColor] = endingColor\n\t\t[font] = font\n\t\t(onClickBuilding)=\"mouseClickBuilding($event)\"\n\t\t(onEnterBuilding)=\"mouseEnterBuilding($event)\"\n\t\t(onLeaveBuilding)=\"mouseLeaveBuilding($event)\">\t\t\n\t</rising-skyline>\n\n\t<app-panel-control \n\t\t[backgroundColor] = controlBackgroundColor\n\t\t[sliderColor] = sliderColor\n\t\t[debug] = debug>\n\t</app-panel-control>\n</div>",
styles: ["#mainDiv{background-color:var(--skyline-background-color);width:var(--mainDiv-width);height:var(--mainDiv-height)}\n"]
},] }
];
ControlledRisingSkylineComponent.ctorParameters = () => [
{ type: RisingSkylineService }
];
ControlledRisingSkylineComponent.propDecorators = {
width: [{ type: Input }, { type: HostBinding, args: ['style.--mainDiv-width',] }],
height: [{ type: Input }, { type: HostBinding, args: ['style.--mainDiv-height',] }],
margin: [{ type: Input }],
buildingWidth: [{ type: Input }],
risingSkylineHistory$: [{ type: Input }],
speed: [{ type: Input }],
startingColor: [{ type: Input }],
endingColor: [{ type: Input }],
displayVerticalTitle: [{ type: Input }],
buildingMinimumHeightVerticalTitle: [{ type: Input }],
font: [{ type: Input }],
skylineBackgroundColor: [{ type: HostBinding, args: ['style.--skyline-background-color',] }, { type: Input }],
controlBackgroundColor: [{ type: Input }],
sliderColor: [{ type: Input }],
debug: [{ type: Input }],
onClickBuilding: [{ type: Output }],
onEnterBuilding: [{ type: Output }],
onLeaveBuilding: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlZC1yaXNpbmctc2t5bGluZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb250cm9sbGVkLXJpc2luZy1za3lsaW5lL3NyYy9saWIvY29udHJvbGxlZC1yaXNpbmctc2t5bGluZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQThCLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFPckQsTUFBTSxPQUFPLGdDQUFnQztJQXdJNUMsWUFBbUIsY0FBb0M7UUFBcEMsbUJBQWMsR0FBZCxjQUFjLENBQXNCO1FBdEl2RDs7O1dBR0c7UUFHSSxVQUFLLEdBQUcsT0FBTyxDQUFDO1FBRXZCOzs7V0FHRztRQUdJLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFeEI7OztXQUdHO1FBRUksV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUV2Qjs7OztXQUlHO1FBRUksa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFFMUI7Ozs7V0FJRztRQUVJLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRW5FOzs7V0FHRztRQUVJLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFbEI7OztXQUdHO1FBRUksa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFN0I7OztXQUdHO1FBRUksZ0JBQVcsR0FBRyxPQUFPLENBQUM7UUFFN0I7Ozs7V0FJRztRQUNNLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUV0Qzs7OztXQUlHO1FBQ00sdUNBQWtDLEdBQUcsRUFBRSxDQUFDO1FBT2pEOztXQUVHO1FBRU0sMkJBQXNCLEdBQUcsYUFBYSxDQUFDO1FBRWhEOztXQUVHO1FBQ00sMkJBQXNCLEdBQUcsV0FBVyxDQUFDO1FBRTlDOzs7V0FHRztRQUVJLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBRTlCOzs7V0FHRztRQUVJLFVBQUssR0FBRyxLQUFLLENBQUM7UUFFckI7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBRWpFOztXQUVHO1FBQ08sb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUVqRTs7V0FFRztRQUNPLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFPakU7O1dBRUc7UUFDSSxvQkFBZSxHQUFHLENBQUMsQ0FBQztJQVEzQixDQUFDO0lBR0QsUUFBUTtRQUNQLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5RDtRQUVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVE7YUFDckQsU0FBUyxDQUFDO1lBQ1YsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0Q7O09BRUc7SUFDSCxlQUFlO1FBQ2QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxJQUFJLE9BQU8sRUFBRTtZQUNaLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3pGLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUMzQztTQUNEO2FBQU07WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDaEU7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxNQUF3QjtRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxNQUF3QjtRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxNQUF3QjtRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBR0QsV0FBVztRQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QyxDQUFDOzs7WUFwTUQsU0FBUyxTQUFDO2dCQUNWLFFBQVEsRUFBRSwyQkFBMkI7Z0JBQ3JDLHd2QkFBK0M7O2FBRS9DOzs7WUFQb0Msb0JBQW9COzs7b0JBY3ZELEtBQUssWUFDTCxXQUFXLFNBQUMsdUJBQXVCO3FCQU9uQyxLQUFLLFlBQ0wsV0FBVyxTQUFDLHdCQUF3QjtxQkFPcEMsS0FBSzs0QkFRTCxLQUFLO29DQVFMLEtBQUs7b0JBT0wsS0FBSzs0QkFPTCxLQUFLOzBCQU9MLEtBQUs7bUNBUUwsS0FBSztpREFPTCxLQUFLO21CQUtMLEtBQUs7cUNBS0wsV0FBVyxTQUFDLGtDQUFrQyxjQUM5QyxLQUFLO3FDQUtMLEtBQUs7MEJBTUwsS0FBSztvQkFPTCxLQUFLOzhCQU1MLE1BQU07OEJBS04sTUFBTTs4QkFLTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnVpbGRpbmcsIEJ1aWxkaW5nU2VsZWN0ZWQsIFJpc2luZ1NreWxpbmVTZXJ2aWNlIH0gZnJvbSAncmlzaW5nLXNreWxpbmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnY29udHJvbGxlZC1yaXNpbmctc2t5bGluZScsXG5cdHRlbXBsYXRlVXJsOiAnLi9jb250cm9sbGVkLXJpc2luZy1za3lsaW5lLmh0bWwnLFxuXHRzdHlsZVVybHM6IFsnLi9jb250cm9sbGVkLXJpc2luZy1za3lsaW5lLmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZWRSaXNpbmdTa3lsaW5lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG5cdC8qKlxuXHQgKiBUaGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lciwgd2l0aCBpdHMgdW5pdHMgb2YgbWVzdXJlIChweCwgJSwgZW0uLi4pLlxuXHQgKiBEZWZhdXQgdmFsdWUgaXMgX18nNjAwcHgnX187XG5cdCAqL1xuXHRASW5wdXQoKVxuXHRASG9zdEJpbmRpbmcoJ3N0eWxlLi0tbWFpbkRpdi13aWR0aCcpXG5cdHB1YmxpYyB3aWR0aCA9ICc2MDBweCc7XG5cblx0LyoqXG5cdCAqIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lciwgd2l0aCBpdHMgdW5pdHMgb2YgbWVzdXJlIChweCwgJSwgZW0uLi4pLlxuXHQgKiBEZWZhdXQgdmFsdWUgaXMgXyc0MDBweCdfO1xuXHQgKi9cblx0QElucHV0KClcblx0QEhvc3RCaW5kaW5nKCdzdHlsZS4tLW1haW5EaXYtaGVpZ2h0Jylcblx0cHVibGljIGhlaWdodCA9ICc0MDBweCc7XG5cblx0LyoqXG5cdCAqIFRoZSBtYXJnaW4gYXJvdW5kIHRoZSBjb250YWluZXIuXG5cdCAqIERlZmF1dCB2YWx1ZSBpcyBfJzEwcHgnXztcblx0ICovXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBtYXJnaW4gPSAnMTBweCc7XG5cblx0LyoqXG5cdC8qKlxuXHQgKiBUaGUgd2lkdGggb2YgZWFjaCBidWlsZGluZyBvbiB0aGUgc2t5bGluZSB3aXRob3V0IHRoZSB1bml0IG9mIG1lYXN1cmUuXG5cdCAqIERlZmF1dCB2YWx1ZSBpcyBfXzQwX187XG5cdCAqL1xuXHRASW5wdXQoKVxuXHRwdWJsaWMgYnVpbGRpbmdXaWR0aCA9IDQwO1xuXG5cdC8qKlxuXHQgKiBUaGlzIGJlaGF2aW9yU3ViamVjdCBlbWl0cyB0aGUgY29tcGxldGUgc3Rvcnkgb2YgdGhlIHJpc2luZyBza3lsaW5lLlxuXHQgKlxuXHQgKiBUaGlzIHJldmVpdmVkIGFycmF5IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBfX1NreWxpbmVTZXJ2aWNlX18uXG5cdCAqL1xuXHRASW5wdXQoKVxuXHRwdWJsaWMgcmlzaW5nU2t5bGluZUhpc3RvcnkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCdWlsZGluZ1tdPihbXSk7XG5cblx0LyoqXG5cdCAqIFN0YXJ0aW5nIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gaW4gbXMuXG5cdCAqIERlZmF1bHQgdmFsdWUgaXMgXzMwX1xuXHQgKi9cblx0QElucHV0KClcblx0cHVibGljIHNwZWVkID0gMzA7XG5cblx0LyoqXG5cdCAqIF9fU3RhcnRpbmdfXyBjb2xvciBvZiB0aGUgY29sb3IgZ3JhZGF0aW9uLlxuXHQgKiBEZWZhdWx0IHZhbHVlIGlzIF9waW5nX1xuXHQgKi9cblx0QElucHV0KClcblx0cHVibGljIHN0YXJ0aW5nQ29sb3IgPSAncmVkJztcblxuXHQvKipcblx0ICogIF9fRW5kaW5nX18gY29sb3Igb2YgdGhlIGNvbG9yIGdyYWRhdGlvbi5cblx0ICogRGVmYXVsdCB2YWx1ZSBpcyBfYmx1ZV9cblx0ICovXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBlbmRpbmdDb2xvciA9ICdncmVlbic7XG5cblx0LyoqXG5cdCAqIEFsd2F5cyBkaXNwbGF5IHRoZSB2ZXJ0aWNhbCB0aXRsZSBvbiB0b3Agb2YgZWFjaCBidWlsZGluZy5cblx0ICogXG5cdCAqIERlZmF1bHQgdmFsdWUgaXMgKipmYWxzZSoqLlxuXHQgKi9cblx0QElucHV0KCkgZGlzcGxheVZlcnRpY2FsVGl0bGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogRGlzcGxheSB0aGUgdmVydGljYWwgdGl0bGUgd2hlbiB0aGUgYnVpbGRpbmcgaGVpZ2h0IHJlYWNoZXMgdGhpcyB2YWx1ZS5cblx0ICogXG5cdCAqIERlZmF1bHQgdmFsdWUgaXMgKioxMCoqLlxuXHQgKi9cblx0QElucHV0KCkgYnVpbGRpbmdNaW5pbXVtSGVpZ2h0VmVydGljYWxUaXRsZSA9IDEwO1xuXG5cdC8qKlxuXHQgKiBUaGUgZm9udCB0byB1c2UgZm9yIHRoZSB2ZXJ0aWNhbCB0aXRsZVxuXHQgKi9cblx0QElucHV0KCkgZm9udDogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBDb2xvciBvZiB0aGUgc2t5bGluZSBjb250YWluZXJcblx0ICovXG5cdEBIb3N0QmluZGluZygnc3R5bGUuLS1za3lsaW5lLWJhY2tncm91bmQtY29sb3InKVxuXHRASW5wdXQoKSBza3lsaW5lQmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcblxuXHQvKipcblx0ICogQ29sb3Igb2YgdGhlIHNreWxpbmUgY29udHJvbCBwYW5lbFxuXHQgKi9cblx0QElucHV0KCkgY29udHJvbEJhY2tncm91bmRDb2xvciA9ICdsaWdodEdyZXknO1xuXG5cdC8qKlxuXHQgKiAgX19TbGlkZXJfXyBjb2xvci5cblx0ICogRGVmYXVsdCB2YWx1ZSBpcyBfdmlvbGV0X1xuXHQgKi9cblx0QElucHV0KClcblx0cHVibGljIHNsaWRlckNvbG9yID0gJ3Zpb2xldCc7XG5cblx0LyoqXG5cdCAqICAoX0ludGVybmFsXykgZGVidWcgbW9kZS5cblx0ICogRGVmYXVsdCB2YWx1ZSBpcyAqKmZhbHNlKipcblx0ICovXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBkZWJ1ZyA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBUaGlzIG1lc3NlbmdlciB3aWwgaW5mb3JtIHRoZSBwYXJlbnQgY29udGFpbmVyIHRoYXQgdGhlIHVzZXIgaGFzIGNsaWNrZWQgYSBidWlsZGluZy5cblx0ICovXG5cdEBPdXRwdXQoKSBvbkNsaWNrQnVpbGRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1aWxkaW5nU2VsZWN0ZWQ+KCk7XG5cblx0LyoqXG5cdCAqIFRoaXMgbWVzc2VuZ2VyIHdpbGwgaW5mb3JtIHRoZSBwYXJlbnQgY29udGFpbmVyIHRoYXQgdGhlIHVzZXIgaXMgZW50ZXJpbmcgb24gYSBidWlsZGluZy5cblx0ICovXG5cdEBPdXRwdXQoKSBvbkVudGVyQnVpbGRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1aWxkaW5nU2VsZWN0ZWQ+KCk7XG5cblx0LyoqXG5cdCAqIFRoaXMgbWVzc2VuZ2VyIHdpbCBpbmZvcm0gdGhlIHBhcmVudCBjb250YWluZXIgdGhhdCB0aGUgdXNlciBpcyBlbnRlcmluZyBvbiBhIGJ1aWxkaW5nLlxuXHQgKi9cblx0QE91dHB1dCgpIG9uTGVhdmVCdWlsZGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8QnVpbGRpbmdTZWxlY3RlZD4oKTtcblxuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiBmbG9vcnMgXyhvciBlcGlzb2RlcylfIGludm9sdmVkIGluIHRoZSBza3lsaW5lLCBzdGFydGluZyBmcm9tIHNreWxpbmUuc3RhcnREYXRlIHRvIHNreWxpbmUubGFzdERhdGVcblx0ICovXG5cdHB1YmxpYyBudW1iZXJPZkZsb29ycztcblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgZmxvb3IgXyhvciBlcGlzb2RlKV8gYmVpbmcgZHJhd24uXG5cdCAqL1xuXHRwdWJsaWMgcG9zaXRpb25PZkZsb29yID0gMDtcblxuXHQvKipcblx0ICogVGhlIHN1YnNjcmlwdGlvbiBvbiB0aGUgc2t5bGluZSByaXNpbmcuXG5cdCAqL1xuXHRwcml2YXRlIHN1YnNjcmlwdGlvblNreWxpbmU6IFN1YnNjcmlwdGlvbjtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgc2t5bGluZVNlcnZpY2U6IFJpc2luZ1NreWxpbmVTZXJ2aWNlKSB7XG5cdH1cblxuXG5cdG5nT25Jbml0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmRlYnVnKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnU2t5bGluZSB3ICcgKyB0aGlzLndpZHRoICsgJywgaCAnICsgdGhpcy5oZWlnaHQpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uU2t5bGluZSA9IHRoaXMuc2t5bGluZVNlcnZpY2UuZXBpc29kZSRcblx0XHRcdC5zdWJzY3JpYmUoe1xuXHRcdFx0XHRuZXh0OiBmbG9vcnMgPT4gdGhpcy5wb3NpdGlvbk9mRmxvb3IrK1xuXHRcdFx0fSk7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBBZnRlciB2aWV3IGluaXRpYWxpemF0aW9uIDogSGVyZSwgd2Ugc2V0IHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmVyLlxuXHQgKi9cblx0bmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXHRcdGNvbnN0IG1haW5EaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbkRpdicpO1xuXHRcdGlmIChtYWluRGl2KSB7XG5cdFx0XHRtYWluRGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6JyArIHRoaXMud2lkdGggKyAncHg7aGVpZ2h0OicgKyB0aGlzLmhlaWdodCArICdweCcpO1xuXHRcdFx0aWYgKHRoaXMuZGVidWcpIHtcblx0XHRcdFx0Y29uc29sZS5sb2cobWFpbkRpdi5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdJTlRFUk5BTCBFUlJPUiA6IERpZCBub3QgcmV0cmlldmUgdGhlIG1haW4gZGl2Jyk7XG5cdFx0fVxuXHR9XG5cdFxuXHQvKipcblx0ICogTW91c2UgaXMgZW50ZXJpbmcgdGhlIGJ1aWxkaW5nLlxuXHQgKi9cblx0cHVibGljIG1vdXNlRW50ZXJCdWlsZGluZygkZXZlbnQ6IEJ1aWxkaW5nU2VsZWN0ZWQpOiB2b2lkIHtcblx0XHR0aGlzLm9uRW50ZXJCdWlsZGluZy5lbWl0KCRldmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTW91c2UgaXMgbGVhdmluZyB0aGUgYnVpbGRpbmcuXG5cdCAqL1xuXHRwdWJsaWMgbW91c2VMZWF2ZUJ1aWxkaW5nKCRldmVudDogQnVpbGRpbmdTZWxlY3RlZCk6IHZvaWQge1xuXHRcdHRoaXMub25MZWF2ZUJ1aWxkaW5nLmVtaXQoJGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb3VzZSBpcyBjbGlja2luZyB0aGUgYnVpbGRpbmcuXG5cdCAqL1xuXHRwdWJsaWMgbW91c2VDbGlja0J1aWxkaW5nKCRldmVudDogQnVpbGRpbmdTZWxlY3RlZCk6IHZvaWQge1xuXHRcdHRoaXMub25DbGlja0J1aWxkaW5nLmVtaXQoJGV2ZW50KTtcblx0fVxuXG5cblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cdFx0dGhpcy5zdWJzY3JpcHRpb25Ta3lsaW5lLnVuc3Vic2NyaWJlKCk7XG5cdH1cbn1cbiJdfQ==