ng-devui
Version:
DevUI components based on Angular
184 lines • 31.2 kB
JavaScript
import { ChangeDetectionStrategy, Component, ElementRef, Input } from '@angular/core';
import { AXIS_TITLE_SPACE } from '../quadrant.config';
import * as i0 from "@angular/core";
export class QuadrantDiagramAxisComponent {
constructor(elementRef) {
this.elementRef = elementRef;
this.refreshColor = () => {
if (this.themeService) {
this.AXIS_COLOR = this.themeService.currentTheme.data['devui-dividing-line'];
this.AXIS_LABEL_COLOR = this.themeService.currentTheme.data['devui-aide-text'];
}
this.resetAxis();
};
}
ngOnChanges(changes) {
const { axisConfigs, view } = changes;
if (changes && (axisConfigs || view)) {
this.resetAxis();
}
}
ngOnInit() {
if (typeof window !== 'undefined') {
this.themeService = window.devuiThemeService;
if (this.themeService && this.themeService.eventBus) {
this.themeService.eventBus.add('themeChanged', this.refreshColor);
}
this.refreshColor();
}
}
resetAxis() {
this.initAxisData();
this.setAxisData();
this.drawAxis();
this.drawAxisLabels();
}
initAxisData() {
this.quadrantAxis = this.elementRef.nativeElement.querySelector('d-quadrant-diagram#' + this.diagramId + ' canvas');
this.quadrantAxis.width = this.view.width;
this.quadrantAxis.height = this.view.height;
}
setAxisData() {
this.context = this.quadrantAxis.getContext('2d');
this.axisOrigin = this.axisConfigs.axisOrigin;
this.axisTop = this.axisConfigs.axisTop;
this.axisRight = this.axisConfigs.axisRight;
this.axisWidth = this.axisConfigs.axisWidth;
this.axisHeight = this.axisConfigs.axisHeight;
this.yAxisTicksNum = this.axisConfigs.yAxisTicksNum;
this.xAxisTicksNum = this.axisConfigs.xAxisTicksNum;
this.xTickSpacing = this.axisConfigs.xTickSpacing;
this.yTickSpacing = this.axisConfigs.yTickSpacing;
}
drawAxis() {
this.context.save();
this.context.fillStyle = this.AXIS_COLOR;
this.context.strokeStyle = this.AXIS_COLOR;
this.drawXAxis();
this.drawYAxis();
this.context.lineWidth = 0.5;
this.drawYAxisTicks();
this.drawXAxisTicks();
this.context.restore();
}
drawXAxisTicks() {
let deltaY;
for (let i = 1; i < this.xAxisTicksNum; i++) {
this.context.beginPath();
// 判断显示长刻度还是短刻度
if (i % this.axisConfigs.xAxisRange.step === 0) {
deltaY = this.axisConfigs.tickWidth;
}
else {
deltaY = this.axisConfigs.tickWidth / 2;
}
this.context.moveTo(this.axisOrigin.x + i * this.xTickSpacing, this.axisOrigin.y - deltaY);
this.context.lineTo(this.axisOrigin.x + i * this.xTickSpacing, this.axisOrigin.y + deltaY);
this.context.stroke();
}
}
drawYAxisTicks() {
let deltaX;
for (let i = 1; i < this.yAxisTicksNum; i++) {
this.context.beginPath();
if (i % this.axisConfigs.yAxisRange.step === 0) {
deltaX = this.axisConfigs.tickWidth;
}
else {
deltaX = this.axisConfigs.tickWidth / 2;
}
this.context.moveTo(this.axisOrigin.x - deltaX, this.axisOrigin.y - i * this.yTickSpacing);
this.context.lineTo(this.axisOrigin.x + deltaX, this.axisOrigin.y - i * this.yTickSpacing);
this.context.stroke();
}
}
drawYAxis() {
this.context.beginPath();
this.context.moveTo(this.axisOrigin.x, this.axisOrigin.y);
this.context.lineTo(this.axisOrigin.x, this.axisTop - this.axisConfigs.axisMargin);
this.context.stroke();
this.context.moveTo(this.axisOrigin.x, this.axisTop - this.axisConfigs.axisMargin);
this.context.lineTo(this.axisOrigin.x + 5, this.axisTop - this.axisConfigs.axisMargin + 10);
this.context.lineTo(this.axisOrigin.x - 5, this.axisTop - this.axisConfigs.axisMargin + 10);
this.context.fill();
}
drawXAxis() {
this.context.beginPath();
this.context.moveTo(this.axisOrigin.x, this.axisOrigin.y);
this.context.lineTo(this.axisRight + this.axisConfigs.axisMargin - 10, this.axisOrigin.y);
this.context.stroke();
// 绘制坐标轴三角形
this.context.moveTo(this.axisRight + this.axisConfigs.axisMargin, this.axisOrigin.y);
this.context.lineTo(this.axisRight + this.axisConfigs.axisMargin - 10, this.axisOrigin.y + 5);
this.context.lineTo(this.axisRight + this.axisConfigs.axisMargin - 10, this.axisOrigin.y - 5);
this.context.fill();
}
drawAxisLabels() {
this.context.save();
this.context.fillStyle = this.AXIS_LABEL_COLOR;
this.drawXTicksLabels();
this.drawYTicksLabels();
this.context.restore();
this.drawAxisTitle();
}
drawAxisTitle() {
this.context.font = '12px Microsoft YaHei';
this.context.textAlign = 'left';
this.context.fillStyle = this.AXIS_LABEL_COLOR;
const xLabelWidth = this.context.measureText(this.axisConfigs.xAxisLabel).width;
this.rotateLabel(this.axisConfigs.xAxisLabel, this.axisRight + this.axisConfigs.axisMargin / 2, this.axisOrigin.y - xLabelWidth - AXIS_TITLE_SPACE);
this.context.fillText(this.axisConfigs.yAxisLabel, this.axisOrigin.x + AXIS_TITLE_SPACE, this.axisTop - this.axisConfigs.axisMargin / 2);
}
drawXTicksLabels() {
this.context.textAlign = 'center';
this.context.textBaseline = 'top';
for (let i = 0; i <= this.xAxisTicksNum; i++) {
if (i % this.axisConfigs.xAxisRange.step === 0) {
this.context.fillText(i, this.axisOrigin.x + i * this.xTickSpacing, this.axisOrigin.y + this.axisConfigs.spaceBetweenLabelsAxis);
}
}
}
drawYTicksLabels() {
this.context.textAlign = 'center';
this.context.textBaseline = 'middle';
for (let i = 0; i <= this.yAxisTicksNum; i++) {
if (i % this.axisConfigs.yAxisRange.step === 0) {
this.context.fillText(i, this.axisOrigin.x - this.axisConfigs.spaceBetweenLabelsAxis, this.axisOrigin.y - i * this.yTickSpacing);
}
}
}
rotateLabel(name, x, y) {
for (let i = 0; i < name.length; i++) {
const str = name.slice(i, i + 1).toString();
if (str.match(/[A-Za-z0-9]/)) {
this.context.save();
this.context.translate(x, y);
this.context.rotate((Math.PI / 180) * 90);
this.context.textBaseline = 'bottom';
this.context.fillText(str, 0, 0);
this.context.restore();
y += this.context.measureText(str).width;
}
else if (str.match(/[\u4E00-\u9FA5]/)) {
this.context.save();
this.context.textBaseline = 'top';
this.context.fillText(str, x, y);
this.context.restore();
y += this.context.measureText(str).width;
}
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuadrantDiagramAxisComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: QuadrantDiagramAxisComponent, selector: "d-quadrant-axis", inputs: { axisConfigs: "axisConfigs", view: "view", diagramId: "diagramId" }, usesOnChanges: true, ngImport: i0, template: "<canvas id=\"devui-quadrant-axis\"></canvas>\n", styles: ["canvas{position:absolute;z-index:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuadrantDiagramAxisComponent, decorators: [{
type: Component,
args: [{ selector: 'd-quadrant-axis', changeDetection: ChangeDetectionStrategy.OnPush, template: "<canvas id=\"devui-quadrant-axis\"></canvas>\n", styles: ["canvas{position:absolute;z-index:1}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { axisConfigs: [{
type: Input
}], view: [{
type: Input
}], diagramId: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhZHJhbnQtYXhpcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kZXZ1aS9xdWFkcmFudC1kaWFncmFtL3F1YWRyYW50LWF4aXMvcXVhZHJhbnQtYXhpcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9kZXZ1aS9xdWFkcmFudC1kaWFncmFtL3F1YWRyYW50LWF4aXMvcXVhZHJhbnQtYXhpcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBR3hILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQVF0RCxNQUFNLE9BQU8sNEJBQTRCO0lBbUJ2QyxZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBbUIxQyxpQkFBWSxHQUFHLEdBQUcsRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDO0lBekIyQyxDQUFDO0lBRTlDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUN0QyxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEVB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SSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEIsV0FBVztRQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMs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LEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMzQyxDQUFDO2lCQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7K0dBMU1VLDRCQUE0QjttR0FBNUIsNEJBQTRCLDBKQ1h6QyxnREFDQTs7NEZEVWEsNEJBQTRCO2tCQU54QyxTQUFTOytCQUNFLGlCQUFpQixtQkFDVix1QkFBdUIsQ0FBQyxNQUFNOytFQUt0QyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJ25nLWRldnVpL3RoZW1lJztcclxuaW1wb3J0IHsgSUF4aXNDb25maWdzLCBJVmlld0NvbmZpZ3MgfSBmcm9tICcuLi9xdWFkcmFudC1kaWFncmFtLnR5cGUnO1xyXG5pbXBvcnQgeyBBWElTX1RJVExFX1NQQUNFIH0gZnJvbSAnLi4vcXVhZHJhbnQuY29uZmlnJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZC1xdWFkcmFudC1heGlzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICB0ZW1wbGF0ZVVybDogJy4vcXVhZHJhbnQtYXhpcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcXVhZHJhbnQtYXhpcy5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUXVhZHJhbnREaWFncmFtQXhpc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBheGlzQ29uZmlnczogSUF4aXNDb25maWdzO1xyXG4gIEBJbnB1dCgpIHZpZXc6IElWaWV3Q29uZmlncztcclxuICBASW5wdXQoKSBkaWFncmFtSWQ7XHJcbiAgcXVhZHJhbnRBeGlzOiBhbnk7XHJcbiAgY29udGV4dDogYW55O1xyXG4gIGF4aXNPcmlnaW46IGFueTtcclxuICBheGlzVG9wOiBudW1iZXI7XHJcbiAgYXhpc1JpZ2h0OiBudW1iZXI7XHJcbiAgYXhpc1dpZHRoOiBudW1iZXI7XHJcbiAgYXhpc0hlaWdodDogbnVtYmVyO1xyXG4gIHlBeGlzVGlja3NOdW06IG51bWJlcjtcclxuICB4QXhpc1RpY2tzTnVtOiBudW1iZXI7XHJcbiAgeFRpY2tTcGFjaW5nOiBudW1iZXI7XHJcbiAgeVRpY2tTcGFjaW5nOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBBWElTX0NPTE9SO1xyXG4gIHByaXZhdGUgQVhJU19MQUJFTF9DT0xPUjtcclxuICB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGF4aXNDb25maWdzLCB2aWV3IH0gPSBjaGFuZ2VzO1xyXG4gICAgaWYgKGNoYW5nZXMgJiYgKGF4aXNDb25maWdzIHx8IHZpZXcpKSB7XHJcbiAgICAgIHRoaXMucmVzZXRBeGlzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLnRoZW1lU2VydmljZSA9ICh3aW5kb3cgYXMgYW55KS5kZXZ1aVRoZW1lU2VydmljZTtcclxuICAgICAgaWYgKHRoaXMudGhlbWVTZXJ2aWNlICYmIHRoaXMudGhlbWVTZXJ2aWNlLmV2ZW50QnVzKSB7XHJcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UuZXZlbnRCdXMuYWRkKCd0aGVtZUNoYW5nZWQnLCB0aGlzLnJlZnJlc2hDb2xvcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZWZyZXNoQ29sb3IoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hDb2xvciA9ICgpID0+IHtcclxuICAgIGlmICh0aGlzLnRoZW1lU2VydmljZSkge1xyXG4gICAgICB0aGlzLkFYSVNfQ09MT1IgPSB0aGlzLnRoZW1lU2VydmljZS5jdXJyZW50VGhlbWUuZGF0YVsnZGV2dWktZGl2aWRpbmctbGluZSddO1xyXG4gICAgICB0aGlzLkFYSVNfTEFCRUxfQ09MT1IgPSB0aGlzLnRoZW1lU2VydmljZS5jdXJyZW50VGhlbWUuZGF0YVsnZGV2dWktYWlkZS10ZXh0J107XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc2V0QXhpcygpO1xyXG4gIH07XHJcblxyXG4gIHJlc2V0QXhpcygpIHtcclxuICAgIHRoaXMuaW5pdEF4aXNEYXRhKCk7XHJcbiAgICB0aGlzLnNldEF4aXNEYXRhKCk7XHJcbiAgICB0aGlzLmRyYXdBeGlzKCk7XHJcbiAgICB0aGlzLmRyYXdBeGlzTGFiZWxzKCk7XHJcbiAgfVxyXG5cclxuICBpbml0QXhpc0RhdGEoKSB7XHJcbiAgICB0aGlzLnF1YWRyYW50QXhpcyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2QtcXVhZHJhbnQtZGlhZ3JhbSMnICsgdGhpcy5kaWFncmFtSWQgKyAnIGNhbnZhcycpO1xyXG4gICAgdGhpcy5xdWFkcmFudEF4aXMud2lkdGggPSB0aGlzLnZpZXcud2lkdGg7XHJcbiAgICB0aGlzLnF1YWRyYW50QXhpcy5oZWlnaHQgPSB0aGlzLnZpZXcuaGVpZ2h0O1xyXG4gIH1cclxuICBzZXRBeGlzRGF0YSgpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IHRoaXMucXVhZHJhbnRBeGlzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICB0aGlzLmF4aXNPcmlnaW4gPSB0aGlzLmF4aXNDb25maWdzLmF4aXNPcmlnaW47XHJcbiAgICB0aGlzLmF4aXNUb3AgPSB0aGlzLmF4aXNDb25maWdzLmF4aXNUb3A7XHJcbiAgICB0aGlzLmF4aXNSaWdodCA9IHRoaXMuYXhpc0NvbmZpZ3MuYXhpc1JpZ2h0O1xyXG4gICAgdGhpcy5heGlzV2lkdGggPSB0aGlzLmF4aXNDb25maWdzLmF4aXNXaWR0aDtcclxuICAgIHRoaXMuYXhpc0hlaWdodCA9IHRoaXMuYXhpc0NvbmZpZ3MuYXhpc0hlaWdodDtcclxuICAgIHRoaXMueUF4aXNUaWNrc051bSA9IHRoaXMuYXhpc0NvbmZpZ3MueUF4aXNUaWNrc051bTtcclxuICAgIHRoaXMueEF4aXNUaWNrc051bSA9IHRoaXMuYXhpc0NvbmZpZ3MueEF4aXNUaWNrc051bTtcclxuICAgIHRoaXMueFRpY2tTcGFjaW5nID0gdGhpcy5heGlzQ29uZmlncy54VGlja1NwYWNpbmc7XHJcbiAgICB0aGlzLnlUaWNrU3BhY2luZyA9IHRoaXMuYXhpc0NvbmZpZ3MueVRpY2tTcGFjaW5nO1xyXG4gIH1cclxuXHJcbiAgZHJhd0F4aXMoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xyXG4gICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IHRoaXMuQVhJU19DT0xPUjtcclxuICAgIHRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9IHRoaXMuQVhJU19DT0xPUjtcclxuICAgIHRoaXMuZHJhd1hBeGlzKCk7XHJcbiAgICB0aGlzLmRyYXdZQXhpcygpO1xyXG4gICAgdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IDAuNTtcclxuICAgIHRoaXMuZHJhd1lBeGlzVGlja3MoKTtcclxuICAgIHRoaXMuZHJhd1hBeGlzVGlja3MoKTtcclxuICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XHJcbiAgfVxyXG5cclxuICBkcmF3WEF4aXNUaWNrcygpIHtcclxuICAgIGxldCBkZWx0YVk7XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMueEF4aXNUaWNrc051bTsgaSsrKSB7XHJcbiAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcclxuICAgICAgLy8g5Yik5pat5pi+56S66ZW/5Yi75bqm6L+Y5piv55+t5Yi75bqmXHJcbiAgICAgIGlmIChpICUgdGhpcy5heGlzQ29uZmlncy54QXhpc1JhbmdlLnN0ZXAgPT09IDApIHtcclxuICAgICAgICBkZWx0YVkgPSB0aGlzLmF4aXNDb25maWdzLnRpY2tXaWR0aDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZWx0YVkgPSB0aGlzLmF4aXNDb25maWdzLnRpY2tXaWR0aCAvIDI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb250ZXh0Lm1vdmVUbyh0aGlzLmF4aXNPcmlnaW4ueCArIGkgKiB0aGlzLnhUaWNrU3BhY2luZywgdGhpcy5heGlzT3JpZ2luLnkgLSBkZWx0YVkpO1xyXG4gICAgICB0aGlzLmNvbnRleHQubGluZVRvKHRoaXMuYXhpc09yaWdpbi54ICsgaSAqIHRoaXMueFRpY2tTcGFjaW5nLCB0aGlzLmF4aXNPcmlnaW4ueSArIGRlbHRhWSk7XHJcbiAgICAgIHRoaXMuY29udGV4dC5zdHJva2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRyYXdZQXhpc1RpY2tzKCkge1xyXG4gICAgbGV0IGRlbHRhWDtcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy55QXhpc1RpY2tzTnVtOyBpKyspIHtcclxuICAgICAgdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xyXG4gICAgICBpZiAoaSAlIHRoaXMuYXhpc0NvbmZpZ3MueUF4aXNSYW5nZS5zdGVwID09PSAwKSB7XHJcbiAgICAgICAgZGVsdGFYID0gdGhpcy5heGlzQ29uZmlncy50aWNrV2lkdGg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVsdGFYID0gdGhpcy5heGlzQ29uZmlncy50aWNrV2lkdGggLyAyO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29udGV4dC5tb3ZlVG8odGhpcy5heGlzT3JpZ2luLnggLSBkZWx0YVgsIHRoaXMuYXhpc09yaWdpbi55IC0gaSAqIHRoaXMueVRpY2tTcGFjaW5nKTtcclxuICAgICAgdGhpcy5jb250ZXh0LmxpbmVUbyh0aGlzLmF4aXNPcmlnaW4ueCArIGRlbHRhWCwgdGhpcy5heGlzT3JpZ2luLnkgLSBpICogdGhpcy55VGlja1NwYWNpbmcpO1xyXG4gICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkcmF3WUF4aXMoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCk7XHJcbiAgICB0aGlzLmNvbnRleHQubW92ZVRvKHRoaXMuYXhpc09yaWdpbi54LCB0aGlzLmF4aXNPcmlnaW4ueSk7XHJcbiAgICB0aGlzLmNvbnRleHQubGluZVRvKHRoaXMuYXhpc09yaWdpbi54LCB0aGlzLmF4aXNUb3AgLSB0aGlzLmF4aXNDb25maWdzLmF4aXNNYXJnaW4pO1xyXG4gICAgdGhpcy5jb250ZXh0LnN0cm9rZSgpO1xyXG4gICAgdGhpcy5jb250ZXh0Lm1vdmVUbyh0aGlzLmF4aXNPcmlnaW4ueCwgdGhpcy5heGlzVG9wIC0gdGhpcy5heGlzQ29uZmlncy5heGlzTWFyZ2luKTtcclxuICAgIHRoaXMuY29udGV4dC5saW5lVG8odGhpcy5heGlzT3JpZ2luLnggKyA1LCB0aGlzLmF4aXNUb3AgLSB0aGlzLmF4aXNDb25maWdzLmF4aXNNYXJnaW4gKyAxMCk7XHJcbiAgICB0aGlzLmNvbnRleHQubGluZVRvKHRoaXMuYXhpc09yaWdpbi54IC0gNSwgdGhpcy5heGlzVG9wIC0gdGhpcy5heGlzQ29uZmlncy5heGlzTWFyZ2luICsgMTApO1xyXG4gICAgdGhpcy5jb250ZXh0LmZpbGwoKTtcclxuICB9XHJcblxyXG4gIGRyYXdYQXhpcygpIHtcclxuICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcclxuICAgIHRoaXMuY29udGV4dC5tb3ZlVG8odGhpcy5heGlzT3JpZ2luLngsIHRoaXMuYXhpc09yaWdpbi55KTtcclxuICAgIHRoaXMuY29udGV4dC5saW5lVG8odGhpcy5heGlzUmlnaHQgKyB0aGlzLmF4aXNDb25maWdzLmF4aXNNYXJnaW4gLSAxMCwgdGhpcy5heGlzT3JpZ2luLnkpO1xyXG4gICAgdGhpcy5jb250ZXh0LnN0cm9rZSgpO1xyXG4gICAgLy8g57uY5Yi25Z2Q5qCH6L205LiJ6KeS5b2iXHJcbiAgICB0aGlzLmNvbnRleHQubW92ZVRvKHRoaXMuYXhpc1JpZ2h0ICsgdGhpcy5heGlzQ29uZmlncy5heGlzTWFyZ2luLCB0aGlzLmF4aXNPcmlnaW4ueSk7XHJcbiAgICB0aGlzLmNvbnRleHQubGluZVRvKHRoaXMuYXhpc1JpZ2h0ICsgdGhpcy5heGlzQ29uZmlncy5heGlzTWFyZ2luIC0gMTAsIHRoaXMuYXhpc09yaWdpbi55ICsgNSk7XHJcbiAgICB0aGlzLmNvbnRleHQubGluZVRvKHRoaXMuYXhpc1JpZ2h0ICsgdGhpcy5heGlzQ29uZmlncy5heGlzTWFyZ2luIC0gMTAsIHRoaXMuYXhpc09yaWdpbi55IC0gNSk7XHJcbiAgICB0aGlzLmNvbnRleHQuZmlsbCgpO1xyXG4gIH1cclxuXHJcbiAgZHJhd0F4aXNMYWJlbHMoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xyXG4gICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IHRoaXMuQVhJU19MQUJFTF9DT0xPUjtcclxuICAgIHRoaXMuZHJhd1hUaWNrc0xhYmVscygpO1xyXG4gICAgdGhpcy5kcmF3WVRpY2tzTGFiZWxzKCk7XHJcbiAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xyXG4gICAgdGhpcy5kcmF3QXhpc1RpdGxlKCk7XHJcbiAgfVxyXG5cclxuICBkcmF3QXhpc1RpdGxlKCkge1xyXG4gICAgdGhpcy5jb250ZXh0LmZvbnQgPSAnMTJweCBNaWNyb3NvZnQgWWFIZWknO1xyXG4gICAgdGhpcy5jb250ZXh0LnRleHRBbGlnbiA9ICdsZWZ0JztcclxuICAgIHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSB0aGlzLkFYSVNfTEFCRUxfQ09MT1I7XHJcbiAgICBjb25zdCB4TGFiZWxXaWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dCh0aGlzLmF4aXNDb25maWdzLnhBeGlzTGFiZWwpLndpZHRoO1xyXG4gICAgdGhpcy5yb3RhdGVMYWJlbChcclxuICAgICAgdGhpcy5heGlzQ29uZmlncy54QXhpc0xhYmVsLFxyXG4gICAgICB0aGlzLmF4aXNSaWdodCArIHRoaXMuYXhpc0NvbmZpZ3MuYXhpc01hcmdpbiAvIDIsXHJcbiAgICAgIHRoaXMuYXhpc09yaWdpbi55IC0geExhYmVsV2lkdGggLSBBWElTX1RJVExFX1NQQUNFXHJcbiAgICApO1xyXG4gICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KFxyXG4gICAgICB0aGlzLmF4aXNDb25maWdzLnlBeGlzTGFiZWwsXHJcbiAgICAgIHRoaXMuYXhpc09yaWdpbi54ICsgQVhJU19USVRMRV9TUEFDRSxcclxuICAgICAgdGhpcy5heGlzVG9wIC0gdGhpcy5heGlzQ29uZmlncy5heGlzTWFyZ2luIC8gMlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGRyYXdYVGlja3NMYWJlbHMoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcbiAgICB0aGlzLmNvbnRleHQudGV4dEJhc2VsaW5lID0gJ3RvcCc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0aGlzLnhBeGlzVGlja3NOdW07IGkrKykge1xyXG4gICAgICBpZiAoaSAlIHRoaXMuYXhpc0NvbmZpZ3MueEF4aXNSYW5nZS5zdGVwID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KGksIHRoaXMuYXhpc09yaWdpbi54ICsgaSAqIHRoaXMueFRpY2tTcGFjaW5nLCB0aGlzLmF4aXNPcmlnaW4ueSArIHRoaXMuYXhpc0NvbmZpZ3Muc3BhY2VCZXR3ZWVuTGFiZWxzQXhpcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRyYXdZVGlja3NMYWJlbHMoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcbiAgICB0aGlzLmNvbnRleHQudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0aGlzLnlBeGlzVGlja3NOdW07IGkrKykge1xyXG4gICAgICBpZiAoaSAlIHRoaXMuYXhpc0NvbmZpZ3MueUF4aXNSYW5nZS5zdGVwID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KGksIHRoaXMuYXhpc09yaWdpbi54IC0gdGhpcy5heGlzQ29uZmlncy5zcGFjZUJldHdlZW5MYWJlbHNBeGlzLCB0aGlzLmF4aXNPcmlnaW4ueSAtIGkgKiB0aGlzLnlUaWNrU3BhY2luZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJvdGF0ZUxhYmVsKG5hbWUsIHgsIHkpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBzdHIgPSBuYW1lLnNsaWNlKGksIGkgKyAxKS50b1N0cmluZygpO1xyXG4gICAgICBpZiAoc3RyLm1hdGNoKC9bQS1aYS16MC05XS8pKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudHJhbnNsYXRlKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5yb3RhdGUoKE1hdGguUEkgLyAxODApICogOTApO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnYm90dG9tJztcclxuICAgICAgICB0aGlzLmNvbnRleHQuZmlsbFRleHQoc3RyLCAwLCAwKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xyXG4gICAgICAgIHkgKz0gdGhpcy5jb250ZXh0Lm1lYXN1cmVUZXh0KHN0cikud2lkdGg7XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RyLm1hdGNoKC9bXFx1NEUwMC1cXHU5RkE1XS8pKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudGV4dEJhc2VsaW5lID0gJ3RvcCc7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KHN0ciwgeCwgeSk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcclxuICAgICAgICB5ICs9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dChzdHIpLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxjYW52YXMgaWQ9XCJkZXZ1aS1xdWFkcmFudC1heGlzXCI+PC9jYW52YXM+XG4iXX0=