ngx-beautiful-charts
Version:
A library to create charts in Angular
192 lines • 21.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component } from '@angular/core';
import { GanttChartService } from '../gantt-chart.service';
export class GcChartBaseComponent {
// ganttChartData = [
// {
// name: 'Market Team',
// color: '#EAC435',
// timelines: {
// 'Market Research': [
// {from: new Date('June 9, 2019'), to: new Date('July 20, 2019')},
// {from: new Date('October 9, 2019'), to: new Date('November 20, 2019')}
// ],
// 'User Documentation': [
// {from: new Date('August 10, 2019'), to: new Date('September 15, 2019')}
// ]
// }
// },
// {
// name: 'Development Team',
// color: '#345995',
// timelines: {
// 'Software Development': [
// {from: new Date('July 9, 2019'), to: new Date('October 20, 2019')}
// ],
// 'Testing': [
// {from: new Date('October 25, 2019'), to: new Date('November 15, 2019')}
// ],
// 'User Documentation': [
// {from: new Date('August 1, 2019'), to: new Date('August 15, 2019')}
// ]
// }
// }
// ];
/**
* @param {?} ganttChartService
*/
constructor(ganttChartService) {
this.ganttChartService = ganttChartService;
this.monthNames = [
'January', 'February', 'March',
'April', 'May', 'June', 'July',
'August', 'September', 'October',
'November', 'December'
];
}
/**
* @param {?} date
* @param {?} days
* @return {?}
*/
addDays(date, days) {
/** @type {?} */
const newdate = new Date(date);
newdate.setDate((new Date(date)).getDate() + days);
/** @type {?} */
const day = newdate.getDate();
/** @type {?} */
const monthIndex = newdate.getMonth();
/** @type {?} */
const year = newdate.getFullYear();
return this.monthNames[monthIndex] + ' ' + day + ', ' + year;
}
/**
* @param {?} date
* @return {?}
*/
shortenDate(date) {
date = date.replace('January', 'Jan');
date = date.replace('February', 'Feb');
date = date.replace('March', 'Mar');
date = date.replace('April', 'Apr');
date = date.replace('May', 'May');
date = date.replace('June', 'Jun');
date = date.replace('July', 'Jul');
date = date.replace('August', 'Aug');
date = date.replace('September', 'Sep');
date = date.replace('October', 'Oct');
date = date.replace('November', 'Nov');
date = date.replace('December', 'Dec');
return date;
}
/**
* @return {?}
*/
computeGrid() {
// compute the min date and max date
// const oneDay = 24 * 60 * 60 * 1000;
// const dateRange = Math.round(Math.abs(
// (this.ganttChartService.ganttMaxDate.getTime()
// - this.ganttChartService.ganttMinDate.getTime()
// ) / (oneDay)));
/** @type {?} */
let flag = 0;
/** @type {?} */
let qts = 1;
// 3m --> 1 week --> 12
// 6m --> 2 weeks --> 12
// 9m --> 3 weeks --> 12
while (flag === 0) {
if (this.ganttChartService.ganttDateRange <= 90 * qts) {
this.gridPrecisionX = 7 * qts;
flag = 1;
}
else
qts = qts + 1;
}
// console.log(this.gridPrecisionX);
this.gridWidthX = this.ganttChartService.transformX(this.gridPrecisionX);
this.gridWidthY = this.ganttChartService.rectHeight / this.ganttChartService.ganttPhases.length;
this.gridPath = 'M ' + this.gridWidthX + ' 0 L 0 0 0 ' + this.gridWidthY;
this.xAxis = [];
this.yAxis = [];
/** @type {?} */
let date = this.ganttChartService.ganttMinDate;
// let xPos = this.ganttChartService.transformGanttDate(date) + this.ganttChartService.xPadding + 150;
/** @type {?} */
const yTrans = this.ganttChartService.rectHeight + this.ganttChartService.yPadding + 10;
// let transform = 'translate(' + xPos + 'px, ' + yTrans + 'px)';
// this.xAxis.push({xPos: xPos, value: date, transform: transform});
// console.log(date);
// console.log('max date: ' + this.ganttChartService.ganttMaxDate);
// console.log('date: ' + date);
while (new Date(date) <= new Date(this.ganttChartService.ganttMaxDate)) {
// console.log('date: ' + date);
// console.log(date);
/** @type {?} */
const xPos = this.ganttChartService.transformGanttDate(date) + this.ganttChartService.xPadding + 150;
/** @type {?} */
const transform = 'translate(' + xPos + 'px, ' + yTrans + 'px)';
this.xAxis.push({ xPos, value: this.shortenDate(date), transform });
date = this.addDays(date, this.gridPrecisionX);
}
// console.log(this.xAxis);
/** @type {?} */
let cnt = 0;
for (const phase of this.ganttChartService.ganttPhases) {
/** @type {?} */
const yPos = this.gridWidthY * cnt + this.gridWidthY * 0.5 + this.ganttChartService.yPadding;
this.yAxis.push({ yPos, value: phase });
cnt++;
}
}
/**
* @return {?}
*/
ngOnInit() {
this.computeGrid();
this.gridID = 'grid' + this.ganttChartService.componentID;
}
/**
* @return {?}
*/
ngOnChanges() {
this.computeGrid();
}
}
GcChartBaseComponent.decorators = [
{ type: Component, args: [{
selector: 'g[ngx-gc-chart-base]',
template: "<svg:pattern [attr.id]=\"gridID\" \n[attr.x]=\"ganttChartService.xPadding + 150\" [attr.y]=\"ganttChartService.yPadding\" \n[attr.width]=\"gridWidthX\" [attr.height]=\"gridWidthY\" \npatternUnits=\"userSpaceOnUse\">\n <svg:path [attr.d]=\"gridPath\" fill=\"none\" stroke=\"#444444\" stroke-width=\"0.5\" />\n</svg:pattern>\n\n<svg:rect [attr.x]=\"ganttChartService.xPadding + 150\" \n[attr.y]=\"ganttChartService.yPadding\" \n[attr.width]=\"ganttChartService.rectWidth\" \n[attr.height]=\"ganttChartService.rectHeight\" \nstroke=\"#444444\" [attr.fill]=\"'url(#' + gridID + ')'\" stroke-width=\"1\"/>\n\n<svg:g *ngFor=\"let x of xAxis\" [ngStyle]=\"{'transform': x.transform}\">\n<svg:text class=\"x-axis-text small\" text-anchor=\"end\" dominant-baseline=\"middle\"> {{ x.value }} </svg:text>\n</svg:g>\n\n<svg:text\n*ngFor=\"let y of yAxis\" class=\"y-axis-text small\" text-anchor=\"end\"\n[attr.y]=\"y.yPos\" [attr.x]=\"150+ganttChartService.xPadding-30\">{{ y.value }}</svg:text>\n\n\n<!-- Legion -->\n<svg:rect [attr.x]=\"ganttChartService.xPadding + 150\" \n[attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight\" \n[attr.width]=\"ganttChartService.legionWidth\" \n[attr.height]=\"ganttChartService.legionHeight\" \nfill=\"#f1f1f1\" />\n\n\n<svg:g *ngFor=\"let legionLine of ganttChartService.legion; index as i\">\n <svg:g *ngFor=\"let legionEntry of legionLine; index as j\">\n <svg:rect *ngIf=\"ganttChartService.legionWidth\" \n [attr.x]=\"ganttChartService.xPadding + 150 + ganttChartService.legionWidth / 3 * 0.1 + ganttChartService.legionWidth / 3 * j\" \n [attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight + 20 + 40*i + 10\" \n [attr.width]=\"ganttChartService.legionWidth / 3 * 0.2\" \n [attr.height]=\"20\" \n rx=\"6\" ry=\"6\"\n [attr.fill]=\"legionEntry.color\" />\n\n <!-- <svg:path class=\"legion-line\" [attr.d]=\"computeLegionPath(i)\" fill=\"none\" [attr.stroke]=\"x.color\" /> -->\n <svg:text class=\"axis-text\" dominant-baseline=\"middle\"\n [attr.x]=\"ganttChartService.xPadding + 150 + ganttChartService.legionWidth / 3 * j + ganttChartService.legionWidth / 3 * 0.4\" \n [attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight + 20 + 40*i + 20\" class=\"small\"> {{ legionEntry.name }} </svg:text>\n </svg:g>\n</svg:g>\n",
styles: [".x-axis-text{-webkit-transform:rotate(320deg);transform:rotate(320deg)}"]
}] }
];
/** @nocollapse */
GcChartBaseComponent.ctorParameters = () => [
{ type: GanttChartService }
];
if (false) {
/** @type {?} */
GcChartBaseComponent.prototype.gridWidthX;
/** @type {?} */
GcChartBaseComponent.prototype.gridWidthY;
/** @type {?} */
GcChartBaseComponent.prototype.gridPrecisionX;
/** @type {?} */
GcChartBaseComponent.prototype.gridID;
/** @type {?} */
GcChartBaseComponent.prototype.gridPath;
/** @type {?} */
GcChartBaseComponent.prototype.xAxis;
/** @type {?} */
GcChartBaseComponent.prototype.yAxis;
/** @type {?} */
GcChartBaseComponent.prototype.monthNames;
/** @type {?} */
GcChartBaseComponent.prototype.ganttChartService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MtY2hhcnQtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9nYW50dC1jaGFydC9nYy1jaGFydC1iYXNlL2djLWNoYXJ0LWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU8zRCxNQUFNLE9BQU8sb0JBQW9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBOEQvQixZQUFtQixpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQWpEdkQsZUFBVSxHQUFHO1lBQ1gsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPO1lBQzlCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07WUFDOUIsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTO1lBQ2hDLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUM7SUE0Q3lELENBQUM7Ozs7OztJQXpDNUQsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFZOztjQUNsQixPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDOztjQUM3QyxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRTs7Y0FDdkIsVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUU7O2NBQy9CLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFO1FBR2xDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElB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QUFtQjs7SUFDbkIsMENBQW1COztJQUVuQiw4Q0FBdUI7O0lBRXZCLHNDQUFlOztJQUNmLHdDQUFpQjs7SUFFakIscUNBQVc7O0lBQ1gscUNBQVc7O0lBRVgsMENBS0U7O0lBNENVLGlEQUEyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHYW50dENoYXJ0U2VydmljZSB9IGZyb20gJy4uL2dhbnR0LWNoYXJ0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnW25neC1nYy1jaGFydC1iYXNlXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYy1jaGFydC1iYXNlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2MtY2hhcnQtYmFzZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEdjQ2hhcnRCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIGdyaWRXaWR0aFg6IG51bWJlcjtcbiAgZ3JpZFdpZHRoWTogbnVtYmVyO1xuXG4gIGdyaWRQcmVjaXNpb25YOiBudW1iZXI7XG5cbiAgZ3JpZElEOiBzdHJpbmc7XG4gIGdyaWRQYXRoOiBzdHJpbmc7XG5cbiAgeEF4aXM6IGFueTtcbiAgeUF4aXM6IGFueTtcblxuICBtb250aE5hbWVzID0gW1xuICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJyxcbiAgICAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsXG4gICAgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsXG4gICAgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICBdO1xuXG5cbiAgYWRkRGF5cyhkYXRlLCBkYXlzOiBudW1iZXIpIHtcbiAgICBjb25zdCBuZXdkYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgbmV3ZGF0ZS5zZXREYXRlKChuZXcgRGF0ZShkYXRlKSkuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgY29uc3QgZGF5ID0gbmV3ZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleCA9IG5ld2RhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbmV3ZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG5cbiAgICByZXR1cm4gdGhpcy5tb250aE5hbWVzW21vbnRoSW5kZXhdICsgJyAnICsgZGF5ICsgJywgJyArIHllYXI7XG4gIH1cbiAgLy8gZ2FudHRDaGFydERhdGEgPSBbXG4gIC8vICAge1xuICAvLyAgICAgbmFtZTogJ01hcmtldCBUZWFtJyxcbiAgLy8gICAgIGNvbG9yOiAnI0VBQzQzNScsXG4gIC8vICAgICB0aW1lbGluZXM6IHtcbiAgLy8gICAgICAgJ01hcmtldCBSZXNlYXJjaCc6IFtcbiAgLy8gICAgICAgICB7ZnJvbTogbmV3IERhdGUoJ0p1bmUgOSwgMjAxOScpLCB0bzogbmV3IERhdGUoJ0p1bHkgMjAsIDIwMTknKX0sXG4gIC8vICAgICAgICAge2Zyb206IG5ldyBEYXRlKCdPY3RvYmVyIDksIDIwMTknKSwgdG86IG5ldyBEYXRlKCdOb3ZlbWJlciAyMCwgMjAxOScpfVxuICAvLyAgICAgICBdLFxuICAvLyAgICAgICAnVXNlciBEb2N1bWVudGF0aW9uJzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnQXVndXN0IDEwLCAyMDE5JyksIHRvOiBuZXcgRGF0ZSgnU2VwdGVtYmVyIDE1LCAyMDE5Jyl9XG4gIC8vICAgICAgIF1cbiAgLy8gICAgIH1cbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIG5hbWU6ICdEZXZlbG9wbWVudCBUZWFtJyxcbiAgLy8gICAgIGNvbG9yOiAnIzM0NTk5NScsXG4gIC8vICAgICB0aW1lbGluZXM6IHtcbiAgLy8gICAgICAgJ1NvZnR3YXJlIERldmVsb3BtZW50JzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnSnVseSA5LCAyMDE5JyksIHRvOiBuZXcgRGF0ZSgnT2N0b2JlciAyMCwgMjAxOScpfVxuICAvLyAgICAgICBdLFxuICAvLyAgICAgICAnVGVzdGluZyc6IFtcbiAgLy8gICAgICAgICB7ZnJvbTogbmV3IERhdGUoJ09jdG9iZXIgMjUsIDIwMTknKSwgdG86IG5ldyBEYXRlKCdOb3ZlbWJlciAxNSwgMjAxOScpfVxuICAvLyAgICAgICBdLFxuICAvLyAgICAgICAnVXNlciBEb2N1bWVudGF0aW9uJzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnQXVndXN0IDEsIDIwMTknKSwgdG86IG5ldyBEYXRlKCdBdWd1c3QgMTUsIDIwMTknKX1cbiAgLy8gICAgICAgXVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gXTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZ2FudHRDaGFydFNlcnZpY2U6IEdhbnR0Q2hhcnRTZXJ2aWNlKSB7IH1cblxuICBzaG9ydGVuRGF0ZShkYXRlKSB7XG4gICAgZGF0ZSA9IGRhdGUucmVwbGFjZSgnSmFudWFyeScsICdKYW4nKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdGZWJydWFyeScsICdGZWInKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdNYXJjaCcsICdNYXInKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdBcHJpbCcsICdBcHInKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdNYXknLCAnTWF5Jyk7XG4gICAgZGF0ZSA9IGRhdGUucmVwbGFjZSgnSnVuZScsICdKdW4nKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdKdWx5JywgJ0p1bCcpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0F1Z3VzdCcsICdBdWcnKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdTZXB0ZW1iZXInLCAnU2VwJyk7XG4gICAgZGF0ZSA9IGRhdGUucmVwbGFjZSgnT2N0b2JlcicsICdPY3QnKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdOb3ZlbWJlcicsICdOb3YnKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdEZWNlbWJlcicsICdEZWMnKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGNvbXB1dGVHcmlkKCkge1xuICAgIC8vIGNvbXB1dGUgdGhlIG1pbiBkYXRlIGFuZCBtYXggZGF0ZVxuICAgIC8vIGNvbnN0IG9uZURheSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgLy8gY29uc3QgZGF0ZVJhbmdlID0gTWF0aC5yb3VuZChNYXRoLmFicyhcbiAgICAvLyAgICAgKHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRNYXhEYXRlLmdldFRpbWUoKVxuICAgIC8vICAgICAgLSB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmdhbnR0TWluRGF0ZS5nZXRUaW1lKClcbiAgICAvLyAgICAgICkgLyAob25lRGF5KSkpO1xuICAgIGxldCBmbGFnID0gMDtcbiAgICBsZXQgcXRzID0gMTtcblxuICAgIC8vIDNtIC0tPiAxIHdlZWsgIC0tPiAxMlxuICAgIC8vIDZtIC0tPiAyIHdlZWtzIC0tPiAxMlxuICAgIC8vIDltIC0tPiAzIHdlZWtzIC0tPiAxMlxuXG4gICAgd2hpbGUgKGZsYWcgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmdhbnR0RGF0ZVJhbmdlIDw9IDkwICogcXRzKSB7XG4gICAgICAgIHRoaXMuZ3JpZFByZWNpc2lvblggPSA3ICogcXRzO1xuICAgICAgICBmbGFnID0gMTtcbiAgICAgIH0gZWxzZSBxdHMgPSBxdHMgKyAxO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZ3JpZFByZWNpc2lvblgpO1xuXG4gICAgdGhpcy5ncmlkV2lkdGhYID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS50cmFuc2Zvcm1YKHRoaXMuZ3JpZFByZWNpc2lvblgpO1xuICAgIHRoaXMuZ3JpZFdpZHRoWSA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UucmVjdEhlaWdodCAvIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRQaGFzZXMubGVuZ3RoO1xuICAgIHRoaXMuZ3JpZFBhdGggPSAnTSAnICsgdGhpcy5ncmlkV2lkdGhYICsgJyAwIEwgMCAwIDAgJyArIHRoaXMuZ3JpZFdpZHRoWTtcblxuICAgIHRoaXMueEF4aXMgPSBbXTtcbiAgICB0aGlzLnlBeGlzID0gW107XG5cbiAgICBsZXQgZGF0ZSA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRNaW5EYXRlO1xuICAgIC8vIGxldCB4UG9zID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS50cmFuc2Zvcm1HYW50dERhdGUoZGF0ZSkgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnhQYWRkaW5nICsgMTUwO1xuICAgIGNvbnN0IHlUcmFucyA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UucmVjdEhlaWdodCArIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UueVBhZGRpbmcgKyAxMDtcbiAgICAvLyBsZXQgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgeFBvcyArICdweCwgJyArIHlUcmFucyArICdweCknO1xuICAgIC8vIHRoaXMueEF4aXMucHVzaCh7eFBvczogeFBvcywgdmFsdWU6IGRhdGUsIHRyYW5zZm9ybTogdHJhbnNmb3JtfSk7XG4gICAgLy8gY29uc29sZS5sb2coZGF0ZSk7XG4gICAgLy8gY29uc29sZS5sb2coJ21heCBkYXRlOiAnICsgdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dE1heERhdGUpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdkYXRlOiAnICsgZGF0ZSk7XG4gICAgd2hpbGUgKG5ldyBEYXRlKGRhdGUpIDw9IG5ldyBEYXRlKHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRNYXhEYXRlKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coJ2RhdGU6ICcgKyBkYXRlKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGUpO1xuICAgICAgY29uc3QgeFBvcyA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UudHJhbnNmb3JtR2FudHREYXRlKGRhdGUpICsgdGhpcy5nYW50dENoYXJ0U2VydmljZS54UGFkZGluZyArIDE1MDtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoJyArIHhQb3MgKyAncHgsICcgKyB5VHJhbnMgKyAncHgpJztcbiAgICAgIHRoaXMueEF4aXMucHVzaCh7eFBvcywgdmFsdWU6IHRoaXMuc2hvcnRlbkRhdGUoZGF0ZSksIHRyYW5zZm9ybX0pO1xuICAgICAgZGF0ZSA9IHRoaXMuYWRkRGF5cyhkYXRlLCB0aGlzLmdyaWRQcmVjaXNpb25YKTtcbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnhBeGlzKTtcbiAgICBsZXQgY250ID0gMDtcbiAgICBmb3IgKGNvbnN0IHBoYXNlIG9mIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRQaGFzZXMpIHtcbiAgICAgIGNvbnN0IHlQb3MgPSB0aGlzLmdyaWRXaWR0aFkgKiBjbnQgKyB0aGlzLmdyaWRXaWR0aFkgKiAwLjUgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnlQYWRkaW5nO1xuICAgICAgdGhpcy55QXhpcy5wdXNoKHt5UG9zLCB2YWx1ZTogcGhhc2UgfSk7XG4gICAgICBjbnQrKztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbXB1dGVHcmlkKCk7XG4gICAgdGhpcy5ncmlkSUQgPSAnZ3JpZCcgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmNvbXBvbmVudElEO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5jb21wdXRlR3JpZCgpO1xuICB9XG59XG4iXX0=