UNPKG

ngx-frappe-chart

Version:

A simple and easy to use angular wrapper on top of frappe for generating awesome graphs.

370 lines (358 loc) 29.8 kB
import { Component, Input, Directive, ElementRef, NgModule } from '@angular/core'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class FrappeChartsHeatmapComponent { } FrappeChartsHeatmapComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-frappe-charts-heatmap', template: ` <div ngxFrappeChartsHeatmap [title]="title" [countLabel]="countLabel" [discreteDomains]="discreteDomains" [colors]="colors" [data]="data" ></div> ` },] }, ]; FrappeChartsHeatmapComponent.propDecorators = { data: [{ type: Input }], title: [{ type: Input }], countLabel: [{ type: Input }], discreteDomains: [{ type: Input }], colors: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class FrappeChartsPercentageComponent { } FrappeChartsPercentageComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-frappe-charts-percentage', template: ` <div ngxFrappeChartsPercentage [title]="title" [colors]="colors" [height]="height" [data]="data" [type]="type" [barOptions]="barOptions" ></div> ` },] }, ]; FrappeChartsPercentageComponent.propDecorators = { data: [{ type: Input }], title: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], type: [{ type: Input }], maxSlices: [{ type: Input }], barOptions: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class FrappeChartsBarComponent { } FrappeChartsBarComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-frappe-charts-bar', template: ` <div ngxFrappeChartsAxis [title]="title" [colors]="colors" [height]="height" [data]="data" [type]="type" [isNavigable]="isNavigable" [valuesOverPoints]="valuesOverPoints" [axisOptions]="axisOptions" [tooltipOptions]="tooltipOptions" [barOptions]="barOptions" [lineOptions]="lineOptions" [yMarkers]="yMarkers" [yRegions]="yRegions" ></div> ` },] }, ]; FrappeChartsBarComponent.propDecorators = { data: [{ type: Input }], title: [{ type: Input }], type: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], isNavigable: [{ type: Input }], valuesOverPoints: [{ type: Input }], axisOptions: [{ type: Input }], tooltipOptions: [{ type: Input }], barOptions: [{ type: Input }], lineOptions: [{ type: Input }], yMarkers: [{ type: Input }], yRegions: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ // just to avoid error marked by editor. Optional declaration class FrappeChartsHeatmapDirective { /** * @param {?} el */ constructor(el) { this.el = el; this.type = 'heatmap'; } /** * @return {?} */ ngOnChanges() { /** @type {?} */ const chart = new frappe.Chart(this.el.nativeElement, this.getHeatmapInputs()); } /** * @return {?} */ getHeatmapInputs() { /** @type {?} */ const heatmapobject = {}; heatmapobject['countLabel'] = this.countLabel; heatmapobject['discreteDomains'] = this.discreteDomains; heatmapobject['colors'] = this.colors; heatmapobject['type'] = this.type; heatmapobject['title'] = this.title; heatmapobject['data'] = this.data; return heatmapobject; } } FrappeChartsHeatmapDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxFrappeChartsHeatmap]' },] }, ]; FrappeChartsHeatmapDirective.ctorParameters = () => [ { type: ElementRef } ]; FrappeChartsHeatmapDirective.propDecorators = { title: [{ type: Input }], data: [{ type: Input }], countLabel: [{ type: Input }], discreteDomains: [{ type: Input }], colors: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** @type {?} */ const FrappeChartsConstants = { chartType: { percentage: 'percentage', pie: 'pie', bar: 'bar', line: 'line', axismixed: 'axis-mixed' } }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class FrappeChartsPercentageDirective { /** * @param {?} el */ constructor(el) { this.el = el; } /** * @return {?} */ ngOnChanges() { /** @type {?} */ const chart = new frappe.Chart(this.el.nativeElement, this.getPieInputs()); } /** * @return {?} */ getPieInputs() { /** @type {?} */ const pieobject = {}; pieobject['colors'] = this.colors; pieobject['type'] = this.type; pieobject['title'] = this.title; pieobject['data'] = this.data; pieobject['height'] = this.height; pieobject['maxSlices'] = this.maxSlices; this.addBarOptions(pieobject); return pieobject; } /** * @param {?} pieobject * @return {?} */ addBarOptions(pieobject) { if (this.type === FrappeChartsConstants.chartType.percentage) { pieobject['barOptions'] = this.barOptions; } } } FrappeChartsPercentageDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxFrappeChartsPercentage]' },] }, ]; FrappeChartsPercentageDirective.ctorParameters = () => [ { type: ElementRef } ]; FrappeChartsPercentageDirective.propDecorators = { title: [{ type: Input }], data: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], type: [{ type: Input }], maxSlices: [{ type: Input }], barOptions: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class FrappeChartsAxisDirective { /** * @param {?} el */ constructor(el) { this.el = el; } /** * @return {?} */ ngOnChanges() { /** @type {?} */ const chart = new frappe.Chart(this.el.nativeElement, this.getAxisInputs()); } /** * @return {?} */ getAxisInputs() { /** @type {?} */ const barObject = {}; barObject['colors'] = this.colors; barObject['type'] = this.type; barObject['title'] = this.title; barObject['height'] = this.height; barObject['isNavigable'] = this.isNavigable; barObject['valuesOverPoints'] = this.valuesOverPoints; barObject['axisOptions'] = this.axisOptions; barObject['tooltipOptions'] = this.tooltipOptions; this.addGraphData(barObject); this.addLineOptions(barObject); this.addBarOptions(barObject); return barObject; } /** * @param {?} barObject * @return {?} */ addLineOptions(barObject) { if (this.type === FrappeChartsConstants.chartType.line || this.type === FrappeChartsConstants.chartType.axismixed) { barObject['lineOptions'] = this.lineOptions; } } /** * @param {?} barObject * @return {?} */ addBarOptions(barObject) { if (this.type === FrappeChartsConstants.chartType.bar || this.type === FrappeChartsConstants.chartType.axismixed) { barObject['barOptions'] = this.barOptions; } } /** * @param {?} barObject * @return {?} */ addGraphData(barObject) { /** @type {?} */ const data = this.data; if (this.yMarkers) { data['yMarkers'] = this.yMarkers; } if (this.yRegions) { data['yRegions'] = this.yRegions; } barObject['data'] = data; } } FrappeChartsAxisDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxFrappeChartsAxis]' },] }, ]; FrappeChartsAxisDirective.ctorParameters = () => [ { type: ElementRef } ]; FrappeChartsAxisDirective.propDecorators = { data: [{ type: Input }], type: [{ type: Input }], title: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], isNavigable: [{ type: Input }], valuesOverPoints: [{ type: Input }], axisOptions: [{ type: Input }], tooltipOptions: [{ type: Input }], barOptions: [{ type: Input }], lineOptions: [{ type: Input }], yMarkers: [{ type: Input }], yRegions: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class FrappeChartsModule { } FrappeChartsModule.decorators = [ { type: NgModule, args: [{ imports: [], declarations: [ FrappeChartsHeatmapComponent, FrappeChartsPercentageComponent, FrappeChartsBarComponent, FrappeChartsHeatmapDirective, FrappeChartsPercentageDirective, FrappeChartsAxisDirective ], exports: [ FrappeChartsHeatmapComponent, FrappeChartsPercentageComponent, FrappeChartsBarComponent ] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ export { FrappeChartsHeatmapComponent, FrappeChartsPercentageComponent, FrappeChartsBarComponent, FrappeChartsModule, FrappeChartsAxisDirective as ɵc, FrappeChartsHeatmapDirective as ɵa, FrappeChartsPercentageDirective as ɵb }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZyYXBwZS1jaGFydC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvY29tcG9uZW50cy9mcmFwcGUtY2hhcnRzLWhlYXRtYXAuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtcGVyY2VudGFnZS5jb21wb25lbnQudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2NvbXBvbmVudHMvZnJhcHBlLWNoYXJ0cy1iYXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtaGVhdG1hcC5kaXJlY3RpdmUudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2NvbnN0YW50cy9mcmFwcGUtY2hhcnRzLmNvbnN0YW50cy50cyIsIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLXBlcmNlbnRhZ2UuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtYXhpcy5kaXJlY3RpdmUudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2ZyYXBwZS1jaGFydHMubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhlYXRtYXBEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2hlYXRtYXAtZGF0YS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1mcmFwcGUtY2hhcnRzLWhlYXRtYXAnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIG5neEZyYXBwZUNoYXJ0c0hlYXRtYXBcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbY291bnRMYWJlbF09XCJjb3VudExhYmVsXCJcbiAgICAgIFtkaXNjcmV0ZURvbWFpbnNdPVwiZGlzY3JldGVEb21haW5zXCJcbiAgICAgIFtjb2xvcnNdPVwiY29sb3JzXCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgID48L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNIZWF0bWFwQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGF0YTogSGVhdG1hcERhdGFNb2RlbDtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvdW50TGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc2NyZXRlRG9tYWlucz86IG51bWJlcjtcbiAgQElucHV0KCkgY29sb3JzPzogc3RyaW5nWzVdO1xufVxuXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXJPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wZXJjZW50YWdlLWJhci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IEdyYXBoRGF0YU1vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmFwaC1kYXRhLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWZyYXBwZS1jaGFydHMtcGVyY2VudGFnZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgbmd4RnJhcHBlQ2hhcnRzUGVyY2VudGFnZVxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFtjb2xvcnNdPVwiY29sb3JzXCJcbiAgICAgIFtoZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAgW3R5cGVdPVwidHlwZVwiXG4gICAgICBbYmFyT3B0aW9uc109XCJiYXJPcHRpb25zXCJcbiAgICA+PC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRnJhcHBlQ2hhcnRzUGVyY2VudGFnZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRhdGE6IEdyYXBoRGF0YU1vZGVsO1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgY29sb3JzPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGhlaWdodD86IG51bWJlcjtcbiAgQElucHV0KCkgdHlwZT86IHN0cmluZzsgLy8gcGllICwgcGVyY2VudGFnZVxuICBASW5wdXQoKSBtYXhTbGljZXM/OiBudW1iZXI7IC8vIHJlc3RyaWN0IG51bWJlciBvZiBzbGljZXNcbiAgQElucHV0KCkgYmFyT3B0aW9ucz86IEJhck9wdGlvbnM7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBeGlzT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYXhpcy1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IFRvb2x0aXBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90b29sdGlwLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgQmFyT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYmFyLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgTGluZU9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2xpbmUtb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBZTWFya2VycyB9IGZyb20gJy4uL2ludGVyZmFjZXMveS1tYXJrZXJzLm1vZGVsJztcbmltcG9ydCB7IFlSZWdpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy95LXJlZ2lvbnMubW9kZWwnO1xuaW1wb3J0IHsgR3JhcGhEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBoLWRhdGEubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZnJhcHBlLWNoYXJ0cy1iYXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIG5neEZyYXBwZUNoYXJ0c0F4aXNcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbY29sb3JzXT1cImNvbG9yc1wiXG4gICAgICBbaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgW2lzTmF2aWdhYmxlXT1cImlzTmF2aWdhYmxlXCJcbiAgICAgIFt2YWx1ZXNPdmVyUG9pbnRzXT1cInZhbHVlc092ZXJQb2ludHNcIlxuICAgICAgW2F4aXNPcHRpb25zXT1cImF4aXNPcHRpb25zXCJcbiAgICAgIFt0b29sdGlwT3B0aW9uc109XCJ0b29sdGlwT3B0aW9uc1wiXG4gICAgICBbYmFyT3B0aW9uc109XCJiYXJPcHRpb25zXCJcbiAgICAgIFtsaW5lT3B0aW9uc109XCJsaW5lT3B0aW9uc1wiXG4gICAgICBbeU1hcmtlcnNdPVwieU1hcmtlcnNcIlxuICAgICAgW3lSZWdpb25zXT1cInlSZWdpb25zXCJcbiAgICA+PC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRnJhcHBlQ2hhcnRzQmFyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGF0YTogR3JhcGhEYXRhTW9kZWw7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSB0eXBlPzogc3RyaW5nO1xuICBASW5wdXQoKSBjb2xvcnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaGVpZ2h0PzogbnVtYmVyOyAvLyAyNDA7XG4gIEBJbnB1dCgpIGlzTmF2aWdhYmxlPzogYm9vbGVhbjsgLy8gZmFsc2U7XG4gIEBJbnB1dCgpIHZhbHVlc092ZXJQb2ludHM/OiBib29sZWFuOyAvLyBmYWxzZTtcbiAgQElucHV0KCkgYXhpc09wdGlvbnM/OiBBeGlzT3B0aW9ucztcbiAgQElucHV0KCkgdG9vbHRpcE9wdGlvbnM/OiBUb29sdGlwT3B0aW9ucztcbiAgQElucHV0KCkgYmFyT3B0aW9ucz86IEJhck9wdGlvbnM7XG4gIEBJbnB1dCgpIGxpbmVPcHRpb25zPzogTGluZU9wdGlvbnM7XG4gIEBJbnB1dCgpIHlNYXJrZXJzOiBZTWFya2Vyc1tdO1xuICBASW5wdXQoKSB5UmVnaW9uczogWVJlZ2lvbnNbXTtcbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIHZhciBmcmFwcGU6IGFueTsgLy8ganVzdCB0byBhdm9pZCBlcnJvciBtYXJrZWQgYnkgZWRpdG9yLiBPcHRpb25hbCBkZWNsYXJhdGlvblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4RnJhcHBlQ2hhcnRzSGVhdG1hcF0nXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c0hlYXRtYXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgZGF0YTogYW55O1xuICBASW5wdXQoKSBjb3VudExhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBkaXNjcmV0ZURvbWFpbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9ycz86IHN0cmluZ1s1XTtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSAnaGVhdG1hcCc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge31cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBjb25zdCBjaGFydCA9IG5ldyBmcmFwcGUuQ2hhcnQoXG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLmdldEhlYXRtYXBJbnB1dHMoKVxuICAgICk7XG4gIH1cblxuICBnZXRIZWF0bWFwSW5wdXRzKCk6IGFueSB7XG4gICAgY29uc3QgaGVhdG1hcG9iamVjdCA9IHt9O1xuICAgIGhlYXRtYXBvYmplY3RbJ2NvdW50TGFiZWwnXSA9IHRoaXMuY291bnRMYWJlbDtcbiAgICBoZWF0bWFwb2JqZWN0WydkaXNjcmV0ZURvbWFpbnMnXSA9IHRoaXMuZGlzY3JldGVEb21haW5zO1xuICAgIGhlYXRtYXBvYmplY3RbJ2NvbG9ycyddID0gdGhpcy5jb2xvcnM7XG4gICAgaGVhdG1hcG9iamVjdFsndHlwZSddID0gdGhpcy50eXBlO1xuICAgIGhlYXRtYXBvYmplY3RbJ3RpdGxlJ10gPSB0aGlzLnRpdGxlO1xuICAgIGhlYXRtYXBvYmplY3RbJ2RhdGEnXSA9IHRoaXMuZGF0YTtcbiAgICByZXR1cm4gaGVhdG1hcG9iamVjdDtcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IEZyYXBwZUNoYXJ0c0NvbnN0YW50cyA9IHtcclxuICBjaGFydFR5cGU6IHtcclxuICAgIHBlcmNlbnRhZ2U6ICdwZXJjZW50YWdlJyxcclxuICAgIHBpZTogJ3BpZScsXHJcbiAgICBiYXI6ICdiYXInLFxyXG4gICAgbGluZTogJ2xpbmUnLFxyXG4gICAgYXhpc21peGVkOiAnYXhpcy1taXhlZCdcclxuICB9XHJcbn07XHJcbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2ZyYXBwZS1jaGFydHMuY29uc3RhbnRzJztcbmltcG9ydCB7IEJhck9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BlcmNlbnRhZ2UtYmFyLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgR3JhcGhEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBoLWRhdGEubW9kZWwnO1xuXG5kZWNsYXJlIHZhciBmcmFwcGU6IGFueTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VdJ1xufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNQZXJjZW50YWdlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRhdGE6IEdyYXBoRGF0YU1vZGVsO1xuICBASW5wdXQoKSBjb2xvcnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaGVpZ2h0PzogbnVtYmVyO1xuICBASW5wdXQoKSB0eXBlOiBzdHJpbmc7IC8vIHBpZSAsIHBlcmNlbnRhZ2VcbiAgQElucHV0KCkgbWF4U2xpY2VzPzogbnVtYmVyOyAvLyByZXN0cmljdCBudW1iZXIgb2Ygc2xpY2VzXG4gIEBJbnB1dCgpIGJhck9wdGlvbnM/OiBCYXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgZnJhcHBlLkNoYXJ0KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5nZXRQaWVJbnB1dHMoKSk7XG4gIH1cblxuICBnZXRQaWVJbnB1dHMoKTogYW55IHtcbiAgICBjb25zdCBwaWVvYmplY3QgPSB7fTtcbiAgICBwaWVvYmplY3RbJ2NvbG9ycyddID0gdGhpcy5jb2xvcnM7XG4gICAgcGllb2JqZWN0Wyd0eXBlJ10gPSB0aGlzLnR5cGU7XG4gICAgcGllb2JqZWN0Wyd0aXRsZSddID0gdGhpcy50aXRsZTtcbiAgICBwaWVvYmplY3RbJ2RhdGEnXSA9IHRoaXMuZGF0YTtcbiAgICBwaWVvYmplY3RbJ2hlaWdodCddID0gdGhpcy5oZWlnaHQ7XG4gICAgcGllb2JqZWN0WydtYXhTbGljZXMnXSA9IHRoaXMubWF4U2xpY2VzO1xuICAgIHRoaXMuYWRkQmFyT3B0aW9ucyhwaWVvYmplY3QpO1xuICAgIHJldHVybiBwaWVvYmplY3Q7XG4gIH1cblxuICBhZGRCYXJPcHRpb25zKHBpZW9iamVjdCkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IEZyYXBwZUNoYXJ0c0NvbnN0YW50cy5jaGFydFR5cGUucGVyY2VudGFnZSkge1xuICAgICAgcGllb2JqZWN0WydiYXJPcHRpb25zJ10gPSB0aGlzLmJhck9wdGlvbnM7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQXhpc09wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2F4aXMtb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBUb29sdGlwT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdG9vbHRpcC1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IEJhck9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Jhci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IExpbmVPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saW5lLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgWU1hcmtlcnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ktbWFya2Vycy5tb2RlbCc7XG5pbXBvcnQgeyBZUmVnaW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMveS1yZWdpb25zLm1vZGVsJztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c0NvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cy9mcmFwcGUtY2hhcnRzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBHcmFwaERhdGFNb2RlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ3JhcGgtZGF0YS5tb2RlbCc7XG5cbmRlY2xhcmUgdmFyIGZyYXBwZTogYW55O1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4RnJhcHBlQ2hhcnRzQXhpc10nXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c0F4aXNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkYXRhOiBHcmFwaERhdGFNb2RlbDtcbiAgQElucHV0KCkgdHlwZTogc3RyaW5nOyAvLyAnbGluZSdcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbG9ycz86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBoZWlnaHQ/OiBudW1iZXI7IC8vIDI0MDtcbiAgQElucHV0KCkgaXNOYXZpZ2FibGU/OiBib29sZWFuOyAvLyBmYWxzZTtcbiAgQElucHV0KCkgdmFsdWVzT3ZlclBvaW50cz86IGJvb2xlYW47IC8vIGZhbHNlO1xuICBASW5wdXQoKSBheGlzT3B0aW9ucz86IEF4aXNPcHRpb25zO1xuICBASW5wdXQoKSB0b29sdGlwT3B0aW9ucz86IFRvb2x0aXBPcHRpb25zO1xuICBASW5wdXQoKSBiYXJPcHRpb25zPzogQmFyT3B0aW9ucztcbiAgQElucHV0KCkgbGluZU9wdGlvbnM/OiBMaW5lT3B0aW9ucztcbiAgQElucHV0KCkgeU1hcmtlcnM6IFlNYXJrZXJzW107XG4gIEBJbnB1dCgpIHlSZWdpb25zOiBZUmVnaW9uc1tdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgZnJhcHBlLkNoYXJ0KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5nZXRBeGlzSW5wdXRzKCkpO1xuICB9XG5cbiAgZ2V0QXhpc0lucHV0cygpOiBhbnkge1xuICAgIGNvbnN0IGJhck9iamVjdCA9IHt9O1xuICAgIGJhck9iamVjdFsnY29sb3JzJ10gPSB0aGlzLmNvbG9ycztcbiAgICBiYXJPYmplY3RbJ3R5cGUnXSA9IHRoaXMudHlwZTtcbiAgICBiYXJPYmplY3RbJ3RpdGxlJ10gPSB0aGlzLnRpdGxlO1xuICAgIGJhck9iamVjdFsnaGVpZ2h0J10gPSB0aGlzLmhlaWdodDtcbiAgICBiYXJPYmplY3RbJ2lzTmF2aWdhYmxlJ10gPSB0aGlzLmlzTmF2aWdhYmxlO1xuICAgIGJhck9iamVjdFsndmFsdWVzT3ZlclBvaW50cyddID0gdGhpcy52YWx1ZXNPdmVyUG9pbnRzO1xuICAgIGJhck9iamVjdFsnYXhpc09wdGlvbnMnXSA9IHRoaXMuYXhpc09wdGlvbnM7XG4gICAgYmFyT2JqZWN0Wyd0b29sdGlwT3B0aW9ucyddID0gdGhpcy50b29sdGlwT3B0aW9ucztcblxuICAgIHRoaXMuYWRkR3JhcGhEYXRhKGJhck9iamVjdCk7XG4gICAgdGhpcy5hZGRMaW5lT3B0aW9ucyhiYXJPYmplY3QpO1xuICAgIHRoaXMuYWRkQmFyT3B0aW9ucyhiYXJPYmplY3QpO1xuXG4gICAgcmV0dXJuIGJhck9iamVjdDtcbiAgfVxuXG4gIGFkZExpbmVPcHRpb25zKGJhck9iamVjdCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gRnJhcHBlQ2hhcnRzQ29uc3RhbnRzLmNoYXJ0VHlwZS5saW5lIHx8XG4gICAgICB0aGlzLnR5cGUgPT09IEZyYXBwZUNoYXJ0c0NvbnN0YW50cy5jaGFydFR5cGUuYXhpc21peGVkXG4gICAgKSB7XG4gICAgICBiYXJPYmplY3RbJ2xpbmVPcHRpb25zJ10gPSB0aGlzLmxpbmVPcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIGFkZEJhck9wdGlvbnMoYmFyT2JqZWN0KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy50eXBlID09PSBGcmFwcGVDaGFydHNDb25zdGFudHMuY2hhcnRUeXBlLmJhciB8fFxuICAgICAgdGhpcy50eXBlID09PSBGcmFwcGVDaGFydHNDb25zdGFudHMuY2hhcnRUeXBlLmF4aXNtaXhlZFxuICAgICkge1xuICAgICAgYmFyT2JqZWN0WydiYXJPcHRpb25zJ10gPSB0aGlzLmJhck9wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgYWRkR3JhcGhEYXRhKGJhck9iamVjdCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgaWYgKHRoaXMueU1hcmtlcnMpIHtcbiAgICAgIGRhdGFbJ3lNYXJrZXJzJ10gPSB0aGlzLnlNYXJrZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnlSZWdpb25zKSB7XG4gICAgICBkYXRhWyd5UmVnaW9ucyddID0gdGhpcy55UmVnaW9ucztcbiAgICB9XG5cbiAgICBiYXJPYmplY3RbJ2RhdGEnXSA9IGRhdGE7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNIZWF0bWFwQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtaGVhdG1hcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzSGVhdG1hcERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLWhlYXRtYXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZnJhcHBlLWNoYXJ0cy1wZXJjZW50YWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNQZXJjZW50YWdlRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtcGVyY2VudGFnZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzQmFyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNBeGlzRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtYXhpcy5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgRnJhcHBlQ2hhcnRzSGVhdG1hcENvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEZyYXBwZUNoYXJ0c0JhckNvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNIZWF0bWFwRGlyZWN0aXZlLFxuICAgIEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VEaXJlY3RpdmUsXG4gICAgRnJhcHBlQ2hhcnRzQXhpc0RpcmVjdGl2ZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRnJhcHBlQ2hhcnRzSGVhdG1hcENvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEZyYXBwZUNoYXJ0c0JhckNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c01vZHVsZSB7fVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7WUFHQyxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsUUFBUSxFQUFFOzs7Ozs7Ozs7R0FTVDthQUNGOzs7bUJBRUUsS0FBSztvQkFDTCxLQUFLO3lCQUNMLEtBQUs7OEJBQ0wsS0FBSztxQkFDTCxLQUFLOzs7Ozs7O0FDckJSOzs7WUFJQyxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDhCQUE4QjtnQkFDeEMsUUFBUSxFQUFFOzs7Ozs7Ozs7O0dBVVQ7YUFDRjs7O21CQUVFLEtBQUs7b0JBQ0wsS0FBSztxQkFDTCxLQUFLO3FCQUNMLEtBQUs7bUJBQ0wsS0FBSzt3QkFDTCxLQUFLO3lCQUNMLEtBQUs7Ozs7Ozs7QUN6QlI7OztZQVNDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUO2FBQ0Y7OzttQkFFRSxLQUFLO29CQUNMLEtBQUs7bUJBQ0wsS0FBSztxQkFDTCxLQUFLO3FCQUNMLEtBQUs7MEJBQ0wsS0FBSzsrQkFDTCxLQUFLOzBCQUNMLEtBQUs7NkJBQ0wsS0FBSzt5QkFDTCxLQUFLOzBCQUNMLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLOzs7Ozs7O0FDM0NSO0FBUUE7Ozs7SUFRRSxZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUZsQixTQUFJLEdBQUcsU0FBUyxDQUFDO0tBRUs7Ozs7SUFFdEMsV0FBVzs7Y0FDSCxLQUFLLEdB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