/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * Copyright (C) 2018 Michael Czechowski * 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 { ElementRef, Input, Directive } from '@angular/core'; import * as Selection from 'd3-selection'; import * as Shape from 'd3-shape'; import { NlsCanvasService } from './../services/canvas.service'; import { NlsMathService } from './../services/math.service'; import { NlsGraphService } from '../services/graph.service'; var NlsGuillocheDirective = /** @class */ (function () { function NlsGuillocheDirective(canvasService, el, math, graphService) { this.canvasService = canvasService; this.el = el; this.math = math; this.graphService = graphService; } /** * @return {?} */ NlsGuillocheDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this.group.selectAll('*').remove(); }; /** * @param {?} changes * @return {?} */ NlsGuillocheDirective.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var _this = this; this.group = Selection.select(this.el.nativeElement); this.canvas = Selection.select(this.canvasService.get); // @todo modify graph here instead of in graphs.component.ts this.initialNodes = this.graph.nodes.slice(); this.initialCurve = tslib_1.__spread([ this.graph.start.point, this.graph.start.direction ], this.graph.nodes.slice(), [ this.graph.end.direction, this.graph.end.point ]); this.medianPoint = this.math.medianOfCurve(this.initialCurve); this.medianIndex = this.math.medianIndex(this.initialCurve); if (this.animation) { this.graph.nodes = this.graph.nodes.slice().map(function (node, i) { return { x: node.x, y: node.y, // ascent: Math.round(Math.random() * 100) / 100 ascent: _this.medianPoint.ascent + i * 0.5 }; }); this.bounces = this.initialNodes.map(function (node) { /** @type {?} */ var bounceAmplitude = Math.round(Math.random() * 150); return _this.math.bounce(bounceAmplitude, 3); }); /** @type {?} */ var i_1 = 0; this.animationInterval = setInterval(function () { _this.animateGraph(i_1++ % 1000 / 10000); }, this.graph.interval); } else { if (this.animationInterval) { this.bounce = null; clearInterval(this.animationInterval); } } this.group.selectAll('*').remove(); this.pathElements = []; /** @type {?} */ var graphs = this.spreadLines(tslib_1.__spread([ this.graph.start.point, this.graph.start.direction ], this.graph.nodes, [ this.graph.end.direction, this.graph.end.point, ])).forEach(function (points, index) { return _this.drawGraph(points); }); }; /** * @param {?} x * @return {?} */ NlsGuillocheDirective.prototype.animateGraph = /** * @param {?} x * @return {?} */ function (x) { var _this = this; /** @type {?} */ var graphs = this.spreadLines(tslib_1.__spread([ this.graph.start.point, this.graph.start.direction ], this.graph.nodes.map(function (point, i) { /** @type {?} */ var ascent = point.ascent * Math.sin(Math.PI * x); return _this.graphService.shiftPoint(point, ascent, _this.bounces[i].next().value); }), [ this.graph.end.direction, this.graph.end.point, ])); graphs.forEach(function (points, i) { return _this.updateGraph(points, i); }); }; /** * @param {?} points * @return {?} */ NlsGuillocheDirective.prototype.spreadLines = /** * @param {?} points * @return {?} */ function (points) { var _this = this; /** @type {?} */ var shiftedMedians = []; /** @type {?} */ var genshiftedMedians = this.graphService.spreadOrthogonal(this.medianPoint, this.graph.spread.spacing); for (var i = 0; i < this.graph.spread.amount; i++) { shiftedMedians.push(genshiftedMedians.next().value); } return shiftedMedians.map(function (median) { /** @type {?} */ var shiftedPoints = points.slice(); shiftedPoints.splice(_this.medianIndex, 1, median); return shiftedPoints; }); }; /** * @param {?} points * @param {?} index * @return {?} */ NlsGuillocheDirective.prototype.updateGraph = /** * @param {?} points * @param {?} index * @return {?} */ function (points, index) { this.pathElements[index] .attr('d', Shape.line() .x(function (p) { return p.x; }) .y(function (p) { return p.y; }) .curve(Shape.curveBasis)(points)); }; /** * @param {?} points * @return {?} */ NlsGuillocheDirective.prototype.drawGraph = /** * @param {?} points * @return {?} */ function (points) { this.group .attr('stroke', this.graph.color) .attr('stroke-width', this.graph.stroke) .attr('fill', 'none'); this.pathElements.push(this.group.append('path') .attr('d', Shape.line() .x(function (p) { return p.x; }) .y(function (p) { return p.y; }) .curve(Shape.curveBasis)(points))); }; /** * @param {?} points * @return {?} */ NlsGuillocheDirective.prototype.debugGraph = /** * @param {?} points * @return {?} */ function (points) { var _this = this; points.forEach(function (point, index) { /** @type {?} */ var circle = _this.group.append('g'); circle.append('circle') .attr('cx', point.x) .attr('cy', point.y) .attr('r', 3) .attr('fill-opacity', 0.6) .attr('fill', _this.graph.color); circle.append('text') .attr('x', point.x) .attr('y', point.y) .attr('dx', 8) .attr('dy', 15) .attr('fill', _this.graph.color) .text(index); }); }; NlsGuillocheDirective.decorators = [ { type: Directive, args: [{ selector: '[nlsGuilloche]' },] }, ]; /** @nocollapse */ NlsGuillocheDirective.ctorParameters = function () { return [ { type: NlsCanvasService }, { type: ElementRef }, { type: NlsMathService }, { type: NlsGraphService } ]; }; NlsGuillocheDirective.propDecorators = { graph: [{ type: Input }], animation: [{ type: Input }] }; return NlsGuillocheDirective; }()); export { NlsGuillocheDirective }; function NlsGuillocheDirective_tsickle_Closure_declarations() { /** @type {?} */ NlsGuillocheDirective.prototype.canvas; /** @type {?} */ NlsGuillocheDirective.prototype.group; /** @type {?} */ NlsGuillocheDirective.prototype.bounce; /** @type {?} */ NlsGuillocheDirective.prototype.bounces; /** @type {?} */ NlsGuillocheDirective.prototype.initialNodes; /** @type {?} */ NlsGuillocheDirective.prototype.initialCurve; /** @type {?} */ NlsGuillocheDirective.prototype.animationInterval; /** @type {?} */ NlsGuillocheDirective.prototype.medianPoint; /** @type {?} */ NlsGuillocheDirective.prototype.medianIndex; /** @type {?} */ NlsGuillocheDirective.prototype.pathElements; /** @type {?} */ NlsGuillocheDirective.prototype.graph; /** @type {?} */ NlsGuillocheDirective.prototype.animation; /** @type {?} */ NlsGuillocheDirective.prototype.canvasService; /** @type {?} */ NlsGuillocheDirective.prototype.el; /** @type {?} */ NlsGuillocheDirective.prototype.math; /** @type {?} */ NlsGuillocheDirective.prototype.graphService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpbGxvY2hlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25scy1ndWlsbG9jaGUvIiwic291cmNlcyI6WyJubHMvZGlyZWN0aXZlcy9ndWlsbG9jaGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLE9BQU8sRUFBRSxVQUFVLEVBQWdCLEtBQUssRUFBRSxTQUFTLEVBQXVDLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sS0FBSyxTQUFTLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sVUFBVSxDQUFDO0FBUWxDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0lBcUIxRCwrQkFDVSxlQUNBLElBQ0EsTUFDQTtRQUhBLGtCQUFhLEdBQWIsYUFBYTtRQUNiLE9BQUUsR0FBRixFQUFFO1FBQ0YsU0FBSSxHQUFKLElBQUk7UUFDSixpQkFBWSxHQUFaLFlBQVk7S0FFckI7Ozs7SUFFRCwyQ0FBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNwQzs7Ozs7SUFFRCwyQ0FBVzs7OztJQUFYLFVBQVksT0FBc0I7UUFBbEMsaUJBaURDO1FBaERDLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztRQUV2RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFL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TSxFQUFFLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2lCQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEIsQ0FBQyxDQUFDOzs7Z0JBeEpOLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQjs7OztnQkFOUSxnQkFBZ0I7Z0JBVmhCLFVBQVU7Z0JBV1YsY0FBYztnQkFDZCxlQUFlOzs7d0JBa0JyQixLQUFLOzRCQUNMLEtBQUs7O2dDQS9DUjs7U0FpQ2EscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggTWljaGFlbCBDemVjaG93c2tpIDxtYWlsQGRhaWx5c2guaXQ+XG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yXG4gKiBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aFxuICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxXG4gKiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cbiAqL1xuXG5pbXBvcnQgeyBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBEaXJlY3RpdmUsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBTZWxlY3Rpb24gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCAqIGFzIFNoYXBlIGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCAqIGFzIFJhbmRvbSBmcm9tICdkMy1yYW5kb20nO1xuaW1wb3J0ICogYXMgRHJhZyBmcm9tICdkMy1kcmFnJztcbmltcG9ydCAqIGFzIEVhc2UgZnJvbSAnZDMtZWFzZSc7XG5pbXBvcnQgKiBhcyBUaW1lciBmcm9tICdkMy10aW1lcic7XG5cbmltcG9ydCB7IEdyYXBoIH0gZnJvbSAnLi8uLi9tb2RlbHMvZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLy4uL21vZGVscy9wb2ludC5tb2RlbCc7XG5pbXBvcnQgeyBObHNDYW52YXNTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9jYW52YXMuc2VydmljZSc7XG5pbXBvcnQgeyBObHNNYXRoU2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvbWF0aC5zZXJ2aWNlJztcbmltcG9ydCB7IE5sc0dyYXBoU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2dyYXBoLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmxzR3VpbGxvY2hlXSdcbn0pXG5leHBvcnQgY2xhc3MgTmxzR3VpbGxvY2hlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgY2FudmFzOiBhbnk7XG4gIHByaXZhdGUgZ3JvdXA6IGFueTtcbiAgcHJpdmF0ZSBib3VuY2U6IGFueSB8IG51bGw7XG4gIHByaXZhdGUgYm91bmNlczogYW55IHwgbnVsbDtcbiAgcHJpdmF0ZSBpbml0aWFsTm9kZXM6IGFueTtcbiAgcHJpdmF0ZSBpbml0aWFsQ3VydmU6IGFueTtcbiAgcHJpdmF0ZSBhbmltYXRpb25JbnRlcnZhbDogYW55O1xuICBwcml2YXRlIG1lZGlhblBvaW50OiBQb2ludDtcbiAgcHJpdmF0ZSBtZWRpYW5JbmRleDogbnVtYmVyO1xuICBwcml2YXRlIHBhdGhFbGVtZW50czogYW55O1xuXG4gIEBJbnB1dCgpIGdyYXBoOiBHcmFwaDtcbiAgQElucHV0KCkgYW5pbWF0aW9uOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2FudmFzU2VydmljZTogTmxzQ2FudmFzU2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgbWF0aDogTmxzTWF0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBncmFwaFNlcnZpY2U6IE5sc0dyYXBoU2VydmljZVxuICApIHtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZ3JvdXAuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5ncm91cCA9IFNlbGVjdGlvbi5zZWxlY3QodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLmNhbnZhcyA9IFNlbGVjdGlvbi5zZWxlY3QodGhpcy5jYW52YXNTZXJ2aWNlLmdldCk7XG4gICAgLy8gQHRvZG8gbW9kaWZ5IGdyYXBoIGhlcmUgaW5zdGVhZCBvZiBpbiBncmFwaHMuY29tcG9uZW50LnRzXG4gICAgdGhpcy5pbml0aWFsTm9kZXMgPSB0aGlzLmdyYXBoLm5vZGVzLnNsaWNlKCk7XG4gICAgdGhpcy5pbml0aWFsQ3VydmUgPSBbXG4gICAgICB0aGlzLmdyYXBoLnN0YXJ0LnBvaW50LFxuICAgICAgdGhpcy5ncmFwaC5zdGFydC5kaXJlY3Rpb24sXG4gICAgICAuLi50aGlzLmdyYXBoLm5vZGVzLnNsaWNlKCksXG4gICAgICB0aGlzLmdyYXBoLmVuZC5kaXJlY3Rpb24sXG4gICAgICB0aGlzLmdyYXBoLmVuZC5wb2ludFxuICAgIF07XG4gICAgdGhpcy5tZWRpYW5Qb2ludCA9IHRoaXMubWF0aC5tZWRpYW5PZkN1cnZlKHRoaXMuaW5pdGlhbEN1cnZlKTtcbiAgICB0aGlzLm1lZGlhbkluZGV4ID0gdGhpcy5tYXRoLm1lZGlhbkluZGV4KHRoaXMuaW5pdGlhbEN1cnZlKTtcblxuICAgIGlmICh0aGlzLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5ncmFwaC5ub2RlcyA9IHRoaXMuZ3JhcGgubm9kZXMuc2xpY2UoKS5tYXAoKG5vZGUsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiBub2RlLngsXG4gICAgICAgICAgeTogbm9kZS55LFxuICAgICAgICAgIC8vIGFzY2VudDogTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTAwKSAvIDEwMFxuICAgICAgICAgIGFzY2VudDogdGhpcy5tZWRpYW5Qb2ludC5hc2NlbnQgKyBpICogMC41XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmNlcyA9IHRoaXMuaW5pdGlhbE5vZGVzLm1hcChub2RlID0+IHtcbiAgICAgICAgY29uc3QgYm91bmNlQW1wbGl0dWRlID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTUwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0aC5ib3VuY2UoYm91bmNlQW1wbGl0dWRlLCAzKTtcbiAgICAgIH0pO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgdGhpcy5hbmltYXRpb25JbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5hbmltYXRlR3JhcGgoaSsrICUgMTAwMCAvIDEwMDAwKTtcbiAgICAgIH0sIHRoaXMuZ3JhcGguaW50ZXJ2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5hbmltYXRpb25JbnRlcnZhbCkge1xuICAgICAgICB0aGlzLmJvdW5jZSA9IG51bGw7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5hbmltYXRpb25JbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ncm91cC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTtcbiAgICB0aGlzLnBhdGhFbGVtZW50cyA9IFtdO1xuXG4gICAgY29uc3QgZ3JhcGhzID0gdGhpcy5zcHJlYWRMaW5lcyhbXG4gICAgICB0aGlzLmdyYXBoLnN0YXJ0LnBvaW50LFxuICAgICAgdGhpcy5ncmFwaC5zdGFydC5kaXJlY3Rpb24sXG4gICAgICAuLi50aGlzLmdyYXBoLm5vZGVzLFxuICAgICAgdGhpcy5ncmFwaC5lbmQuZGlyZWN0aW9uLFxuICAgICAgdGhpcy5ncmFwaC5lbmQucG9pbnQsXG4gICAgXSkuZm9yRWFjaCgocG9pbnRzLCBpbmRleCkgPT4gdGhpcy5kcmF3R3JhcGgocG9pbnRzKSk7XG4gIH1cblxuICBwcml2YXRlIGFuaW1hdGVHcmFwaCh4KSB7XG4gICAgY29uc3QgZ3JhcGhzID0gdGhpcy5zcHJlYWRMaW5lcyhbXG4gICAgICB0aGlzLmdyYXBoLnN0YXJ0LnBvaW50LFxuICAgICAgdGhpcy5ncmFwaC5zdGFydC5kaXJlY3Rpb24sXG4gICAgICAuLi50aGlzLmdyYXBoLm5vZGVzLm1hcCgocG9pbnQsIGkpID0+IHtcbiAgICAgICAgY29uc3QgYXNjZW50ID0gcG9pbnQuYXNjZW50ICogTWF0aC5zaW4oTWF0aC5QSSAqIHgpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2Uuc2hpZnRQb2ludChwb2ludCwgYXNjZW50LCB0aGlzLmJvdW5jZXNbaV0ubmV4dCgpLnZhbHVlKTtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5ncmFwaC5lbmQuZGlyZWN0aW9uLFxuICAgICAgdGhpcy5ncmFwaC5lbmQucG9pbnQsXG4gICAgXSk7XG5cbiAgICBncmFwaHMuZm9yRWFjaCgocG9pbnRzLCBpKSA9PiB0aGlzLnVwZGF0ZUdyYXBoKHBvaW50cywgaSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcHJlYWRMaW5lcyhwb2ludHM6IFBvaW50W10pIHtcbiAgICBjb25zdCBzaGlmdGVkTWVkaWFucyA9IFtdO1xuICAgIGNvbnN0IGdlbnNoaWZ0ZWRNZWRpYW5zID0gdGhpcy5ncmFwaFNlcnZpY2Uuc3ByZWFkT3J0aG9nb25hbCh0aGlzLm1lZGlhblBvaW50LCB0aGlzLmdyYXBoLnNwcmVhZC5zcGFjaW5nKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ncmFwaC5zcHJlYWQuYW1vdW50OyBpKyspIHtcbiAgICAgIHNoaWZ0ZWRNZWRpYW5zLnB1c2goZ2Vuc2hpZnRlZE1lZGlhbnMubmV4dCgpLnZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hpZnRlZE1lZGlhbnMubWFwKG1lZGlhbiA9PiB7XG4gICAgICBjb25zdCBzaGlmdGVkUG9pbnRzID0gcG9pbnRzLnNsaWNlKCk7XG4gICAgICBzaGlmdGVkUG9pbnRzLnNwbGljZSh0aGlzLm1lZGlhbkluZGV4LCAxLCBtZWRpYW4pO1xuICAgICAgcmV0dXJuIHNoaWZ0ZWRQb2ludHM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUdyYXBoKHBvaW50czogUG9pbnRbXSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGF0aEVsZW1lbnRzW2luZGV4XVxuICAgICAgLmF0dHIoJ2QnLCBTaGFwZS5saW5lKClcbiAgICAgICAgLngocCA9PiBwLngpXG4gICAgICAgIC55KHAgPT4gcC55KVxuICAgICAgICAuY3VydmUoU2hhcGUuY3VydmVCYXNpcykocG9pbnRzKSk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdHcmFwaChwb2ludHM6IFBvaW50W10pOiB2b2lkIHtcbiAgICB0aGlzLmdyb3VwXG4gICAgICAuYXR0cignc3Ryb2tlJywgdGhpcy5ncmFwaC5jb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aGlzLmdyYXBoLnN0cm9rZSlcbiAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKTtcblxuICAgIHRoaXMucGF0aEVsZW1lbnRzLnB1c2goXG4gICAgICB0aGlzLmdyb3VwLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5hdHRyKCdkJywgU2hhcGUubGluZSgpXG4gICAgICAgICAgLngocCA9PiBwLngpXG4gICAgICAgICAgLnkocCA9PiBwLnkpXG4gICAgICAgICAgLmN1cnZlKFNoYXBlLmN1cnZlQmFzaXMpKHBvaW50cykpKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVidWdHcmFwaChwb2ludHM6IFBvaW50W10pIHtcbiAgICBwb2ludHMuZm9yRWFjaCgocG9pbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjaXJjbGUgPSB0aGlzLmdyb3VwLmFwcGVuZCgnZycpO1xuXG4gICAgICBjaXJjbGUuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAuYXR0cignY3gnLCBwb2ludC54KVxuICAgICAgICAuYXR0cignY3knLCBwb2ludC55KVxuICAgICAgICAuYXR0cigncicsIDMpXG4gICAgICAgIC5hdHRyKCdmaWxsLW9wYWNpdHknLCAwLjYpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgdGhpcy5ncmFwaC5jb2xvcik7XG5cbiAgICAgIGNpcmNsZS5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cigneCcsIHBvaW50LngpXG4gICAgICAgIC5hdHRyKCd5JywgcG9pbnQueSlcbiAgICAgICAgLmF0dHIoJ2R4JywgOClcbiAgICAgICAgLmF0dHIoJ2R5JywgMTUpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgdGhpcy5ncmFwaC5jb2xvcilcbiAgICAgICAgLnRleHQoaW5kZXgpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=