@zsviczian/excalidraw 0.10.0-obsidian-18 → 0.10.0-obsidian-19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -575,7 +575,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
575
575
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
576
576
 
577
577
  "use strict";
578
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"line\\\": () => (/* binding */ line),\\n/* harmony export */ \\\"linearPath\\\": () => (/* binding */ linearPath),\\n/* harmony export */ \\\"polygon\\\": () => (/* binding */ polygon),\\n/* harmony export */ \\\"rectangle\\\": () => (/* binding */ rectangle),\\n/* harmony export */ \\\"curve\\\": () => (/* binding */ curve),\\n/* harmony export */ \\\"ellipse\\\": () => (/* binding */ ellipse),\\n/* harmony export */ \\\"generateEllipseParams\\\": () => (/* binding */ generateEllipseParams),\\n/* harmony export */ \\\"ellipseWithParams\\\": () => (/* binding */ ellipseWithParams),\\n/* harmony export */ \\\"arc\\\": () => (/* binding */ arc),\\n/* harmony export */ \\\"svgPath\\\": () => (/* binding */ svgPath),\\n/* harmony export */ \\\"solidFillPolygon\\\": () => (/* binding */ solidFillPolygon),\\n/* harmony export */ \\\"patternFillPolygons\\\": () => (/* binding */ patternFillPolygons),\\n/* harmony export */ \\\"patternFillArc\\\": () => (/* binding */ patternFillArc),\\n/* harmony export */ \\\"randOffset\\\": () => (/* binding */ randOffset),\\n/* harmony export */ \\\"randOffsetWithRange\\\": () => (/* binding */ randOffsetWithRange),\\n/* harmony export */ \\\"doubleLineFillOps\\\": () => (/* binding */ doubleLineFillOps)\\n/* harmony export */ });\\n/* harmony import */ var _fillers_filler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fillers/filler.js */ \\\"../../../node_modules/roughjs/bin/fillers/filler.js\\\");\\n/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math.js */ \\\"../../../node_modules/roughjs/bin/math.js\\\");\\n/* harmony import */ var path_data_parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! path-data-parser */ \\\"../../../node_modules/path-data-parser/lib/index.js\\\");\\n\\n\\n\\nconst helper = {\\n randOffset,\\n randOffsetWithRange,\\n ellipse,\\n doubleLineOps: doubleLineFillOps,\\n};\\nfunction line(x1, y1, x2, y2, o) {\\n return { type: 'path', ops: _doubleLine(x1, y1, x2, y2, o) };\\n}\\nfunction linearPath(points, close, o) {\\n const len = (points || []).length;\\n if (len > 2) {\\n const ops = [];\\n for (let i = 0; i < (len - 1); i++) {\\n ops.push(..._doubleLine(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], o));\\n }\\n if (close) {\\n ops.push(..._doubleLine(points[len - 1][0], points[len - 1][1], points[0][0], points[0][1], o));\\n }\\n return { type: 'path', ops };\\n }\\n else if (len === 2) {\\n return line(points[0][0], points[0][1], points[1][0], points[1][1], o);\\n }\\n return { type: 'path', ops: [] };\\n}\\nfunction polygon(points, o) {\\n return linearPath(points, true, o);\\n}\\nfunction rectangle(x, y, width, height, o) {\\n const points = [\\n [x, y],\\n [x + width, y],\\n [x + width, y + height],\\n [x, y + height],\\n ];\\n return polygon(points, o);\\n}\\nfunction curve(points, o) {\\n let o1 = _curveWithOffset(points, 1 * (1 + o.roughness * 0.2), o);\\n if (!o.disableMultiStroke) {\\n const o2 = _curveWithOffset(points, 1.5 * (1 + o.roughness * 0.22), cloneOptionsAlterSeed(o));\\n o1 = o1.concat(o2);\\n }\\n return { type: 'path', ops: o1 };\\n}\\nfunction ellipse(x, y, width, height, o) {\\n const params = generateEllipseParams(width, height, o);\\n return ellipseWithParams(x, y, o, params).opset;\\n}\\nfunction generateEllipseParams(width, height, o) {\\n const psq = Math.sqrt(Math.PI * 2 * Math.sqrt((Math.pow(width / 2, 2) + Math.pow(height / 2, 2)) / 2));\\n const stepCount = Math.max(o.curveStepCount, (o.curveStepCount / Math.sqrt(200)) * psq);\\n const increment = (Math.PI * 2) / stepCount;\\n let rx = Math.abs(width / 2);\\n let ry = Math.abs(height / 2);\\n const curveFitRandomness = 1 - o.curveFitting;\\n rx += _offsetOpt(rx * curveFitRandomness, o);\\n ry += _offsetOpt(ry * curveFitRandomness, o);\\n return { increment, rx, ry };\\n}\\nfunction ellipseWithParams(x, y, o, ellipseParams) {\\n const [ap1, cp1] = _computeEllipsePoints(ellipseParams.increment, x, y, ellipseParams.rx, ellipseParams.ry, 1, ellipseParams.increment * _offset(0.1, _offset(0.4, 1, o), o), o);\\n let o1 = _curve(ap1, null, o);\\n if ((!o.disableMultiStroke) && (o.roughness !== 0)) {\\n const [ap2] = _computeEllipsePoints(ellipseParams.increment, x, y, ellipseParams.rx, ellipseParams.ry, 1.5, 0, o);\\n const o2 = _curve(ap2, null, o);\\n o1 = o1.concat(o2);\\n }\\n return {\\n estimatedPoints: cp1,\\n opset: { type: 'path', ops: o1 },\\n };\\n}\\nfunction arc(x, y, width, height, start, stop, closed, roughClosure, o) {\\n const cx = x;\\n const cy = y;\\n let rx = Math.abs(width / 2);\\n let ry = Math.abs(height / 2);\\n rx += _offsetOpt(rx * 0.01, o);\\n ry += _offsetOpt(ry * 0.01, o);\\n let strt = start;\\n let stp = stop;\\n while (strt < 0) {\\n strt += Math.PI * 2;\\n stp += Math.PI * 2;\\n }\\n if ((stp - strt) > (Math.PI * 2)) {\\n strt = 0;\\n stp = Math.PI * 2;\\n }\\n const ellipseInc = (Math.PI * 2) / o.curveStepCount;\\n const arcInc = Math.min(ellipseInc / 2, (stp - strt) / 2);\\n const ops = _arc(arcInc, cx, cy, rx, ry, strt, stp, 1, o);\\n if (!o.disableMultiStroke) {\\n const o2 = _arc(arcInc, cx, cy, rx, ry, strt, stp, 1.5, o);\\n ops.push(...o2);\\n }\\n if (closed) {\\n if (roughClosure) {\\n ops.push(..._doubleLine(cx, cy, cx + rx * Math.cos(strt), cy + ry * Math.sin(strt), o), ..._doubleLine(cx, cy, cx + rx * Math.cos(stp), cy + ry * Math.sin(stp), o));\\n }\\n else {\\n ops.push({ op: 'lineTo', data: [cx, cy] }, { op: 'lineTo', data: [cx + rx * Math.cos(strt), cy + ry * Math.sin(strt)] });\\n }\\n }\\n return { type: 'path', ops };\\n}\\nfunction svgPath(path, o) {\\n const segments = (0,path_data_parser__WEBPACK_IMPORTED_MODULE_2__.normalize)((0,path_data_parser__WEBPACK_IMPORTED_MODULE_2__.absolutize)((0,path_data_parser__WEBPACK_IMPORTED_MODULE_2__.parsePath)(path)));\\n const ops = [];\\n let first = [0, 0];\\n let current = [0, 0];\\n for (const { key, data } of segments) {\\n switch (key) {\\n case 'M': {\\n const ro = 1 * (o.maxRandomnessOffset || 0);\\n const pv = o.preserveVertices;\\n ops.push({ op: 'move', data: data.map((d) => d + (pv ? 0 : _offsetOpt(ro, o))) });\\n current = [data[0], data[1]];\\n first = [data[0], data[1]];\\n break;\\n }\\n case 'L':\\n ops.push(..._doubleLine(current[0], current[1], data[0], data[1], o));\\n current = [data[0], data[1]];\\n break;\\n case 'C': {\\n const [x1, y1, x2, y2, x, y] = data;\\n ops.push(..._bezierTo(x1, y1, x2, y2, x, y, current, o));\\n current = [x, y];\\n break;\\n }\\n case 'Z':\\n ops.push(..._doubleLine(current[0], current[1], first[0], first[1], o));\\n current = [first[0], first[1]];\\n break;\\n }\\n }\\n return { type: 'path', ops };\\n}\\n// Fills\\nfunction solidFillPolygon(polygonList, o) {\\n const ops = [];\\n for (const points of polygonList) {\\n if (points.length) {\\n const offset = o.maxRandomnessOffset || 0;\\n const len = points.length;\\n if (len > 2) {\\n ops.push({ op: 'move', data: [points[0][0] + _offsetOpt(offset, o), points[0][1] + _offsetOpt(offset, o)] });\\n for (let i = 1; i < len; i++) {\\n ops.push({ op: 'lineTo', data: [points[i][0] + _offsetOpt(offset, o), points[i][1] + _offsetOpt(offset, o)] });\\n }\\n }\\n }\\n }\\n return { type: 'fillPath', ops };\\n}\\nfunction patternFillPolygons(polygonList, o) {\\n return (0,_fillers_filler_js__WEBPACK_IMPORTED_MODULE_0__.getFiller)(o, helper).fillPolygons(polygonList, o);\\n}\\nfunction patternFillArc(x, y, width, height, start, stop, o) {\\n const cx = x;\\n const cy = y;\\n let rx = Math.abs(width / 2);\\n let ry = Math.abs(height / 2);\\n rx += _offsetOpt(rx * 0.01, o);\\n ry += _offsetOpt(ry * 0.01, o);\\n let strt = start;\\n let stp = stop;\\n while (strt < 0) {\\n strt += Math.PI * 2;\\n stp += Math.PI * 2;\\n }\\n if ((stp - strt) > (Math.PI * 2)) {\\n strt = 0;\\n stp = Math.PI * 2;\\n }\\n const increment = (stp - strt) / o.curveStepCount;\\n const points = [];\\n for (let angle = strt; angle <= stp; angle = angle + increment) {\\n points.push([cx + rx * Math.cos(angle), cy + ry * Math.sin(angle)]);\\n }\\n points.push([cx + rx * Math.cos(stp), cy + ry * Math.sin(stp)]);\\n points.push([cx, cy]);\\n return patternFillPolygons([points], o);\\n}\\nfunction randOffset(x, o) {\\n return _offsetOpt(x, o);\\n}\\nfunction randOffsetWithRange(min, max, o) {\\n return _offset(min, max, o);\\n}\\nfunction doubleLineFillOps(x1, y1, x2, y2, o) {\\n return _doubleLine(x1, y1, x2, y2, o, true);\\n}\\n// Private helpers\\nfunction cloneOptionsAlterSeed(ops) {\\n const result = Object.assign({}, ops);\\n result.randomizer = undefined;\\n if (ops.seed) {\\n result.seed = ops.seed + 1;\\n }\\n return result;\\n}\\nfunction random(ops) {\\n if (!ops.randomizer) {\\n ops.randomizer = new _math_js__WEBPACK_IMPORTED_MODULE_1__.Random(ops.seed || 0);\\n }\\n return ops.randomizer.next();\\n}\\nfunction _offset(min, max, ops, roughnessGain = 1) {\\n return ops.roughness * roughnessGain * ((random(ops) * (max - min)) + min);\\n}\\nfunction _offsetOpt(x, ops, roughnessGain = 1) {\\n return _offset(-x, x, ops, roughnessGain);\\n}\\nfunction _doubleLine(x1, y1, x2, y2, o, filling = false) {\\n const singleStroke = filling ? o.disableMultiStrokeFill : o.disableMultiStroke;\\n const o1 = _line(x1, y1, x2, y2, o, true, false);\\n if (singleStroke) {\\n return o1;\\n }\\n const o2 = _line(x1, y1, x2, y2, o, true, true);\\n return o1.concat(o2);\\n}\\nfunction _line(x1, y1, x2, y2, o, move, overlay) {\\n const lengthSq = Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2);\\n const length = Math.sqrt(lengthSq);\\n let roughnessGain = 1;\\n if (length < 200) {\\n roughnessGain = 1;\\n }\\n else if (length > 500) {\\n roughnessGain = 0.4;\\n }\\n else {\\n roughnessGain = (-0.0016668) * length + 1.233334;\\n }\\n let offset = o.maxRandomnessOffset || 0;\\n if ((offset * offset * 100) > lengthSq) {\\n offset = length / 10;\\n }\\n const halfOffset = offset / 2;\\n const divergePoint = 0.2 + random(o) * 0.2;\\n let midDispX = o.bowing * o.maxRandomnessOffset * (y2 - y1) / 200;\\n let midDispY = o.bowing * o.maxRandomnessOffset * (x1 - x2) / 200;\\n midDispX = _offsetOpt(midDispX, o, roughnessGain);\\n midDispY = _offsetOpt(midDispY, o, roughnessGain);\\n const ops = [];\\n const randomHalf = () => _offsetOpt(halfOffset, o, roughnessGain);\\n const randomFull = () => _offsetOpt(offset, o, roughnessGain);\\n const preserveVertices = o.preserveVertices;\\n if (move) {\\n if (overlay) {\\n ops.push({\\n op: 'move', data: [\\n x1 + (preserveVertices ? 0 : randomHalf()),\\n y1 + (preserveVertices ? 0 : randomHalf()),\\n ],\\n });\\n }\\n else {\\n ops.push({\\n op: 'move', data: [\\n x1 + (preserveVertices ? 0 : _offsetOpt(offset, o, roughnessGain)),\\n y1 + (preserveVertices ? 0 : _offsetOpt(offset, o, roughnessGain)),\\n ],\\n });\\n }\\n }\\n if (overlay) {\\n ops.push({\\n op: 'bcurveTo',\\n data: [\\n midDispX + x1 + (x2 - x1) * divergePoint + randomHalf(),\\n midDispY + y1 + (y2 - y1) * divergePoint + randomHalf(),\\n midDispX + x1 + 2 * (x2 - x1) * divergePoint + randomHalf(),\\n midDispY + y1 + 2 * (y2 - y1) * divergePoint + randomHalf(),\\n x2 + (preserveVertices ? 0 : randomHalf()),\\n y2 + (preserveVertices ? 0 : randomHalf()),\\n ],\\n });\\n }\\n else {\\n ops.push({\\n op: 'bcurveTo',\\n data: [\\n midDispX + x1 + (x2 - x1) * divergePoint + randomFull(),\\n midDispY + y1 + (y2 - y1) * divergePoint + randomFull(),\\n midDispX + x1 + 2 * (x2 - x1) * divergePoint + randomFull(),\\n midDispY + y1 + 2 * (y2 - y1) * divergePoint + randomFull(),\\n x2 + (preserveVertices ? 0 : randomFull()),\\n y2 + (preserveVertices ? 0 : randomFull()),\\n ],\\n });\\n }\\n return ops;\\n}\\nfunction _curveWithOffset(points, offset, o) {\\n const ps = [];\\n ps.push([\\n points[0][0] + _offsetOpt(offset, o),\\n points[0][1] + _offsetOpt(offset, o),\\n ]);\\n ps.push([\\n points[0][0] + _offsetOpt(offset, o),\\n points[0][1] + _offsetOpt(offset, o),\\n ]);\\n for (let i = 1; i < points.length; i++) {\\n ps.push([\\n points[i][0] + _offsetOpt(offset, o),\\n points[i][1] + _offsetOpt(offset, o),\\n ]);\\n if (i === (points.length - 1)) {\\n ps.push([\\n points[i][0] + _offsetOpt(offset, o),\\n points[i][1] + _offsetOpt(offset, o),\\n ]);\\n }\\n }\\n return _curve(ps, null, o);\\n}\\nfunction _curve(points, closePoint, o) {\\n const len = points.length;\\n const ops = [];\\n if (len > 3) {\\n const b = [];\\n const s = 1 - o.curveTightness;\\n ops.push({ op: 'move', data: [points[1][0], points[1][1]] });\\n for (let i = 1; (i + 2) < len; i++) {\\n const cachedVertArray = points[i];\\n b[0] = [cachedVertArray[0], cachedVertArray[1]];\\n b[1] = [cachedVertArray[0] + (s * points[i + 1][0] - s * points[i - 1][0]) / 6, cachedVertArray[1] + (s * points[i + 1][1] - s * points[i - 1][1]) / 6];\\n b[2] = [points[i + 1][0] + (s * points[i][0] - s * points[i + 2][0]) / 6, points[i + 1][1] + (s * points[i][1] - s * points[i + 2][1]) / 6];\\n b[3] = [points[i + 1][0], points[i + 1][1]];\\n ops.push({ op: 'bcurveTo', data: [b[1][0], b[1][1], b[2][0], b[2][1], b[3][0], b[3][1]] });\\n }\\n if (closePoint && closePoint.length === 2) {\\n const ro = o.maxRandomnessOffset;\\n ops.push({ op: 'lineTo', data: [closePoint[0] + _offsetOpt(ro, o), closePoint[1] + _offsetOpt(ro, o)] });\\n }\\n }\\n else if (len === 3) {\\n ops.push({ op: 'move', data: [points[1][0], points[1][1]] });\\n ops.push({\\n op: 'bcurveTo',\\n data: [\\n points[1][0], points[1][1],\\n points[2][0], points[2][1],\\n points[2][0], points[2][1],\\n ],\\n });\\n }\\n else if (len === 2) {\\n ops.push(..._doubleLine(points[0][0], points[0][1], points[1][0], points[1][1], o));\\n }\\n return ops;\\n}\\nfunction _computeEllipsePoints(increment, cx, cy, rx, ry, offset, overlap, o) {\\n const corePoints = [];\\n const allPoints = [];\\n const radOffset = _offsetOpt(0.5, o) - (Math.PI / 2);\\n const coreOnly = o.roughness === 0;\\n if (!coreOnly) {\\n allPoints.push([\\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset - increment),\\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset - increment),\\n ]);\\n }\\n const endAngle = Math.PI * 2 + (coreOnly ? 0 : (radOffset - 0.01));\\n for (let angle = radOffset; angle < endAngle; angle = angle + increment) {\\n const p = [\\n _offsetOpt(offset, o) + cx + rx * Math.cos(angle),\\n _offsetOpt(offset, o) + cy + ry * Math.sin(angle),\\n ];\\n corePoints.push(p);\\n allPoints.push(p);\\n }\\n if (!coreOnly) {\\n allPoints.push([\\n _offsetOpt(offset, o) + cx + rx * Math.cos(radOffset + Math.PI * 2 + overlap * 0.5),\\n _offsetOpt(offset, o) + cy + ry * Math.sin(radOffset + Math.PI * 2 + overlap * 0.5),\\n ]);\\n allPoints.push([\\n _offsetOpt(offset, o) + cx + 0.98 * rx * Math.cos(radOffset + overlap),\\n _offsetOpt(offset, o) + cy + 0.98 * ry * Math.sin(radOffset + overlap),\\n ]);\\n allPoints.push([\\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset + overlap * 0.5),\\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset + overlap * 0.5),\\n ]);\\n }\\n return [allPoints, corePoints];\\n}\\nfunction _arc(increment, cx, cy, rx, ry, strt, stp, offset, o) {\\n const radOffset = strt + _offsetOpt(0.1, o);\\n const points = [];\\n points.push([\\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset - increment),\\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset - increment),\\n ]);\\n for (let angle = radOffset; angle <= stp; angle = angle + increment) {\\n points.push([\\n _offsetOpt(offset, o) + cx + rx * Math.cos(angle),\\n _offsetOpt(offset, o) + cy + ry * Math.sin(angle),\\n ]);\\n }\\n points.push([\\n cx + rx * Math.cos(stp),\\n cy + ry * Math.sin(stp),\\n ]);\\n points.push([\\n cx + rx * Math.cos(stp),\\n cy + ry * Math.sin(stp),\\n ]);\\n return _curve(points, null, o);\\n}\\nfunction _bezierTo(x1, y1, x2, y2, x, y, current, o) {\\n const ops = [];\\n const ros = [o.maxRandomnessOffset || 1, (o.maxRandomnessOffset || 1) + 0.3];\\n let f = [0, 0];\\n const iterations = o.disableMultiStroke ? 1 : 2;\\n const preserveVertices = o.preserveVertices;\\n for (let i = 0; i < iterations; i++) {\\n if (i === 0) {\\n ops.push({ op: 'move', data: [current[0], current[1]] });\\n }\\n else {\\n ops.push({ op: 'move', data: [current[0] + (preserveVertices ? 0 : _offsetOpt(ros[0], o)), current[1] + (preserveVertices ? 0 : _offsetOpt(ros[0], o))] });\\n }\\n f = preserveVertices ? [x, y] : [x + _offsetOpt(ros[i], o), y + _offsetOpt(ros[i], o)];\\n ops.push({\\n op: 'bcurveTo',\\n data: [\\n x1 + _offsetOpt(ros[i], o), y1 + _offsetOpt(ros[i], o),\\n x2 + _offsetOpt(ros[i], o), y2 + _offsetOpt(ros[i], o),\\n f[0], f[1],\\n ],\\n });\\n }\\n return ops;\\n}\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JvdWdoanMvYmluL3JlbmRlcmVyLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBZ0Q7QUFDYjtBQUNpQztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsdUJBQXVCO0FBQ3hDO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDhCQUE4QixJQUFJLDBFQUEwRTtBQUNuSTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxxQkFBcUIsMkRBQVMsQ0FBQyw0REFBVSxDQUFDLDJEQUFTO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHFFQUFxRTtBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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dUIsOElBQThJO0FBQ3JLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JvdWdoanMvYmluL3JlbmRlcmVyLmpzPzBkM2UiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RmlsbGVyIH0gZnJvbSAnLi9maWxsZXJzL2ZpbGxlci5qcyc7XG5pbXBvcnQgeyBSYW5kb20gfSBmcm9tICcuL21hdGguanMnO1xuaW1wb3J0IHsgcGFyc2VQYXRoLCBub3JtYWxpemUsIGFic29sdXRpemUgfSBmcm9tICdwYXRoLWRhdGEtcGFyc2VyJztcbmNvbnN0IGhlbHBlciA9IHtcbiAgICByYW5kT2Zmc2V0LFxuICAgIHJhbmRPZmZzZXRXaXRoUmFuZ2UsXG4gICAgZWxsaXBzZSxcbiAgICBkb3VibGVMaW5lT3BzOiBkb3VibGVMaW5lRmlsbE9wcyxcbn07XG5leHBvcnQgZnVuY3Rpb24gbGluZSh4MSwgeTEsIHgyLCB5Miwgbykge1xuICAgIHJldHVybiB7IHR5cGU6ICdwYXRoJywgb3BzOiBfZG91YmxlTGluZSh4MSwgeTEsIHgyLCB5MiwgbykgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsaW5lYXJQYXRoKHBvaW50cywgY2xvc2UsIG8pIHtcbiAgICBjb25zdCBsZW4gPSAocG9pbnRzIHx8IFtdKS5sZW5ndGg7XG4gICAgaWYgKGxlbiA+IDIpIHtcbiAgICAgICAgY29uc3Qgb3BzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGxlbiAtIDEpOyBpKyspIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKC4uLl9kb3VibGVMaW5lKHBvaW50c1tpXVswXSwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaSArIDFdWzBdLCBwb2ludHNbaSArIDFdWzFdLCBvKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgICAgICBvcHMucHVzaCguLi5fZG91YmxlTGluZShwb2ludHNbbGVuIC0gMV1bMF0sIHBvaW50c1tsZW4gLSAxXVsxXSwgcG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0sIG8pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0eXBlOiAncGF0aCcsIG9wcyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGxpbmUocG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0sIHBvaW50c1sxXVswXSwgcG9pbnRzWzFdWzFdLCBvKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogJ3BhdGgnLCBvcHM6IFtdIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbihwb2ludHMsIG8pIHtcbiAgICByZXR1cm4gbGluZWFyUGF0aChwb2ludHMsIHRydWUsIG8pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvKSB7XG4gICAgY29uc3QgcG9pbnRzID0gW1xuICAgICAgICBbeCwgeV0sXG4gICAgICAgIFt4ICsgd2lkdGgsIHldLFxuICAgICAgICBbeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSxcbiAgICAgICAgW3gsIHkgKyBoZWlnaHRdLFxuICAgIF07XG4gICAgcmV0dXJuIHBvbHlnb24ocG9pbnRzLCBvKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdXJ2ZShwb2ludHMsIG8pIHtcbiAgICBsZXQgbzEgPSBfY3VydmVXaXRoT2Zmc2V0KHBvaW50cywgMSAqICgxICsgby5yb3VnaG5lc3MgKiAwLjIpLCBvKTtcbiAgICBpZiAoIW8uZGlzYWJsZU11bHRpU3Ryb2tlKSB7XG4gICAgICAgIGNvbnN0IG8yID0gX2N1cnZlV2l0aE9mZnNldChwb2ludHMsIDEuNSAqICgxICsgby5yb3VnaG5lc3MgKiAwLjIyKSwgY2xvbmVPcHRpb25zQWx0ZXJTZWVkKG8pKTtcbiAgICAgICAgbzEgPSBvMS5jb25jYXQobzIpO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiAncGF0aCcsIG9wczogbzEgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIG8pIHtcbiAgICBjb25zdCBwYXJhbXMgPSBnZW5lcmF0ZUVsbGlwc2VQYXJhbXMod2lkdGgsIGhlaWdodCwgbyk7XG4gICAgcmV0dXJuIGVsbGlwc2VXaXRoUGFyYW1zKHgsIHksIG8sIHBhcmFtcykub3BzZXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVFbGxpcHNlUGFyYW1zKHdpZHRoLCBoZWlnaHQsIG8pIHtcbiAgICBjb25zdCBwc3EgPSBNYXRoLnNxcnQoTWF0aC5QSSAqIDIgKiBNYXRoLnNxcnQoKE1hdGgucG93KHdpZHRoIC8gMiwgMikgKyBNYXRoLnBvdyhoZWlnaHQgLyAyLCAyKSkgLyAyKSk7XG4gICAgY29uc3Qgc3RlcENvdW50ID0gTWF0aC5tYXgoby5jdXJ2ZVN0ZXBDb3VudCwgKG8uY3VydmVTdGVwQ291bnQgLyBNYXRoLnNxcnQoMjAwKSkgKiBwc3EpO1xuICAgIGNvbnN0IGluY3JlbWVudCA9IChNYXRoLlBJICogMikgLyBzdGVwQ291bnQ7XG4gICAgbGV0IHJ4ID0gTWF0aC5hYnMod2lkdGggLyAyKTtcbiAgICBsZXQgcnkgPSBNYXRoLmFicyhoZWlnaHQgLyAyKTtcbiAgICBjb25zdCBjdXJ2ZUZpdFJhbmRvbW5lc3MgPSAxIC0gby5jdXJ2ZUZpdHRpbmc7XG4gICAgcnggKz0gX29mZnNldE9wdChyeCAqIGN1cnZlRml0UmFuZG9tbmVzcywgbyk7XG4gICAgcnkgKz0gX29mZnNldE9wdChyeSAqIGN1cnZlRml0UmFuZG9tbmVzcywgbyk7XG4gICAgcmV0dXJuIHsgaW5jcmVtZW50LCByeCwgcnkgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbGxpcHNlV2l0aFBhcmFtcyh4LCB5LCBvLCBlbGxpcHNlUGFyYW1zKSB7XG4gICAgY29uc3QgW2FwMSwgY3AxXSA9IF9jb21wdXRlRWxsaXBzZVBvaW50cyhlbGxpcHNlUGFyYW1zLmluY3JlbWVudCwgeCwgeSwgZWxsaXBzZVBhcmFtcy5yeCwgZWxsaXBzZVBhcmFtcy5yeSwgMSwgZWxsaXBzZVBhcmFtcy5pbmNyZW1lbnQgKiBfb2Zmc2V0KDAuMSwgX29mZnNldCgwLjQsIDEsIG8pLCBvKSwgbyk7XG4gICAgbGV0IG8xID0gX2N1cnZlKGFwMSwgbnVsbCwgbyk7XG4gICAgaWYgKCghby5kaXNhYmxlTXVsdGlTdHJva2UpICYmIChvLnJvdWdobmVzcyAhPT0gMCkpIHtcbiAgICAgICAgY29uc3QgW2FwMl0gPSBfY29tcHV0ZUVsbGlwc2VQb2ludHMoZWxsaXBzZVBhcmFtcy5pbmNyZW1lbnQsIHgsIHksIGVsbGlwc2VQYXJhbXMucngsIGVsbGlwc2VQYXJhbXMucnksIDEuNSwgMCwgbyk7XG4gICAgICAgIGNvbnN0IG8yID0gX2N1cnZlKGFwMiwgbnVsbCwgbyk7XG4gICAgICAgIG8xID0gbzEuY29uY2F0KG8yKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXN0aW1hdGVkUG9pbnRzOiBjcDEsXG4gICAgICAgIG9wc2V0OiB7IHR5cGU6ICdwYXRoJywgb3BzOiBvMSB9LFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYXJjKHgsIHksIHdpZHRoLCBoZWlnaHQsIHN0YXJ0LCBzdG9wLCBjbG9zZWQsIHJvdWdoQ2xvc3VyZSwgbykge1xuICAgIGNvbnN0IGN4ID0geDtcbiAgICBjb25zdCBjeSA9IHk7XG4gICAgbGV0IHJ4ID0gTWF0aC5hYnMod2lkdGggLyAyKTtcbiAgICBsZXQgcnkgPSBNYXRoLmFicyhoZWlnaHQgLyAyKTtcbiAgICByeCArPSBfb2Zmc2V0T3B0KHJ4ICogMC4wMSwgbyk7XG4gICAgcnkgKz0gX29mZnNldE9wdChyeSAqIDAuMDEsIG8pO1xuICAgIGxldCBzdHJ0ID0gc3RhcnQ7XG4gICAgbGV0IHN0cCA9IHN0b3A7XG4gICAgd2hpbGUgKHN0cnQgPCAwKSB7XG4gICAgICAgIHN0cnQgKz0gTWF0aC5QSSAqIDI7XG4gICAgICAgIHN0cCArPSBNYXRoLlBJICogMjtcbiAgICB9XG4gICAgaWYgKChzdHAgLSBzdHJ0KSA+IChNYXRoLlBJICogMikpIHtcbiAgICAgICAgc3RydCA9IDA7XG4gICAgICAgIHN0cCA9IE1hdGguUEkgKiAyO1xuICAgIH1cbiAgICBjb25zdCBlbGxpcHNlSW5jID0gKE1hdGguUEkgKiAyKSAvIG8uY3VydmVTdGVwQ291bnQ7XG4gICAgY29uc3QgYXJjSW5jID0gTWF0aC5taW4oZWxsaXBzZUluYyAvIDIsIChzdHAgLSBzdHJ0KSAvIDIpO1xuICAgIGNvbnN0IG9wcyA9IF9hcmMoYXJjSW5jLCBjeCwgY3ksIHJ4LCByeSwgc3RydCwgc3RwLCAxLCBvKTtcbiAgICBpZiAoIW8uZGlzYWJsZU11bHRpU3Ryb2tlKSB7XG4gICAgICAgIGNvbnN0IG8yID0gX2FyYyhhcmNJbmMsIGN4LCBjeSwgcngsIHJ5LCBzdHJ0LCBzdHAsIDEuNSwgbyk7XG4gICAgICAgIG9wcy5wdXNoKC4uLm8yKTtcbiAgICB9XG4gICAgaWYgKGNsb3NlZCkge1xuICAgICAgICBpZiAocm91Z2hDbG9zdXJlKSB7XG4gICAgICAgICAgICBvcHMucHVzaCguLi5fZG91YmxlTGluZShjeCwgY3ksIGN4ICsgcnggKiBNYXRoLmNvcyhzdHJ0KSwgY3kgKyByeSAqIE1hdGguc2luKHN0cnQpLCBvKSwgLi4uX2RvdWJsZUxpbmUoY3gsIGN5LCBjeCArIHJ4ICogTWF0aC5jb3Moc3RwKSwgY3kgKyByeSAqIE1hdGguc2luKHN0cCksIG8pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKHsgb3A6ICdsaW5lVG8nLCBkYXRhOiBbY3gsIGN5XSB9LCB7IG9wOiAnbGluZVRvJywgZGF0YTogW2N4ICsgcnggKiBNYXRoLmNvcyhzdHJ0KSwgY3kgKyByeSAqIE1hdGguc2luKHN0cnQpXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiAncGF0aCcsIG9wcyB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN2Z1BhdGgocGF0aCwgbykge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplKGFic29sdXRpemUocGFyc2VQYXRoKHBhdGgpKSk7XG4gICAgY29uc3Qgb3BzID0gW107XG4gICAgbGV0IGZpcnN0ID0gWzAsIDBdO1xuICAgIGxldCBjdXJyZW50ID0gWzAsIDBdO1xuICAgIGZvciAoY29uc3QgeyBrZXksIGRhdGEgfSBvZiBzZWdtZW50cykge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnTSc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBybyA9IDEgKiAoby5tYXhSYW5kb21uZXNzT2Zmc2V0IHx8IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHB2ID0gby5wcmVzZXJ2ZVZlcnRpY2VzO1xuICAgICAgICAgICAgICAgIG9wcy5wdXNoKHsgb3A6ICdtb3ZlJywgZGF0YTogZGF0YS5tYXAoKGQpID0+IGQgKyAocHYgPyAwIDogX29mZnNldE9wdChybywgbykpKSB9KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gW2RhdGFbMF0sIGRhdGFbMV1dO1xuICAgICAgICAgICAgICAgIGZpcnN0ID0gW2RhdGFbMF0sIGRhdGFbMV1dO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAgICAgb3BzLnB1c2goLi4uX2RvdWJsZUxpbmUoY3VycmVudFswXSwgY3VycmVudFsxXSwgZGF0YVswXSwgZGF0YVsxXSwgbykpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBbZGF0YVswXSwgZGF0YVsxXV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5MiwgeCwgeV0gPSBkYXRhO1xuICAgICAgICAgICAgICAgIG9wcy5wdXNoKC4uLl9iZXppZXJUbyh4MSwgeTEsIHgyLCB5MiwgeCwgeSwgY3VycmVudCwgbykpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBbeCwgeV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgICAgICAgICBvcHMucHVzaCguLi5fZG91YmxlTGluZShjdXJyZW50WzBdLCBjdXJyZW50WzFdLCBmaXJzdFswXSwgZmlyc3RbMV0sIG8pKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gW2ZpcnN0WzBdLCBmaXJzdFsxXV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogJ3BhdGgnLCBvcHMgfTtcbn1cbi8vIEZpbGxzXG5leHBvcnQgZnVuY3Rpb24gc29saWRGaWxsUG9seWdvbihwb2x5Z29uTGlzdCwgbykge1xuICAgIGNvbnN0IG9wcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9pbnRzIG9mIHBvbHlnb25MaXN0KSB7XG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBvLm1heFJhbmRvbW5lc3NPZmZzZXQgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IHBvaW50cy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG9wcy5wdXNoKHsgb3A6ICdtb3ZlJywgZGF0YTogW3BvaW50c1swXVswXSArIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSwgcG9pbnRzWzBdWzFdICsgX29mZnNldE9wdChvZmZzZXQsIG8pXSB9KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wcy5wdXNoKHsgb3A6ICdsaW5lVG8nLCBkYXRhOiBbcG9pbnRzW2ldWzBdICsgX29mZnNldE9wdChvZmZzZXQsIG8pLCBwb2ludHNbaV1bMV0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyldIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiAnZmlsbFBhdGgnLCBvcHMgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXR0ZXJuRmlsbFBvbHlnb25zKHBvbHlnb25MaXN0LCBvKSB7XG4gICAgcmV0dXJuIGdldEZpbGxlcihvLCBoZWxwZXIpLmZpbGxQb2x5Z29ucyhwb2x5Z29uTGlzdCwgbyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGF0dGVybkZpbGxBcmMoeCwgeSwgd2lkdGgsIGhlaWdodCwgc3RhcnQsIHN0b3AsIG8pIHtcbiAgICBjb25zdCBjeCA9IHg7XG4gICAgY29uc3QgY3kgPSB5O1xuICAgIGxldCByeCA9IE1hdGguYWJzKHdpZHRoIC8gMik7XG4gICAgbGV0IHJ5ID0gTWF0aC5hYnMoaGVpZ2h0IC8gMik7XG4gICAgcnggKz0gX29mZnNldE9wdChyeCAqIDAuMDEsIG8pO1xuICAgIHJ5ICs9IF9vZmZzZXRPcHQocnkgKiAwLjAxLCBvKTtcbiAgICBsZXQgc3RydCA9IHN0YXJ0O1xuICAgIGxldCBzdHAgPSBzdG9wO1xuICAgIHdoaWxlIChzdHJ0IDwgMCkge1xuICAgICAgICBzdHJ0ICs9IE1hdGguUEkgKiAyO1xuICAgICAgICBzdHAgKz0gTWF0aC5QSSAqIDI7XG4gICAgfVxuICAgIGlmICgoc3RwIC0gc3RydCkgPiAoTWF0aC5QSSAqIDIpKSB7XG4gICAgICAgIHN0cnQgPSAwO1xuICAgICAgICBzdHAgPSBNYXRoLlBJICogMjtcbiAgICB9XG4gICAgY29uc3QgaW5jcmVtZW50ID0gKHN0cCAtIHN0cnQpIC8gby5jdXJ2ZVN0ZXBDb3VudDtcbiAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICBmb3IgKGxldCBhbmdsZSA9IHN0cnQ7IGFuZ2xlIDw9IHN0cDsgYW5nbGUgPSBhbmdsZSArIGluY3JlbWVudCkge1xuICAgICAgICBwb2ludHMucHVzaChbY3ggKyByeCAqIE1hdGguY29zKGFuZ2xlKSwgY3kgKyByeSAqIE1hdGguc2luKGFuZ2xlKV0pO1xuICAgIH1cbiAgICBwb2ludHMucHVzaChbY3ggKyByeCAqIE1hdGguY29zKHN0cCksIGN5ICsgcnkgKiBNYXRoLnNpbihzdHApXSk7XG4gICAgcG9pbnRzLnB1c2goW2N4LCBjeV0pO1xuICAgIHJldHVybiBwYXR0ZXJuRmlsbFBvbHlnb25zKFtwb2ludHNdLCBvKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByYW5kT2Zmc2V0KHgsIG8pIHtcbiAgICByZXR1cm4gX29mZnNldE9wdCh4LCBvKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByYW5kT2Zmc2V0V2l0aFJhbmdlKG1pbiwgbWF4LCBvKSB7XG4gICAgcmV0dXJuIF9vZmZzZXQobWluLCBtYXgsIG8pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRvdWJsZUxpbmVGaWxsT3BzKHgxLCB5MSwgeDIsIHkyLCBvKSB7XG4gICAgcmV0dXJuIF9kb3VibGVMaW5lKHgxLCB5MSwgeDIsIHkyLCBvLCB0cnVlKTtcbn1cbi8vIFByaXZhdGUgaGVscGVyc1xuZnVuY3Rpb24gY2xvbmVPcHRpb25zQWx0ZXJTZWVkKG9wcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9wcyk7XG4gICAgcmVzdWx0LnJhbmRvbWl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgaWYgKG9wcy5zZWVkKSB7XG4gICAgICAgIHJlc3VsdC5zZWVkID0gb3BzLnNlZWQgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcmFuZG9tKG9wcykge1xuICAgIGlmICghb3BzLnJhbmRvbWl6ZXIpIHtcbiAgICAgICAgb3BzLnJhbmRvbWl6ZXIgPSBuZXcgUmFuZG9tKG9wcy5zZWVkIHx8IDApO1xuICAgIH1cbiAgICByZXR1cm4gb3BzLnJhbmRvbWl6ZXIubmV4dCgpO1xufVxuZnVuY3Rpb24gX29mZnNldChtaW4sIG1heCwgb3BzLCByb3VnaG5lc3NHYWluID0gMSkge1xuICAgIHJldHVybiBvcHMucm91Z2huZXNzICogcm91Z2huZXNzR2FpbiAqICgocmFuZG9tKG9wcykgKiAobWF4IC0gbWluKSkgKyBtaW4pO1xufVxuZnVuY3Rpb24gX29mZnNldE9wdCh4LCBvcHMsIHJvdWdobmVzc0dhaW4gPSAxKSB7XG4gICAgcmV0dXJuIF9vZmZzZXQoLXgsIHgsIG9wcywgcm91Z2huZXNzR2Fpbik7XG59XG5mdW5jdGlvbiBfZG91YmxlTGluZSh4MSwgeTEsIHgyLCB5MiwgbywgZmlsbGluZyA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc2luZ2xlU3Ryb2tlID0gZmlsbGluZyA/IG8uZGlzYWJsZU11bHRpU3Ryb2tlRmlsbCA6IG8uZGlzYWJsZU11bHRpU3Ryb2tlO1xuICAgIGNvbnN0IG8xID0gX2xpbmUoeDEsIHkxLCB4MiwgeTIsIG8sIHRydWUsIGZhbHNlKTtcbiAgICBpZiAoc2luZ2xlU3Ryb2tlKSB7XG4gICAgICAgIHJldHVybiBvMTtcbiAgICB9XG4gICAgY29uc3QgbzIgPSBfbGluZSh4MSwgeTEsIHgyLCB5MiwgbywgdHJ1ZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG8xLmNvbmNhdChvMik7XG59XG5mdW5jdGlvbiBfbGluZSh4MSwgeTEsIHgyLCB5MiwgbywgbW92ZSwgb3ZlcmxheSkge1xuICAgIGNvbnN0IGxlbmd0aFNxID0gTWF0aC5wb3coKHgxIC0geDIpLCAyKSArIE1hdGgucG93KCh5MSAtIHkyKSwgMik7XG4gICAgY29uc3QgbGVuZ3RoID0gTWF0aC5zcXJ0KGxlbmd0aFNxKTtcbiAgICBsZXQgcm91Z2huZXNzR2FpbiA9IDE7XG4gICAgaWYgKGxlbmd0aCA8IDIwMCkge1xuICAgICAgICByb3VnaG5lc3NHYWluID0gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAobGVuZ3RoID4gNTAwKSB7XG4gICAgICAgIHJvdWdobmVzc0dhaW4gPSAwLjQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByb3VnaG5lc3NHYWluID0gKC0wLjAwMTY2NjgpICogbGVuZ3RoICsgMS4yMzMzMzQ7XG4gICAgfVxuICAgIGxldCBvZmZzZXQgPSBvLm1heFJhbmRvbW5lc3NPZmZzZXQgfHwgMDtcbiAgICBpZiAoKG9mZnNldCAqIG9mZnNldCAqIDEwMCkgPiBsZW5ndGhTcSkge1xuICAgICAgICBvZmZzZXQgPSBsZW5ndGggLyAxMDtcbiAgICB9XG4gICAgY29uc3QgaGFsZk9mZnNldCA9IG9mZnNldCAvIDI7XG4gICAgY29uc3QgZGl2ZXJnZVBvaW50ID0gMC4yICsgcmFuZG9tKG8pICogMC4yO1xuICAgIGxldCBtaWREaXNwWCA9IG8uYm93aW5nICogby5tYXhSYW5kb21uZXNzT2Zmc2V0ICogKHkyIC0geTEpIC8gMjAwO1xuICAgIGxldCBtaWREaXNwWSA9IG8uYm93aW5nICogby5tYXhSYW5kb21uZXNzT2Zmc2V0ICogKHgxIC0geDIpIC8gMjAwO1xuICAgIG1pZERpc3BYID0gX29mZnNldE9wdChtaWREaXNwWCwgbywgcm91Z2huZXNzR2Fpbik7XG4gICAgbWlkRGlzcFkgPSBfb2Zmc2V0T3B0KG1pZERpc3BZLCBvLCByb3VnaG5lc3NHYWluKTtcbiAgICBjb25zdCBvcHMgPSBbXTtcbiAgICBjb25zdCByYW5kb21IYWxmID0gKCkgPT4gX29mZnNldE9wdChoYWxmT2Zmc2V0LCBvLCByb3VnaG5lc3NHYWluKTtcbiAgICBjb25zdCByYW5kb21GdWxsID0gKCkgPT4gX29mZnNldE9wdChvZmZzZXQsIG8sIHJvdWdobmVzc0dhaW4pO1xuICAgIGNvbnN0IHByZXNlcnZlVmVydGljZXMgPSBvLnByZXNlcnZlVmVydGljZXM7XG4gICAgaWYgKG1vdmUpIHtcbiAgICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcDogJ21vdmUnLCBkYXRhOiBbXG4gICAgICAgICAgICAgICAgICAgIHgxICsgKHByZXNlcnZlVmVydGljZXMgPyAwIDogcmFuZG9tSGFsZigpKSxcbiAgICAgICAgICAgICAgICAgICAgeTEgKyAocHJlc2VydmVWZXJ0aWNlcyA/IDAgOiByYW5kb21IYWxmKCkpLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcDogJ21vdmUnLCBkYXRhOiBbXG4gICAgICAgICAgICAgICAgICAgIHgxICsgKHByZXNlcnZlVmVydGljZXMgPyAwIDogX29mZnNldE9wdChvZmZzZXQsIG8sIHJvdWdobmVzc0dhaW4pKSxcbiAgICAgICAgICAgICAgICAgICAgeTEgKyAocHJlc2VydmVWZXJ0aWNlcyA/IDAgOiBfb2Zmc2V0T3B0KG9mZnNldCwgbywgcm91Z2huZXNzR2FpbikpLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgICBvcHMucHVzaCh7XG4gICAgICAgICAgICBvcDogJ2JjdXJ2ZVRvJyxcbiAgICAgICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAgICAgICBtaWREaXNwWCArIHgxICsgKHgyIC0geDEpICogZGl2ZXJnZVBvaW50ICsgcmFuZG9tSGFsZigpLFxuICAgICAgICAgICAgICAgIG1pZERpc3BZICsgeTEgKyAoeTIgLSB5MSkgKiBkaXZlcmdlUG9pbnQgKyByYW5kb21IYWxmKCksXG4gICAgICAgICAgICAgICAgbWlkRGlzcFggKyB4MSArIDIgKiAoeDIgLSB4MSkgKiBkaXZlcmdlUG9pbnQgKyByYW5kb21IYWxmKCksXG4gICAgICAgICAgICAgICAgbWlkRGlzcFkgKyB5MSArIDIgKiAoeTIgLSB5MSkgKiBkaXZlcmdlUG9pbnQgKyByYW5kb21IYWxmKCksXG4gICAgICAgICAgICAgICAgeDIgKyAocHJlc2VydmVWZXJ0aWNlcyA/IDAgOiByYW5kb21IYWxmKCkpLFxuICAgICAgICAgICAgICAgIHkyICsgKHByZXNlcnZlVmVydGljZXMgPyAwIDogcmFuZG9tSGFsZigpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb3BzLnB1c2goe1xuICAgICAgICAgICAgb3A6ICdiY3VydmVUbycsXG4gICAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICAgICAgbWlkRGlzcFggKyB4MSArICh4MiAtIHgxKSAqIGRpdmVyZ2VQb2ludCArIHJhbmRvbUZ1bGwoKSxcbiAgICAgICAgICAgICAgICBtaWREaXNwWSArIHkxICsgKHkyIC0geTEpICogZGl2ZXJnZVBvaW50ICsgcmFuZG9tRnVsbCgpLFxuICAgICAgICAgICAgICAgIG1pZERpc3BYICsgeDEgKyAyICogKHgyIC0geDEpICogZGl2ZXJnZVBvaW50ICsgcmFuZG9tRnVsbCgpLFxuICAgICAgICAgICAgICAgIG1pZERpc3BZICsgeTEgKyAyICogKHkyIC0geTEpICogZGl2ZXJnZVBvaW50ICsgcmFuZG9tRnVsbCgpLFxuICAgICAgICAgICAgICAgIHgyICsgKHByZXNlcnZlVmVydGljZXMgPyAwIDogcmFuZG9tRnVsbCgpKSxcbiAgICAgICAgICAgICAgICB5MiArIChwcmVzZXJ2ZVZlcnRpY2VzID8gMCA6IHJhbmRvbUZ1bGwoKSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9wcztcbn1cbmZ1bmN0aW9uIF9jdXJ2ZVdpdGhPZmZzZXQocG9pbnRzLCBvZmZzZXQsIG8pIHtcbiAgICBjb25zdCBwcyA9IFtdO1xuICAgIHBzLnB1c2goW1xuICAgICAgICBwb2ludHNbMF1bMF0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyksXG4gICAgICAgIHBvaW50c1swXVsxXSArIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSxcbiAgICBdKTtcbiAgICBwcy5wdXNoKFtcbiAgICAgICAgcG9pbnRzWzBdWzBdICsgX29mZnNldE9wdChvZmZzZXQsIG8pLFxuICAgICAgICBwb2ludHNbMF1bMV0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyksXG4gICAgXSk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcHMucHVzaChbXG4gICAgICAgICAgICBwb2ludHNbaV1bMF0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyksXG4gICAgICAgICAgICBwb2ludHNbaV1bMV0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyksXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoaSA9PT0gKHBvaW50cy5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgcHMucHVzaChbXG4gICAgICAgICAgICAgICAgcG9pbnRzW2ldWzBdICsgX29mZnNldE9wdChvZmZzZXQsIG8pLFxuICAgICAgICAgICAgICAgIHBvaW50c1tpXVsxXSArIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfY3VydmUocHMsIG51bGwsIG8pO1xufVxuZnVuY3Rpb24gX2N1cnZlKHBvaW50cywgY2xvc2VQb2ludCwgbykge1xuICAgIGNvbnN0IGxlbiA9IHBvaW50cy5sZW5ndGg7XG4gICAgY29uc3Qgb3BzID0gW107XG4gICAgaWYgKGxlbiA+IDMpIHtcbiAgICAgICAgY29uc3QgYiA9IFtdO1xuICAgICAgICBjb25zdCBzID0gMSAtIG8uY3VydmVUaWdodG5lc3M7XG4gICAgICAgIG9wcy5wdXNoKHsgb3A6ICdtb3ZlJywgZGF0YTogW3BvaW50c1sxXVswXSwgcG9pbnRzWzFdWzFdXSB9KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IChpICsgMikgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkVmVydEFycmF5ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgYlswXSA9IFtjYWNoZWRWZXJ0QXJyYXlbMF0sIGNhY2hlZFZlcnRBcnJheVsxXV07XG4gICAgICAgICAgICBiWzFdID0gW2NhY2hlZFZlcnRBcnJheVswXSArIChzICogcG9pbnRzW2kgKyAxXVswXSAtIHMgKiBwb2ludHNbaSAtIDFdWzBdKSAvIDYsIGNhY2hlZFZlcnRBcnJheVsxXSArIChzICogcG9pbnRzW2kgKyAxXVsxXSAtIHMgKiBwb2ludHNbaSAtIDFdWzFdKSAvIDZdO1xuICAgICAgICAgICAgYlsyXSA9IFtwb2ludHNbaSArIDFdWzBdICsgKHMgKiBwb2ludHNbaV1bMF0gLSBzICogcG9pbnRzW2kgKyAyXVswXSkgLyA2LCBwb2ludHNbaSArIDFdWzFdICsgKHMgKiBwb2ludHNbaV1bMV0gLSBzICogcG9pbnRzW2kgKyAyXVsxXSkgLyA2XTtcbiAgICAgICAgICAgIGJbM10gPSBbcG9pbnRzW2kgKyAxXVswXSwgcG9pbnRzW2kgKyAxXVsxXV07XG4gICAgICAgICAgICBvcHMucHVzaCh7IG9wOiAnYmN1cnZlVG8nLCBkYXRhOiBbYlsxXVswXSwgYlsxXVsxXSwgYlsyXVswXSwgYlsyXVsxXSwgYlszXVswXSwgYlszXVsxXV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsb3NlUG9pbnQgJiYgY2xvc2VQb2ludC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvID0gby5tYXhSYW5kb21uZXNzT2Zmc2V0O1xuICAgICAgICAgICAgb3BzLnB1c2goeyBvcDogJ2xpbmVUbycsIGRhdGE6IFtjbG9zZVBvaW50WzBdICsgX29mZnNldE9wdChybywgbyksIGNsb3NlUG9pbnRbMV0gKyBfb2Zmc2V0T3B0KHJvLCBvKV0gfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobGVuID09PSAzKSB7XG4gICAgICAgIG9wcy5wdXNoKHsgb3A6ICdtb3ZlJywgZGF0YTogW3BvaW50c1sxXVswXSwgcG9pbnRzWzFdWzFdXSB9KTtcbiAgICAgICAgb3BzLnB1c2goe1xuICAgICAgICAgICAgb3A6ICdiY3VydmVUbycsXG4gICAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICAgICAgcG9pbnRzWzFdWzBdLCBwb2ludHNbMV1bMV0sXG4gICAgICAgICAgICAgICAgcG9pbnRzWzJdWzBdLCBwb2ludHNbMl1bMV0sXG4gICAgICAgICAgICAgICAgcG9pbnRzWzJdWzBdLCBwb2ludHNbMl1bMV0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAobGVuID09PSAyKSB7XG4gICAgICAgIG9wcy5wdXNoKC4uLl9kb3VibGVMaW5lKHBvaW50c1swXVswXSwgcG9pbnRzWzBdWzFdLCBwb2ludHNbMV1bMF0sIHBvaW50c1sxXVsxXSwgbykpO1xuICAgIH1cbiAgICByZXR1cm4gb3BzO1xufVxuZnVuY3Rpb24gX2NvbXB1dGVFbGxpcHNlUG9pbnRzKGluY3JlbWVudCwgY3gsIGN5LCByeCwgcnksIG9mZnNldCwgb3ZlcmxhcCwgbykge1xuICAgIGNvbnN0IGNvcmVQb2ludHMgPSBbXTtcbiAgICBjb25zdCBhbGxQb2ludHMgPSBbXTtcbiAgICBjb25zdCByYWRPZmZzZXQgPSBfb2Zmc2V0T3B0KDAuNSwgbykgLSAoTWF0aC5QSSAvIDIpO1xuICAgIGNvbnN0IGNvcmVPbmx5ID0gby5yb3VnaG5lc3MgPT09IDA7XG4gICAgaWYgKCFjb3JlT25seSkge1xuICAgICAgICBhbGxQb2ludHMucHVzaChbXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeCArIDAuOSAqIHJ4ICogTWF0aC5jb3MocmFkT2Zmc2V0IC0gaW5jcmVtZW50KSxcbiAgICAgICAgICAgIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSArIGN5ICsgMC45ICogcnkgKiBNYXRoLnNpbihyYWRPZmZzZXQgLSBpbmNyZW1lbnQpLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY29uc3QgZW5kQW5nbGUgPSBNYXRoLlBJICogMiArIChjb3JlT25seSA/IDAgOiAocmFkT2Zmc2V0IC0gMC4wMSkpO1xuICAgIGZvciAobGV0IGFuZ2xlID0gcmFkT2Zmc2V0OyBhbmdsZSA8IGVuZEFuZ2xlOyBhbmdsZSA9IGFuZ2xlICsgaW5jcmVtZW50KSB7XG4gICAgICAgIGNvbnN0IHAgPSBbXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeCArIHJ4ICogTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgX29mZnNldE9wdChvZmZzZXQsIG8pICsgY3kgKyByeSAqIE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgXTtcbiAgICAgICAgY29yZVBvaW50cy5wdXNoKHApO1xuICAgICAgICBhbGxQb2ludHMucHVzaChwKTtcbiAgICB9XG4gICAgaWYgKCFjb3JlT25seSkge1xuICAgICAgICBhbGxQb2ludHMucHVzaChbXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeCArIHJ4ICogTWF0aC5jb3MocmFkT2Zmc2V0ICsgTWF0aC5QSSAqIDIgKyBvdmVybGFwICogMC41KSxcbiAgICAgICAgICAgIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSArIGN5ICsgcnkgKiBNYXRoLnNpbihyYWRPZmZzZXQgKyBNYXRoLlBJICogMiArIG92ZXJsYXAgKiAwLjUpLFxuICAgICAgICBdKTtcbiAgICAgICAgYWxsUG9pbnRzLnB1c2goW1xuICAgICAgICAgICAgX29mZnNldE9wdChvZmZzZXQsIG8pICsgY3ggKyAwLjk4ICogcnggKiBNYXRoLmNvcyhyYWRPZmZzZXQgKyBvdmVybGFwKSxcbiAgICAgICAgICAgIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSArIGN5ICsgMC45OCAqIHJ5ICogTWF0aC5zaW4ocmFkT2Zmc2V0ICsgb3ZlcmxhcCksXG4gICAgICAgIF0pO1xuICAgICAgICBhbGxQb2ludHMucHVzaChbXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeCArIDAuOSAqIHJ4ICogTWF0aC5jb3MocmFkT2Zmc2V0ICsgb3ZlcmxhcCAqIDAuNSksXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeSArIDAuOSAqIHJ5ICogTWF0aC5zaW4ocmFkT2Zmc2V0ICsgb3ZlcmxhcCAqIDAuNSksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gW2FsbFBvaW50cywgY29yZVBvaW50c107XG59XG5mdW5jdGlvbiBfYXJjKGluY3JlbWVudCwgY3gsIGN5LCByeCwgcnksIHN0cnQsIHN0cCwgb2Zmc2V0LCBvKSB7XG4gICAgY29uc3QgcmFkT2Zmc2V0ID0gc3RydCArIF9vZmZzZXRPcHQoMC4xLCBvKTtcbiAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICBwb2ludHMucHVzaChbXG4gICAgICAgIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSArIGN4ICsgMC45ICogcnggKiBNYXRoLmNvcyhyYWRPZmZzZXQgLSBpbmNyZW1lbnQpLFxuICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeSArIDAuOSAqIHJ5ICogTWF0aC5zaW4ocmFkT2Zmc2V0IC0gaW5jcmVtZW50KSxcbiAgICBdKTtcbiAgICBmb3IgKGxldCBhbmdsZSA9IHJhZE9mZnNldDsgYW5nbGUgPD0gc3RwOyBhbmdsZSA9IGFuZ2xlICsgaW5jcmVtZW50KSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtcbiAgICAgICAgICAgIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSArIGN4ICsgcnggKiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeSArIHJ5ICogTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgcG9pbnRzLnB1c2goW1xuICAgICAgICBjeCArIHJ4ICogTWF0aC5jb3Moc3RwKSxcbiAgICAgICAgY3kgKyByeSAqIE1hdGguc2luKHN0cCksXG4gICAgXSk7XG4gICAgcG9pbnRzLnB1c2goW1xuICAgICAgICBjeCArIHJ4ICogTWF0aC5jb3Moc3RwKSxcbiAgICAgICAgY3kgKyByeSAqIE1hdGguc2luKHN0cCksXG4gICAgXSk7XG4gICAgcmV0dXJuIF9jdXJ2ZShwb2ludHMsIG51bGwsIG8pO1xufVxuZnVuY3Rpb24gX2JlemllclRvKHgxLCB5MSwgeDIsIHkyLCB4LCB5LCBjdXJyZW50LCBvKSB7XG4gICAgY29uc3Qgb3BzID0gW107XG4gICAgY29uc3Qgcm9zID0gW28ubWF4UmFuZG9tbmVzc09mZnNldCB8fCAxLCAoby5tYXhSYW5kb21uZXNzT2Zmc2V0IHx8IDEpICsgMC4zXTtcbiAgICBsZXQgZiA9IFswLCAwXTtcbiAgICBjb25zdCBpdGVyYXRpb25zID0gby5kaXNhYmxlTXVsdGlTdHJva2UgPyAxIDogMjtcbiAgICBjb25zdCBwcmVzZXJ2ZVZlcnRpY2VzID0gby5wcmVzZXJ2ZVZlcnRpY2VzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICBvcHMucHVzaCh7IG9wOiAnbW92ZScsIGRhdGE6IFtjdXJyZW50WzBdLCBjdXJyZW50WzFdXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKHsgb3A6ICdtb3ZlJywgZGF0YTogW2N1cnJlbnRbMF0gKyAocHJlc2VydmVWZXJ0aWNlcyA/IDAgOiBfb2Zmc2V0T3B0KHJvc1swXSwgbykpLCBjdXJyZW50WzFdICsgKHByZXNlcnZlVmVydGljZXMgPyAwIDogX29mZnNldE9wdChyb3NbMF0sIG8pKV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgZiA9IHByZXNlcnZlVmVydGljZXMgPyBbeCwgeV0gOiBbeCArIF9vZmZzZXRPcHQocm9zW2ldLCBvKSwgeSArIF9vZmZzZXRPcHQocm9zW2ldLCBvKV07XG4gICAgICAgIG9wcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiAnYmN1cnZlVG8nLFxuICAgICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgICAgIHgxICsgX29mZnNldE9wdChyb3NbaV0sIG8pLCB5MSArIF9vZmZzZXRPcHQocm9zW2ldLCBvKSxcbiAgICAgICAgICAgICAgICB4MiArIF9vZmZzZXRPcHQocm9zW2ldLCBvKSwgeTIgKyBfb2Zmc2V0T3B0KHJvc1tpXSwgbyksXG4gICAgICAgICAgICAgICAgZlswXSwgZlsxXSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3BzO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../../node_modules/roughjs/bin/renderer.js\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../../node_modules/roughjs/bin/renderer.js?");
578
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"line\\\": () => (/* binding */ line),\\n/* harmony export */ \\\"linearPath\\\": () => (/* binding */ linearPath),\\n/* harmony export */ \\\"polygon\\\": () => (/* binding */ polygon),\\n/* harmony export */ \\\"rectangle\\\": () => (/* binding */ rectangle),\\n/* harmony export */ \\\"curve\\\": () => (/* binding */ curve),\\n/* harmony export */ \\\"ellipse\\\": () => (/* binding */ ellipse),\\n/* harmony export */ \\\"generateEllipseParams\\\": () => (/* binding */ generateEllipseParams),\\n/* harmony export */ \\\"ellipseWithParams\\\": () => (/* binding */ ellipseWithParams),\\n/* harmony export */ \\\"arc\\\": () => (/* binding */ arc),\\n/* harmony export */ \\\"svgPath\\\": () => (/* binding */ svgPath),\\n/* harmony export */ \\\"solidFillPolygon\\\": () => (/* binding */ solidFillPolygon),\\n/* harmony export */ \\\"patternFillPolygons\\\": () => (/* binding */ patternFillPolygons),\\n/* harmony export */ \\\"patternFillArc\\\": () => (/* binding */ patternFillArc),\\n/* harmony export */ \\\"randOffset\\\": () => (/* binding */ randOffset),\\n/* harmony export */ \\\"randOffsetWithRange\\\": () => (/* binding */ randOffsetWithRange),\\n/* harmony export */ \\\"doubleLineFillOps\\\": () => (/* binding */ doubleLineFillOps)\\n/* harmony export */ });\\n/* harmony import */ var _fillers_filler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fillers/filler.js */ \\\"../../../node_modules/roughjs/bin/fillers/filler.js\\\");\\n/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math.js */ \\\"../../../node_modules/roughjs/bin/math.js\\\");\\n/* harmony import */ var path_data_parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! path-data-parser */ \\\"../../../node_modules/path-data-parser/lib/index.js\\\");\\n\\n\\n\\nconst helper = {\\n randOffset,\\n randOffsetWithRange,\\n ellipse,\\n doubleLineOps: doubleLineFillOps,\\n};\\nfunction line(x1, y1, x2, y2, o) {\\n return { type: 'path', ops: _doubleLine(x1, y1, x2, y2, o) };\\n}\\nfunction linearPath(points, close, o) {\\n const len = (points || []).length;\\n if (len > 2) {\\n const ops = [];\\n for (let i = 0; i < (len - 1); i++) {\\n ops.push(..._doubleLine(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], o));\\n }\\n if (close) {\\n ops.push(..._doubleLine(points[len - 1][0], points[len - 1][1], points[0][0], points[0][1], o));\\n }\\n return { type: 'path', ops };\\n }\\n else if (len === 2) {\\n return line(points[0][0], points[0][1], points[1][0], points[1][1], o);\\n }\\n return { type: 'path', ops: [] };\\n}\\nfunction polygon(points, o) {\\n return linearPath(points, true, o);\\n}\\nfunction rectangle(x, y, width, height, o) {\\n const points = [\\n [x, y],\\n [x + width, y],\\n [x + width, y + height],\\n [x, y + height],\\n ];\\n return polygon(points, o);\\n}\\nfunction curve(points, o) {\\n let o1 = _curveWithOffset(points, 1 * (1 + o.roughness * 0.2), o);\\n if (!o.disableMultiStroke) {\\n const o2 = _curveWithOffset(points, 1.5 * (1 + o.roughness * 0.22), cloneOptionsAlterSeed(o));\\n o1 = o1.concat(o2);\\n }\\n return { type: 'path', ops: o1 };\\n}\\nfunction ellipse(x, y, width, height, o) {\\n const params = generateEllipseParams(width, height, o);\\n return ellipseWithParams(x, y, o, params).opset;\\n}\\nfunction generateEllipseParams(width, height, o) {\\n const psq = Math.sqrt(Math.PI * 2 * Math.sqrt((Math.pow(width / 2, 2) + Math.pow(height / 2, 2)) / 2));\\n const stepCount = Math.ceil(Math.max(o.curveStepCount, (o.curveStepCount / Math.sqrt(200)) * psq));\\n const increment = (Math.PI * 2) / stepCount;\\n let rx = Math.abs(width / 2);\\n let ry = Math.abs(height / 2);\\n const curveFitRandomness = 1 - o.curveFitting;\\n rx += _offsetOpt(rx * curveFitRandomness, o);\\n ry += _offsetOpt(ry * curveFitRandomness, o);\\n return { increment, rx, ry };\\n}\\nfunction ellipseWithParams(x, y, o, ellipseParams) {\\n const [ap1, cp1] = _computeEllipsePoints(ellipseParams.increment, x, y, ellipseParams.rx, ellipseParams.ry, 1, ellipseParams.increment * _offset(0.1, _offset(0.4, 1, o), o), o);\\n let o1 = _curve(ap1, null, o);\\n if ((!o.disableMultiStroke) && (o.roughness !== 0)) {\\n const [ap2] = _computeEllipsePoints(ellipseParams.increment, x, y, ellipseParams.rx, ellipseParams.ry, 1.5, 0, o);\\n const o2 = _curve(ap2, null, o);\\n o1 = o1.concat(o2);\\n }\\n return {\\n estimatedPoints: cp1,\\n opset: { type: 'path', ops: o1 },\\n };\\n}\\nfunction arc(x, y, width, height, start, stop, closed, roughClosure, o) {\\n const cx = x;\\n const cy = y;\\n let rx = Math.abs(width / 2);\\n let ry = Math.abs(height / 2);\\n rx += _offsetOpt(rx * 0.01, o);\\n ry += _offsetOpt(ry * 0.01, o);\\n let strt = start;\\n let stp = stop;\\n while (strt < 0) {\\n strt += Math.PI * 2;\\n stp += Math.PI * 2;\\n }\\n if ((stp - strt) > (Math.PI * 2)) {\\n strt = 0;\\n stp = Math.PI * 2;\\n }\\n const ellipseInc = (Math.PI * 2) / o.curveStepCount;\\n const arcInc = Math.min(ellipseInc / 2, (stp - strt) / 2);\\n const ops = _arc(arcInc, cx, cy, rx, ry, strt, stp, 1, o);\\n if (!o.disableMultiStroke) {\\n const o2 = _arc(arcInc, cx, cy, rx, ry, strt, stp, 1.5, o);\\n ops.push(...o2);\\n }\\n if (closed) {\\n if (roughClosure) {\\n ops.push(..._doubleLine(cx, cy, cx + rx * Math.cos(strt), cy + ry * Math.sin(strt), o), ..._doubleLine(cx, cy, cx + rx * Math.cos(stp), cy + ry * Math.sin(stp), o));\\n }\\n else {\\n ops.push({ op: 'lineTo', data: [cx, cy] }, { op: 'lineTo', data: [cx + rx * Math.cos(strt), cy + ry * Math.sin(strt)] });\\n }\\n }\\n return { type: 'path', ops };\\n}\\nfunction svgPath(path, o) {\\n const segments = (0,path_data_parser__WEBPACK_IMPORTED_MODULE_2__.normalize)((0,path_data_parser__WEBPACK_IMPORTED_MODULE_2__.absolutize)((0,path_data_parser__WEBPACK_IMPORTED_MODULE_2__.parsePath)(path)));\\n const ops = [];\\n let first = [0, 0];\\n let current = [0, 0];\\n for (const { key, data } of segments) {\\n switch (key) {\\n case 'M': {\\n const ro = 1 * (o.maxRandomnessOffset || 0);\\n const pv = o.preserveVertices;\\n ops.push({ op: 'move', data: data.map((d) => d + (pv ? 0 : _offsetOpt(ro, o))) });\\n current = [data[0], data[1]];\\n first = [data[0], data[1]];\\n break;\\n }\\n case 'L':\\n ops.push(..._doubleLine(current[0], current[1], data[0], data[1], o));\\n current = [data[0], data[1]];\\n break;\\n case 'C': {\\n const [x1, y1, x2, y2, x, y] = data;\\n ops.push(..._bezierTo(x1, y1, x2, y2, x, y, current, o));\\n current = [x, y];\\n break;\\n }\\n case 'Z':\\n ops.push(..._doubleLine(current[0], current[1], first[0], first[1], o));\\n current = [first[0], first[1]];\\n break;\\n }\\n }\\n return { type: 'path', ops };\\n}\\n// Fills\\nfunction solidFillPolygon(polygonList, o) {\\n const ops = [];\\n for (const points of polygonList) {\\n if (points.length) {\\n const offset = o.maxRandomnessOffset || 0;\\n const len = points.length;\\n if (len > 2) {\\n ops.push({ op: 'move', data: [points[0][0] + _offsetOpt(offset, o), points[0][1] + _offsetOpt(offset, o)] });\\n for (let i = 1; i < len; i++) {\\n ops.push({ op: 'lineTo', data: [points[i][0] + _offsetOpt(offset, o), points[i][1] + _offsetOpt(offset, o)] });\\n }\\n }\\n }\\n }\\n return { type: 'fillPath', ops };\\n}\\nfunction patternFillPolygons(polygonList, o) {\\n return (0,_fillers_filler_js__WEBPACK_IMPORTED_MODULE_0__.getFiller)(o, helper).fillPolygons(polygonList, o);\\n}\\nfunction patternFillArc(x, y, width, height, start, stop, o) {\\n const cx = x;\\n const cy = y;\\n let rx = Math.abs(width / 2);\\n let ry = Math.abs(height / 2);\\n rx += _offsetOpt(rx * 0.01, o);\\n ry += _offsetOpt(ry * 0.01, o);\\n let strt = start;\\n let stp = stop;\\n while (strt < 0) {\\n strt += Math.PI * 2;\\n stp += Math.PI * 2;\\n }\\n if ((stp - strt) > (Math.PI * 2)) {\\n strt = 0;\\n stp = Math.PI * 2;\\n }\\n const increment = (stp - strt) / o.curveStepCount;\\n const points = [];\\n for (let angle = strt; angle <= stp; angle = angle + increment) {\\n points.push([cx + rx * Math.cos(angle), cy + ry * Math.sin(angle)]);\\n }\\n points.push([cx + rx * Math.cos(stp), cy + ry * Math.sin(stp)]);\\n points.push([cx, cy]);\\n return patternFillPolygons([points], o);\\n}\\nfunction randOffset(x, o) {\\n return _offsetOpt(x, o);\\n}\\nfunction randOffsetWithRange(min, max, o) {\\n return _offset(min, max, o);\\n}\\nfunction doubleLineFillOps(x1, y1, x2, y2, o) {\\n return _doubleLine(x1, y1, x2, y2, o, true);\\n}\\n// Private helpers\\nfunction cloneOptionsAlterSeed(ops) {\\n const result = Object.assign({}, ops);\\n result.randomizer = undefined;\\n if (ops.seed) {\\n result.seed = ops.seed + 1;\\n }\\n return result;\\n}\\nfunction random(ops) {\\n if (!ops.randomizer) {\\n ops.randomizer = new _math_js__WEBPACK_IMPORTED_MODULE_1__.Random(ops.seed || 0);\\n }\\n return ops.randomizer.next();\\n}\\nfunction _offset(min, max, ops, roughnessGain = 1) {\\n return ops.roughness * roughnessGain * ((random(ops) * (max - min)) + min);\\n}\\nfunction _offsetOpt(x, ops, roughnessGain = 1) {\\n return _offset(-x, x, ops, roughnessGain);\\n}\\nfunction _doubleLine(x1, y1, x2, y2, o, filling = false) {\\n const singleStroke = filling ? o.disableMultiStrokeFill : o.disableMultiStroke;\\n const o1 = _line(x1, y1, x2, y2, o, true, false);\\n if (singleStroke) {\\n return o1;\\n }\\n const o2 = _line(x1, y1, x2, y2, o, true, true);\\n return o1.concat(o2);\\n}\\nfunction _line(x1, y1, x2, y2, o, move, overlay) {\\n const lengthSq = Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2);\\n const length = Math.sqrt(lengthSq);\\n let roughnessGain = 1;\\n if (length < 200) {\\n roughnessGain = 1;\\n }\\n else if (length > 500) {\\n roughnessGain = 0.4;\\n }\\n else {\\n roughnessGain = (-0.0016668) * length + 1.233334;\\n }\\n let offset = o.maxRandomnessOffset || 0;\\n if ((offset * offset * 100) > lengthSq) {\\n offset = length / 10;\\n }\\n const halfOffset = offset / 2;\\n const divergePoint = 0.2 + random(o) * 0.2;\\n let midDispX = o.bowing * o.maxRandomnessOffset * (y2 - y1) / 200;\\n let midDispY = o.bowing * o.maxRandomnessOffset * (x1 - x2) / 200;\\n midDispX = _offsetOpt(midDispX, o, roughnessGain);\\n midDispY = _offsetOpt(midDispY, o, roughnessGain);\\n const ops = [];\\n const randomHalf = () => _offsetOpt(halfOffset, o, roughnessGain);\\n const randomFull = () => _offsetOpt(offset, o, roughnessGain);\\n const preserveVertices = o.preserveVertices;\\n if (move) {\\n if (overlay) {\\n ops.push({\\n op: 'move', data: [\\n x1 + (preserveVertices ? 0 : randomHalf()),\\n y1 + (preserveVertices ? 0 : randomHalf()),\\n ],\\n });\\n }\\n else {\\n ops.push({\\n op: 'move', data: [\\n x1 + (preserveVertices ? 0 : _offsetOpt(offset, o, roughnessGain)),\\n y1 + (preserveVertices ? 0 : _offsetOpt(offset, o, roughnessGain)),\\n ],\\n });\\n }\\n }\\n if (overlay) {\\n ops.push({\\n op: 'bcurveTo',\\n data: [\\n midDispX + x1 + (x2 - x1) * divergePoint + randomHalf(),\\n midDispY + y1 + (y2 - y1) * divergePoint + randomHalf(),\\n midDispX + x1 + 2 * (x2 - x1) * divergePoint + randomHalf(),\\n midDispY + y1 + 2 * (y2 - y1) * divergePoint + randomHalf(),\\n x2 + (preserveVertices ? 0 : randomHalf()),\\n y2 + (preserveVertices ? 0 : randomHalf()),\\n ],\\n });\\n }\\n else {\\n ops.push({\\n op: 'bcurveTo',\\n data: [\\n midDispX + x1 + (x2 - x1) * divergePoint + randomFull(),\\n midDispY + y1 + (y2 - y1) * divergePoint + randomFull(),\\n midDispX + x1 + 2 * (x2 - x1) * divergePoint + randomFull(),\\n midDispY + y1 + 2 * (y2 - y1) * divergePoint + randomFull(),\\n x2 + (preserveVertices ? 0 : randomFull()),\\n y2 + (preserveVertices ? 0 : randomFull()),\\n ],\\n });\\n }\\n return ops;\\n}\\nfunction _curveWithOffset(points, offset, o) {\\n const ps = [];\\n ps.push([\\n points[0][0] + _offsetOpt(offset, o),\\n points[0][1] + _offsetOpt(offset, o),\\n ]);\\n ps.push([\\n points[0][0] + _offsetOpt(offset, o),\\n points[0][1] + _offsetOpt(offset, o),\\n ]);\\n for (let i = 1; i < points.length; i++) {\\n ps.push([\\n points[i][0] + _offsetOpt(offset, o),\\n points[i][1] + _offsetOpt(offset, o),\\n ]);\\n if (i === (points.length - 1)) {\\n ps.push([\\n points[i][0] + _offsetOpt(offset, o),\\n points[i][1] + _offsetOpt(offset, o),\\n ]);\\n }\\n }\\n return _curve(ps, null, o);\\n}\\nfunction _curve(points, closePoint, o) {\\n const len = points.length;\\n const ops = [];\\n if (len > 3) {\\n const b = [];\\n const s = 1 - o.curveTightness;\\n ops.push({ op: 'move', data: [points[1][0], points[1][1]] });\\n for (let i = 1; (i + 2) < len; i++) {\\n const cachedVertArray = points[i];\\n b[0] = [cachedVertArray[0], cachedVertArray[1]];\\n b[1] = [cachedVertArray[0] + (s * points[i + 1][0] - s * points[i - 1][0]) / 6, cachedVertArray[1] + (s * points[i + 1][1] - s * points[i - 1][1]) / 6];\\n b[2] = [points[i + 1][0] + (s * points[i][0] - s * points[i + 2][0]) / 6, points[i + 1][1] + (s * points[i][1] - s * points[i + 2][1]) / 6];\\n b[3] = [points[i + 1][0], points[i + 1][1]];\\n ops.push({ op: 'bcurveTo', data: [b[1][0], b[1][1], b[2][0], b[2][1], b[3][0], b[3][1]] });\\n }\\n if (closePoint && closePoint.length === 2) {\\n const ro = o.maxRandomnessOffset;\\n ops.push({ op: 'lineTo', data: [closePoint[0] + _offsetOpt(ro, o), closePoint[1] + _offsetOpt(ro, o)] });\\n }\\n }\\n else if (len === 3) {\\n ops.push({ op: 'move', data: [points[1][0], points[1][1]] });\\n ops.push({\\n op: 'bcurveTo',\\n data: [\\n points[1][0], points[1][1],\\n points[2][0], points[2][1],\\n points[2][0], points[2][1],\\n ],\\n });\\n }\\n else if (len === 2) {\\n ops.push(..._doubleLine(points[0][0], points[0][1], points[1][0], points[1][1], o));\\n }\\n return ops;\\n}\\nfunction _computeEllipsePoints(increment, cx, cy, rx, ry, offset, overlap, o) {\\n const coreOnly = o.roughness === 0;\\n const corePoints = [];\\n const allPoints = [];\\n if (coreOnly) {\\n increment = increment / 4;\\n allPoints.push([\\n cx + rx * Math.cos(-increment),\\n cy + ry * Math.sin(-increment),\\n ]);\\n for (let angle = 0; angle <= Math.PI * 2; angle = angle + increment) {\\n const p = [\\n cx + rx * Math.cos(angle),\\n cy + ry * Math.sin(angle),\\n ];\\n corePoints.push(p);\\n allPoints.push(p);\\n }\\n allPoints.push([\\n cx + rx * Math.cos(0),\\n cy + ry * Math.sin(0),\\n ]);\\n allPoints.push([\\n cx + rx * Math.cos(increment),\\n cy + ry * Math.sin(increment),\\n ]);\\n }\\n else {\\n const radOffset = _offsetOpt(0.5, o) - (Math.PI / 2);\\n allPoints.push([\\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset - increment),\\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset - increment),\\n ]);\\n const endAngle = Math.PI * 2 + radOffset - 0.01;\\n for (let angle = radOffset; angle < endAngle; angle = angle + increment) {\\n const p = [\\n _offsetOpt(offset, o) + cx + rx * Math.cos(angle),\\n _offsetOpt(offset, o) + cy + ry * Math.sin(angle),\\n ];\\n corePoints.push(p);\\n allPoints.push(p);\\n }\\n allPoints.push([\\n _offsetOpt(offset, o) + cx + rx * Math.cos(radOffset + Math.PI * 2 + overlap * 0.5),\\n _offsetOpt(offset, o) + cy + ry * Math.sin(radOffset + Math.PI * 2 + overlap * 0.5),\\n ]);\\n allPoints.push([\\n _offsetOpt(offset, o) + cx + 0.98 * rx * Math.cos(radOffset + overlap),\\n _offsetOpt(offset, o) + cy + 0.98 * ry * Math.sin(radOffset + overlap),\\n ]);\\n allPoints.push([\\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset + overlap * 0.5),\\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset + overlap * 0.5),\\n ]);\\n }\\n return [allPoints, corePoints];\\n}\\nfunction _arc(increment, cx, cy, rx, ry, strt, stp, offset, o) {\\n const radOffset = strt + _offsetOpt(0.1, o);\\n const points = [];\\n points.push([\\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset - increment),\\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset - increment),\\n ]);\\n for (let angle = radOffset; angle <= stp; angle = angle + increment) {\\n points.push([\\n _offsetOpt(offset, o) + cx + rx * Math.cos(angle),\\n _offsetOpt(offset, o) + cy + ry * Math.sin(angle),\\n ]);\\n }\\n points.push([\\n cx + rx * Math.cos(stp),\\n cy + ry * Math.sin(stp),\\n ]);\\n points.push([\\n cx + rx * Math.cos(stp),\\n cy + ry * Math.sin(stp),\\n ]);\\n return _curve(points, null, o);\\n}\\nfunction _bezierTo(x1, y1, x2, y2, x, y, current, o) {\\n const ops = [];\\n const ros = [o.maxRandomnessOffset || 1, (o.maxRandomnessOffset || 1) + 0.3];\\n let f = [0, 0];\\n const iterations = o.disableMultiStroke ? 1 : 2;\\n const preserveVertices = o.preserveVertices;\\n for (let i = 0; i < iterations; i++) {\\n if (i === 0) {\\n ops.push({ op: 'move', data: [current[0], current[1]] });\\n }\\n else {\\n ops.push({ op: 'move', data: [current[0] + (preserveVertices ? 0 : _offsetOpt(ros[0], o)), current[1] + (preserveVertices ? 0 : _offsetOpt(ros[0], o))] });\\n }\\n f = preserveVertices ? [x, y] : [x + _offsetOpt(ros[i], o), y + _offsetOpt(ros[i], o)];\\n ops.push({\\n op: 'bcurveTo',\\n data: [\\n x1 + _offsetOpt(ros[i], o), y1 + _offsetOpt(ros[i], o),\\n x2 + _offsetOpt(ros[i], o), y2 + _offsetOpt(ros[i], o),\\n f[0], f[1],\\n ],\\n });\\n }\\n return ops;\\n}\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JvdWdoanMvYmluL3JlbmRlcmVyLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBZ0Q7QUFDYjtBQUNpQztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsdUJBQXVCO0FBQ3hDO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDhCQUE4QixJQUFJLDBFQUEwRTtBQUNuSTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxxQkFBcUIsMkRBQVMsQ0FBQyw0REFBVSxDQUFDLDJEQUFTO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHFFQUFxRTtBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQSx1QkFBdUIsNENBQTRDO0FBQ25FO0FBQ0E7QUFDQSx1QkFBdUIsOElBQThJO0FBQ3JLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JvdWdoanMvYmluL3JlbmRlcmVyLmpzPzBkM2UiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RmlsbGVyIH0gZnJvbSAnLi9maWxsZXJzL2ZpbGxlci5qcyc7XG5pbXBvcnQgeyBSYW5kb20gfSBmcm9tICcuL21hdGguanMnO1xuaW1wb3J0IHsgcGFyc2VQYXRoLCBub3JtYWxpemUsIGFic29sdXRpemUgfSBmcm9tICdwYXRoLWRhdGEtcGFyc2VyJztcbmNvbnN0IGhlbHBlciA9IHtcbiAgICByYW5kT2Zmc2V0LFxuICAgIHJhbmRPZmZzZXRXaXRoUmFuZ2UsXG4gICAgZWxsaXBzZSxcbiAgICBkb3VibGVMaW5lT3BzOiBkb3VibGVMaW5lRmlsbE9wcyxcbn07XG5leHBvcnQgZnVuY3Rpb24gbGluZSh4MSwgeTEsIHgyLCB5Miwgbykge1xuICAgIHJldHVybiB7IHR5cGU6ICdwYXRoJywgb3BzOiBfZG91YmxlTGluZSh4MSwgeTEsIHgyLCB5MiwgbykgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsaW5lYXJQYXRoKHBvaW50cywgY2xvc2UsIG8pIHtcbiAgICBjb25zdCBsZW4gPSAocG9pbnRzIHx8IFtdKS5sZW5ndGg7XG4gICAgaWYgKGxlbiA+IDIpIHtcbiAgICAgICAgY29uc3Qgb3BzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGxlbiAtIDEpOyBpKyspIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKC4uLl9kb3VibGVMaW5lKHBvaW50c1tpXVswXSwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaSArIDFdWzBdLCBwb2ludHNbaSArIDFdWzFdLCBvKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgICAgICBvcHMucHVzaCguLi5fZG91YmxlTGluZShwb2ludHNbbGVuIC0gMV1bMF0sIHBvaW50c1tsZW4gLSAxXVsxXSwgcG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0sIG8pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0eXBlOiAncGF0aCcsIG9wcyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGxpbmUocG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0sIHBvaW50c1sxXVswXSwgcG9pbnRzWzFdWzFdLCBvKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogJ3BhdGgnLCBvcHM6IFtdIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbihwb2ludHMsIG8pIHtcbiAgICByZXR1cm4gbGluZWFyUGF0aChwb2ludHMsIHRydWUsIG8pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvKSB7XG4gICAgY29uc3QgcG9pbnRzID0gW1xuICAgICAgICBbeCwgeV0sXG4gICAgICAgIFt4ICsgd2lkdGgsIHldLFxuICAgICAgICBbeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSxcbiAgICAgICAgW3gsIHkgKyBoZWlnaHRdLFxuICAgIF07XG4gICAgcmV0dXJuIHBvbHlnb24ocG9pbnRzLCBvKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdXJ2ZShwb2ludHMsIG8pIHtcbiAgICBsZXQgbzEgPSBfY3VydmVXaXRoT2Zmc2V0KHBvaW50cywgMSAqICgxICsgby5yb3VnaG5lc3MgKiAwLjIpLCBvKTtcbiAgICBpZiAoIW8uZGlzYWJsZU11bHRpU3Ryb2tlKSB7XG4gICAgICAgIGNvbnN0IG8yID0gX2N1cnZlV2l0aE9mZnNldChwb2ludHMsIDEuNSAqICgxICsgby5yb3VnaG5lc3MgKiAwLjIyKSwgY2xvbmVPcHRpb25zQWx0ZXJTZWVkKG8pKTtcbiAgICAgICAgbzEgPSBvMS5jb25jYXQobzIpO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiAncGF0aCcsIG9wczogbzEgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIG8pIHtcbiAgICBjb25zdCBwYXJhbXMgPSBnZW5lcmF0ZUVsbGlwc2VQYXJhbXMod2lkdGgsIGhlaWdodCwgbyk7XG4gICAgcmV0dXJuIGVsbGlwc2VXaXRoUGFyYW1zKHgsIHksIG8sIHBhcmFtcykub3BzZXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVFbGxpcHNlUGFyYW1zKHdpZHRoLCBoZWlnaHQsIG8pIHtcbiAgICBjb25zdCBwc3EgPSBNYXRoLnNxcnQoTWF0aC5QSSAqIDIgKiBNYXRoLnNxcnQoKE1hdGgucG93KHdpZHRoIC8gMiwgMikgKyBNYXRoLnBvdyhoZWlnaHQgLyAyLCAyKSkgLyAyKSk7XG4gICAgY29uc3Qgc3RlcENvdW50ID0gTWF0aC5jZWlsKE1hdGgubWF4KG8uY3VydmVTdGVwQ291bnQsIChvLmN1cnZlU3RlcENvdW50IC8gTWF0aC5zcXJ0KDIwMCkpICogcHNxKSk7XG4gICAgY29uc3QgaW5jcmVtZW50ID0gKE1hdGguUEkgKiAyKSAvIHN0ZXBDb3VudDtcbiAgICBsZXQgcnggPSBNYXRoLmFicyh3aWR0aCAvIDIpO1xuICAgIGxldCByeSA9IE1hdGguYWJzKGhlaWdodCAvIDIpO1xuICAgIGNvbnN0IGN1cnZlRml0UmFuZG9tbmVzcyA9IDEgLSBvLmN1cnZlRml0dGluZztcbiAgICByeCArPSBfb2Zmc2V0T3B0KHJ4ICogY3VydmVGaXRSYW5kb21uZXNzLCBvKTtcbiAgICByeSArPSBfb2Zmc2V0T3B0KHJ5ICogY3VydmVGaXRSYW5kb21uZXNzLCBvKTtcbiAgICByZXR1cm4geyBpbmNyZW1lbnQsIHJ4LCByeSB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVsbGlwc2VXaXRoUGFyYW1zKHgsIHksIG8sIGVsbGlwc2VQYXJhbXMpIHtcbiAgICBjb25zdCBbYXAxLCBjcDFdID0gX2NvbXB1dGVFbGxpcHNlUG9pbnRzKGVsbGlwc2VQYXJhbXMuaW5jcmVtZW50LCB4LCB5LCBlbGxpcHNlUGFyYW1zLnJ4LCBlbGxpcHNlUGFyYW1zLnJ5LCAxLCBlbGxpcHNlUGFyYW1zLmluY3JlbWVudCAqIF9vZmZzZXQoMC4xLCBfb2Zmc2V0KDAuNCwgMSwgbyksIG8pLCBvKTtcbiAgICBsZXQgbzEgPSBfY3VydmUoYXAxLCBudWxsLCBvKTtcbiAgICBpZiAoKCFvLmRpc2FibGVNdWx0aVN0cm9rZSkgJiYgKG8ucm91Z2huZXNzICE9PSAwKSkge1xuICAgICAgICBjb25zdCBbYXAyXSA9IF9jb21wdXRlRWxsaXBzZVBvaW50cyhlbGxpcHNlUGFyYW1zLmluY3JlbWVudCwgeCwgeSwgZWxsaXBzZVBhcmFtcy5yeCwgZWxsaXBzZVBhcmFtcy5yeSwgMS41LCAwLCBvKTtcbiAgICAgICAgY29uc3QgbzIgPSBfY3VydmUoYXAyLCBudWxsLCBvKTtcbiAgICAgICAgbzEgPSBvMS5jb25jYXQobzIpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlc3RpbWF0ZWRQb2ludHM6IGNwMSxcbiAgICAgICAgb3BzZXQ6IHsgdHlwZTogJ3BhdGgnLCBvcHM6IG8xIH0sXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcmMoeCwgeSwgd2lkdGgsIGhlaWdodCwgc3RhcnQsIHN0b3AsIGNsb3NlZCwgcm91Z2hDbG9zdXJlLCBvKSB7XG4gICAgY29uc3QgY3ggPSB4O1xuICAgIGNvbnN0IGN5ID0geTtcbiAgICBsZXQgcnggPSBNYXRoLmFicyh3aWR0aCAvIDIpO1xuICAgIGxldCByeSA9IE1hdGguYWJzKGhlaWdodCAvIDIpO1xuICAgIHJ4ICs9IF9vZmZzZXRPcHQocnggKiAwLjAxLCBvKTtcbiAgICByeSArPSBfb2Zmc2V0T3B0KHJ5ICogMC4wMSwgbyk7XG4gICAgbGV0IHN0cnQgPSBzdGFydDtcbiAgICBsZXQgc3RwID0gc3RvcDtcbiAgICB3aGlsZSAoc3RydCA8IDApIHtcbiAgICAgICAgc3RydCArPSBNYXRoLlBJICogMjtcbiAgICAgICAgc3RwICs9IE1hdGguUEkgKiAyO1xuICAgIH1cbiAgICBpZiAoKHN0cCAtIHN0cnQpID4gKE1hdGguUEkgKiAyKSkge1xuICAgICAgICBzdHJ0ID0gMDtcbiAgICAgICAgc3RwID0gTWF0aC5QSSAqIDI7XG4gICAgfVxuICAgIGNvbnN0IGVsbGlwc2VJbmMgPSAoTWF0aC5QSSAqIDIpIC8gby5jdXJ2ZVN0ZXBDb3VudDtcbiAgICBjb25zdCBhcmNJbmMgPSBNYXRoLm1pbihlbGxpcHNlSW5jIC8gMiwgKHN0cCAtIHN0cnQpIC8gMik7XG4gICAgY29uc3Qgb3BzID0gX2FyYyhhcmNJbmMsIGN4LCBjeSwgcngsIHJ5LCBzdHJ0LCBzdHAsIDEsIG8pO1xuICAgIGlmICghby5kaXNhYmxlTXVsdGlTdHJva2UpIHtcbiAgICAgICAgY29uc3QgbzIgPSBfYXJjKGFyY0luYywgY3gsIGN5LCByeCwgcnksIHN0cnQsIHN0cCwgMS41LCBvKTtcbiAgICAgICAgb3BzLnB1c2goLi4ubzIpO1xuICAgIH1cbiAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgIGlmIChyb3VnaENsb3N1cmUpIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKC4uLl9kb3VibGVMaW5lKGN4LCBjeSwgY3ggKyByeCAqIE1hdGguY29zKHN0cnQpLCBjeSArIHJ5ICogTWF0aC5zaW4oc3RydCksIG8pLCAuLi5fZG91YmxlTGluZShjeCwgY3ksIGN4ICsgcnggKiBNYXRoLmNvcyhzdHApLCBjeSArIHJ5ICogTWF0aC5zaW4oc3RwKSwgbykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2goeyBvcDogJ2xpbmVUbycsIGRhdGE6IFtjeCwgY3ldIH0sIHsgb3A6ICdsaW5lVG8nLCBkYXRhOiBbY3ggKyByeCAqIE1hdGguY29zKHN0cnQpLCBjeSArIHJ5ICogTWF0aC5zaW4oc3RydCldIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6ICdwYXRoJywgb3BzIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc3ZnUGF0aChwYXRoLCBvKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemUoYWJzb2x1dGl6ZShwYXJzZVBhdGgocGF0aCkpKTtcbiAgICBjb25zdCBvcHMgPSBbXTtcbiAgICBsZXQgZmlyc3QgPSBbMCwgMF07XG4gICAgbGV0IGN1cnJlbnQgPSBbMCwgMF07XG4gICAgZm9yIChjb25zdCB7IGtleSwgZGF0YSB9IG9mIHNlZ21lbnRzKSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdNJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvID0gMSAqIChvLm1heFJhbmRvbW5lc3NPZmZzZXQgfHwgMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHYgPSBvLnByZXNlcnZlVmVydGljZXM7XG4gICAgICAgICAgICAgICAgb3BzLnB1c2goeyBvcDogJ21vdmUnLCBkYXRhOiBkYXRhLm1hcCgoZCkgPT4gZCArIChwdiA/IDAgOiBfb2Zmc2V0T3B0KHJvLCBvKSkpIH0pO1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBbZGF0YVswXSwgZGF0YVsxXV07XG4gICAgICAgICAgICAgICAgZmlyc3QgPSBbZGF0YVswXSwgZGF0YVsxXV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICBvcHMucHVzaCguLi5fZG91YmxlTGluZShjdXJyZW50WzBdLCBjdXJyZW50WzFdLCBkYXRhWzBdLCBkYXRhWzFdLCBvKSk7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IFtkYXRhWzBdLCBkYXRhWzFdXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0MnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCB4LCB5XSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgb3BzLnB1c2goLi4uX2JlemllclRvKHgxLCB5MSwgeDIsIHkyLCB4LCB5LCBjdXJyZW50LCBvKSk7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IFt4LCB5XTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgICAgICAgIG9wcy5wdXNoKC4uLl9kb3VibGVMaW5lKGN1cnJlbnRbMF0sIGN1cnJlbnRbMV0sIGZpcnN0WzBdLCBmaXJzdFsxXSwgbykpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBbZmlyc3RbMF0sIGZpcnN0WzFdXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiAncGF0aCcsIG9wcyB9O1xufVxuLy8gRmlsbHNcbmV4cG9ydCBmdW5jdGlvbiBzb2xpZEZpbGxQb2x5Z29uKHBvbHlnb25MaXN0LCBvKSB7XG4gICAgY29uc3Qgb3BzID0gW107XG4gICAgZm9yIChjb25zdCBwb2ludHMgb2YgcG9seWdvbkxpc3QpIHtcbiAgICAgICAgaWYgKHBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IG8ubWF4UmFuZG9tbmVzc09mZnNldCB8fCAwO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gcG9pbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3BzLnB1c2goeyBvcDogJ21vdmUnLCBkYXRhOiBbcG9pbnRzWzBdWzBdICsgX29mZnNldE9wdChvZmZzZXQsIG8pLCBwb2ludHNbMF1bMV0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyldIH0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgb3BzLnB1c2goeyBvcDogJ2xpbmVUbycsIGRhdGE6IFtwb2ludHNbaV1bMF0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyksIHBvaW50c1tpXVsxXSArIF9vZmZzZXRPcHQob2Zmc2V0LCBvKV0gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6ICdmaWxsUGF0aCcsIG9wcyB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhdHRlcm5GaWxsUG9seWdvbnMocG9seWdvbkxpc3QsIG8pIHtcbiAgICByZXR1cm4gZ2V0RmlsbGVyKG8sIGhlbHBlcikuZmlsbFBvbHlnb25zKHBvbHlnb25MaXN0LCBvKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXR0ZXJuRmlsbEFyYyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzdGFydCwgc3RvcCwgbykge1xuICAgIGNvbnN0IGN4ID0geDtcbiAgICBjb25zdCBjeSA9IHk7XG4gICAgbGV0IHJ4ID0gTWF0aC5hYnMod2lkdGggLyAyKTtcbiAgICBsZXQgcnkgPSBNYXRoLmFicyhoZWlnaHQgLyAyKTtcbiAgICByeCArPSBfb2Zmc2V0T3B0KHJ4ICogMC4wMSwgbyk7XG4gICAgcnkgKz0gX29mZnNldE9wdChyeSAqIDAuMDEsIG8pO1xuICAgIGxldCBzdHJ0ID0gc3RhcnQ7XG4gICAgbGV0IHN0cCA9IHN0b3A7XG4gICAgd2hpbGUgKHN0cnQgPCAwKSB7XG4gICAgICAgIHN0cnQgKz0gTWF0aC5QSSAqIDI7XG4gICAgICAgIHN0cCArPSBNYXRoLlBJICogMjtcbiAgICB9XG4gICAgaWYgKChzdHAgLSBzdHJ0KSA+IChNYXRoLlBJICogMikpIHtcbiAgICAgICAgc3RydCA9IDA7XG4gICAgICAgIHN0cCA9IE1hdGguUEkgKiAyO1xuICAgIH1cbiAgICBjb25zdCBpbmNyZW1lbnQgPSAoc3RwIC0gc3RydCkgLyBvLmN1cnZlU3RlcENvdW50O1xuICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgIGZvciAobGV0IGFuZ2xlID0gc3RydDsgYW5nbGUgPD0gc3RwOyBhbmdsZSA9IGFuZ2xlICsgaW5jcmVtZW50KSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtjeCArIHJ4ICogTWF0aC5jb3MoYW5nbGUpLCBjeSArIHJ5ICogTWF0aC5zaW4oYW5nbGUpXSk7XG4gICAgfVxuICAgIHBvaW50cy5wdXNoKFtjeCArIHJ4ICogTWF0aC5jb3Moc3RwKSwgY3kgKyByeSAqIE1hdGguc2luKHN0cCldKTtcbiAgICBwb2ludHMucHVzaChbY3gsIGN5XSk7XG4gICAgcmV0dXJuIHBhdHRlcm5GaWxsUG9seWdvbnMoW3BvaW50c10sIG8pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRPZmZzZXQoeCwgbykge1xuICAgIHJldHVybiBfb2Zmc2V0T3B0KHgsIG8pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRPZmZzZXRXaXRoUmFuZ2UobWluLCBtYXgsIG8pIHtcbiAgICByZXR1cm4gX29mZnNldChtaW4sIG1heCwgbyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZG91YmxlTGluZUZpbGxPcHMoeDEsIHkxLCB4MiwgeTIsIG8pIHtcbiAgICByZXR1cm4gX2RvdWJsZUxpbmUoeDEsIHkxLCB4MiwgeTIsIG8sIHRydWUpO1xufVxuLy8gUHJpdmF0ZSBoZWxwZXJzXG5mdW5jdGlvbiBjbG9uZU9wdGlvbnNBbHRlclNlZWQob3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgb3BzKTtcbiAgICByZXN1bHQucmFuZG9taXplciA9IHVuZGVmaW5lZDtcbiAgICBpZiAob3BzLnNlZWQpIHtcbiAgICAgICAgcmVzdWx0LnNlZWQgPSBvcHMuc2VlZCArIDE7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiByYW5kb20ob3BzKSB7XG4gICAgaWYgKCFvcHMucmFuZG9taXplcikge1xuICAgICAgICBvcHMucmFuZG9taXplciA9IG5ldyBSYW5kb20ob3BzLnNlZWQgfHwgMCk7XG4gICAgfVxuICAgIHJldHVybiBvcHMucmFuZG9taXplci5uZXh0KCk7XG59XG5mdW5jdGlvbiBfb2Zmc2V0KG1pbiwgbWF4LCBvcHMsIHJvdWdobmVzc0dhaW4gPSAxKSB7XG4gICAgcmV0dXJuIG9wcy5yb3VnaG5lc3MgKiByb3VnaG5lc3NHYWluICogKChyYW5kb20ob3BzKSAqIChtYXggLSBtaW4pKSArIG1pbik7XG59XG5mdW5jdGlvbiBfb2Zmc2V0T3B0KHgsIG9wcywgcm91Z2huZXNzR2FpbiA9IDEpIHtcbiAgICByZXR1cm4gX29mZnNldCgteCwgeCwgb3BzLCByb3VnaG5lc3NHYWluKTtcbn1cbmZ1bmN0aW9uIF9kb3VibGVMaW5lKHgxLCB5MSwgeDIsIHkyLCBvLCBmaWxsaW5nID0gZmFsc2UpIHtcbiAgICBjb25zdCBzaW5nbGVTdHJva2UgPSBmaWxsaW5nID8gby5kaXNhYmxlTXVsdGlTdHJva2VGaWxsIDogby5kaXNhYmxlTXVsdGlTdHJva2U7XG4gICAgY29uc3QgbzEgPSBfbGluZSh4MSwgeTEsIHgyLCB5MiwgbywgdHJ1ZSwgZmFsc2UpO1xuICAgIGlmIChzaW5nbGVTdHJva2UpIHtcbiAgICAgICAgcmV0dXJuIG8xO1xuICAgIH1cbiAgICBjb25zdCBvMiA9IF9saW5lKHgxLCB5MSwgeDIsIHkyLCBvLCB0cnVlLCB0cnVlKTtcbiAgICByZXR1cm4gbzEuY29uY2F0KG8yKTtcbn1cbmZ1bmN0aW9uIF9saW5lKHgxLCB5MSwgeDIsIHkyLCBvLCBtb3ZlLCBvdmVybGF5KSB7XG4gICAgY29uc3QgbGVuZ3RoU3EgPSBNYXRoLnBvdygoeDEgLSB4MiksIDIpICsgTWF0aC5wb3coKHkxIC0geTIpLCAyKTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQobGVuZ3RoU3EpO1xuICAgIGxldCByb3VnaG5lc3NHYWluID0gMTtcbiAgICBpZiAobGVuZ3RoIDwgMjAwKSB7XG4gICAgICAgIHJvdWdobmVzc0dhaW4gPSAxO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW5ndGggPiA1MDApIHtcbiAgICAgICAgcm91Z2huZXNzR2FpbiA9IDAuNDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJvdWdobmVzc0dhaW4gPSAoLTAuMDAxNjY2OCkgKiBsZW5ndGggKyAxLjIzMzMzNDtcbiAgICB9XG4gICAgbGV0IG9mZnNldCA9IG8ubWF4UmFuZG9tbmVzc09mZnNldCB8fCAwO1xuICAgIGlmICgob2Zmc2V0ICogb2Zmc2V0ICogMTAwKSA+IGxlbmd0aFNxKSB7XG4gICAgICAgIG9mZnNldCA9IGxlbmd0aCAvIDEwO1xuICAgIH1cbiAgICBjb25zdCBoYWxmT2Zmc2V0ID0gb2Zmc2V0IC8gMjtcbiAgICBjb25zdCBkaXZlcmdlUG9pbnQgPSAwLjIgKyByYW5kb20obykgKiAwLjI7XG4gICAgbGV0IG1pZERpc3BYID0gby5ib3dpbmcgKiBvLm1heFJhbmRvbW5lc3NPZmZzZXQgKiAoeTIgLSB5MSkgLyAyMDA7XG4gICAgbGV0IG1pZERpc3BZID0gby5ib3dpbmcgKiBvLm1heFJhbmRvbW5lc3NPZmZzZXQgKiAoeDEgLSB4MikgLyAyMDA7XG4gICAgbWlkRGlzcFggPSBfb2Zmc2V0T3B0KG1pZERpc3BYLCBvLCByb3VnaG5lc3NHYWluKTtcbiAgICBtaWREaXNwWSA9IF9vZmZzZXRPcHQobWlkRGlzcFksIG8sIHJvdWdobmVzc0dhaW4pO1xuICAgIGNvbnN0IG9wcyA9IFtdO1xuICAgIGNvbnN0IHJhbmRvbUhhbGYgPSAoKSA9PiBfb2Zmc2V0T3B0KGhhbGZPZmZzZXQsIG8sIHJvdWdobmVzc0dhaW4pO1xuICAgIGNvbnN0IHJhbmRvbUZ1bGwgPSAoKSA9PiBfb2Zmc2V0T3B0KG9mZnNldCwgbywgcm91Z2huZXNzR2Fpbik7XG4gICAgY29uc3QgcHJlc2VydmVWZXJ0aWNlcyA9IG8ucHJlc2VydmVWZXJ0aWNlcztcbiAgICBpZiAobW92ZSkge1xuICAgICAgICBpZiAob3ZlcmxheSkge1xuICAgICAgICAgICAgb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9wOiAnbW92ZScsIGRhdGE6IFtcbiAgICAgICAgICAgICAgICAgICAgeDEgKyAocHJlc2VydmVWZXJ0aWNlcyA/IDAgOiByYW5kb21IYWxmKCkpLFxuICAgICAgICAgICAgICAgICAgICB5MSArIChwcmVzZXJ2ZVZlcnRpY2VzID8gMCA6IHJhbmRvbUhhbGYoKSksXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9wOiAnbW92ZScsIGRhdGE6IFtcbiAgICAgICAgICAgICAgICAgICAgeDEgKyAocHJlc2VydmVWZXJ0aWNlcyA/IDAgOiBfb2Zmc2V0T3B0KG9mZnNldCwgbywgcm91Z2huZXNzR2FpbikpLFxuICAgICAgICAgICAgICAgICAgICB5MSArIChwcmVzZXJ2ZVZlcnRpY2VzID8gMCA6IF9vZmZzZXRPcHQob2Zmc2V0LCBvLCByb3VnaG5lc3NHYWluKSksXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChvdmVybGF5KSB7XG4gICAgICAgIG9wcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiAnYmN1cnZlVG8nLFxuICAgICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgICAgIG1pZERpc3BYICsgeDEgKyAoeDIgLSB4MSkgKiBkaXZlcmdlUG9pbnQgKyByYW5kb21IYWxmKCksXG4gICAgICAgICAgICAgICAgbWlkRGlzcFkgKyB5MSArICh5MiAtIHkxKSAqIGRpdmVyZ2VQb2ludCArIHJhbmRvbUhhbGYoKSxcbiAgICAgICAgICAgICAgICBtaWREaXNwWCArIHgxICsgMiAqICh4MiAtIHgxKSAqIGRpdmVyZ2VQb2ludCArIHJhbmRvbUhhbGYoKSxcbiAgICAgICAgICAgICAgICBtaWREaXNwWSArIHkxICsgMiAqICh5MiAtIHkxKSAqIGRpdmVyZ2VQb2ludCArIHJhbmRvbUhhbGYoKSxcbiAgICAgICAgICAgICAgICB4MiArIChwcmVzZXJ2ZVZlcnRpY2VzID8gMCA6IHJhbmRvbUhhbGYoKSksXG4gICAgICAgICAgICAgICAgeTIgKyAocHJlc2VydmVWZXJ0aWNlcyA/IDAgOiByYW5kb21IYWxmKCkpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvcHMucHVzaCh7XG4gICAgICAgICAgICBvcDogJ2JjdXJ2ZVRvJyxcbiAgICAgICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAgICAgICBtaWREaXNwWCArIHgxICsgKHgyIC0geDEpICogZGl2ZXJnZVBvaW50ICsgcmFuZG9tRnVsbCgpLFxuICAgICAgICAgICAgICAgIG1pZERpc3BZICsgeTEgKyAoeTIgLSB5MSkgKiBkaXZlcmdlUG9pbnQgKyByYW5kb21GdWxsKCksXG4gICAgICAgICAgICAgICAgbWlkRGlzcFggKyB4MSArIDIgKiAoeDIgLSB4MSkgKiBkaXZlcmdlUG9pbnQgKyByYW5kb21GdWxsKCksXG4gICAgICAgICAgICAgICAgbWlkRGlzcFkgKyB5MSArIDIgKiAoeTIgLSB5MSkgKiBkaXZlcmdlUG9pbnQgKyByYW5kb21GdWxsKCksXG4gICAgICAgICAgICAgICAgeDIgKyAocHJlc2VydmVWZXJ0aWNlcyA/IDAgOiByYW5kb21GdWxsKCkpLFxuICAgICAgICAgICAgICAgIHkyICsgKHByZXNlcnZlVmVydGljZXMgPyAwIDogcmFuZG9tRnVsbCgpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3BzO1xufVxuZnVuY3Rpb24gX2N1cnZlV2l0aE9mZnNldChwb2ludHMsIG9mZnNldCwgbykge1xuICAgIGNvbnN0IHBzID0gW107XG4gICAgcHMucHVzaChbXG4gICAgICAgIHBvaW50c1swXVswXSArIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSxcbiAgICAgICAgcG9pbnRzWzBdWzFdICsgX29mZnNldE9wdChvZmZzZXQsIG8pLFxuICAgIF0pO1xuICAgIHBzLnB1c2goW1xuICAgICAgICBwb2ludHNbMF1bMF0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyksXG4gICAgICAgIHBvaW50c1swXVsxXSArIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSxcbiAgICBdKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcy5wdXNoKFtcbiAgICAgICAgICAgIHBvaW50c1tpXVswXSArIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSxcbiAgICAgICAgICAgIHBvaW50c1tpXVsxXSArIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChpID09PSAocG9pbnRzLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgICBwcy5wdXNoKFtcbiAgICAgICAgICAgICAgICBwb2ludHNbaV1bMF0gKyBfb2Zmc2V0T3B0KG9mZnNldCwgbyksXG4gICAgICAgICAgICAgICAgcG9pbnRzW2ldWzFdICsgX29mZnNldE9wdChvZmZzZXQsIG8pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9jdXJ2ZShwcywgbnVsbCwgbyk7XG59XG5mdW5jdGlvbiBfY3VydmUocG9pbnRzLCBjbG9zZVBvaW50LCBvKSB7XG4gICAgY29uc3QgbGVuID0gcG9pbnRzLmxlbmd0aDtcbiAgICBjb25zdCBvcHMgPSBbXTtcbiAgICBpZiAobGVuID4gMykge1xuICAgICAgICBjb25zdCBiID0gW107XG4gICAgICAgIGNvbnN0IHMgPSAxIC0gby5jdXJ2ZVRpZ2h0bmVzcztcbiAgICAgICAgb3BzLnB1c2goeyBvcDogJ21vdmUnLCBkYXRhOiBbcG9pbnRzWzFdWzBdLCBwb2ludHNbMV1bMV1dIH0pO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgKGkgKyAyKSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWRWZXJ0QXJyYXkgPSBwb2ludHNbaV07XG4gICAgICAgICAgICBiWzBdID0gW2NhY2hlZFZlcnRBcnJheVswXSwgY2FjaGVkVmVydEFycmF5WzFdXTtcbiAgICAgICAgICAgIGJbMV0gPSBbY2FjaGVkVmVydEFycmF5WzBdICsgKHMgKiBwb2ludHNbaSArIDFdWzBdIC0gcyAqIHBvaW50c1tpIC0gMV1bMF0pIC8gNiwgY2FjaGVkVmVydEFycmF5WzFdICsgKHMgKiBwb2ludHNbaSArIDFdWzFdIC0gcyAqIHBvaW50c1tpIC0gMV1bMV0pIC8gNl07XG4gICAgICAgICAgICBiWzJdID0gW3BvaW50c1tpICsgMV1bMF0gKyAocyAqIHBvaW50c1tpXVswXSAtIHMgKiBwb2ludHNbaSArIDJdWzBdKSAvIDYsIHBvaW50c1tpICsgMV1bMV0gKyAocyAqIHBvaW50c1tpXVsxXSAtIHMgKiBwb2ludHNbaSArIDJdWzFdKSAvIDZdO1xuICAgICAgICAgICAgYlszXSA9IFtwb2ludHNbaSArIDFdWzBdLCBwb2ludHNbaSArIDFdWzFdXTtcbiAgICAgICAgICAgIG9wcy5wdXNoKHsgb3A6ICdiY3VydmVUbycsIGRhdGE6IFtiWzFdWzBdLCBiWzFdWzFdLCBiWzJdWzBdLCBiWzJdWzFdLCBiWzNdWzBdLCBiWzNdWzFdXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xvc2VQb2ludCAmJiBjbG9zZVBvaW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3Qgcm8gPSBvLm1heFJhbmRvbW5lc3NPZmZzZXQ7XG4gICAgICAgICAgICBvcHMucHVzaCh7IG9wOiAnbGluZVRvJywgZGF0YTogW2Nsb3NlUG9pbnRbMF0gKyBfb2Zmc2V0T3B0KHJvLCBvKSwgY2xvc2VQb2ludFsxXSArIF9vZmZzZXRPcHQocm8sIG8pXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gPT09IDMpIHtcbiAgICAgICAgb3BzLnB1c2goeyBvcDogJ21vdmUnLCBkYXRhOiBbcG9pbnRzWzFdWzBdLCBwb2ludHNbMV1bMV1dIH0pO1xuICAgICAgICBvcHMucHVzaCh7XG4gICAgICAgICAgICBvcDogJ2JjdXJ2ZVRvJyxcbiAgICAgICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAgICAgICBwb2ludHNbMV1bMF0sIHBvaW50c1sxXVsxXSxcbiAgICAgICAgICAgICAgICBwb2ludHNbMl1bMF0sIHBvaW50c1syXVsxXSxcbiAgICAgICAgICAgICAgICBwb2ludHNbMl1bMF0sIHBvaW50c1syXVsxXSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gPT09IDIpIHtcbiAgICAgICAgb3BzLnB1c2goLi4uX2RvdWJsZUxpbmUocG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0sIHBvaW50c1sxXVswXSwgcG9pbnRzWzFdWzFdLCBvKSk7XG4gICAgfVxuICAgIHJldHVybiBvcHM7XG59XG5mdW5jdGlvbiBfY29tcHV0ZUVsbGlwc2VQb2ludHMoaW5jcmVtZW50LCBjeCwgY3ksIHJ4LCByeSwgb2Zmc2V0LCBvdmVybGFwLCBvKSB7XG4gICAgY29uc3QgY29yZU9ubHkgPSBvLnJvdWdobmVzcyA9PT0gMDtcbiAgICBjb25zdCBjb3JlUG9pbnRzID0gW107XG4gICAgY29uc3QgYWxsUG9pbnRzID0gW107XG4gICAgaWYgKGNvcmVPbmx5KSB7XG4gICAgICAgIGluY3JlbWVudCA9IGluY3JlbWVudCAvIDQ7XG4gICAgICAgIGFsbFBvaW50cy5wdXNoKFtcbiAgICAgICAgICAgIGN4ICsgcnggKiBNYXRoLmNvcygtaW5jcmVtZW50KSxcbiAgICAgICAgICAgIGN5ICsgcnkgKiBNYXRoLnNpbigtaW5jcmVtZW50KSxcbiAgICAgICAgXSk7XG4gICAgICAgIGZvciAobGV0IGFuZ2xlID0gMDsgYW5nbGUgPD0gTWF0aC5QSSAqIDI7IGFuZ2xlID0gYW5nbGUgKyBpbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBbXG4gICAgICAgICAgICAgICAgY3ggKyByeCAqIE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICBjeSArIHJ5ICogTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvcmVQb2ludHMucHVzaChwKTtcbiAgICAgICAgICAgIGFsbFBvaW50cy5wdXNoKHApO1xuICAgICAgICB9XG4gICAgICAgIGFsbFBvaW50cy5wdXNoKFtcbiAgICAgICAgICAgIGN4ICsgcnggKiBNYXRoLmNvcygwKSxcbiAgICAgICAgICAgIGN5ICsgcnkgKiBNYXRoLnNpbigwKSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFsbFBvaW50cy5wdXNoKFtcbiAgICAgICAgICAgIGN4ICsgcnggKiBNYXRoLmNvcyhpbmNyZW1lbnQpLFxuICAgICAgICAgICAgY3kgKyByeSAqIE1hdGguc2luKGluY3JlbWVudCksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcmFkT2Zmc2V0ID0gX29mZnNldE9wdCgwLjUsIG8pIC0gKE1hdGguUEkgLyAyKTtcbiAgICAgICAgYWxsUG9pbnRzLnB1c2goW1xuICAgICAgICAgICAgX29mZnNldE9wdChvZmZzZXQsIG8pICsgY3ggKyAwLjkgKiByeCAqIE1hdGguY29zKHJhZE9mZnNldCAtIGluY3JlbWVudCksXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeSArIDAuOSAqIHJ5ICogTWF0aC5zaW4ocmFkT2Zmc2V0IC0gaW5jcmVtZW50KSxcbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IGVuZEFuZ2xlID0gTWF0aC5QSSAqIDIgKyByYWRPZmZzZXQgLSAwLjAxO1xuICAgICAgICBmb3IgKGxldCBhbmdsZSA9IHJhZE9mZnNldDsgYW5nbGUgPCBlbmRBbmdsZTsgYW5nbGUgPSBhbmdsZSArIGluY3JlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcCA9IFtcbiAgICAgICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeCArIHJ4ICogTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgICAgIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSArIGN5ICsgcnkgKiBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgY29yZVBvaW50cy5wdXNoKHApO1xuICAgICAgICAgICAgYWxsUG9pbnRzLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICAgICAgYWxsUG9pbnRzLnB1c2goW1xuICAgICAgICAgICAgX29mZnNldE9wdChvZmZzZXQsIG8pICsgY3ggKyByeCAqIE1hdGguY29zKHJhZE9mZnNldCArIE1hdGguUEkgKiAyICsgb3ZlcmxhcCAqIDAuNSksXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeSArIHJ5ICogTWF0aC5zaW4ocmFkT2Zmc2V0ICsgTWF0aC5QSSAqIDIgKyBvdmVybGFwICogMC41KSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFsbFBvaW50cy5wdXNoKFtcbiAgICAgICAgICAgIF9vZmZzZXRPcHQob2Zmc2V0LCBvKSArIGN4ICsgMC45OCAqIHJ4ICogTWF0aC5jb3MocmFkT2Zmc2V0ICsgb3ZlcmxhcCksXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeSArIDAuOTggKiByeSAqIE1hdGguc2luKHJhZE9mZnNldCArIG92ZXJsYXApLFxuICAgICAgICBdKTtcbiAgICAgICAgYWxsUG9pbnRzLnB1c2goW1xuICAgICAgICAgICAgX29mZnNldE9wdChvZmZzZXQsIG8pICsgY3ggKyAwLjkgKiByeCAqIE1hdGguY29zKHJhZE9mZnNldCArIG92ZXJsYXAgKiAwLjUpLFxuICAgICAgICAgICAgX29mZnNldE9wdChvZmZzZXQsIG8pICsgY3kgKyAwLjkgKiByeSAqIE1hdGguc2luKHJhZE9mZnNldCArIG92ZXJsYXAgKiAwLjUpLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIFthbGxQb2ludHMsIGNvcmVQb2ludHNdO1xufVxuZnVuY3Rpb24gX2FyYyhpbmNyZW1lbnQsIGN4LCBjeSwgcngsIHJ5LCBzdHJ0LCBzdHAsIG9mZnNldCwgbykge1xuICAgIGNvbnN0IHJhZE9mZnNldCA9IHN0cnQgKyBfb2Zmc2V0T3B0KDAuMSwgbyk7XG4gICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgcG9pbnRzLnB1c2goW1xuICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeCArIDAuOSAqIHJ4ICogTWF0aC5jb3MocmFkT2Zmc2V0IC0gaW5jcmVtZW50KSxcbiAgICAgICAgX29mZnNldE9wdChvZmZzZXQsIG8pICsgY3kgKyAwLjkgKiByeSAqIE1hdGguc2luKHJhZE9mZnNldCAtIGluY3JlbWVudCksXG4gICAgXSk7XG4gICAgZm9yIChsZXQgYW5nbGUgPSByYWRPZmZzZXQ7IGFuZ2xlIDw9IHN0cDsgYW5nbGUgPSBhbmdsZSArIGluY3JlbWVudCkge1xuICAgICAgICBwb2ludHMucHVzaChbXG4gICAgICAgICAgICBfb2Zmc2V0T3B0KG9mZnNldCwgbykgKyBjeCArIHJ4ICogTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgX29mZnNldE9wdChvZmZzZXQsIG8pICsgY3kgKyByeSAqIE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIHBvaW50cy5wdXNoKFtcbiAgICAgICAgY3ggKyByeCAqIE1hdGguY29zKHN0cCksXG4gICAgICAgIGN5ICsgcnkgKiBNYXRoLnNpbihzdHApLFxuICAgIF0pO1xuICAgIHBvaW50cy5wdXNoKFtcbiAgICAgICAgY3ggKyByeCAqIE1hdGguY29zKHN0cCksXG4gICAgICAgIGN5ICsgcnkgKiBNYXRoLnNpbihzdHApLFxuICAgIF0pO1xuICAgIHJldHVybiBfY3VydmUocG9pbnRzLCBudWxsLCBvKTtcbn1cbmZ1bmN0aW9uIF9iZXppZXJUbyh4MSwgeTEsIHgyLCB5MiwgeCwgeSwgY3VycmVudCwgbykge1xuICAgIGNvbnN0IG9wcyA9IFtdO1xuICAgIGNvbnN0IHJvcyA9IFtvLm1heFJhbmRvbW5lc3NPZmZzZXQgfHwgMSwgKG8ubWF4UmFuZG9tbmVzc09mZnNldCB8fCAxKSArIDAuM107XG4gICAgbGV0IGYgPSBbMCwgMF07XG4gICAgY29uc3QgaXRlcmF0aW9ucyA9IG8uZGlzYWJsZU11bHRpU3Ryb2tlID8gMSA6IDI7XG4gICAgY29uc3QgcHJlc2VydmVWZXJ0aWNlcyA9IG8ucHJlc2VydmVWZXJ0aWNlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgb3BzLnB1c2goeyBvcDogJ21vdmUnLCBkYXRhOiBbY3VycmVudFswXSwgY3VycmVudFsxXV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHMucHVzaCh7IG9wOiAnbW92ZScsIGRhdGE6IFtjdXJyZW50WzBdICsgKHByZXNlcnZlVmVydGljZXMgPyAwIDogX29mZnNldE9wdChyb3NbMF0sIG8pKSwgY3VycmVudFsxXSArIChwcmVzZXJ2ZVZlcnRpY2VzID8gMCA6IF9vZmZzZXRPcHQocm9zWzBdLCBvKSldIH0pO1xuICAgICAgICB9XG4gICAgICAgIGYgPSBwcmVzZXJ2ZVZlcnRpY2VzID8gW3gsIHldIDogW3ggKyBfb2Zmc2V0T3B0KHJvc1tpXSwgbyksIHkgKyBfb2Zmc2V0T3B0KHJvc1tpXSwgbyldO1xuICAgICAgICBvcHMucHVzaCh7XG4gICAgICAgICAgICBvcDogJ2JjdXJ2ZVRvJyxcbiAgICAgICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAgICAgICB4MSArIF9vZmZzZXRPcHQocm9zW2ldLCBvKSwgeTEgKyBfb2Zmc2V0T3B0KHJvc1tpXSwgbyksXG4gICAgICAgICAgICAgICAgeDIgKyBfb2Zmc2V0T3B0KHJvc1tpXSwgbyksIHkyICsgX29mZnNldE9wdChyb3NbaV0sIG8pLFxuICAgICAgICAgICAgICAgIGZbMF0sIGZbMV0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9wcztcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../../node_modules/roughjs/bin/renderer.js\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../../node_modules/roughjs/bin/renderer.js?");
579
579
 
