UNPKG

d3-graphviz

Version:

Graphviz DOT rendering and animated transitions for D3

753 lines (739 loc) 806 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-transition'), require('d3-timer'), require('d3-interpolate'), require('d3-zoom'), require('d3-format'), require('d3-path')) : typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-transition', 'd3-timer', 'd3-interpolate', 'd3-zoom', 'd3-format', 'd3-path'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["d3-graphviz"] = {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); })(this, (function (exports, d3, d3Dispatch, d3Transition, d3Timer, d3Interpolate, d3Zoom, d3Format, d3Path) { 'use strict'; function _interopNamespaceDefault(e) { var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var d3__namespace = /*#__PURE__*/_interopNamespaceDefault(d3); function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function extractElementData(element) { var datum = {}; var tag = element.node().nodeName; datum.tag = tag; if (tag == '#text') { datum.text = element.text(); } else if (tag == '#comment') { datum.comment = element.text(); } datum.attributes = {}; var attributes = element.node().attributes; if (attributes) { for (var i = 0; i < attributes.length; i++) { var attribute = attributes[i]; var name = attribute.name; var value = attribute.value; datum.attributes[name] = value; } } var transform = element.node().transform; if (transform && transform.baseVal.numberOfItems != 0) { var matrix = transform.baseVal.consolidate().matrix; datum.translation = { x: matrix.e, y: matrix.f }; datum.scale = matrix.a; } if (tag == 'ellipse') { datum.center = { x: datum.attributes.cx, y: datum.attributes.cy }; } if (tag == 'polygon') { var points = element.attr('points').split(' '); var x = points.map(function (p) { return p.split(',')[0]; }); var y = points.map(function (p) { return p.split(',')[1]; }); var xmin = Math.min.apply(null, x); var xmax = Math.max.apply(null, x); var ymin = Math.min.apply(null, y); var ymax = Math.max.apply(null, y); var bbox = { x: xmin, y: ymin, width: xmax - xmin, height: ymax - ymin }; datum.bbox = bbox; datum.center = { x: (xmin + xmax) / 2, y: (ymin + ymax) / 2 }; } if (tag == 'path') { var d = element.attr('d'); var points = d.split(/[A-Z ]/); points.shift(); var x = points.map(function (p) { return +p.split(',')[0]; }); var y = points.map(function (p) { return +p.split(',')[1]; }); var xmin = Math.min.apply(null, x); var xmax = Math.max.apply(null, x); var ymin = Math.min.apply(null, y); var ymax = Math.max.apply(null, y); var bbox = { x: xmin, y: ymin, width: xmax - xmin, height: ymax - ymin }; datum.bbox = bbox; datum.center = { x: (xmin + xmax) / 2, y: (ymin + ymax) / 2 }; datum.totalLength = element.node().getTotalLength(); } if (tag == 'text') { datum.center = { x: element.attr('x'), y: element.attr('y') }; } if (tag == '#text') { datum.text = element.text(); } else if (tag == '#comment') { datum.comment = element.text(); } return datum; } function extractAllElementsData(element) { var datum = extractElementData(element); datum.children = []; var children = d3__namespace.selectAll(element.node().childNodes); children.each(function () { var childData = extractAllElementsData(d3__namespace.select(this)); childData.parent = datum; datum.children.push(childData); }); return datum; } function createElement(data) { if (data.tag == '#text') { return document.createTextNode(""); } else if (data.tag == '#comment') { return document.createComment(data.comment); } else { return document.createElementNS('http://www.w3.org/2000/svg', data.tag); } } function createElementWithAttributes(data) { var elementNode = createElement(data); var element = d3__namespace.select(elementNode); var attributes = data.attributes; for (var _i = 0, _Object$keys = Object.keys(attributes); _i < _Object$keys.length; _i++) { var attributeName = _Object$keys[_i]; var attributeValue = attributes[attributeName]; element.attr(attributeName, attributeValue); } return elementNode; } function replaceElement(element, data) { var parent = d3__namespace.select(element.node().parentNode); var newElementNode = createElementWithAttributes(data); var newElement = parent.insert(function () { return newElementNode; }, function () { return element.node(); }); element.remove(); return newElement; } function insertElementData(element, datum) { element.datum(datum); element.data([datum], function (d) { return d.key; }); } function insertAllElementsData(element, datum) { insertElementData(element, datum); var children = d3__namespace.selectAll(element.node().childNodes); children.each(function (d, i) { insertAllElementsData(d3__namespace.select(this), datum.children[i]); }); } function insertChildren(element, index) { var children = element.selectAll(function () { return element.node().childNodes; }); children = children.data(function (d) { return d.children; }, function (d) { return d.tag + '-' + index; }); var childrenEnter = children.enter().append(function (d) { return createElement(d); }); var childrenExit = children.exit(); childrenExit = childrenExit.remove(); children = childrenEnter.merge(children); var childTagIndexes = {}; children.each(function (childData) { var childTag = childData.tag; if (childTagIndexes[childTag] == null) { childTagIndexes[childTag] = 0; } var childIndex = childTagIndexes[childTag]++; attributeElement.call(this, childData, childIndex); }); } function attributeElement(data) { var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var element = d3__namespace.select(this); data.tag; var attributes = data.attributes; var currentAttributes = element.node().attributes; if (currentAttributes) { for (var i = 0; i < currentAttributes.length; i++) { var currentAttribute = currentAttributes[i]; var name = currentAttribute.name; if (name.split(':')[0] != 'xmlns' && currentAttribute.namespaceURI) { var namespaceURIParts = currentAttribute.namespaceURI.split('/'); var namespace = namespaceURIParts[namespaceURIParts.length - 1]; name = namespace + ':' + name; } if (!(name in attributes)) { attributes[name] = null; } } } for (var _i2 = 0, _Object$keys2 = Object.keys(attributes); _i2 < _Object$keys2.length; _i2++) { var attributeName = _Object$keys2[_i2]; element.attr(attributeName, attributes[attributeName]); } if (data.text) { element.text(data.text); } insertChildren(element, index); } function zoom (enable) { this._options.zoom = enable; if (this._options.zoom && !this._zoomBehavior) { createZoomBehavior.call(this); } else if (!this._options.zoom && this._zoomBehavior) { this._zoomSelection.on(".zoom", null); this._zoomBehavior = null; } return this; } function createZoomBehavior() { var graphvizInstance = this; function zoomed(event) { var g = d3__namespace.select(svg.node().querySelector("g")); g.attr('transform', event.transform); graphvizInstance._dispatch.call('zoom', graphvizInstance); } var root = this._selection; var svg = d3__namespace.select(root.node().querySelector("svg")); if (svg.size() == 0) { return this; } this._zoomSelection = svg; var zoomBehavior = d3Zoom.zoom().scaleExtent(this._options.zoomScaleExtent).translateExtent(this._options.zoomTranslateExtent).interpolate(d3Interpolate.interpolate).on("zoom", zoomed); this._zoomBehavior = zoomBehavior; var g = d3__namespace.select(svg.node().querySelector("g")); svg.call(zoomBehavior); if (!this._active) { translateZoomBehaviorTransform.call(this, g); } this._originalTransform = d3Zoom.zoomTransform(svg.node()); return this; } function getTranslatedZoomTransform(selection) { // Get the current zoom transform for the top level svg and // translate it uniformly with the given selection, using the // difference between the translation specified in the selection's // data and it's saved previous translation. The selection is // normally the top level g element of the graph. var oldTranslation = this._translation; var oldScale = this._scale; var newTranslation = selection.datum().translation; var newScale = selection.datum().scale; var t = d3Zoom.zoomTransform(this._zoomSelection.node()); if (oldTranslation) { t = t.scale(1 / oldScale); t = t.translate(-oldTranslation.x, -oldTranslation.y); } t = t.translate(newTranslation.x, newTranslation.y); t = t.scale(newScale); return t; } function translateZoomBehaviorTransform(selection) { // Translate the current zoom transform for the top level svg // uniformly with the given selection, using the difference // between the translation specified in the selection's data and // it's saved previous translation. The selection is normally the // top level g element of the graph. this._zoomBehavior.transform(this._zoomSelection, getTranslatedZoomTransform.call(this, selection)); // Save the selections's new translation and scale. this._translation = selection.datum().translation; this._scale = selection.datum().scale; // Set the original zoom transform to the translation and scale specified in // the selection's data. this._originalTransform = d3Zoom.zoomIdentity.translate(selection.datum().translation.x, selection.datum().translation.y).scale(selection.datum().scale); } function resetZoom(transition) { // Reset the zoom transform to the original zoom transform. var selection = this._zoomSelection; if (transition) { selection = selection.transition(transition); } selection.call(this._zoomBehavior.transform, this._originalTransform); return this; } function zoomScaleExtent(extent) { this._options.zoomScaleExtent = extent; return this; } function zoomTranslateExtent(extent) { this._options.zoomTranslateExtent = extent; return this; } function zoomBehavior() { return this._zoomBehavior || null; } function zoomSelection() { return this._zoomSelection || null; } function pathTween(points, d1) { return function () { var pointInterpolators = points.map(function (p) { return d3Interpolate.interpolate([p[0][0], p[0][1]], [p[1][0], p[1][1]]); }); return function (t) { return t < 1 ? "M" + pointInterpolators.map(function (p) { return p(t); }).join("L") : d1; }; }; } function pathTweenPoints(node, d1, precision, precisionIsRelative) { var path0 = node; var path1 = path0.cloneNode(); var n0 = path0.getTotalLength(); var n1 = (path1.setAttribute("d", d1), path1).getTotalLength(); // Uniform sampling of distance based on specified precision. var distances = [0]; var i = 0; var dt = precisionIsRelative ? precision : precision / Math.max(n0, n1); while ((i += dt) < 1) { distances.push(i); } distances.push(1); // Compute point-interpolators at each distance. var points = distances.map(function (t) { var p0 = path0.getPointAtLength(t * n0); var p1 = path1.getPointAtLength(t * n1); return [[p0.x, p0.y], [p1.x, p1.y]]; }); return points; } function data () { return this._data || null; } function isEdgeElementParent(datum) { return datum.attributes["class"] == 'edge' || datum.tag == 'a' && datum.parent.tag == 'g' && datum.parent.parent.attributes["class"] == 'edge'; } function isEdgeElement(datum) { return datum.parent && isEdgeElementParent(datum.parent); } function getEdgeGroup(datum) { if (datum.parent.attributes["class"] == 'edge') { return datum.parent; } else { // datum.parent.tag == 'g' && datum.parent.parent.tag == 'g' && datum.parent.parent.parent.attributes.class == 'edge' return datum.parent.parent.parent; } } function getEdgeTitle(datum) { return getEdgeGroup(datum).children.find(function (e) { return e.tag == 'title'; }); } function render (callback) { if (this._busy) { this._queue.push(this.render.bind(this, callback)); return this; } this._dispatch.call('renderStart', this); if (this._transitionFactory) { d3Timer.timeout(function () { // Decouple from time spent. See https://github.com/d3/d3-timer/issues/27 this._transition = d3Transition.transition(this._transitionFactory()); _render.call(this, callback); }.bind(this), 0); } else { _render.call(this, callback); } return this; } function _render(callback) { var transitionInstance = this._transition; var fade = this._options.fade && transitionInstance != null; var tweenPaths = this._options.tweenPaths; var tweenShapes = this._options.tweenShapes; var convertEqualSidedPolygons = this._options.convertEqualSidedPolygons; var growEnteringEdges = this._options.growEnteringEdges && transitionInstance != null; var attributer = this._attributer; var graphvizInstance = this; function insertChildren(element) { var children = element.selectAll(function () { return element.node().childNodes; }); children = children.data(function (d) { return d.children; }, function (d) { return d.key; }); var childrenEnter = children.enter().append(function (d) { var element = createElement(d); if (d.tag == '#text' && fade) { element.nodeValue = d.text; } return element; }); if (fade || growEnteringEdges && isEdgeElementParent(element.datum())) { var childElementsEnter = childrenEnter.filter(function (d) { return d.tag[0] == '#' ? null : this; }).each(function (d) { var childEnter = d3__namespace.select(this); for (var _i = 0, _Object$keys = Object.keys(d.attributes); _i < _Object$keys.length; _i++) { var attributeName = _Object$keys[_i]; var attributeValue = d.attributes[attributeName]; childEnter.attr(attributeName, attributeValue); } }); childElementsEnter.filter(function (d) { return d.tag == 'svg' || d.tag == 'g' ? null : this; }).style("opacity", 0.0); } var childrenExit = children.exit(); if (attributer) { childrenExit.each(attributer); } if (transitionInstance) { childrenExit = childrenExit.transition(transitionInstance); if (fade) { childrenExit.filter(function (d) { return d.tag[0] == '#' ? null : this; }).style("opacity", 0.0); } } childrenExit = childrenExit.remove(); children = childrenEnter.merge(children).order(); children.each(attributeElement); } function attributeElement(data) { var element = d3__namespace.select(this); if (data.tag == "svg") { var options = graphvizInstance._options; if (options.width != null || options.height != null) { var width = options.width; var height = options.height; if (width == null) { width = data.attributes.width.replace('pt', '') * 4 / 3; } else { element.attr("width", width); data.attributes.width = width; } if (height == null) { height = data.attributes.height.replace('pt', '') * 4 / 3; } else { element.attr("height", height); data.attributes.height = height; } if (!options.fit) { element.attr("viewBox", "0 0 ".concat(width * 3 / 4 / options.scale, " ").concat(height * 3 / 4 / options.scale)); data.attributes.viewBox = "0 0 ".concat(width * 3 / 4 / options.scale, " ").concat(height * 3 / 4 / options.scale); } } if (options.scale != 1 && (options.fit || options.width == null && options.height == null)) { width = data.attributes.viewBox.split(' ')[2]; height = data.attributes.viewBox.split(' ')[3]; element.attr("viewBox", "0 0 ".concat(width / options.scale, " ").concat(height / options.scale)); data.attributes.viewBox = "0 0 ".concat(width / options.scale, " ").concat(height / options.scale); } } if (attributer) { element.each(attributer); } var tag = data.tag; var attributes = data.attributes; var currentAttributes = element.node().attributes; if (currentAttributes) { for (var i = 0; i < currentAttributes.length; i++) { var currentAttribute = currentAttributes[i]; var name = currentAttribute.name; if (name.split(':')[0] != 'xmlns' && currentAttribute.namespaceURI) { var namespaceURIParts = currentAttribute.namespaceURI.split('/'); var namespace = namespaceURIParts[namespaceURIParts.length - 1]; name = namespace + ':' + name; } if (!(name in attributes)) { attributes[name] = null; } } } var convertShape = false; var convertPrevShape = false; if (tweenShapes && transitionInstance) { if ((this.nodeName == 'polygon' || this.nodeName == 'ellipse') && data.alternativeOld) { convertPrevShape = true; } if ((tag == 'polygon' || tag == 'ellipse') && data.alternativeNew) { convertShape = true; } if (this.nodeName == 'polygon' && tag == 'polygon' && data.alternativeOld) { var prevData = extractElementData(element); var prevPoints = prevData.attributes.points; if (!convertEqualSidedPolygons) { var nPrevPoints = prevPoints.split(' ').length; var points = data.attributes.points; var nPoints = points.split(' ').length; if (nPoints == nPrevPoints) { convertShape = false; convertPrevShape = false; } } } if (convertPrevShape) { var prevPathData = data.alternativeOld; var pathElement = replaceElement(element, prevPathData); pathElement.data([data], function () { return data.key; }); element = pathElement; } if (convertShape) { var newPathData = data.alternativeNew; tag = 'path'; attributes = newPathData.attributes; } } var elementTransition = element; if (transitionInstance) { elementTransition = elementTransition.transition(transitionInstance); if (fade) { elementTransition.filter(function (d) { return d.tag[0] == '#' ? null : this; }).style("opacity", 1.0); } elementTransition.filter(function (d) { return d.tag[0] == '#' ? null : this; }).on("end", function (d) { d3__namespace.select(this).attr('style', d && d.attributes && d.attributes.style || null); }); } var growThisPath = growEnteringEdges && tag == 'path' && data.offset; if (growThisPath) { var totalLength = data.totalLength; element.attr("stroke-dasharray", totalLength + " " + totalLength).attr("stroke-dashoffset", totalLength).attr('transform', 'translate(' + data.offset.x + ',' + data.offset.y + ')'); attributes["stroke-dashoffset"] = 0; attributes['transform'] = 'translate(0,0)'; elementTransition.attr("stroke-dashoffset", attributes["stroke-dashoffset"]).attr('transform', attributes['transform']).on("start", function () { d3__namespace.select(this).style('opacity', null); }).on("end", function () { d3__namespace.select(this).attr('stroke-dashoffset', null).attr('stroke-dasharray', null).attr('transform', null); }); } var moveThisPolygon = growEnteringEdges && tag == 'polygon' && isEdgeElement(data) && data.offset && data.parent.children[3].tag == 'path'; if (moveThisPolygon) { var edgePath = d3__namespace.select(element.node().parentNode.querySelector("path")); var p0 = edgePath.node().getPointAtLength(0); var p1 = edgePath.node().getPointAtLength(data.totalLength); var p2 = edgePath.node().getPointAtLength(data.totalLength - 1); var angle1 = Math.atan2(p1.y - p2.y, p1.x - p2.x) * 180 / Math.PI; var x = p0.x - p1.x + data.offset.x; var y = p0.y - p1.y + data.offset.y; element.attr('transform', 'translate(' + x + ',' + y + ')'); elementTransition.attrTween("transform", function () { return function (t) { var p = edgePath.node().getPointAtLength(data.totalLength * t); var p2 = edgePath.node().getPointAtLength(data.totalLength * t + 1); var angle = Math.atan2(p2.y - p.y, p2.x - p.x) * 180 / Math.PI - angle1; x = p.x - p1.x + data.offset.x * (1 - t); y = p.y - p1.y + data.offset.y * (1 - t); return 'translate(' + x + ',' + y + ') rotate(' + angle + ' ' + p1.x + ' ' + p1.y + ')'; }; }).on("start", function () { d3__namespace.select(this).style('opacity', null); }).on("end", function () { d3__namespace.select(this).attr('transform', null); }); } var tweenThisPath = tweenPaths && transitionInstance && tag == 'path' && element.attr('d') != null; for (var _i2 = 0, _Object$keys2 = Object.keys(attributes); _i2 < _Object$keys2.length; _i2++) { var attributeName = _Object$keys2[_i2]; var attributeValue = attributes[attributeName]; if (tweenThisPath && attributeName == 'd') { var points = (data.alternativeOld || data).points; if (points) { elementTransition.attrTween("d", pathTween(points, attributeValue)); } } else { if (attributeName == 'transform' && data.translation) { if (transitionInstance) { var onEnd = elementTransition.on("end"); elementTransition.on("start", function () { if (graphvizInstance._zoomBehavior) { // Update the transform to transition to, just before the transition starts // in order to catch changes between the transition scheduling to its start. elementTransition.tween("attr.transform", function () { var node = this; return function (t) { node.setAttribute("transform", d3Interpolate.interpolateTransformSvg(d3Zoom.zoomTransform(graphvizInstance._zoomSelection.node()).toString(), getTranslatedZoomTransform.call(graphvizInstance, element).toString())(t)); }; }); } }).on("end", function () { onEnd.call(this); // Update the zoom transform to the new translated transform if (graphvizInstance._zoomBehavior) { translateZoomBehaviorTransform.call(graphvizInstance, element); } }); } else { if (graphvizInstance._zoomBehavior) { // Update the transform attribute to set with the current pan translation translateZoomBehaviorTransform.call(graphvizInstance, element); attributeValue = getTranslatedZoomTransform.call(graphvizInstance, element).toString(); } } } elementTransition.attr(attributeName, attributeValue); } } if (convertShape) { elementTransition.on("end", function (d, i, nodes) { pathElement = d3__namespace.select(this); var newElement = replaceElement(pathElement, d); newElement.data([d], function () { return d.key; }); }); } if (data.text) { elementTransition.text(data.text); } insertChildren(element); } var root = this._selection; if (transitionInstance != null) { // Ensure original SVG shape elements are restored after transition before rendering new graph var jobs = this._jobs; if (graphvizInstance._active) { jobs.push(null); return this; } else { root.transition(transitionInstance).transition().duration(0).on("end", function () { graphvizInstance._active = false; if (jobs.length != 0) { jobs.shift(); graphvizInstance.render(); } }); this._active = true; } } if (transitionInstance != null) { root.transition(transitionInstance).on("start", function () { graphvizInstance._dispatch.call('transitionStart', graphvizInstance); }).on("end", function () { graphvizInstance._dispatch.call('transitionEnd', graphvizInstance); }).transition().duration(0).on("start", function () { graphvizInstance._dispatch.call('restoreEnd', graphvizInstance); graphvizInstance._dispatch.call('end', graphvizInstance); if (callback) { callback.call(graphvizInstance); } }); } var data = this._data; var svg = root.selectAll("svg").data([data], function (d) { return d.key; }); svg = svg.enter().append("svg").merge(svg); attributeElement.call(svg.node(), data); if (this._options.zoom && !this._zoomBehavior) { createZoomBehavior.call(this); } graphvizInstance._dispatch.call('renderEnd', graphvizInstance); if (transitionInstance == null) { this._dispatch.call('end', this); if (callback) { callback.call(this); } } return this; } function graphvizVersion () { return this._graphvizVersion; } var io=ArrayBuffer,H=Uint8Array,Qe=Uint16Array,so=Int16Array,qe=Int32Array,pr=function(p,c,d){if(H.prototype.slice)return H.prototype.slice.call(p,c,d);(c==null||c<0)&&(c=0),(d==null||d>p.length)&&(d=p.length);var s=new H(d-c);return s.set(p.subarray(c,d)),s},Ye=function(p,c,d,s){if(H.prototype.fill)return H.prototype.fill.call(p,c,d,s);for((d==null||d<0)&&(d=0),(s==null||s>p.length)&&(s=p.length);d<s;++d)p[d]=c;return p},uo=function(p,c,d,s){if(H.prototype.copyWithin)return H.prototype.copyWithin.call(p,c,d,s);for((d==null||d<0)&&(d=0),(s==null||s>p.length)&&(s=p.length);d<s;)p[c++]=p[d++];},po=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],T=function(p,c,d){var s=new Error(c||po[p]);if(s.code=p,Error.captureStackTrace&&Error.captureStackTrace(s,T),!d)throw s;return s},jr=function(p,c,d){for(var s=0,f=0;s<d;++s)f|=p[c++]<<(s<<3);return f},lo=function(p,c){return (p[c]|p[c+1]<<8|p[c+2]<<16|p[c+3]<<24)>>>0},co=function(p,c){var d=p[0]|p[1]<<8|p[2]<<16;if(d==3126568&&p[3]==253){var s=p[4],f=s>>5&1,m=s>>2&1,_=s&3,h=s>>6;s&8&&T(0);var M=6-f,I=_==3?4:_,Q=jr(p,M,I);M+=I;var Z=h?1<<h:f,Y=jr(p,M,Z)+(h==1&&256),z=Y;if(!f){var q=1<<10+(p[5]>>3);z=q+(q>>3)*(p[5]&7);}z>2145386496&&T(1);var X=new H((c==1?Y||z:c?0:z)+12);return X[0]=1,X[4]=4,X[8]=8,{b:M+Z,y:0,l:0,d:Q,w:c&&c!=1?c:X.subarray(12),e:z,o:new qe(X.buffer,0,3),u:Y,c:m,m:Math.min(131072,z)}}else if((d>>4|p[3]<<20)==25481893)return lo(p,4)+8;T(0);},Xe=function(p){for(var c=0;1<<c<=p;++c);return c-1},je=function(p,c,d){var s=(c<<3)+4,f=(p[c]&15)+5;f>d&&T(3);for(var m=1<<f,_=m,h=-1,M=-1,I=-1,Q=m,Z=new io(512+(m<<2)),Y=new so(Z,0,256),z=new Qe(Z,0,256),q=new Qe(Z,512,m),X=512+(m<<1),V=new H(Z,X,m),re=new H(Z,X+m);h<255&&_>0;){var S=Xe(_+1),P=s>>3,ae=(1<<S+1)-1,J=(p[P]|p[P+1]<<8|p[P+2]<<16)>>(s&7)&ae,w=(1<<S)-1,j=ae-_-1,W=J&w;if(W<j?(s+=S,J=W):(s+=S+1,J>w&&(J-=j)),Y[++h]=--J,J==-1?(_+=J,V[--Q]=h):_-=J,!J)do{var ie=s>>3;M=(p[ie]|p[ie+1]<<8)>>(s&7)&3,s+=2,h+=M;}while(M==3)}(h>255||_)&&T(0);for(var b=0,k=(m>>1)+(m>>3)+3,se=m-1,oe=0;oe<=h;++oe){var K=Y[oe];if(K<1){z[oe]=-K;continue}for(I=0;I<K;++I){V[b]=oe;do b=b+k&se;while(b>=Q)}}for(b&&T(0),I=0;I<m;++I){var L=z[V[I]]++,A=re[I]=f-Xe(L);q[I]=(L<<A)-m;}return [s+7>>3,{b:f,s:V,n:re,t:q}]},fo=function(p,c){var d=0,s=-1,f=new H(292),m=p[c],_=f.subarray(0,256),h=f.subarray(256,268),M=new Qe(f.buffer,268);if(m<128){var I=je(p,c+1,6),Q=I[0],Z=I[1];c+=m;var Y=Q<<3,z=p[c];z||T(0);for(var q=0,X=0,V=Z.b,re=V,S=(++c<<3)-8+Xe(z);S-=V,!(S<Y);){var P=S>>3;if(q+=(p[P]|p[P+1]<<8)>>(S&7)&(1<<V)-1,_[++s]=Z.s[q],S-=re,S<Y)break;P=S>>3,X+=(p[P]|p[P+1]<<8)>>(S&7)&(1<<re)-1,_[++s]=Z.s[X],V=Z.n[q],q=Z.t[q],re=Z.n[X],X=Z.t[X];}++s>255&&T(0);}else {for(s=m-127;d<s;d+=2){var ae=p[++c];_[d]=ae>>4,_[d+1]=ae&15;}++c;}var J=0;for(d=0;d<s;++d){var w=_[d];w>11&&T(0),J+=w&&1<<w-1;}var j=Xe(J)+1,W=1<<j,ie=W-J;for(ie&ie-1&&T(0),_[s++]=Xe(ie)+1,d=0;d<s;++d){var w=_[d];++h[_[d]=w&&j+1-w];}var b=new H(W<<1),k=b.subarray(0,W),se=b.subarray(W);for(M[j]=0,d=j;d>0;--d){var oe=M[d];Ye(se,d,oe,M[d-1]=oe+h[d]*(1<<j-d));}for(M[0]!=W&&T(0),d=0;d<s;++d){var K=_[d];if(K){var L=M[K];Ye(k,d,L,M[K]=L+(1<<j-K));}}return [c,{n:se,b:j,s:k}]},vo=je(new H([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],mo=je(new H([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],_o=je(new H([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Pr=function(p,c){for(var d=p.length,s=new qe(d),f=0;f<d;++f)s[f]=c,c+=1<<p[f];return s},cr=new H(new qe([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),go=Pr(cr,0),dr=new H(new qe([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),ho=Pr(dr,3),Ze=function(p,c,d){var s=p.length,f=c.length,m=p[s-1],_=(1<<d.b)-1,h=-d.b;m||T(0);for(var M=0,I=d.b,Q=(s<<3)-8+Xe(m)-I,Z=-1;Q>h&&Z<f;){var Y=Q>>3,z=(p[Y]|p[Y+1]<<8|p[Y+2]<<16)>>(Q&7);M=(M<<I|z)&_,c[++Z]=d.s[M],Q-=I=d.n[M];}(Q!=h||Z+1!=f)&&T(0);},wo=function(p,c,d){var s=6,f=c.length,m=f+3>>2,_=m<<1,h=m+_;Ze(p.subarray(s,s+=p[0]|p[1]<<8),c.subarray(0,m),d),Ze(p.subarray(s,s+=p[2]|p[3]<<8),c.subarray(m,_),d),Ze(p.subarray(s,s+=p[4]|p[5]<<8),c.subarray(_,h),d),Ze(p.subarray(s),c.subarray(h),d);},yo=function(p,c,d){var s,f=c.b,m=p[f],_=m>>1&3;c.l=m&1;var h=m>>3|p[f+1]<<5|p[f+2]<<13,M=(f+=3)+h;if(_==1)return f>=p.length?void 0:(c.b=f+1,d?(Ye(d,p[f],c.y,c.y+=h),d):Ye(new H(h),p[f]));if(!(M>p.length)){if(_==0)return c.b=M,d?(d.set(p.subarray(f,M),c.y),c.y+=h,d):pr(p,f,M);if(_==2){var I=p[f],Q=I&3,Z=I>>2&3,Y=I>>4,z=0,q=0;Q<2?Z&1?Y|=p[++f]<<4|(Z&2&&p[++f]<<12):Y=I>>3:(q=Z,Z<2?(Y|=(p[++f]&63)<<4,z=p[f]>>6|p[++f]<<2):Z==2?(Y|=p[++f]<<4|(p[++f]&3)<<12,z=p[f]>>2|p[++f]<<6):(Y|=p[++f]<<4|(p[++f]&63)<<12,z=p[f]>>6|p[++f]<<2|p[++f]<<10)),++f;var X=d?d.subarray(c.y,c.y+c.m):new H(c.m),V=X.length-Y;if(Q==0)X.set(p.subarray(f,f+=Y),V);else if(Q==1)Ye(X,p[f++],V);else {var re=c.h;if(Q==2){var S=fo(p,f);z+=f-(f=S[0]),c.h=re=S[1];}else re||T(0);(q?wo:Ze)(p.subarray(f,f+=z),X.subarray(V),re);}var P=p[f++];if(P){P==255?P=(p[f++]|p[f++]<<8)+32512:P>127&&(P=P-128<<8|p[f++]);var ae=p[f++];ae&3&&T(0);for(var J=[mo,_o,vo],w=2;w>-1;--w){var j=ae>>(w<<1)+2&3;if(j==1){var W=new H([0,0,p[f++]]);J[w]={s:W.subarray(2,3),n:W.subarray(0,1),t:new Qe(W.buffer,0,1),b:0};}else j==2?(s=je(p,f,9-(w&1)),f=s[0],J[w]=s[1]):j==3&&(c.t||T(0),J[w]=c.t[w]);}var ie=c.t=J,b=ie[0],k=ie[1],se=ie[2],oe=p[M-1];oe||T(0);var K=(M<<3)-8+Xe(oe)-se.b,L=K>>3,A=0,Le=(p[L]|p[L+1]<<8)>>(K&7)&(1<<se.b)-1;L=(K-=k.b)>>3;var Be=(p[L]|p[L+1]<<8)>>(K&7)&(1<<k.b)-1;L=(K-=b.b)>>3;var Re=(p[L]|p[L+1]<<8)>>(K&7)&(1<<b.b)-1;for(++P;--P;){var Ne=se.s[Le],Pe=se.n[Le],Ve=b.s[Re],ye=b.n[Re],ke=k.s[Be],be=k.n[Be];L=(K-=ke)>>3;var $e=1<<ke,ce=$e+((p[L]|p[L+1]<<8|p[L+2]<<16|p[L+3]<<24)>>>(K&7)&$e-1);L=(K-=dr[Ve])>>3;var me=ho[Ve]+((p[L]|p[L+1]<<8|p[L+2]<<16)>>(K&7)&(1<<dr[Ve])-1);L=(K-=cr[Ne])>>3;var _e=go[Ne]+((p[L]|p[L+1]<<8|p[L+2]<<16)>>(K&7)&(1<<cr[Ne])-1);if(L=(K-=Pe)>>3,Le=se.t[Le]+((p[L]|p[L+1]<<8)>>(K&7)&(1<<Pe)-1),L=(K-=ye)>>3,Re=b.t[Re]+((p[L]|p[L+1]<<8)>>(K&7)&(1<<ye)-1),L=(K-=be)>>3,Be=k.t[Be]+((p[L]|p[L+1]<<8)>>(K&7)&(1<<be)-1),ce>3)c.o[2]=c.o[1],c.o[1]=c.o[0],c.o[0]=ce-=3;else {var Ge=ce-(_e!=0);Ge?(ce=Ge==3?c.o[0]-1:c.o[Ge],Ge>1&&(c.o[2]=c.o[1]),c.o[1]=c.o[0],c.o[0]=ce):ce=c.o[0];}for(var w=0;w<_e;++w)X[A+w]=X[V+w];A+=_e,V+=_e;var Ee=A-ce;if(Ee<0){var De=-Ee,We=c.e+Ee;De>me&&(De=me);for(var w=0;w<De;++w)X[A+w]=c.w[We+w];A+=De,me-=De,Ee=0;}for(var w=0;w<me;++w)X[A+w]=X[Ee+w];A+=me;}if(A!=V)for(;V<X.length;)X[A++]=X[V++];else A=X.length;d?c.y+=A:X=pr(X,0,A);}else if(d){if(c.y+=Y,V)for(var w=0;w<Y;++w)X[w]=X[V+w];}else V&&(X=pr(X,V));return c.b=M,X}T(2);}},bo=function(p,c){if(p.length==1)return p[0];for(var d=new H(c),s=0,f=0;s<p.length;++s){var m=p[s];d.set(m,f),f+=m.length;}return d};function Eo(p,c){for(var d=[],s=+!c,f=0,m=0;p.length;){var _=co(p,s||c);if(typeof _=="object"){for(s?(c=null,_.w.length==_.u&&(d.push(c=_.w),m+=_.u)):(d.push(c),_.e=0);!_.l;){var h=yo(p,_,c);h||T(5),c?_.e=_.y:(d.push(h),m+=h.length,uo(_.w,0,h.length),_.w.set(h,_.w.length-h.length));}f=_.b+_.c*4;}else f=_;p=p.subarray(f);}return bo(d,m)}var Mo=(()=>{typeof document<"u"?document.currentScript?.src:void 0;return function(c={}){var d,s=c,f,m,_=new Promise((e,r)=>{f=e,m=r;}),M=Object.assign({},s),I="./this.program",Q=(e,r)=>{throw r},Z="";function Y(e){return Z+e}var z,q,X=console.log.bind(console),V=console.error.bind(console);Object.assign(s,M),M=null;var re;s.wasmBinary&&(re=s.wasmBinary);var S,P=!1;function J(e,r){e||_e(r);}var w,j,W,b,k,oe;function K(){var e=S.buffer;s.HEAP8=w=new Int8Array(e),s.HEAP16=W=new Int16Array(e),s.HEAPU8=j=new Uint8Array(e),s.HEAPU16=new Uint16Array(e),s.HEAP32=b=new Int32Array(e),s.HEAPU32=k=new Uint32Array(e),s.HEAPF32=new Float32Array(e),s.HEAPF64=oe=new Float64Array(e);}var L=[],A=[],Le=[];function Re(){Ae(L);}function Ne(){!s.noFSInit&&!o.init.initialized&&o.init(),o.ignorePermissions=!1,Ae(A);}function Pe(){Ae(Le);}function Ve(e){A.unshift(e);}var ye=0,be=null;function ce(e){ye++;}function me(e){if(ye--,ye==0&&(be)){var r=be;be=null,r();}}function _e(e){e="Aborted("+e+")",V(e),P=!0,e+=". Build with -sASSERTIONS for more info.";var r=new WebAssembly.RuntimeError(e);throw m(r),r}var Ge="data:application/octet-stream;base64,",Ee=e=>e.startsWith(Ge),De=e=>e.startsWith("file://");function We(){var e="graphvizlib.wasm";return Ee(e)?e:Y(e)}var Je;function fr(e){if(e==Je&&re)return new Uint8Array(re);throw "both async and sync fetching of the wasm failed"}function Jr(e){return re?Promise.resolve().then(()=>fr(e)):z(e).then(r=>new Uint8Array(r),()=>fr(e))}function vr(e,r,t){return Jr(e).then(n=>WebAssembly.instantiate(n,r)).then(t,n=>{V(`failed to asynchronously prepare wasm: ${n}`),_e(n);})}function Sr(e,r,t,n){return !e&&typeof WebAssembly.instantiateStreaming=="function"&&!Ee(r)&&!De(r)&&typeof fetch=="function"?fetch(r,{credentials:"same-origin"}).then(a=>{var i=WebAssembly.instantiateStreaming(a,t);return i.then(n,function(u){return V(`wasm streaming compile failed: ${u}`),V("falling back to ArrayBuffer instantiation"),vr(r,t,n)})}):vr(r,t,n)}function Hr(){return {a:Qt}}function Tr(){var e=Hr();function r(n,a){return N=n.exports,S=N.B,K(),Ve(N.C),me(),N}ce();function t(n){r(n.instance);}return Je||(Je=We()),Sr(re,Je,e,t).catch(m),{}}var R,$,Qr={172808:(e,r)=>{var t=ue(e),n=ue(r);o.createPath("/",C.dirname(t)),o.writeFile(C.join("/",t),n);}};function qr(e){this.name="ExitStatus",this.message=`Program terminated with exit(${e})`,this.status=e;}var Ae=e=>{for(;e.length>0;)e.shift()(s);};class $r{constructor(r){this.excPtr=r,this.ptr=r-24;}set_type(r){k[this.ptr+4>>2]=r;}get_type(){return k[this.ptr+4>>2]}set_destructor(r){k[this.ptr+8>>2]=r;}get_destructor(){return k[this.ptr+8>>2]}set_caught(r){r=r?1:0,w[this.ptr+12]=r;}get_caught(){return w[this.ptr+12]!=0}set_rethrown(r){r=r?1:0,w[this.ptr+13]=r;}get_rethrown(){return w[this.ptr+13]!=0}init(r,t){this.set_adjusted_ptr(0),this.set_type(r),this.set_destructor(t);}set_adjusted_ptr(r){k[this.ptr+16>>2]=r;}get_adjusted_ptr(){return k[this.ptr+16>>2]}get_exception_ptr(){var r=Yr(this.get_type());if(r)return k[this.excPtr>>2];var t=this.get_adjusted_ptr();return t!==0?t:this.excPtr}}var mr=0,Ar=(e,r,t)=>{var n=new $r(e);throw n.init(r,t),mr=e,mr},C={isAbs:e=>e.charAt(0)==="/",splitPath:e=>{var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return r.exec(e).slice(1)},normalizeArray:(e,r)=>{for(var t=0,n=e.length-1;n>=0;n--){var a=e[n];a==="."?e.splice(n,1):a===".."?(e.splice(n,1),t++):t&&(e.splice(n,1),t--);}if(r)for(;t;t--)e.unshift("..");return e},normalize:e=>{var r=C.isAbs(e),t=e.substr(-1)==="/";return e=C.normalizeArray(e.split("/").filter(n=>!!n),!r).join("/"),!e&&!r&&(e="."),e&&t&&(e+="/"),(r?"/":"")+e},dirname:e=>{var r=C.splitPath(e),t=r[0],n=r[1];return !t&&!n?".":(n&&(n=n.substr(0,n.length-1)),t+n)},basename:e=>{if(e==="/")return "/";e=C.normalize(e),e=e.replace(/\/$/,"");var r=e.lastIndexOf("/");return r===-1?e:e.substr(r+1)},join:(...e)=>C.normalize(e.join("/")),join2:(e,r)=>C.normalize(e+"/"+r)},et=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return e=>crypto.getRandomValues(e);_e("initRandomDevice");},_r=e=>(_r=et())(e),he={resolve:(...e)=>{for(var r="",t=!1,n=e.length-1;n>=-1&&!t;n--){var a=n>=0?e[n]:o.cwd();if(typeof a!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!a)return "";r=a+"/"+r,t=C.isAbs(a);}return r=C.normalizeArray(r.split("/").filter(i=>!!i),!t).join("/"),(t?"/":"")+r||"."},relative:(e,r)=>{e=he.resolve(e).substr(1),r=he.resolve(r).substr(1);function t(E){for(var G=0;G<E.length&&E[G]==="";G++);for(var x=E.length-1;x>=0&&E[x]==="";x--);return G>x?[]:E.slice(G,x-G+1)}for(var n=t(e.split("/")),a=t(r.split("/")),i=Math.min(n.length,a.length),u=i,l=0;l<i;l++)if(n[l]!==a[l]){u=l;break}for(var v=[],l=u;l<n.length;l++)v.push("..");return v=v.concat(a.slice(u)),v.join("/")}},gr=typeof TextDecoder<"u"?new TextDecoder:void 0,Fe=(e,r,t)=>{for(var n=r+t,a=r;e[a]&&!(a>=n);)++a;if(a-r>16&&e.buffer&&gr)return gr.decode(e.subarray(r,a));for(var i="";r<a;){var u=e[r++];if(!(u&128)){i+=String.fromCharCode(u);continue}var l=e[r++]&63;if((u&224)==192){i+=String.fromCharCode((u&31)<<6|l);continue}var v=e[r++]&63;if((u&240)==224?u=(u&15)<<12|l<<6|v:u=(u&7)<<18|l<<12|v<<6|e[r++]&63,u<65536)i+=String.fromCharCode(u);else {var E=u-65536;i+=String.fromCharCode(55296|E>>10,56320|E&1023);}}return i},er=[],rr=e=>{for(var r=0,t=0;t<e.length;++t){var n=e.charCodeAt(t);n<=127?r++:n<=2047?r+=2:n>=55296&&n<=57343?(r+=4,++t):r+=3;}return r},tr=(e,r,t,n)=>{if(!(n>0))return 0;for(var a=t,i=t+n-1,u=0;u<e.length;++u){var l=e.charCodeAt(u);if(l>=55296&&l<=57343){var v=e.charCodeAt(++u);l=65536+((l&1023)<<10)|v&1023;}if(l<=127){if(t>=i)break;r[t++]=l;}else if(l<=2047){if(t+1>=i)break;r[t++]=192|l>>6,r[t++]=128|l&63;}else if(l<=65535){if(t+2>=i)break;r[t++]=224|l>>12,r[t++]=128|l>>6&63,r[t++]=128|l&63;}else {if(t+3>=i)break;r[t++]=240|l>>18,r[t++]=128|l>>12&63,r[t++]=128|l>>6&63,r[t++]=128|l&63;}}return r[t]=0,t-a};function or(e,r,t){var n=rr(e)+1,a=new Array(n),i=tr(e,a,0,a.length);return r&&(a.length=i),a}var rt=()=>{if(!er.length){var e=null;if(!e)return null;er=or(e,!0);}return er.shift()},Me={ttys:[],init(){},shutdown(){},register(e,r){Me.ttys[e]={input:[],output:[],ops:r},o.registerDevice(e,Me.stream_ops);},stream_ops:{open(e){var r=Me.ttys[e.node.rdev];if(!r)throw new o.ErrnoError(43);e.tty=r,e.seekable=!1;},close(e){e.tty.ops.fsync(e.tty);},fsync(e){e.tty.ops.fsync(e.tty);},read(e,r,t,n,a){if(!e.tty||!e.tty.ops.get_char)throw new o.ErrnoError(60);for(var i=0,u=0;u<n;u++){var l;try{l=e.tty.ops.get_char(e.tty);}catch{throw new o.ErrnoError(29)}if(l===void 0&&i===0)throw new o.ErrnoError(6);if(l==null)break;i++,r[t+u]=l;}return i&&(e.node.timestamp=Date.now()),i},write(e,r,t,n,a){if(!e.tty||!e.tty.ops.put_char)throw new o.ErrnoError(60);try{for(var i=0;i<n;i++)e.tty.ops.put_char(e.tty,r[t+i]);}catch{throw new o.ErrnoError(29)}return n&&(e.node.timestamp=Date.now()),i}},default_tty_ops:{get_char(e){return rt()},put_char(e,r){r===null||r===10?(X(Fe(e.output,0)),e.output=[]):r!=0&&e.output.push(r);},fsync(e){e.output&&e.output.length>0&&(X(Fe(e.output,0)),e.output=[]);},ioctl_tcgets(e){return {c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(e,r,t){return 0},ioctl_tiocgwinsz(e){return [24,80]}},default_tty1_ops:{put_char(e,r){r===null||r===10?(V(Fe(e.output,0)),e.output=[]):r!=0&&e.output.push(r);},fsync(e){e.output&&e.output.length>0&&(V(Fe(e.output,0)),e.output=[]);}}},tt=(e,r)=>(j.fill(0,e,e+r),e),hr=(e,r)=>Math.ceil(e/r)*r,wr=e=>{e=hr(e,65536);var r=Zr(65536,e);return r?tt(r,e):0},D={ops_table:null,mount(e){return D.createNode(null,"/",16895,0)},createNode(e,r,t,n){if(o.isBlkdev(t)||o.isFIFO(t))throw new o.ErrnoError(63);D.ops_table||={dir:{node:{getattr:D.node_ops.getattr,setattr:D.node_ops.setattr,lookup:D.node_ops.lookup,mknod:D.node_ops.mknod,rename:D.node_ops.rename,unlink:D.node_ops.unlink,rmdir:D.node_ops.rmdir,readdir:D.node_ops.readdir,symlink:D.node_ops.symlink},stream:{llseek:D.stream_ops.llseek}},file:{node:{getattr:D.node_ops.getattr,setattr:D.node_ops.setattr},stream:{llseek:D.stream_ops.llseek,read:D.stream_ops.read,write:D.stream_ops.write,allocate:D.stream_ops.allocate,mmap:D.stream_ops.mmap,msync:D.stream_ops.msync}},link:{node:{getattr:D.node_ops.getattr,setattr:D.node_ops.setattr,readlink:D.node_ops.readlink},stream:{}},chrdev:{node:{getattr:D.node_ops.getattr,setattr:D.node_ops.setattr},stream:o.chrdev_stream_ops}};var a=o.createNode(e,r,t,n);return o.isDir(a.mode)?(a.node_ops=D.ops_table.dir.node,a.stream_ops=D.ops_table.dir.stream,a.contents={}):o.isFile(a.mode)?(a.node_ops=D.ops_table.file.node,a.stream_ops=D.ops_table.file.stream,a.usedBytes=0,a.contents=null):o.isLink(a.mode)?(a.node_ops=D.ops_table.link.node,a.stream_ops=D.ops_table.link.stream):o.isChrdev(a.mode)&&(a.node_ops=D.ops_table.chrdev.node,a.stream_ops=D.ops_table.chrdev.stream),a.timestamp=Date.now(),e&&(e.contents[r]=a,e.timestamp=a.timestamp),a},getFileDataAsTypedArray(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage(e,r){var t=e.contents?e.contents.length:0;if(!(t>=r)){var n=1048576;r=Math.max(r,t*(t<n?2:1.125)>>>0),t!=0&&(r=Math.max(r,256));var a=e.contents;e.contents=new Uint8Array(r),e.usedBytes>0&&e.contents.set(a.subarray(0,e.usedBytes),0);}},resizeFileStorage(e,r){if(e.usedBytes!=r)if(r==0)e.contents=null,e.usedBytes=0;else {var t=e.contents;e.contents=new Uint8Array(r),t&&e.contents.set(t.subarray(0,Math.min(r,e.usedBytes))),e.usedBytes=r;}},node_ops:{getattr(e){var r={};return r.dev=o.isChrdev(e.mode)?e.id:1,r.ino=e.id,r.mode=e.mode,r.nlink=1,r.uid=0,r.gid=0,r.rdev=e.rdev,o.isDir(e.mode)?r.size=4096:o.isFile(e.mode)?r.size=e.usedBytes:o.isLink(e.mode)?r.size=e.link.length:r.size=0,r.atime=new Date(e.timestamp),r.mtime=new Date(e.timestamp),r.ctime=new Date(e.timestamp),r.blksize=4096,r.blocks=Math.ceil(r.size/r.blksize),r},setattr(e,r){r.mode!==void 0&&(e.mode=r.mode),r.timestamp!==void 0&&(e.timestamp=r.timestamp),r.size!==void 0&&D.resizeFileStorage(e,r.size);},lookup(e,r){throw o.genericErrors[44]},mknod(e,r,t,n){return D.createNode(e,r,t,n)},rename(e,r,t){if(o.isDir(e.mode)){var n;try{n=o.lookupNode(r,t);}catch{}if(n)for(var a in n.contents)throw new o.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=t,r.contents[t]=e,r.timestamp=e.parent.timestamp;},unlink(e,r){delete e.contents[r],e.timestamp=Date.now();},rmdir(e,r){var t=o.lookupNode(e,r);for(var n in t.contents)throw new o.ErrnoError(55);delete e.contents[r],e.timestamp=Date.now();},readdir(e){var r=[".",".."];for(var t of Object.keys(e.contents))r.push(t);return r},symlink(e,r,t){var n=D.createNode(e,r,41471,0);return n.link=t,n},readlink(e){if(!o.isLink(e.mode))throw new o.ErrnoError(28);return e.link}},stream_ops:{read(e,r,t,n,a){var i=e.node.contents;if(a>=e.node.usedBytes)return 0;var u=Math.min(e.node.usedBytes-a,n);if(u>8&&i.subarray)r.set(i.subarray(a,a+u),t);else for(var l=0;l<u;l++)r[t+l]=i[a+l];return u},write(e,r,t,n,a,i){if(r.buffer===w.buffer&&(i=!1),!n)return 0;var u=e.node;if(u.timestamp=Date.now(),r.subarray&&(!u.contents||u.contents.subarray)){if(i)return u.contents=r.subarray(t,t+n),u.usedBytes=n,n;if(u.usedBytes===0&&a===0)return u.contents=r.slice(t,t+n),u.usedBytes=n,n;if(a+n<=u.usedBytes)return u.contents.set(r.subarray(t,t+n),a),n}if(D.expandFileStorage(u,a+n),u.contents.subarray&&r.subarray)u.contents.set(r.subarray(t,t+n),a);else for(var l=0;l<n;l++)u.contents[a+l]=r[t+l];return u.usedBytes=Math.max(u.usedBytes,a+n),n},llseek(e,r,t){var n=r;if(t===1?n+=e.position:t===2&&o.isFile(e.node.mode)&&(n+=e.node.usedBytes),n<0)throw new o.ErrnoError(28);return n},allocate(e,r,t){D.expandFileStorage(e.node,r+t),e.node.usedBytes=Math.max(e.node.usedBytes,r+t);},mmap(e,r,t,n,a){if(!o.isFile(e.node.mode))throw new o.ErrnoError(43);var i,u,l=e.node.contents;if(!(a&2)&&l.buffer===w.buffer)u=!1,i=l.byteOffset;else {if((t>0||t+r<l.length)&&(l.subarray?l=l.subarray(t,t+r):l=Array.prototype.slice.call(l,t,t+r)),u=!0,i=wr(r),!i)throw new o.ErrnoError(48);w.set(l,i);}return {ptr:i,allocated:u}},msync(e,r,t,n,a){return D.stream_ops.write(e,r,0,n,t,!1),0}}},ot=(e,r,t,n)=>{var a=`al ${e}`;z(e).then(i=>{r(new Uint8Array(i)),a&&me();},i=>{if(t)t();else throw `Loading data file "${e}" failed.`}),a&&ce();},nt=(e,r,t,n,a,i)=>{o.createDataFile(e,r,t,n,a,i);},at=[],it=(e,r,t,n)=>{typeof Browser<"u"&&Browser.init();var a=!1;return at.forEach(i=>{a||i.canHandle(r)&&(i.handle(e,r,t,n),a=!0);}),a},st=(e,r,t,n,a,i,u,l,v,E)=>{var G=r?he.resolve(C.join2(e,r)):e;function B(y){function O(te){E?.(),l||nt(e,r,te,n,a,v),i?.(),me();}it(y,G,O,()=>{u?.(),me();})||O(y);}ce(),typeof t=="string"?ot(t,B,u):B(t);},ut=e=>{var r={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},t=r[e];if(typeof t>"u")throw new Error(`Unknown file open mode: ${e}`);return t},nr=(e,r)=>{var t=0;return e&&(t|=365),r&&(t|=146),t},o={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(e){this.name="ErrnoError",this.errno=e;}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={};}get object(){return this.node}set object(e){this.node=e;}get isRead(){return (this.flags&2097155)!==1}get isWrite(){return (this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(e){this.shared.flags=e;}get position(){return this.shared.position}set