UNPKG

ngx-beautiful-charts

Version:
221 lines 22.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component } from '@angular/core'; import { GanttChartService } from '../gantt-chart.service'; var GcChartBaseComponent = /** @class */ (function () { // 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')} // ] // } // } // ]; function GcChartBaseComponent(ganttChartService) { this.ganttChartService = ganttChartService; this.monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; } /** * @param {?} date * @param {?} days * @return {?} */ GcChartBaseComponent.prototype.addDays = /** * @param {?} date * @param {?} days * @return {?} */ function (date, days) { /** @type {?} */ var newdate = new Date(date); newdate.setDate((new Date(date)).getDate() + days); /** @type {?} */ var day = newdate.getDate(); /** @type {?} */ var monthIndex = newdate.getMonth(); /** @type {?} */ var year = newdate.getFullYear(); return this.monthNames[monthIndex] + ' ' + day + ', ' + year; }; /** * @param {?} date * @return {?} */ GcChartBaseComponent.prototype.shortenDate = /** * @param {?} date * @return {?} */ function (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 {?} */ GcChartBaseComponent.prototype.computeGrid = /** * @return {?} */ function () { var e_1, _a; // 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 {?} */ var flag = 0; /** @type {?} */ var 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 {?} */ var date = this.ganttChartService.ganttMinDate; // let xPos = this.ganttChartService.transformGanttDate(date) + this.ganttChartService.xPadding + 150; /** @type {?} */ var 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 {?} */ var xPos = this.ganttChartService.transformGanttDate(date) + this.ganttChartService.xPadding + 150; /** @type {?} */ var transform = 'translate(' + xPos + 'px, ' + yTrans + 'px)'; this.xAxis.push({ xPos: xPos, value: this.shortenDate(date), transform: transform }); date = this.addDays(date, this.gridPrecisionX); } // console.log(this.xAxis); /** @type {?} */ var cnt = 0; try { for (var _b = tslib_1.__values(this.ganttChartService.ganttPhases), _c = _b.next(); !_c.done; _c = _b.next()) { var phase = _c.value; /** @type {?} */ var yPos = this.gridWidthY * cnt + this.gridWidthY * 0.5 + this.ganttChartService.yPadding; this.yAxis.push({ yPos: yPos, value: phase }); cnt++; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; /** * @return {?} */ GcChartBaseComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.computeGrid(); this.gridID = 'grid' + this.ganttChartService.componentID; }; /** * @return {?} */ GcChartBaseComponent.prototype.ngOnChanges = /** * @return {?} */ function () { 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 = function () { return [ { type: GanttChartService } ]; }; return GcChartBaseComponent; }()); export { GcChartBaseComponent }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MtY2hhcnQtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9nYW50dC1jaGFydC9nYy1jaGFydC1iYXNlL2djLWNoYXJ0LWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFM0Q7SUFvQ0UscUJBQXFCO0lBQ3JCLE1BQU07SUFDTiwyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLG1CQUFtQjtJQUNuQiw2QkFBNkI7SUFDN0IsMkVBQTJFO0lBQzNFLGlGQUFpRjtJQUNqRixXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLGtGQUFrRjtJQUNsRixVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sZ0NBQWdDO0lBQ2hDLHdCQUF3QjtJQUN4QixtQkFBbUI7SUFDbkIsa0NBQWtDO0lBQ2xDLDZFQUE2RTtJQUM3RSxXQUFXO0lBQ1gscUJBQXFCO0lBQ3JCLGtGQUFrRjtJQUNsRixXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLDhFQUE4RTtJQUM5RSxVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixLQUFLO0lBRUwsOEJBQW1CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBakR2RCxlQUFVLEdBQUc7WUFDWCxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU87WUFDOUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTTtZQUM5QixRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVM7WUFDaEMsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztJQTRDeUQsQ0FBQzs7Ozs7O0lBekM1RCxzQ0FBTzs7Ozs7SUFBUCxVQUFRLElBQUksRUFBRSxJQUFZOztZ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QzVGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxNQUFBLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3ZDLEdBQUcsRUFBRSxDQUFDO2FBQ1A7Ozs7Ozs7OztJQUNILENBQUM7Ozs7SUFFRCx1Q0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztJQUM1RCxDQUFDOzs7O0lBRUQsMENBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7O2dCQXBKRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsODFFQUE2Qzs7aUJBRTlDOzs7O2dCQU5RLGlCQUFpQjs7SUF1SjFCLDJCQUFDO0NBQUEsQUFySkQsSUFxSkM7U0FoSlksb0JBQW9COzs7SUFFL0IsMENBQW1COztJQUNuQiwwQ0FBbUI7O0lBRW5CLDhDQUF1Qjs7SUFFdkIsc0NBQWU7O0lBQ2Ysd0NBQWlCOztJQUVqQixxQ0FBVzs7SUFDWCxxQ0FBVzs7SUFFWCwwQ0FLRTs7SUE0Q1UsaURBQTJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdhbnR0Q2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vZ2FudHQtY2hhcnQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dbbmd4LWdjLWNoYXJ0LWJhc2VdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2djLWNoYXJ0LWJhc2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYy1jaGFydC1iYXNlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2NDaGFydEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgZ3JpZFdpZHRoWDogbnVtYmVyO1xuICBncmlkV2lkdGhZOiBudW1iZXI7XG5cbiAgZ3JpZFByZWNpc2lvblg6IG51bWJlcjtcblxuICBncmlkSUQ6IHN0cmluZztcbiAgZ3JpZFBhdGg6IHN0cmluZztcblxuICB4QXhpczogYW55O1xuICB5QXhpczogYW55O1xuXG4gIG1vbnRoTmFtZXMgPSBbXG4gICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLFxuICAgICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JyxcbiAgICAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJyxcbiAgICAnTm92ZW1iZXInLCAnRGVjZW1iZXInXG4gIF07XG5cblxuICBhZGREYXlzKGRhdGUsIGRheXM6IG51bWJlcikge1xuICAgIGNvbnN0IG5ld2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBuZXdkYXRlLnNldERhdGUoKG5ldyBEYXRlKGRhdGUpKS5nZXREYXRlKCkgKyBkYXlzKTtcbiAgICBjb25zdCBkYXkgPSBuZXdkYXRlLmdldERhdGUoKTtcbiAgICBjb25zdCBtb250aEluZGV4ID0gbmV3ZGF0ZS5nZXRNb250aCgpO1xuICAgIGNvbnN0IHllYXIgPSBuZXdkYXRlLmdldEZ1bGxZZWFyKCk7XG5cblxuICAgIHJldHVybiB0aGlzLm1vbnRoTmFtZXNbbW9udGhJbmRleF0gKyAnICcgKyBkYXkgKyAnLCAnICsgeWVhcjtcbiAgfVxuICAvLyBnYW50dENoYXJ0RGF0YSA9IFtcbiAgLy8gICB7XG4gIC8vICAgICBuYW1lOiAnTWFya2V0IFRlYW0nLFxuICAvLyAgICAgY29sb3I6ICcjRUFDNDM1JyxcbiAgLy8gICAgIHRpbWVsaW5lczoge1xuICAvLyAgICAgICAnTWFya2V0IFJlc2VhcmNoJzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnSnVuZSA5LCAyMDE5JyksIHRvOiBuZXcgRGF0ZSgnSnVseSAyMCwgMjAxOScpfSxcbiAgLy8gICAgICAgICB7ZnJvbTogbmV3IERhdGUoJ09jdG9iZXIgOSwgMjAxOScpLCB0bzogbmV3IERhdGUoJ05vdmVtYmVyIDIwLCAyMDE5Jyl9XG4gIC8vICAgICAgIF0sXG4gIC8vICAgICAgICdVc2VyIERvY3VtZW50YXRpb24nOiBbXG4gIC8vICAgICAgICAge2Zyb206IG5ldyBEYXRlKCdBdWd1c3QgMTAsIDIwMTknKSwgdG86IG5ldyBEYXRlKCdTZXB0ZW1iZXIgMTUsIDIwMTknKX1cbiAgLy8gICAgICAgXVxuICAvLyAgICAgfVxuICAvLyAgIH0sXG4gIC8vICAge1xuICAvLyAgICAgbmFtZTogJ0RldmVsb3BtZW50IFRlYW0nLFxuICAvLyAgICAgY29sb3I6ICcjMzQ1OTk1JyxcbiAgLy8gICAgIHRpbWVsaW5lczoge1xuICAvLyAgICAgICAnU29mdHdhcmUgRGV2ZWxvcG1lbnQnOiBbXG4gIC8vICAgICAgICAge2Zyb206IG5ldyBEYXRlKCdKdWx5IDksIDIwMTknKSwgdG86IG5ldyBEYXRlKCdPY3RvYmVyIDIwLCAyMDE5Jyl9XG4gIC8vICAgICAgIF0sXG4gIC8vICAgICAgICdUZXN0aW5nJzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnT2N0b2JlciAyNSwgMjAxOScpLCB0bzogbmV3IERhdGUoJ05vdmVtYmVyIDE1LCAyMDE5Jyl9XG4gIC8vICAgICAgIF0sXG4gIC8vICAgICAgICdVc2VyIERvY3VtZW50YXRpb24nOiBbXG4gIC8vICAgICAgICAge2Zyb206IG5ldyBEYXRlKCdBdWd1c3QgMSwgMjAxOScpLCB0bzogbmV3IERhdGUoJ0F1Z3VzdCAxNSwgMjAxOScpfVxuICAvLyAgICAgICBdXG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyBdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBnYW50dENoYXJ0U2VydmljZTogR2FudHRDaGFydFNlcnZpY2UpIHsgfVxuXG4gIHNob3J0ZW5EYXRlKGRhdGUpIHtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdKYW51YXJ5JywgJ0phbicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0ZlYnJ1YXJ5JywgJ0ZlYicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ01hcmNoJywgJ01hcicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0FwcmlsJywgJ0FwcicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ01heScsICdNYXknKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdKdW5lJywgJ0p1bicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0p1bHknLCAnSnVsJyk7XG4gICAgZGF0ZSA9IGRhdGUucmVwbGFjZSgnQXVndXN0JywgJ0F1ZycpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ1NlcHRlbWJlcicsICdTZXAnKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdPY3RvYmVyJywgJ09jdCcpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ05vdmVtYmVyJywgJ05vdicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0RlY2VtYmVyJywgJ0RlYycpO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgY29tcHV0ZUdyaWQoKSB7XG4gICAgLy8gY29tcHV0ZSB0aGUgbWluIGRhdGUgYW5kIG1heCBkYXRlXG4gICAgLy8gY29uc3Qgb25lRGF5ID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAvLyBjb25zdCBkYXRlUmFuZ2UgPSBNYXRoLnJvdW5kKE1hdGguYWJzKFxuICAgIC8vICAgICAodGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dE1heERhdGUuZ2V0VGltZSgpXG4gICAgLy8gICAgICAtIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRNaW5EYXRlLmdldFRpbWUoKVxuICAgIC8vICAgICAgKSAvIChvbmVEYXkpKSk7XG4gICAgbGV0IGZsYWcgPSAwO1xuICAgIGxldCBxdHMgPSAxO1xuXG4gICAgLy8gM20gLS0+IDEgd2VlayAgLS0+IDEyXG4gICAgLy8gNm0gLS0+IDIgd2Vla3MgLS0+IDEyXG4gICAgLy8gOW0gLS0+IDMgd2Vla3MgLS0+IDEyXG5cbiAgICB3aGlsZSAoZmxhZyA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHREYXRlUmFuZ2UgPD0gOTAgKiBxdHMpIHtcbiAgICAgICAgdGhpcy5ncmlkUHJlY2lzaW9uWCA9IDcgKiBxdHM7XG4gICAgICAgIGZsYWcgPSAxO1xuICAgICAgfSBlbHNlIHF0cyA9IHF0cyArIDE7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5ncmlkUHJlY2lzaW9uWCk7XG5cbiAgICB0aGlzLmdyaWRXaWR0aFggPSB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnRyYW5zZm9ybVgodGhpcy5ncmlkUHJlY2lzaW9uWCk7XG4gICAgdGhpcy5ncmlkV2lkdGhZID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS5yZWN0SGVpZ2h0IC8gdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dFBoYXNlcy5sZW5ndGg7XG4gICAgdGhpcy5ncmlkUGF0aCA9ICdNICcgKyB0aGlzLmdyaWRXaWR0aFggKyAnIDAgTCAwIDAgMCAnICsgdGhpcy5ncmlkV2lkdGhZO1xuXG4gICAgdGhpcy54QXhpcyA9IFtdO1xuICAgIHRoaXMueUF4aXMgPSBbXTtcblxuICAgIGxldCBkYXRlID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dE1pbkRhdGU7XG4gICAgLy8gbGV0IHhQb3MgPSB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnRyYW5zZm9ybUdhbnR0RGF0ZShkYXRlKSArIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UueFBhZGRpbmcgKyAxNTA7XG4gICAgY29uc3QgeVRyYW5zID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS5yZWN0SGVpZ2h0ICsgdGhpcy5nYW50dENoYXJ0U2VydmljZS55UGFkZGluZyArIDEwO1xuICAgIC8vIGxldCB0cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4UG9zICsgJ3B4LCAnICsgeVRyYW5zICsgJ3B4KSc7XG4gICAgLy8gdGhpcy54QXhpcy5wdXNoKHt4UG9zOiB4UG9zLCB2YWx1ZTogZGF0ZSwgdHJhbnNmb3JtOiB0cmFuc2Zvcm19KTtcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRlKTtcbiAgICAvLyBjb25zb2xlLmxvZygnbWF4IGRhdGU6ICcgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmdhbnR0TWF4RGF0ZSk7XG4gICAgLy8gY29uc29sZS5sb2coJ2RhdGU6ICcgKyBkYXRlKTtcbiAgICB3aGlsZSAobmV3IERhdGUoZGF0ZSkgPD0gbmV3IERhdGUodGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dE1heERhdGUpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnZGF0ZTogJyArIGRhdGUpO1xuICAgICAgLy8gY29uc29sZS5sb2coZGF0ZSk7XG4gICAgICBjb25zdCB4UG9zID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS50cmFuc2Zvcm1HYW50dERhdGUoZGF0ZSkgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnhQYWRkaW5nICsgMTUwO1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgeFBvcyArICdweCwgJyArIHlUcmFucyArICdweCknO1xuICAgICAgdGhpcy54QXhpcy5wdXNoKHt4UG9zLCB2YWx1ZTogdGhpcy5zaG9ydGVuRGF0ZShkYXRlKSwgdHJhbnNmb3JtfSk7XG4gICAgICBkYXRlID0gdGhpcy5hZGREYXlzKGRhdGUsIHRoaXMuZ3JpZFByZWNpc2lvblgpO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMueEF4aXMpO1xuICAgIGxldCBjbnQgPSAwO1xuICAgIGZvciAoY29uc3QgcGhhc2Ugb2YgdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dFBoYXNlcykge1xuICAgICAgY29uc3QgeVBvcyA9IHRoaXMuZ3JpZFdpZHRoWSAqIGNudCArIHRoaXMuZ3JpZFdpZHRoWSAqIDAuNSArIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UueVBhZGRpbmc7XG4gICAgICB0aGlzLnlBeGlzLnB1c2goe3lQb3MsIHZhbHVlOiBwaGFzZSB9KTtcbiAgICAgIGNudCsrO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcHV0ZUdyaWQoKTtcbiAgICB0aGlzLmdyaWRJRCA9ICdncmlkJyArIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuY29tcG9uZW50SUQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLmNvbXB1dGVHcmlkKCk7XG4gIH1cbn1cbiJdfQ==