580
580
  /***/ }),
581
581
 
@@ -3734,7 +3734,7 @@ eval("module.exports = JSON.parse('{\"labels\":{\"paste\":\"貼上\",\"pasteChar
3734
3734
  /***/ ((module) => {
3735
3735
 
3736
3736
  "use strict";
3737
- eval("module.exports = JSON.parse('{\"name\":\"@zsviczian/excalidraw\",\"version\":\"0.10.0-obsidian-18\",\"main\":\"main.js\",\"types\":\"types/packages/excalidraw/index.d.ts\",\"files\":[\"dist/*\",\"types/*\"],\"publishConfig\":{\"access\":\"public\"},\"description\":\"Excalidraw as a React component\",\"repository\":\"https://github.com/excalidraw/excalidraw\",\"license\":\"MIT\",\"keywords\":[\"excalidraw\",\"excalidraw-embed\",\"react\",\"npm\",\"npm excalidraw\"],\"browserslist\":{\"production\":[\">0.2%\",\"not dead\",\"not ie <= 11\",\"not op_mini all\",\"not safari < 12\",\"not kaios <= 2.5\",\"not edge < 79\",\"not chrome < 70\",\"not and_uc < 13\",\"not samsung < 10\"],\"development\":[\"last 1 chrome version\",\"last 1 firefox version\",\"last 1 safari version\"]},\"peerDependencies\":{\"react\":\"^17.0.2\",\"react-dom\":\"^17.0.2\"},\"devDependencies\":{\"@babel/core\":\"7.16.0\",\"@babel/plugin-transform-arrow-functions\":\"7.16.0\",\"@babel/plugin-transform-async-to-generator\":\"7.16.0\",\"@babel/plugin-transform-runtime\":\"7.16.4\",\"@babel/plugin-transform-typescript\":\"7.16.1\",\"@babel/preset-env\":\"7.16.4\",\"@babel/preset-react\":\"7.16.0\",\"@babel/preset-typescript\":\"7.16.0\",\"autoprefixer\":\"10.4.0\",\"babel-loader\":\"8.2.3\",\"babel-plugin-transform-class-properties\":\"6.24.1\",\"cross-env\":\"7.0.3\",\"css-loader\":\"6.5.1\",\"file-loader\":\"6.2.0\",\"mini-css-extract-plugin\":\"2.4.5\",\"postcss-loader\":\"6.2.1\",\"sass-loader\":\"12.3.0\",\"terser-webpack-plugin\":\"5.2.5\",\"ts-loader\":\"9.2.6\",\"typescript\":\"4.5.2\",\"webpack\":\"5.64.4\",\"webpack-bundle-analyzer\":\"4.5.0\",\"webpack-cli\":\"4.9.1\"},\"bugs\":\"https://github.com/excalidraw/excalidraw/issues\",\"homepage\":\"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw\",\"scripts\":{\"gen:types\":\"tsc --project ../../../tsconfig-types.json\",\"build:umd\":\"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types\",\"build:umd:withAnalyzer\":\"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js\",\"pack\":\"yarn build:umd && yarn pack\"},\"dependencies\":{\"dotenv\":\"10.0.0\"}}');\n\n//# sourceURL=webpack://Excalidraw/./package.json?");
3737
+ eval("module.exports = JSON.parse('{\"name\":\"@zsviczian/excalidraw\",\"version\":\"0.10.0-obsidian-19\",\"main\":\"main.js\",\"types\":\"types/packages/excalidraw/index.d.ts\",\"files\":[\"dist/*\",\"types/*\"],\"publishConfig\":{\"access\":\"public\"},\"description\":\"Excalidraw as a React component\",\"repository\":\"https://github.com/excalidraw/excalidraw\",\"license\":\"MIT\",\"keywords\":[\"excalidraw\",\"excalidraw-embed\",\"react\",\"npm\",\"npm excalidraw\"],\"browserslist\":{\"production\":[\">0.2%\",\"not dead\",\"not ie <= 11\",\"not op_mini all\",\"not safari < 12\",\"not kaios <= 2.5\",\"not edge < 79\",\"not chrome < 70\",\"not and_uc < 13\",\"not samsung < 10\"],\"development\":[\"last 1 chrome version\",\"last 1 firefox version\",\"last 1 safari version\"]},\"peerDependencies\":{\"react\":\"^17.0.2\",\"react-dom\":\"^17.0.2\"},\"devDependencies\":{\"@babel/core\":\"7.16.0\",\"@babel/plugin-transform-arrow-functions\":\"7.16.0\",\"@babel/plugin-transform-async-to-generator\":\"7.16.0\",\"@babel/plugin-transform-runtime\":\"7.16.4\",\"@babel/plugin-transform-typescript\":\"7.16.1\",\"@babel/preset-env\":\"7.16.4\",\"@babel/preset-react\":\"7.16.0\",\"@babel/preset-typescript\":\"7.16.0\",\"autoprefixer\":\"10.4.0\",\"babel-loader\":\"8.2.3\",\"babel-plugin-transform-class-properties\":\"6.24.1\",\"cross-env\":\"7.0.3\",\"css-loader\":\"6.5.1\",\"mini-css-extract-plugin\":\"2.4.5\",\"postcss-loader\":\"6.2.1\",\"sass-loader\":\"12.3.0\",\"terser-webpack-plugin\":\"5.2.5\",\"ts-loader\":\"9.2.6\",\"typescript\":\"4.5.2\",\"webpack\":\"5.64.4\",\"webpack-bundle-analyzer\":\"4.5.0\",\"webpack-cli\":\"4.9.1\"},\"bugs\":\"https://github.com/excalidraw/excalidraw/issues\",\"homepage\":\"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw\",\"scripts\":{\"gen:types\":\"tsc --project ../../../tsconfig-types.json\",\"build:umd\":\"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types\",\"build:umd:withAnalyzer\":\"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js\",\"pack\":\"yarn build:umd && yarn pack\"},\"dependencies\":{\"dotenv\":\"10.0.0\"}}');\n\n//# sourceURL=webpack://Excalidraw/./package.json?");
3738
3738
 
3739
3739
  /***/ })
3740
3740