422 lines
33 KiB
JavaScript
422 lines
33 KiB
JavaScript
/**
|
|
* @fileoverview added by tsickle
|
|
* @suppress {checkTypes} checked by tsc
|
|
*/
|
|
/**
|
|
* Copyright (C) 2018 Michael Czechowski <mail@dailysh.it>
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation; version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program; if not, write to the Free Software Foundation, Inc., 51
|
|
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
import * as tslib_1 from "tslib";
|
|
import { ViewChild, Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
|
|
import { NlsCanvasService } from './../services/canvas.service';
|
|
import { NlsHistoryService } from './../services/history.service';
|
|
import { NlsMathService } from './../services/math.service';
|
|
import { NlsGraphService } from './../services/graph.service';
|
|
/** @type {?} */
|
|
var RESIZING_TIMEOUT = 800;
|
|
var NlsGraphsComponent = /** @class */ (function () {
|
|
function NlsGraphsComponent(canvasService, historyService, math, graphService) {
|
|
this.canvasService = canvasService;
|
|
this.historyService = historyService;
|
|
this.math = math;
|
|
this.graphService = graphService;
|
|
this.svgChange = new EventEmitter();
|
|
this.graphChange = new EventEmitter();
|
|
this.genLoadedAllGraphs = this.countLoadedGraphs();
|
|
this.resizingWindow = false;
|
|
}
|
|
/**
|
|
* @param {?} event
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.onResize = /**
|
|
* @param {?} event
|
|
* @return {?}
|
|
*/
|
|
function (event) {
|
|
var _this = this;
|
|
clearTimeout(this.resizingWindow);
|
|
this.resizingWindow = setTimeout(function () {
|
|
_this.canvas = _this.adjustCanvas();
|
|
_this.matrix = _this.calcMatrix();
|
|
_this.updateGraphs();
|
|
}, RESIZING_TIMEOUT);
|
|
};
|
|
/**
|
|
* @param {?} changes
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.ngOnChanges = /**
|
|
* @param {?} changes
|
|
* @return {?}
|
|
*/
|
|
function (changes) {
|
|
this.canvas = this.adjustCanvas();
|
|
this.matrix = this.calcMatrix();
|
|
if (changes["config"]) {
|
|
this.updateGraphs();
|
|
}
|
|
if (this.restoredHistory && this.restoredHistory.hash !== this.hash) {
|
|
this.restoreGraph();
|
|
}
|
|
};
|
|
/**
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.restoreGraph = /**
|
|
* @return {?}
|
|
*/
|
|
function () {
|
|
this.graphs = this.restoredHistory.graphs;
|
|
this.hash = this.restoredHistory.hash;
|
|
};
|
|
/**
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.saveHistory = /**
|
|
* @return {?}
|
|
*/
|
|
function () {
|
|
this.hash = this.historyService.hash(this.graphs);
|
|
this.historyService.save(this.graphs, this.config);
|
|
};
|
|
/**
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.saveGraph = /**
|
|
* @return {?}
|
|
*/
|
|
function () {
|
|
this.graphService.set(this.graphs);
|
|
};
|
|
/**
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.updateGraphs = /**
|
|
* @return {?}
|
|
*/
|
|
function () {
|
|
var _this = this;
|
|
/** @type {?} */
|
|
var genShiftStart = this.shiftPoint(this.matrix.start, this.config.vectors.start);
|
|
/** @type {?} */
|
|
var genShiftEnd = this.shiftPoint(this.matrix.end, this.config.vectors.end, false);
|
|
console.log(this.matrix);
|
|
/** @type {?} */
|
|
var curveList = [
|
|
{
|
|
color: this.config.colors.primary,
|
|
start: genShiftStart.next().value,
|
|
end: genShiftEnd.next().value
|
|
},
|
|
{
|
|
color: this.config.colors.secondary,
|
|
start: genShiftEnd.next().value,
|
|
end: genShiftStart.next().value
|
|
}
|
|
];
|
|
this.graphs = curveList.map(function (curve) {
|
|
return tslib_1.__assign({}, _this.adjustGraph(curve), { spread: _this.config.spread, interval: _this.config.interval });
|
|
});
|
|
this.hash = this.historyService.hash(this.graphs);
|
|
this.saveHistory();
|
|
this.saveGraph();
|
|
};
|
|
/**
|
|
* @param {?} curve
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.adjustGraph = /**
|
|
* @param {?} curve
|
|
* @return {?}
|
|
*/
|
|
function (curve) {
|
|
return Object.assign(curve, {
|
|
stroke: this.config.stroke,
|
|
start: Object.assign(curve.start, {
|
|
direction: this.genVectorPoint(curve.start.point, curve.start.vector)
|
|
}),
|
|
end: Object.assign(curve.end, {
|
|
direction: this.genVectorPoint(curve.end.point, curve.end.vector)
|
|
}),
|
|
nodes: this.genRandomPoints(this.config.nodes)
|
|
});
|
|
};
|
|
/**
|
|
* @param {?} num
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.genRandomPoints = /**
|
|
* @param {?} num
|
|
* @return {?}
|
|
*/
|
|
function (num) {
|
|
/** @type {?} */
|
|
var generatedPoints = [];
|
|
for (var i = 0; i < this.config.nodes; i++) {
|
|
generatedPoints.push(this.math.randomPoint(this.matrix, this.config.overlap));
|
|
}
|
|
return generatedPoints;
|
|
};
|
|
/**
|
|
* @param {?} x
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.flipflop = /**
|
|
* @param {?} x
|
|
* @return {?}
|
|
*/
|
|
function (x) {
|
|
return (x === 'start') ? 'end' : 'start';
|
|
};
|
|
/**
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.adjustCanvas = /**
|
|
* @return {?}
|
|
*/
|
|
function () {
|
|
this.canvasService.set(this.canvas);
|
|
this.canvasService.adjustToWindow();
|
|
return this.svgElementRef.nativeElement;
|
|
};
|
|
/**
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.calcMatrix = /**
|
|
* @return {?}
|
|
*/
|
|
function () {
|
|
/** @type {?} */
|
|
var canvasWidth = this.canvas.getBoundingClientRect().width;
|
|
/** @type {?} */
|
|
var canvasHeight = this.canvas.getBoundingClientRect().height;
|
|
/** @type {?} */
|
|
var totalArea = Math.abs(canvasWidth * canvasHeight);
|
|
/** @type {?} */
|
|
var totalCenter = this.math.centerOfArea(canvasWidth, canvasHeight);
|
|
return {
|
|
start: {
|
|
x: 0,
|
|
y: canvasHeight - this.config.vectors.spacing - this.config.margin.y
|
|
},
|
|
end: {
|
|
x: canvasWidth - this.config.vectors.spacing - this.config.margin.x,
|
|
y: 0
|
|
},
|
|
width: canvasWidth,
|
|
height: canvasHeight,
|
|
center: totalCenter
|
|
};
|
|
};
|
|
/**
|
|
* @param {?} point
|
|
* @param {?} vector
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.genVectorPoint = /**
|
|
* @param {?} point
|
|
* @param {?} vector
|
|
* @return {?}
|
|
*/
|
|
function (point, vector) {
|
|
/** @type {?} */
|
|
var range = this.math.Δ(this.matrix.start, this.matrix.end) * this.config.vectors.range;
|
|
return {
|
|
x: range * Math.sin(Math.PI * vector) + point.x,
|
|
y: range * Math.cos(Math.PI * vector) + point.y
|
|
};
|
|
};
|
|
/**
|
|
* @param {?} point
|
|
* @param {?} vector
|
|
* @param {?=} startPositive
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.shiftPoint = /**
|
|
* @param {?} point
|
|
* @param {?} vector
|
|
* @param {?=} startPositive
|
|
* @return {?}
|
|
*/
|
|
function (point, vector, startPositive) {
|
|
if (startPositive === void 0) { startPositive = true; }
|
|
var genShiftX, genShiftY;
|
|
return tslib_1.__generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
genShiftX = this.shiftNumber(this.config.vectors.spacing, vector, startPositive);
|
|
genShiftY = this.shiftNumber(this.config.vectors.spacing, vector, startPositive);
|
|
_a.label = 1;
|
|
case 1:
|
|
if (!true) return [3 /*break*/, 3];
|
|
return [4 /*yield*/, {
|
|
point: {
|
|
x: Math.cos(Math.PI * vector) * genShiftX.next().value + point.x,
|
|
y: Math.sin(Math.PI * vector) * genShiftY.next().value + point.y,
|
|
},
|
|
vector: vector
|
|
}];
|
|
case 2:
|
|
_a.sent();
|
|
return [3 /*break*/, 1];
|
|
case 3: return [2 /*return*/];
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* @param {?} space
|
|
* @param {?} vector
|
|
* @param {?=} startPositive
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.shiftNumber = /**
|
|
* @param {?} space
|
|
* @param {?} vector
|
|
* @param {?=} startPositive
|
|
* @return {?}
|
|
*/
|
|
function (space, vector, startPositive) {
|
|
if (startPositive === void 0) { startPositive = true; }
|
|
var current, index, sign;
|
|
return tslib_1.__generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
current = 0;
|
|
index = 0;
|
|
sign = this.math.flipSign(startPositive);
|
|
_a.label = 1;
|
|
case 1:
|
|
if (!true) return [3 /*break*/, 3];
|
|
return [4 /*yield*/, current = sign.next().value * index * space + current];
|
|
case 2:
|
|
_a.sent();
|
|
index++;
|
|
return [3 /*break*/, 1];
|
|
case 3: return [2 /*return*/];
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* @param {?} guillocheElement
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.prepareGuillocheExport = /**
|
|
* @param {?} guillocheElement
|
|
* @return {?}
|
|
*/
|
|
function (guillocheElement) {
|
|
if (this.genLoadedAllGraphs.next().value) {
|
|
this.svgChange.emit(this.svgElementRef);
|
|
}
|
|
};
|
|
/**
|
|
* @return {?}
|
|
*/
|
|
NlsGraphsComponent.prototype.countLoadedGraphs = /**
|
|
* @return {?}
|
|
*/
|
|
function () {
|
|
var cycles;
|
|
return tslib_1.__generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
cycles = 1;
|
|
_a.label = 1;
|
|
case 1:
|
|
if (!true) return [3 /*break*/, 6];
|
|
if (!(cycles < this.graphs.length)) return [3 /*break*/, 3];
|
|
return [4 /*yield*/, false];
|
|
case 2:
|
|
_a.sent();
|
|
cycles++;
|
|
return [3 /*break*/, 5];
|
|
case 3: return [4 /*yield*/, true];
|
|
case 4:
|
|
_a.sent();
|
|
cycles = 1;
|
|
_a.label = 5;
|
|
case 5: return [3 /*break*/, 1];
|
|
case 6: return [2 /*return*/];
|
|
}
|
|
});
|
|
};
|
|
NlsGraphsComponent.decorators = [
|
|
{ type: Component, args: [{
|
|
selector: 'nls-graphs',
|
|
template: "<svg #svg width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\"\nversion=\"1.1\" shape-rendering=\"geometricPrecision\">\n <g nlsGuilloche *ngFor=\"let graph of graphs\" [graph]=\"graph\" [animation]=\"animation\"></g>\n</svg>\n",
|
|
styles: [":host{position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden}"]
|
|
},] },
|
|
];
|
|
/** @nocollapse */
|
|
NlsGraphsComponent.ctorParameters = function () { return [
|
|
{ type: NlsCanvasService },
|
|
{ type: NlsHistoryService },
|
|
{ type: NlsMathService },
|
|
{ type: NlsGraphService }
|
|
]; };
|
|
NlsGraphsComponent.propDecorators = {
|
|
config: [{ type: Input }],
|
|
restoredHistory: [{ type: Input }],
|
|
animation: [{ type: Input }],
|
|
svgChange: [{ type: Output }],
|
|
graphChange: [{ type: Output }],
|
|
svgElementRef: [{ type: ViewChild, args: ['svg',] }],
|
|
onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
|
|
};
|
|
return NlsGraphsComponent;
|
|
}());
|
|
export { NlsGraphsComponent };
|
|
function NlsGraphsComponent_tsickle_Closure_declarations() {
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.canvas;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.matrix;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.graphs;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.windowHeight;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.windowWidth;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.genShiftPoint;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.genLoadedAllGraphs;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.hash;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.resizingWindow;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.config;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.restoredHistory;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.animation;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.svgChange;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.graphChange;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.svgElementRef;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.canvasService;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.historyService;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.math;
|
|
/** @type {?} */
|
|
NlsGraphsComponent.prototype.graphService;
|
|
}
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25scy1ndWlsbG9jaGUvIiwic291cmNlcyI6WyJubHMvY29tcG9uZW50cy9ncmFwaHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTRCLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFVMUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFOUQsSUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7O0lBMEMzQiw0QkFDVSxlQUNBLGdCQUNBLE1BQ0E7UUFIQSxrQkFBYSxHQUFiLGFBQWE7UUFDYixtQkFBYyxHQUFkLGNBQWM7UUFDZCxTQUFJLEdBQUosSUFBSTtRQUNKLGlCQUFZLEdBQVosWUFBWTt5QkFuQkEsSUFBSSxZQUFZLEVBQUU7MkJBQ2hCLElBQUksWUFBWSxFQUFFO1FBb0J4QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7S0FDN0I7Ozs7O0lBbEJELHFDQUFROzs7O0lBRFIsVUFDUyxLQUFLO1FBRGQsaUJBU0M7UUFQQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO1lBQy9CLEtBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lB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TSxFQUFFLENBQUM7O3dCQUVULHFCQUFNLElBQUksRUFBQTs7b0JBQVYsU0FBVSxDQUFDO29CQUNYLE1BQU0sR0FBRyxDQUFDLENBQUM7Ozs7Ozs7O2dCQXJPbEIsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO29CQUN0QixRQUFRLEVBQUUscVBBSVg7b0JBQ0MsTUFBTSxFQUFFLENBQUMsOEVBQThFLENBQUM7aUJBQ3pGOzs7O2dCQWhCUSxnQkFBZ0I7Z0JBQ2hCLGlCQUFpQjtnQkFDakIsY0FBYztnQkFFZCxlQUFlOzs7eUJBMEJyQixLQUFLO2tDQUNMLEtBQUs7NEJBQ0wsS0FBSzs0QkFDTCxNQUFNOzhCQUNOLE1BQU07Z0NBQ04sU0FBUyxTQUFDLEtBQUs7MkJBRWYsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7NkJBL0QzQzs7U0EyQ2Esa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggTWljaGFlbCBDemVjaG93c2tpIDxtYWlsQGRhaWx5c2guaXQ+XG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yXG4gKiBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aFxuICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxXG4gKiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cbiAqL1xuXG5pbXBvcnQgeyBWaWV3Q2hpbGQsIENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFNlbGVjdGlvbiBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0ICogYXMgU2hhcGUgZnJvbSAnZDMtc2hhcGUnO1xuaW1wb3J0ICogYXMgUmFuZG9tIGZyb20gJ2QzLXJhbmRvbSc7XG5pbXBvcnQgKiBhcyBEcmFnIGZyb20gJ2QzLWRyYWcnO1xuXG5pbXBvcnQgeyBHcmFwaCB9IGZyb20gJy4vLi4vbW9kZWxzL2dyYXBoLm1vZGVsJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vLi4vbW9kZWxzL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4vLi4vbW9kZWxzL3BvaW50Lm1vZGVsJztcbmltcG9ydCB7IE5sc0NhbnZhc1NlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL2NhbnZhcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5sc0hpc3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9oaXN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzTWF0aFNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL21hdGguc2VydmljZSc7XG5pbXBvcnQgeyBObHNHdWlsbG9jaGVEaXJlY3RpdmUgfSBmcm9tICcuLy4uL2RpcmVjdGl2ZXMvZ3VpbGxvY2hlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBObHNHcmFwaFNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL2dyYXBoLnNlcnZpY2UnO1xuXG5jb25zdCBSRVNJWklOR19USU1FT1VUID0gODAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdubHMtZ3JhcGhzJyxcbiAgdGVtcGxhdGU6IGA8c3ZnICNzdmcgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxudmVyc2lvbj1cIjEuMVwiIHNoYXBlLXJlbmRlcmluZz1cImdlb21ldHJpY1ByZWNpc2lvblwiPlxuICA8ZyBubHNHdWlsbG9jaGUgKm5nRm9yPVwibGV0IGdyYXBoIG9mIGdyYXBoc1wiIFtncmFwaF09XCJncmFwaFwiIFthbmltYXRpb25dPVwiYW5pbWF0aW9uXCI+PC9nPlxuPC9zdmc+XG5gLFxuICBzdHlsZXM6IFtgOmhvc3R7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjA7b3ZlcmZsb3c6aGlkZGVufWBdXG59KVxuZXhwb3J0IGNsYXNzIE5sc0dyYXBoc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgcHVibGljIGNhbnZhczogYW55IHwgbnVsbDtcbiAgcHVibGljIG1hdHJpeDogYW55IHwgbnVsbDtcbiAgcHVibGljIGdyYXBoczogR3JhcGhbXTtcbiAgcHVibGljIHdpbmRvd0hlaWdodDogbnVtYmVyIHwgbnVsbDtcbiAgcHVibGljIHdpbmRvd1dpZHRoOiBudW1iZXIgfCBudWxsO1xuXG4gIHByaXZhdGUgZ2VuU2hpZnRQb2ludDogYW55IHwgbnVsbDtcbiAgcHJpdmF0ZSBnZW5Mb2FkZWRBbGxHcmFwaHM6IGFueSB8IG51bGw7XG4gIHByaXZhdGUgaGFzaDogc3RyaW5nO1xuICBwcml2YXRlIHJlc2l6aW5nV2luZG93OiBhbnk7XG5cbiAgQElucHV0KCkgY29uZmlnOiBDb25maWc7XG4gIEBJbnB1dCgpIHJlc3RvcmVkSGlzdG9yeTogYW55O1xuICBASW5wdXQoKSBhbmltYXRpb246IGJvb2xlYW47XG4gIEBPdXRwdXQoKSBzdmdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBncmFwaENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQFZpZXdDaGlsZCgnc3ZnJykgc3ZnRWxlbWVudFJlZjtcblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgb25SZXNpemUoZXZlbnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemluZ1dpbmRvdyk7XG5cbiAgICB0aGlzLnJlc2l6aW5nV2luZG93ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbnZhcyA9IHRoaXMuYWRqdXN0Q2FudmFzKCk7XG4gICAgICB0aGlzLm1hdHJpeCA9IHRoaXMuY2FsY01hdHJpeCgpO1xuICAgICAgdGhpcy51cGRhdGVHcmFwaHMoKTtcbiAgICB9LCBSRVNJWklOR19USU1FT1VUKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2FudmFzU2VydmljZTogTmxzQ2FudmFzU2VydmljZSxcbiAgICBwcml2YXRlIGhpc3RvcnlTZXJ2aWNlOiBObHNIaXN0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIG1hdGg6IE5sc01hdGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JhcGhTZXJ2aWNlOiBObHNHcmFwaFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5nZW5Mb2FkZWRBbGxHcmFwaHMgPSB0aGlzLmNvdW50TG9hZGVkR3JhcGhzKCk7XG4gICAgdGhpcy5yZXNpemluZ1dpbmRvdyA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuY2FudmFzID0gdGhpcy5hZGp1c3RDYW52YXMoKTtcbiAgICB0aGlzLm1hdHJpeCA9IHRoaXMuY2FsY01hdHJpeCgpO1xuXG4gICAgaWYgKGNoYW5nZXMuY29uZmlnKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyYXBocygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3RvcmVkSGlzdG9yeSAmJiB0aGlzLnJlc3RvcmVkSGlzdG9yeS5oYXNoICE9PSB0aGlzLmhhc2gpIHtcbiAgICAgIHRoaXMucmVzdG9yZUdyYXBoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlR3JhcGgoKSB7XG4gICAgdGhpcy5ncmFwaHMgPSB0aGlzLnJlc3RvcmVkSGlzdG9yeS5ncmFwaHM7XG4gICAgdGhpcy5oYXNoID0gdGhpcy5yZXN0b3JlZEhpc3RvcnkuaGFzaDtcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUhpc3RvcnkoKSB7XG4gICAgdGhpcy5oYXNoID0gdGhpcy5oaXN0b3J5U2VydmljZS5oYXNoKHRoaXMuZ3JhcGhzKTtcbiAgICB0aGlzLmhpc3RvcnlTZXJ2aWNlLnNhdmUodGhpcy5ncmFwaHMsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUdyYXBoKCkge1xuICAgIHRoaXMuZ3JhcGhTZXJ2aWNlLnNldCh0aGlzLmdyYXBocyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUdyYXBocygpOiB2b2lkIHtcbiAgICBjb25zdCBnZW5TaGlmdFN0YXJ0ID0gdGhpcy5zaGlmdFBvaW50KHRoaXMubWF0cml4LnN0YXJ0LCB0aGlzLmNvbmZpZy52ZWN0b3JzLnN0YXJ0KTtcbiAgICBjb25zdCBnZW5TaGlmdEVuZCA9IHRoaXMuc2hpZnRQb2ludCh0aGlzLm1hdHJpeC5lbmQsIHRoaXMuY29uZmlnLnZlY3RvcnMuZW5kLCBmYWxzZSk7XG5cbiAgICBjb25zb2xlLmxvZyh0aGlzLm1hdHJpeCk7XG5cbiAgICBjb25zdCBjdXJ2ZUxpc3QgPSBbXG4gICAgICB7XG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbmZpZy5jb2xvcnMucHJpbWFyeSxcbiAgICAgICAgc3RhcnQ6IGdlblNoaWZ0U3RhcnQubmV4dCgpLnZhbHVlLFxuICAgICAgICBlbmQ6IGdlblNoaWZ0RW5kLm5leHQoKS52YWx1ZVxuICAgICAgICAvLyBzdGFydDoge1xuICAgICAgICAvLyAgIHBvaW50OiB0aGlzLm1hdHJpeC5zdGFydCxcbiAgICAgICAgLy8gICB2ZWN0b3I6IHRoaXMuY29uZmlnLnZlY3RvcnMuc3RhcnRcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gZW5kOiB7XG4gICAgICAgIC8vICAgcG9pbnQ6IHRoaXMubWF0cml4LmVuZCxcbiAgICAgICAgLy8gICB2ZWN0b3I6IHRoaXMuY29uZmlnLnZlY3RvcnMuZW5kXG4gICAgICAgIC8vIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbmZpZy5jb2xvcnMuc2Vjb25kYXJ5LFxuICAgICAgICBzdGFydDogZ2VuU2hpZnRFbmQubmV4dCgpLnZhbHVlLFxuICAgICAgICBlbmQ6IGdlblNoaWZ0U3RhcnQubmV4dCgpLnZhbHVlXG4gICAgICAgIC8vIGVuZDoge1xuICAgICAgICAvLyAgIHBvaW50OiB0aGlzLm1hdHJpeC5zdGFydCxcbiAgICAgICAgLy8gICB2ZWN0b3I6IHRoaXMuY29uZmlnLnZlY3RvcnMuc3RhcnRcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gc3RhcnQ6IHtcbiAgICAgICAgLy8gICBwb2ludDogdGhpcy5tYXRyaXguZW5kLFxuICAgICAgICAvLyAgIHZlY3RvcjogdGhpcy5jb25maWcudmVjdG9ycy5lbmRcbiAgICAgICAgLy8gfVxuICAgICAgfVxuICAgIF07XG5cbiAgICB0aGlzLmdyYXBocyA9IGN1cnZlTGlzdC5tYXAoY3VydmUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhpcy5hZGp1c3RHcmFwaChjdXJ2ZSksXG4gICAgICAgIHNwcmVhZDogdGhpcy5jb25maWcuc3ByZWFkLFxuICAgICAgICBpbnRlcnZhbDogdGhpcy5jb25maWcuaW50ZXJ2YWxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5oYXNoID0gdGhpcy5oaXN0b3J5U2VydmljZS5oYXNoKHRoaXMuZ3JhcGhzKTtcbiAgICB0aGlzLnNhdmVIaXN0b3J5KCk7XG4gICAgdGhpcy5zYXZlR3JhcGgoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0R3JhcGgoY3VydmUpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihjdXJ2ZSwge1xuICAgICAgc3Ryb2tlOiB0aGlzLmNvbmZpZy5zdHJva2UsXG4gICAgICBzdGFydDogT2JqZWN0LmFzc2lnbihjdXJ2ZS5zdGFydCwge1xuICAgICAgICBkaXJlY3Rpb246IHRoaXMuZ2VuVmVjdG9yUG9pbnQoY3VydmUuc3RhcnQucG9pbnQsIGN1cnZlLnN0YXJ0LnZlY3RvcilcbiAgICAgIH0pLFxuICAgICAgZW5kOiBPYmplY3QuYXNzaWduKGN1cnZlLmVuZCwge1xuICAgICAgICBkaXJlY3Rpb246IHRoaXMuZ2VuVmVjdG9yUG9pbnQoY3VydmUuZW5kLnBvaW50LCBjdXJ2ZS5lbmQudmVjdG9yKVxuICAgICAgfSksXG4gICAgICBub2RlczogdGhpcy5nZW5SYW5kb21Qb2ludHModGhpcy5jb25maWcubm9kZXMpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdlblJhbmRvbVBvaW50cyhudW06IG51bWJlcikge1xuICAgIGNvbnN0IGdlbmVyYXRlZFBvaW50cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmZpZy5ub2RlczsgaSsrKSB7XG4gICAgICBnZW5lcmF0ZWRQb2ludHMucHVzaCh0aGlzLm1hdGgucmFuZG9tUG9pbnQodGhpcy5tYXRyaXgsIHRoaXMuY29uZmlnLm92ZXJsYXApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2VuZXJhdGVkUG9pbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGlwZmxvcCh4OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKHggPT09ICdzdGFydCcpID8gJ2VuZCcgOiAnc3RhcnQnO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RDYW52YXMoKTogdm9pZCB7XG4gICAgdGhpcy5jYW52YXNTZXJ2aWNlLnNldCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXNTZXJ2aWNlLmFkanVzdFRvV2luZG93KCk7XG5cbiAgICByZXR1cm4gdGhpcy5zdmdFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGNhbGNNYXRyaXgoKSB7XG4gICAgY29uc3QgY2FudmFzV2lkdGggPSB0aGlzLmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSB0aGlzLmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgY29uc3QgdG90YWxBcmVhID0gTWF0aC5hYnMoY2FudmFzV2lkdGggKiBjYW52YXNIZWlnaHQpO1xuICAgIGNvbnN0IHRvdGFsQ2VudGVyID0gdGhpcy5tYXRoLmNlbnRlck9mQXJlYShjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydDoge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiBjYW52YXNIZWlnaHQgLSB0aGlzLmNvbmZpZy52ZWN0b3JzLnNwYWNpbmcgLSB0aGlzLmNvbmZpZy5tYXJnaW4ueVxuICAgICAgfSxcbiAgICAgIGVuZDoge1xuICAgICAgICB4OiBjYW52YXNXaWR0aCAtIHRoaXMuY29uZmlnLnZlY3RvcnMuc3BhY2luZyAtIHRoaXMuY29uZmlnLm1hcmdpbi54LFxuICAgICAgICB5OiAwXG4gICAgICB9LFxuICAgICAgd2lkdGg6IGNhbnZhc1dpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICBjZW50ZXI6IHRvdGFsQ2VudGVyXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuVmVjdG9yUG9pbnQocG9pbnQ6IFBvaW50LCB2ZWN0b3I6IG51bWJlcikge1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5tYXRoLs6UKHRoaXMubWF0cml4LnN0YXJ0LCB0aGlzLm1hdHJpeC5lbmQpICogdGhpcy5jb25maWcudmVjdG9ycy5yYW5nZTtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiByYW5nZSAqIE1hdGguc2luKE1hdGguUEkgKiB2ZWN0b3IpICsgcG9pbnQueCxcbiAgICAgIHk6IHJhbmdlICogTWF0aC5jb3MoTWF0aC5QSSAqIHZlY3RvcikgKyBwb2ludC55XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgKnNoaWZ0UG9pbnQocG9pbnQ6IFBvaW50LCB2ZWN0b3I6IG51bWJlciwgc3RhcnRQb3NpdGl2ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBnZW5TaGlmdFggPSB0aGlzLnNoaWZ0TnVtYmVyKHRoaXMuY29uZmlnLnZlY3RvcnMuc3BhY2luZywgdmVjdG9yLCBzdGFydFBvc2l0aXZlKTtcbiAgICBjb25zdCBnZW5TaGlmdFkgPSB0aGlzLnNoaWZ0TnVtYmVyKHRoaXMuY29uZmlnLnZlY3RvcnMuc3BhY2luZywgdmVjdG9yLCBzdGFydFBvc2l0aXZlKTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHBvaW50OiB7XG4gICAgICAgICAgeDogTWF0aC5jb3MoTWF0aC5QSSAqIHZlY3RvcikgKiBnZW5TaGlmdFgubmV4dCgpLnZhbHVlICsgcG9pbnQueCxcbiAgICAgICAgICB5OiBNYXRoLnNpbihNYXRoLlBJICogdmVjdG9yKSAqIGdlblNoaWZ0WS5uZXh0KCkudmFsdWUgKyBwb2ludC55LFxuICAgICAgICB9LFxuICAgICAgICB2ZWN0b3I6IHZlY3RvclxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlICpzaGlmdE51bWJlcihzcGFjZTogbnVtYmVyLCB2ZWN0b3I6IG51bWJlciwgc3RhcnRQb3NpdGl2ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBsZXQgY3VycmVudCA9IDA7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBzaWduID0gdGhpcy5tYXRoLmZsaXBTaWduKHN0YXJ0UG9zaXRpdmUpO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHlpZWxkIGN1cnJlbnQgPSBzaWduLm5leHQoKS52YWx1ZSAqIGluZGV4ICogc3BhY2UgKyBjdXJyZW50O1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUd1aWxsb2NoZUV4cG9ydChndWlsbG9jaGVFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuZ2VuTG9hZGVkQWxsR3JhcGhzLm5leHQoKS52YWx1ZSkge1xuICAgICAgdGhpcy5zdmdDaGFuZ2UuZW1pdCh0aGlzLnN2Z0VsZW1lbnRSZWYpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgKmNvdW50TG9hZGVkR3JhcGhzKCkge1xuICAgIGxldCBjeWNsZXMgPSAxO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChjeWNsZXMgPCB0aGlzLmdyYXBocy5sZW5ndGgpIHtcbiAgICAgICAgeWllbGQgZmFsc2U7XG4gICAgICAgIGN5Y2xlcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeWllbGQgdHJ1ZTtcbiAgICAgICAgY3ljbGVzID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|